{"version":3,"sources":["../../../Scripts/script.js","../../../app/js/directives/responsiveTable.directive.js","../../../Scripts/xdomain.min.js","../../../Scripts/Modernizr/modernizr.2.8.2.js","../../../Scripts/JQuery/jquery-1.11.0.js","../../../Scripts/JQuery/jquery.easing.1.3.js","../../../Scripts/JQuery/jquery-ui.js","../../../Scripts/JQuery/jquery.ui.autocomplete.js","../../../Scripts/JQuery/jquery-ui-timepicker-addon.js","../../../Scripts/moment-with-langs.min.js","../../../Scripts/Raphael/raphael.js","../../../Scripts/PolyFill.js","../../../Scripts/JQuery/jquery.touchSwipe.min.js","../../../Scripts/JQuery/jquery.md5.js","../../../Scripts/Angular/angular-file-upload-shim.js","../../../Scripts/Angular/angular.js","../../../Scripts/Angular/angular-file-upload.js","../../../Scripts/Angular/angular-route.js","../../../Scripts/Angular/angular-resource.js","../../../Scripts/Angular/angular-sanitize.js","../../../Scripts/Angular/angular-cookies.js","../../../Scripts/Angular/angular-animate.js","../../../Scripts/i18n/angular-locale_fr-fr.js","../../../app/js/app.js","../../../app/js/factories/currentUserFactory.js","../../../app/js/factories/parametersFactory.js","../../../app/js/factories/modulesFactory.js","../../../app/js/factories/editableObjectsFactory.js","../../../app/js/enum/enum.js","../../../app/js/directives/superTableDirective/jquery.dragtable.js","../../../app/filters/sumByKey.js","../../../app/filters/roundByDecimalAndConverter.js","../../../app/filters/unique.js","../../../app/filters/formatDataTable.js","../../../app/filters/formatMd5.js","../../../app/filters/pdfLink.js","../../../app/filters/uploadLink.js","../../../app/filters/trustUrl.js","../../../Scripts/i18n/grid.locale-fr.js","../../../Scripts/Hightstock/highstock.src.js","../../../app/js/directives/autoCompleteDirective.js","../../../app/js/directives/popUpConfirmDirective.js","../../../app/js/directives/popUpSubmitDirective.js","../../../app/js/directives/datePickerDirective.js","../../../app/js/directives/timePickerDirective.js","../../../app/js/directives/translateResetPasswordDirective.js","../../../app/js/directives/ToolTipAutoSizeDirective.js","../../../app/js/directives/sortTableDirective.js","../../../app/js/directives/ngEnterDirective.js","../../../app/js/directives/ListToSelectedDirective.js","../../../app/js/directives/checkListDirective.js","../../../app/js/Controllers/loginController.js","../../../app/js/Controllers/UnsubscribeNewsMarketInfoController.js","../../../app/js/Controllers/siteUnavailableController.js","../../../app/js/Controllers/disableSubscriptionController.js","../../../app/js/Controllers/ValidateCGUController.js","../../../app/js/controllers/backoffice/backdoor/backdoorController.js","../../../app/js/Controllers/resetPasswordController.js","../../../app/js/Controllers/editableController.js","../../../app/js/directives/refreshDirective.js","../../../app/js/directives/smartFloatDirective.js","../../../app/js/directives/uploadFileDirective.js","../../../app/js/directives/popUpDetailsDirective.js","../../../app/js/directives/ckEditorDirective.js","../../../app/js/directives/superTableDirective/ControleTableDirective.js","../../../app/js/directives/superTableDirective/ControleTableDevDirective.js","../../../app/js/directives/sortableElementDirective.js","../../../app/js/directives/euronextGraphDirective.js","../../../app/js/directives/angucomplete.js","../../../app/js/directives/angucompleteAlt.js","../../../app/js/directives/TooltipDirective.js","../../../app/js/directives/subNavDirective.js","../../../app/js/directives/counterDirective.js","../../../app/js/directives/highchartsDirective.js","../../../app/js/directives/editableDirective.js","../../../app/js/directives/agrimarketEditableDirective.js","../../../app/js/directives/agrimarketEditableGraphDirective.js","../../../app/js/directives/agrimarketEditableTableDirective.js","../../../app/js/directives/agrimarketEditableEnumDirective.js","../../../app/js/directives/agrimarketEditableBlockDirective.js","../../../app/js/directives/tickerDirective.js","../../../app/js/directives/multipleSelectDirective.js","../../../app/js/directives/accordionDirective.js","../../../app/js/directives/dirPagination.directive.js","../../../app/js/directives/ngIncludeReplace.directive.js","../../../app/js/directives/autoFocusDirective.js","../../../app/js/controllers/backoffice/contract/contractsFirmMonitoringController.js","../../../app/js/controllers/backoffice/contract/contractsCommitmentMonitoringController.js","../../../app/js/controllers/backoffice/contract/contractsSurfaceCommitmentMonitoringController.js","../../../app/js/controllers/backoffice/contract/contractsBaseMonitoringController.js","../../../app/js/controllers/backoffice/contract/contractsBuiltPriceMonitoringController.js","../../../app/js/controllers/backoffice/editorial/editorialMailController.js","../../../app/js/controllers/backoffice/editorial/editorialContractController.js","../../../app/js/controllers/backoffice/contract/contractsOptionMonitoringController.js","../../../app/js/controllers/backoffice/editorial/editTemplateContractController.js","../../../app/js/controllers/backoffice/editorial/editTemplateMailController.js","../../../app/js/controllers/backoffice/editorial/comMarketInfoController.js","../../../app/js/controllers/backoffice/editorial/saveComMarketInfoController.js","../../../app/js/controllers/backoffice/editorial/alertMailController.js","../../../app/js/controllers/backoffice/editorial/createAlertMailController.js","../../../app/js/controllers/backoffice/dataManagment/weatherDataController.js","../../../app/js/controllers/backoffice/editorial/editorialMobileController.js","../../../app/js/controllers/backoffice/offer/offerController.js","../../../app/js/controllers/backoffice/offer/createofferController.js","../../../app/js/controllers/backoffice/offer/builtPriceManagerController.js","../../../app/js/controllers/backoffice/parameters/cropsController.js","../../../app/js/controllers/backoffice/parameters/globalController.js","../../../app/js/controllers/backoffice/parameters/productsController.js","../../../app/js/controllers/backoffice/parameters/homePageApplicationMobilesController.js","../../../app/js/controllers/backoffice/parameters/closeDayController.js","../../../app/js/controllers/backoffice/parameters/coverController.js","../../../app/js/controllers/backoffice/parameters/conditionsController.js","../../../app/js/controllers/backoffice/parameters/categoryOfferController.js","../../../app/js/controllers/backoffice/parameters/compagniesController.js","../../../app/js/controllers/backoffice/contents/quoteAdminController.js","../../../app/js/controllers/backoffice/contents/news/newsController.js","../../../app/js/controllers/backoffice/contents/news/saveNewsController.js","../../../app/js/controllers/backoffice/contents/fluxrssController.js","../../../app/js/controllers/backoffice/contents/videoController.js","../../../app/js/controllers/backoffice/contents/contactsController.js","../../../app/js/controllers/backoffice/contents/carouselPictureController.js","../../../app/js/controllers/backoffice/contents/content/contentsController.js","../../../app/js/controllers/backoffice/contents/content/savePageController.js","../../../app/js/controllers/backoffice/contents/manage/manageUsersController.js","../../../app/js/controllers/backoffice/contents/manage/manageGroupUsersController.js","../../../app/js/controllers/backoffice/contents/infoMarketHashtagri/infoMarketHashtagriController.js","../../../app/js/controllers/backoffice/contents/infoMarketHashtagri/saveContentInfoMarketController.js","../../../app/js/controllers/backoffice/contents/notifications/notificationsController.js","../../../app/js/controllers/backoffice/contents/notifications/saveNotificationController.js","../../../app/js/controllers/backoffice/routing/portfolioController.js","../../../app/js/controllers/frontoffice/offer/offerController.js","../../../app/js/controllers/frontoffice/contract/userContractsFirmMonitoringController.js","../../../app/js/controllers/frontoffice/contract/userContractsBaseMonitoringController.js","../../../app/js/controllers/frontoffice/contract/userContractsOptionMonitoringController.js","../../../app/js/controllers/frontoffice/subscribe/subscribeContractOptionController.js","../../../app/js/controllers/frontoffice/contract/userContractsCommitmentMonitoringController.js","../../../app/js/controllers/frontoffice/contract/userContractsSurfaceCommitmentMonitoringController.js","../../../app/js/controllers/frontoffice/dashboardController.js","../../../app/js/controllers/frontoffice/supply/deliveryController.js","../../../app/js/controllers/frontoffice/supply/commandsController.js","../../../app/js/controllers/frontoffice/supply/requestPricesController.js","../../../app/js/controllers/frontoffice/supply/monitoringRequestController.js","../../../app/js/controllers/frontoffice/accounts/outstandingsController.js","../../../app/js/controllers/frontoffice/contentUserController.js","../../../app/js/controllers/frontoffice/accounts/billsController.js","../../../app/js/controllers/frontoffice/accounts/accountstatementController.js","../../../app/js/controllers/frontoffice/contribution/contributionsController.js","../../../app/js/controllers/frontoffice/manage/manageUsersOfTcController.js","../../../app/js/controllers/frontoffice/manage/manageContractsOfTcUsersController.js","../../../app/js/controllers/frontoffice/manage/manageContractsBaseOfTcUserController.js","../../../app/js/controllers/frontoffice/manage/manageContractsCommitmentOfTcUserController.js","../../../app/js/controllers/frontoffice/manage/manageContractsSurfaceCommitmentOfTcUserController.js","../../../app/js/controllers/frontoffice/user/userManagementController.js","../../../app/js/controllers/frontoffice/commitments/commitmentsController.js","../../../app/js/controllers/frontoffice/commitments/commitmentsAllController.js","../../../app/js/controllers/frontoffice/documents/documentsController.js","../../../app/js/controllers/frontoffice/marketinfos/marketinfosUserController.js","../../../app/js/Controllers/frontoffice/redirectOuiFieldController.js","../../../app/js/controllers/frontoffice/subscribe/subscribeContractBaseController.js","../../../app/js/controllers/frontoffice/subscribe/subscribeContractFirmController.js","../../../app/js/controllers/frontoffice/subscribe/subscribeContractCommitmentController.js","../../../app/js/controllers/frontoffice/subscribe/subscribeContractSurfaceCommitmentController.js","../../../app/js/controllers/frontoffice/subscribe/subscribeContractBlankController.js","../../../app/js/controllers/frontoffice/subscribe/subscribeContractMultiCropsController.js","../../../app/js/controllers/frontoffice/smsalert/smsAlertController.js","../../../app/js/controllers/DisconnectController.js","../../../app/js/controllers/common/messenger/messengerController.js","../../../app/js/controllers/common/quote/quoteController.js","../../../app/js/controllers/TestSocket/testsocketController.js","../../../app/js/controllers/ceremisDashboardController.js","../../../app/js/services/cropsService.js","../../../app/js/services/coverService.js","../../../app/js/services/parametersService.js","../../../app/js/services/authenticationService.js","../../../app/js/services/closeDayService.js","../../../app/js/services/productsService.js","../../../app/js/services/typeDashboardActualityAppMobileService.js","../../../app/js/services/typeQuotesService.js","../../../app/js/services/typeOffersService.js","../../../app/js/services/offerVisibilityService.js","../../../app/js/services/typeCoversService.js","../../../app/js/services/offerService.js","../../../app/js/services/wsdApiService.js","../../../app/js/services/editableObjectsService.js","../../../app/js/services/deliveryPeriodService.js","../../../app/js/services/validityDurationService.js","../../../app/js/services/modelContractService.js","../../../app/js/services/GroupContactService.js","../../../app/js/services/contractsService.js","../../../app/js/services/contractsOptionService.js","../../../app/js/services/userTableService.js","../../../app/js/services/deliveriesService.js","../../../app/js/services/billsService.js","../../../app/js/services/contributionsService.js","../../../app/js/services/operationService.js","../../../app/js/services/categoryArticleService.js","../../../app/js/services/articleService.js","../../../app/js/services/dateService.js","../../../app/js/services/backdoorService.js","../../../app/js/services/compagnyService.js","../../../app/js/services/uploadService.js","../../../app/js/services/templatesService.js","../../../app/js/services/templateMailsService.js","../../../app/js/services/communicationMarketInfoService.js","../../../app/js/services/alertMailService.js","../../../app/js/services/accuWeatherCallService.js","../../../app/js/services/tagsService.js","../../../app/js/services/pdfService.js","../../../app/js/services/newsService.js","../../../app/js/services/quoteService.js","../../../app/js/services/fluxRssService.js","../../../app/js/services/CarouselPictureService.js","../../../app/js/services/VideoService.js","../../../app/js/services/dashboardService.js","../../../app/js/services/contentService.js","../../../app/js/services/commandService.js","../../../app/js/services/userService.js","../../../app/js/services/userInfosService.js","../../../app/js/services/messengerService.js","../../../app/js/services/testsocketService.js","../../../app/js/services/athenaOrdersService.js","../../../app/js/services/conditionsService.js","../../../app/js/services/typeOperationsService.js","../../../app/js/services/typeOptionsService.js","../../../app/js/services/typeCalculOptionsService.js","../../../app/js/services/elementInfoMarketHomePageService.js","../../../app/js/services/elementInfoMarketHomePageQuoteService.js","../../../app/js/services/categoryInfoMarketService.js","../../../app/js/services/quoteCashHashtagriService.js","../../../app/js/services/quoteFutureHashtagriService.js","../../../app/js/services/quoteForexHashtagriService.js","../../../app/js/services/marketinfosUserHashtagriService.js","../../../app/js/services/blocDispositionService.js","../../../app/js/services/typeBlockEditableService.js","../../../app/js/services/writingContentInfoMarketService.js","../../../app/js/services/typeOfferCommitmentsService.js","../../../app/js/services/typeCommitmentsService.js","../../../app/js/services/typeOrdersService.js","../../../app/js/services/routeService.js","../../../app/js/services/elementInfoMarketHomePagesService.js","../../../app/js/services/userCropCapitalService.js","../../../app/js/services/typeFixationsService.js","../../../app/js/services/signatureService.js","../../../app/js/services/contractingDelayService.js","../../../app/js/services/targetPriceService.js","../../../app/js/services/contractBaseService.js","../../../app/js/services/languageService.js","../../../app/js/services/typeFixationBasesService.js","../../../app/js/services/smsAlertService.js","../../../app/js/services/currencyService.js","../../../app/js/services/unitService.js","../../../app/js/owlcarousel/owl.carousel.js","../../../app/js/services/categoryOfferService.js","../../../app/js/services/ceremisApiService.js","../../../app/js/services/portfolioService.js","../../../app/js/services/typeContractsService.js","../../../app/js/services/criteriaOfferService.js","../../../app/js/services/coverParametersService.js","../../../app/js/services/notificationsService.js","../../../app/js/services/typePriceService.js","../../../app/js/services/versionService.js","../../../app/js/services/strikeService.js"],"names":["setLink","i","first","$","attr","href","window","location","menu","style","menuScroll","$nav","css","position","scrollTop","this","navHeight","outerHeight","containerHeight","windowHeight","height","top","$navPosTop","bottom","z-index","ratio","initVertical","$elemNav","each","id","$deployNav","$elemSsNav","calcHeight","find","length","titleNav","html","titleLink","target","overflow","width","display","prepend","addClass","undeployNav","initHorizontal","deviceWidth","widthMenu","hide","append","unbind","bind","showMenuHor","e","showSubMenuHor","removeClass","show","remove","$heightArray","$heightElem","push","deployNav","$subNav","removeAttr","animate","menuWidth","hasClass","opacity","$mainContainer","padding-left","containerMarge","classList","add","is","slideDown","el","parent","preventDefault","menuWidthDefault","showNav","menuWidthSsNav","elemPos","offset","elemHeight","hideNav","showSsNav","hideSsNav","deviceAgent","navigator","userAgent","toLowerCase","isTouchDevice","Modernizr","touch","match","horizontalSite","$bt","Array","parseInt","replace","click","parentElement","resize","scroll","$elemNavWidth","outerWidth","maxWidth","undefined","resizeEvtMenu","clearTimeout","setTimeout","toggleClass","mouseenter","mouseleave","initDragDrop","sortable","handle","helper","connectWith","placeholder","update","event","ui","toString","activate","item","userMenu","link","nav","$link","stopPropagation","slideUp","document","one","closeTooltip","has","moveVehicle","currentDistance","left","dashboardCarousel","largeCarousel","owl","owlCarousel","autoplay","autoplayHoverPause","autoplayTimeout","autoplaySpeed","center","items","stagePadding","loop","margin","animateOut","animateIn","dots","mouseDrag","touchDrag","on","dotsPosition","refreshCarousel","data","options","trigger","onHeightCalcul","elem","timeout","dataChanged","time","tableLeft","tableScrollable","tableRight","currentHeaderHeight","currentLineHeight","offsetHeight","eq","oldHeaderHeight","Date","a","b","c","d","f","g","h","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","indexOf","exec","isNaN","prototype","slice","call","createEventObject","type","Event","splice","arguments","shift","apply","concat","listeners","off","fire","once","destroy","EventEmitter","enable","disable","headers","join","split","test","RegExp","$1","$2","fd","form","Object","defineProperty","get","querySelectorAll","filter","checked","map","name","files","value","A","B","C","D","E","F","G","H","status","statusText","getAllResponseHeaders","text","responseText","xml","responseXML","response","async","xhr","onreadystatechange","addWithCredentials","withCredentials","open","headerNames","method","url","user","pass","send","body","setRequestHeader","head","progress","abort","getResponseHeader","overrideMimeType","upload","define","amd","exports","xhook","I","J","K","L","M","N","O","P","createElement","src","setAttribute","appendChild","contentWindow","FileReader","onload","result","readAsArrayBuffer","forEach","dispatchEvent","credentials","cookie","emit","entries","before","origin","close","addEventListener","ready","path","XMLHttpRequest","readyState","responseType","FormData","Blob","postMessage","attachEvent","JSON","parse","source","unshift","stringify","masters","slaves","debug","protocol","host","Math","round","random","pow","console","alert","parseUrl","$3","slave","master","getElementsByTagName","getAttribute","xdomain","cssText","charAt","toUpperCase","input","list","HTMLDataListElement","inputtypes","WebkitAppearance","defaultView","getComputedStyle","removeChild","checkValidity","documentElement","svg","innerHTML","background","parentNode","removeAttribute","select","change","submit","reset","error","load","hasOwnProperty","constructor","Function","TypeError","flexbox","flexboxlegacy","canvas","getContext","canvastext","fillText","webgl","WebGLRenderingContext","DocumentTouch","offsetTop","geolocation","postmessage","websqldatabase","openDatabase","indexedDB","hashchange","documentMode","history","pushState","draganddrop","websockets","rgba","backgroundColor","hsla","multiplebgs","backgroundsize","borderimage","borderradius","boxshadow","textshadow","textShadow","cssanimations","csscolumns","cssgradients","backgroundImage","cssreflections","csstransforms","csstransforms3d","offsetLeft","csstransitions","fontface","getElementById","sheet","styleSheet","cssRules","generatedcontent","video","canPlayType","Boolean","ogg","h264","webm","audio","mp3","wav","m4a","localstorage","localStorage","setItem","removeItem","sessionstorage","sessionStorage","webworkers","Worker","applicationcache","applicationCache","createElementNS","createSVGRect","inlinesvg","firstChild","namespaceURI","smil","svgclippaths","addTest","className","insertBefore","lastChild","elements","cache","cloneNode","createElem","canHaveChildren","tagUrn","frag","createDocumentFragment","createFrag","shivMethods","shivCSS","hasCSS","html5","childNodes","version","supportsUnknownElements","shivDocument","_version","_prefixes","_domPrefixes","_cssomPrefixes","hasEvent","testProp","testAllProps","testStyles","injectCss","injectJs","errorTimeout","onerror","loader","createRange","compareNode","opera","isArray","pop","origUrl","prefixes","autoCallback","bypass","instead","noexec","forceCSS","forceJS","attrs","both","callback","complete","yep","nope","yepnope","addPrefix","addFilter","removeEventListener","executeStack","rel","global","factory","module","Error","noGlobal","isArraylike","obj","jQuery","isWindow","nodeType","winnow","qualifier","not","isFunction","grep","risSimple","inArray","sibling","cur","dir","createOptions","object","optionsCache","rnotwhite","_","flag","detach","completed","detachEvent","dataAttr","key","rmultiDash","rbrace","parseJSON","isEmptyDataObject","isEmptyObject","internalData","pvt","acceptData","ret","thisCache","internalKey","expando","isNode","deletedIds","guid","toJSON","noop","extend","camelCase","internalRemoveData","cleanData","support","deleteExpando","returnTrue","returnFalse","safeActiveElement","activeElement","err","createSafeFragment","nodeNames","safeFrag","getAll","context","tag","elems","found","strundefined","nodeName","merge","fixDefaultChecked","rcheckableType","defaultChecked","manipulationTarget","content","ownerDocument","disableScript","restoreScript","rscriptTypeMasked","setGlobalEval","refElements","_data","cloneCopyEvent","dest","hasData","oldData","curData","events","fixCloneNodeIssues","noCloneEvent","removeEvent","outerHTML","html5Clone","trim","defaultSelected","selected","defaultValue","actualDisplay","doc","appendTo","getDefaultComputedStyle","defaultDisplay","elemdisplay","iframe","contentDocument","write","addGetHookIf","conditionFn","hookFn","condition","vendorPropName","capName","origName","cssPrefixes","showHide","hidden","values","index","isHidden","setPositiveNumber","subtract","matches","rnumsplit","max","augmentWidthOrHeight","extra","isBorderBox","styles","val","cssExpand","getWidthOrHeight","valueIsBorderBox","offsetWidth","getStyles","boxSizing","curCSS","rnumnonpx","boxSizingReliable","parseFloat","Tween","prop","end","easing","init","createFxNow","fxNow","now","genFx","includeWidth","which","createTween","animation","tween","collection","tweeners","defaultPrefilter","props","opts","toggle","hooks","oldfire","dDisplay","anim","orig","dataShow","queue","_queueHooks","unqueued","empty","always","overflowX","overflowY","inlineBlockNeedsLayout","zoom","shrinkWrapBlocks","rfxtypes","done","_removeData","start","propFilter","specialEasing","cssHooks","expand","Animation","properties","stopped","animationPrefilters","deferred","Deferred","tick","currentTime","remaining","startTime","duration","temp","percent","tweens","run","notifyWith","resolveWith","promise","originalProperties","originalOptions","stop","gotoEnd","rejectWith","fx","timer","fail","addToPrefiltersOrTransports","structure","dataTypeExpression","func","dataType","dataTypes","inspectPrefiltersOrTransports","jqXHR","inspect","inspected","prefilterOrFactory","dataTypeOrTransport","seekingTransport","transports","ajaxExtend","deep","flatOptions","ajaxSettings","ajaxHandleResponses","responses","firstDataType","ct","finalDataType","contents","mimeType","converters","ajaxConvert","isSuccess","conv2","current","conv","tmp","prev","responseFields","dataFilter","state","buildParams","prefix","traditional","rbracket","createStandardXHR","createActiveXHR","ActiveXObject","getWindow","parentWindow","class2type","hasOwn","selector","fn","rtrim","rmsPrefix","rdashAlpha","fcamelCase","all","letter","jquery","toArray","num","pushStack","prevObject","args","last","len","sort","copyIsArray","copy","clone","isPlainObject","isReady","msg","isNumeric","ownLast","globalEval","execScript","string","makeArray","arr","results","second","invert","callbackExpect","arg","proxy","Sizzle","seed","groups","old","nid","newContext","newSelector","preferredDoc","setDocument","documentIsHTML","rquickExpr","contains","getElementsByClassName","qsa","rbuggyQSA","tokenize","rescape","toSelector","rsibling","testContext","qsaError","createCache","keys","Expr","cacheLength","markFunction","assert","div","addHandle","handler","attrHandle","siblingCheck","diff","sourceIndex","MAX_NEGATIVE","nextSibling","createInputPseudo","createButtonPseudo","createPositionalPseudo","argument","matchIndexes","setFilters","parseOnly","matched","tokens","soFar","preFilters","cached","tokenCache","preFilter","rcomma","rcombinators","matchExpr","addCombinator","matcher","combinator","base","checkNonElements","doneName","oldCache","outerCache","newCache","dirruns","elementMatcher","matchers","condense","unmatched","newUnmatched","mapped","setMatcher","postFilter","postFinder","postSelector","preMap","postMap","preexisting","multipleContexts","matcherIn","matcherOut","matcherFromTokens","checkContext","leadingRelative","relative","implicitRelative","matchContext","matchAnyContext","outermostContext","matcherFromGroupMatchers","elementMatchers","setMatchers","bySet","byElement","superMatcher","outermost","matchedCount","setMatched","contextBackup","dirrunsUnique","uniqueSort","contexts","token","getById","runescape","funescape","compile","getText","isXML","sortInput","hasDuplicate","docElem","rbuggyMatches","classCache","compilerCache","sortOrder","push_native","booleans","whitespace","characterEncoding","identifier","attributes","pseudos","rattributeQuotes","rpseudo","ridentifier","ID","CLASS","TAG","ATTR","PSEUDO","CHILD","bool","needsContext","rinputs","rheader","rnative","escaped","escapedWhitespace","high","String","fromCharCode","els","node","hasCompare","createComment","getElementsByName","attrId","getAttributeNode","matchesSelector","webkitMatchesSelector","mozMatchesSelector","oMatchesSelector","msMatchesSelector","disconnectedMatch","compareDocumentPosition","adown","bup","compare","sortDetached","aup","ap","bp","expr","specified","duplicates","detectDuplicates","sortStable","textContent","nodeValue","selectors","createPseudo",">"," ","+","~","excess","unquoted","nodeNameSelector","pattern","operator","check","what","simple","forward","ofType","nodeIndex","useCache","pseudo","idx","innerText","lang","elemLang","hash","root","focus","hasFocus","tabIndex","enabled","disabled","selectedIndex","header","button","even","odd","lt","gt","radio","checkbox","file","password","image","filters","group","div1","unique","isXMLDoc","rneedsContext","rsingleTag","self","rootjQuery","parseHTML","rparentsprev","guaranteedUnique","children","next","until","targets","closest","pos","prevAll","addBack","parents","parentsUntil","nextAll","nextUntil","prevUntil","siblings","reverse","Callbacks","firing","memory","fired","firingLength","firingIndex","firingStart","stack","stopOnFalse","lock","locked","fireWith","tuples","then","fns","newDefer","tuple","returned","resolve","reject","notify","pipe","stateString","when","subordinate","progressValues","progressContexts","resolveContexts","resolveValues","updateFunc","readyList","readyWait","holdReady","hold","wait","frameElement","doScroll","doScrollCheck","container","noData","applet ","embed ","object ","removeData","dequeue","startLength","setter","clearQueue","count","defer","pnum","access","chainable","emptyGet","raw","bulk","fragment","leadingWhitespace","tbody","htmlSerialize","appendChecked","noCloneChecked","checkClone","eventName","focusin","rformElems","rkeyEvent","rmouseEvent","rfocusMorph","rtypenamespace","types","handleObjIn","special","eventHandle","handleObj","handlers","namespaces","origType","elemData","triggered","dispatch","delegateType","bindType","namespace","delegateCount","setup","mappedTypes","origCount","teardown","onlyHandlers","ontype","bubbleType","eventPath","isTrigger","namespace_re","noBubble","isPropagationStopped","isDefaultPrevented","_default","fix","handlerQueue","delegateTarget","preDispatch","currentTarget","isImmediatePropagationStopped","postDispatch","sel","originalEvent","fixHook","fixHooks","mouseHooks","keyHooks","srcElement","metaKey","original","charCode","keyCode","eventDoc","fromElement","pageX","clientX","scrollLeft","clientLeft","pageY","clientY","clientTop","relatedTarget","toElement","blur","beforeunload","returnValue","simulate","bubble","isSimulated","defaultPrevented","getPreventDefault","timeStamp","cancelBubble","stopImmediatePropagation","related","submitBubbles","_submit_bubble","changeBubbles","propertyName","_just_changed","focusinBubbles","attaches","origFn","triggerHandler","rinlinejQuery","rnoshimcache","rleadingWhitespace","rxhtmlTag","rtagName","rtbody","rhtml","rnoInnerhtml","rchecked","rscriptType","rcleanScript","wrapMap","option","legend","area","param","thead","tr","col","td","safeFragment","fragmentDiv","optgroup","tfoot","colgroup","caption","th","dataAndEvents","deepDataAndEvents","destElements","srcElements","inPage","buildFragment","scripts","selection","wrap","safe","nodes","createTextNode","domManip","after","keepData","replaceWith","replaceChild","hasScripts","set","iNoClone","_evalUrl","prependTo","insertAfter","replaceAll","insert","shrinkWrapBlocksVal","cssFloat","backgroundClip","clearCloneStyle","divReset","rmargin","rposition","computed","minWidth","getPropertyValue","currentStyle","rs","rsLeft","runtimeStyle","pixelLeft","computeStyleTests","containerStyles","swap","boxSizingVal","boxSizingReliableVal","pixelPositionVal","reliableMarginRightVal","reliableHiddenOffsetsVal","reliableHiddenOffsets","tds","isSupported","pixelPosition","reliableMarginRight","marginDiv","marginRight","ralpha","ropacity","rdisplayswap","rrelNum","cssShow","visibility","cssNormalTransform","letterSpacing","fontWeight","cssNumber","columnCount","fillOpacity","lineHeight","order","orphans","widows","zIndex","cssProps","float","padding","border","suffix","expanded","parts","unit","propHooks","eased","step","linear","swing","cos","PI","timerId","rfxnum","rrun","*","scale","maxIterations","tweener","prefilter","speed","opt","speeds","fadeTo","to","optall","doAnimation","finish","stopQueue","timers","cssFn","slideToggle","fadeIn","fadeOut","fadeToggle","interval","setInterval","clearInterval","slow","fast","delay","getSetAttribute","hrefNormalized","checkOn","optSelected","enctype","optDisabled","radioValue","rreturn","valHooks","optionSet","scrollHeight","nodeHook","boolHook","ruseDefault","getSetInput","nType","attrHooks","propName","attrNames","propFix","getter","setAttributeNode","createAttribute","coords","contenteditable","rfocusable","rclickable","removeProp","for","class","notxml","tabindex","rclass","classes","clazz","finalValue","proceed","stateVal","classNames","hover","fnOver","fnOut","delegate","undelegate","nonce","rquery","rvalidtokens","requireNonComma","depth","str","comma","parseXML","DOMParser","parseFromString","loadXML","ajaxLocParts","ajaxLocation","rhash","rts","rheaders","rlocalProtocol","rnoContent","rprotocol","rurl","prefilters","allTypes","active","lastModified","etag","isLocal","processData","contentType","accepts","json","* text","text html","text json","text xml","ajaxSetup","settings","ajaxPrefilter","ajaxTransport","ajax","nativeStatusText","success","modified","timeoutTimer","transport","responseHeadersString","ifModified","cacheURL","callbackContext","statusCode","fireGlobals","globalEventContext","completeDeferred","responseHeaders","requestHeaders","requestHeadersNames","strAbort","lname","code","finalText","crossDomain","hasContent","beforeSend","getJSON","getScript","throws","wrapAll","wrapInner","unwrap","visible","r20","rCRLF","rsubmitterTypes","rsubmittable","encodeURIComponent","serialize","serializeArray","xhrId","xhrCallbacks","xhrSupported","cors","username","xhrFields","isAbort","script","text script","scriptCharset","charset","oldCallbacks","rjsonp","jsonp","jsonpCallback","originalSettings","callbackName","overwritten","responseContainer","jsonProp","keepScripts","parsed","_load","params","animated","setOffset","curPosition","curLeft","curCSSTop","curTop","curOffset","curCSSLeft","calculatePosition","curElem","using","win","box","getBoundingClientRect","pageYOffset","pageXOffset","offsetParent","parentOffset","scrollTo","Height","Width","","defaultExtra","funcName","size","andSelf","_jQuery","_$","noConflict","def","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","sin","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","sqrt","easeOutCirc","easeInOutCirc","easeInElastic","abs","asin","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","focusable","element","isTabIndexNotNaN","mapName","img","datepicker_getZindex","Datepicker","_curInst","_keyEvent","_disabledInputs","_datepickerShowing","_inDialog","_mainDivId","_inlineClass","_appendClass","_triggerClass","_dialogClass","_disableClass","_unselectableClass","_currentClass","_dayOverClass","regional","closeText","prevText","nextText","currentText","monthNames","monthNamesShort","dayNames","dayNamesShort","dayNamesMin","weekHeader","dateFormat","firstDay","isRTL","showMonthAfterYear","yearSuffix","_defaults","showOn","showAnim","showOptions","defaultDate","appendText","buttonText","buttonImage","buttonImageOnly","hideIfNoPrevNext","navigationAsDateFormat","gotoCurrent","changeMonth","changeYear","yearRange","showOtherMonths","selectOtherMonths","showWeek","calculateWeek","iso8601Week","shortYearCutoff","minDate","maxDate","beforeShowDay","beforeShow","onSelect","onChangeMonthYear","onClose","numberOfMonths","showCurrentAtPos","stepMonths","stepBigMonths","altField","altFormat","constrainInput","showButtonPanel","autoSize","en","dpDiv","datepicker_bindHover","datepicker_handleMouseover","datepicker","_isDisabledDatepicker","datepicker_instActive","inline","datepicker_extendRemove","spinner_modifier","previous","_refresh","_trigger","BACKSPACE","COMMA","DELETE","DOWN","END","ENTER","ESCAPE","HOME","LEFT","PAGE_DOWN","PAGE_UP","PERIOD","RIGHT","SPACE","TAB","UP","scrollParent","includeHidden","excludeStaticParent","overflowRegex","uniqueId","uuid","removeUniqueId","dataName","tabbable","isTabIndexNaN","reduce","side","innerWidth","innerHeight","ie","disableSelection","eventType","enableSelection","plugin","proto","plugins","instance","allowDisconnected","widget_uuid","widget_slice","widget","fullName","existingConstructor","basePrototype","proxiedPrototype","Widget","_createWidget","_proto","_childConstructors","_super","_superApply","__super","__superApply","widgetEventPrefix","widgetName","widgetFullName","child","childPrototype","bridge","inputIndex","inputLength","isMethodCall","methodValue","_init","defaultElement","create","eventNamespace","bindings","hoverable","_on","_getCreateOptions","_create","_getCreateEventData","_destroy","curOption","_setOptions","_setOption","suppressDisabledCheck","delegateElement","handlerProxy","_off","_delay","_hoverable","_focusable","focusout","defaultEffect","effect","hasOptions","effectName","effects","mouseHandled","mouseup","cancel","distance","_mouseInit","that","_mouseDown","started","_mouseDestroy","_mouseMoveDelegate","_mouseUpDelegate","_mouseMoved","_mouseStarted","_mouseUp","_mouseDownEvent","btnIsLeft","elIsCancel","_mouseCapture","mouseDelayMet","_mouseDelayTimer","_mouseDistanceMet","_mouseDelayMet","_mouseStart","_mouseMove","_mouseDrag","_mouseStop","getOffsets","offsets","rpercent","parseCss","property","getDimensions","cachedScrollbarWidth","supportsOffsetFractions","rhorizontal","rvertical","roffset","_position","scrollbarWidth","w1","w2","innerDiv","clientWidth","getScrollInfo","within","isDocument","hasOverflowX","scrollWidth","getWithinInfo","withinElement","of","atOffset","targetWidth","targetHeight","targetOffset","basePosition","dimensions","scrollInfo","collision","at","horizontalOffset","verticalOffset","collisionPosition","elemWidth","marginLeft","marginTop","collisionWidth","collisionHeight","myOffset","my","right","feedback","horizontal","vertical","important","fit","newOverRight","withinOffset","collisionPosLeft","overLeft","overRight","newOverBottom","collisionPosTop","overTop","overBottom","flip","newOverLeft","newOverTop","flipfit","testElement","testElementParent","testElementStyle","mouse","addClasses","axis","connectToSortable","containment","cursor","cursorAt","grid","iframeFix","refreshPositions","revert","revertDuration","scope","scrollSensitivity","scrollSpeed","snap","snapMode","snapTolerance","drag","_setPositionRelative","_setHandleClassName","_removeHandleClassName","destroyOnClear","_blurActiveElement","_getHandle","_blockFrames","iframeBlocks","_unblockFrames","handleElement","_createHelper","_cacheHelperProportions","ddmanager","_cacheMargins","cssPosition","hasFixedAncestor","positionAbs","_refreshOffsets","originalPosition","_generatePosition","originalPageX","originalPageY","_adjustOffsetFromHelper","_setContainment","_clear","dropBehaviour","prepareOffsets","_normalizeRightBottom","dragStart","margins","_getParentOffset","_getRelativeOffset","noPropagation","_convertPositionTo","_uiHash","dropped","drop","dragStop","helperIsFunction","helperProportions","_isRootNode","tagName","po","scrollIsRootNode","isUserScrollable","ce","relativeContainer","mod","constrainPosition","co","cancelHelperRemoval","draggable","uiSortable","sortables","isOver","_storedCSS","_helper","innermostIntersecting","_intersectsWith","containerCache","_parent","currentItem","fromOutside","_revert","_cursor","_opacity","scrollParentNotHidden","overflowOffset","scrolled","snapElements","$t","$o","inst","ts","bs","ls","x1","x2","y1","y2","snapping","release","snapItem","min","_zIndex","accept","activeClass","greedy","hoverClass","tolerance","deactivate","out","over","proportions","isover","isout","_addToManager","droppables","_splice","_activate","_deactivate","_over","_out","_drop","custom","childrenIntersection","droppable","intersect","isOverAxis","reference","toleranceMode","absolute","default","droppablesLoop","greedyChild","parentInstance","intersects","alsoResize","animateDuration","animateEasing","aspectRatio","autoHide","ghost","handles","maxHeight","minHeight","_num","_isNumber","_hasScroll","hname","_aspectRatio","originalElement","_proportionallyResizeElements","resizable","elementIsWrapper","marginBottom","originalResizeStyle","_proportionallyResize","se","sw","ne","nw","_handles","_renderAxis","padPos","padWrapper","mousedown","mouseover","resizing","wrapper","exp","capture","curleft","curtop","_renderProxy","originalSize","sizeDiff","originalMousePosition","_propagate","smp","dx","dy","_change","_updatePrevProperties","_updateVirtualBoundaries","shiftKey","_updateRatio","_respectSize","_updateCache","_applyChanges","pr","ista","soffseth","soffsetw","prevPosition","prevSize","forceAspectRatio","pMinWidth","pMaxWidth","pMinHeight","pMaxHeight","Infinity","_vBoundaries","cpos","csize","ismaxw","ismaxh","isminw","isminh","dw","dh","cw","ch","_getPaddingPlusBorderDimensions","widths","borders","paddings","prel","outerDimensions","elementOffset","cs","oc","containerElement","containerOffset","containerPosition","parentData","containerSize","woset","hoset","isParent","isOffsetRelative","cp","pRatio","cop","continueResize","ho","os","op","delta","sum","gridX","gridY","ox","oy","newWidth","newHeight","isMaxWidth","isMaxHeight","isMinWidth","isMinHeight","autoRefresh","selecting","unselected","unselecting","selectees","dragged","refresh","$this","$element","startselected","opos","selectee","ctrlKey","doSelect","hit","dropOnEmpty","forcePlaceholderSize","forceHelperSize","beforeStop","receive","_isOverAxis","_isFloating","overrideHandle","validHandle","reverting","_refreshItems","_removeCurrentsFromItems","noActivation","currentContainer","domPosition","_createPlaceholder","storedCursor","storedStylesheet","_storedOpacity","_storedZIndex","_preserveHelperProportions","containers","dragging","itemElement","intersection","lastPositionAbs","_intersectsWithPointer","direction","_intersectsWithSides","_rearrange","_contactContainers","_noFinalSort","_getItemsAsjQuery","connected","res","attribute","expression","dyClick","dxClick","isOverElementHeight","isOverElementWidth","isOverElement","forcePointerForContainers","floating","verticalDirection","_getDragVerticalDirection","horizontalDirection","_getDragHorizontalDirection","isOverBottomHalf","isOverRightHalf","_connectWith","addItems","queries","targetData","_queries","queriesLength","toleranceElement","refreshContainers","_createTrPlaceholder","sourceTr","targetTr","dist","itemWithLeastDistance","posProperty","sizeProperty","nearBottom","innermostContainer","innermostIndex","hardRefresh","counter","delayEvent","delayedTriggers","_inst","sender","collapsible","heightStyle","icons","activeHeader","beforeActivate","hideProps","borderTopWidth","borderBottomWidth","paddingTop","paddingBottom","showProps","prevShow","prevHide","_processPanels","panel","_createIcons","_destroyIcons","_setupEvents","_keydown","altKey","currentIndex","toFocus","_eventHandler","_panelKeyDown","prevHeaders","prevPanels","panels","_findActive","headerId","panelId","aria-selected","aria-expanded","aria-hidden","keydown","clicked","clickedIsActive","collapsing","toShow","toHide","eventData","oldHeader","oldPanel","newHeader","newPanel","_toggle","_animate","_toggleComplete","total","adjust","down","submenu","menus","role","activeMenu","mousedown .ui-menu-item","click .ui-menu-item","mouseenter .ui-menu-item","previousFilter","mouseleave .ui-menu","keepActiveItem","collapseAll","_closeOnDocumentClick","character","skip","previousPage","nextPage","_move","collapse","filterTimer","_filterMenuItems","icon","submenus","submenuCarat","_isDivider","_itemRole","listbox","nested","focused","_scrollIntoView","_close","_startOpening","borderTop","elementHeight","itemHeight","fromFocus","_open","currentMenu","startMenu","newItem","isFirstItem","isLastItem","escapedCharacter","regex","autoFocus","minLength","search","requestIndex","pending","suppressKeyPress","suppressKeyPressRepeat","suppressInput","isTextarea","isInput","isMultiLine","valueMethod","isNewMenu","_value","term","_searchTimeout","keypress","selectedItem","cancelBlur","searching","_initSource","_appendTo","menuElement","menufocus","label","liveRegion","menuselect","aria-live","aria-relevant","array","request","autocomplete","equalValues","menuVisible","modifierKey","_search","cancelSearch","_response","__response","_normalize","_suggest","ul","_renderMenu","_resizeMenu","_renderItemData","_renderItem","keyEvent","escapeRegex","messages","noResults","amount","message","lastActive","baseClasses","typeClasses","formResetHandler","radioGroup","radios","primary","secondary","_determineButtonType","hasTitle","buttonElement","toggleButton","keyup","_resetButton","ancestor","labelSelector","isDisabled","multipleIcons","buttonClasses","buttons","rtl","allButtons","existingButtons","markerClassName","maxRows","_widgetDatepicker","setDefaults","_attachDatepicker","_newInst","_connectDatepicker","_inlineDatepicker","selectedDay","selectedMonth","selectedYear","drawMonth","drawYear","_attachments","_doKeyDown","_doKeyPress","_doKeyUp","_autoSize","_disableDatepicker","_get","_showDatepicker","alt","title","_lastInput","_hideDatepicker","findMax","maxI","date","names","setMonth","setDate","getDay","_formatDate","divSpan","_setDate","_getDefaultDate","_updateDatepicker","_updateAlternate","_dialogDatepicker","browserWidth","browserHeight","scrollX","scrollY","_dialogInst","_dialogInput","_pos","clientHeight","blockUI","_destroyDatepicker","$target","_enableDatepicker","_getInst","_optionDatepicker","_getDateDatepicker","_getMinMaxDate","_changeDatepicker","_refreshDatepicker","_setDateDatepicker","noDefault","_setDateFromField","_getDate","dateStr","handled","_selectDay","_adjustDate","_clearDate","_gotoToday","chars","chr","_possibleChars","lastVal","parseDate","_getFormatConfig","beforeShowSettings","isFixed","_findPos","_checkOffset","_shouldFocusInput","_generateHTML","_attachHandlers","origyearshtml","numMonths","_getNumberOfMonths","cols","activeCell","yearshtml","dpWidth","dpHeight","inputWidth","inputHeight","viewWidth","viewHeight","postProcess","_tidyDialog","unblockUI","_checkExternalClick","period","_adjustInstDate","currentDay","currentMonth","currentYear","getDate","getMonth","getFullYear","_notifyChange","_selectMonthYear","month","year","_selectDate","formatDate","noWeekends","day","checkDate","getTime","floor","format","iFormat","dim","iValue","shortYearCutoffTemp","doy","literal","lookAhead","getNumber","isDoubled","minSize","digits","substring","getName","shortNames","longNames","pair","substr","checkLiteral","_ticksTo1970","_getDaysInMonth","_daylightSavingAdjust","ATOM","COOKIE","ISO_8601","RFC_822","RFC_850","RFC_1036","RFC_1123","RFC_2822","RSS","TICKS","TIMESTAMP","W3C","formatNumber","formatName","output","getYear","dates","_restrictMinMax","_determineDate","offsetNumeric","offsetString","newDate","setHours","setMinutes","setSeconds","setMilliseconds","getHours","noChange","clear","origMonth","origYear","today","selectDay","selectMonth","selectYear","maxDraw","gotoDate","controls","buttonPanel","dow","row","selectedDate","cornerClass","calender","daysInMonth","leadDays","curRows","numRows","printDate","dRow","daySettings","otherMonth","unselectable","tempDate","isMultiMonth","currentDate","_canAdjustMonth","_isInRange","_generateMonthYearHeader","_getFirstDayOfMonth","ceil","inMinYear","inMaxYear","years","thisYear","determineYear","endYear","monthHtml","onChange","minMax","curYear","curMonth","yearSplit","minYear","maxYear","initialized","otherArgs","dataSpace","autoOpen","closeOnEscape","dialogClass","modal","topOffset","beforeClose","resizeStart","resizeStop","sizeRelatedOptions","resizableRelatedOptions","originalCss","originalTitle","_createWrapper","uiDialog","_createTitlebar","_createButtonPane","_makeDraggable","_makeResizable","_isOpen","_trackFocus","_untrackInstance","_destroyOverlay","_focusedElement","opener","_hide","isOpen","moveToTop","_moveToTop","silent","moved","zIndices","zIndexMax","_focusTabbable","_size","_createOverlay","overlay","_show","_makeFocusTarget","uiDialogButtonPane","uiDialogTitlebarClose","_keepFocus","checkFocus","tabbables","aria-describedby","uiDialogTitle","uiDialogTitlebar","_title","aria-labelledby","uiButtonSet","_createButtons","buttonOptions","showText","filteredUi","resizeHandles","_minHeight","_trackingInstances","instances","exists","isVisible","resizableOptions","isDraggable","isResizable","nonContentHeight","minContentHeight","maxContentHeight","_allowInteraction","isOpening","overlays","oldValue","_constrainedValue","aria-valuemin","valueDiv","_refreshValue","newValue","indeterminate","_percentage","percentage","toFixed","overlayDiv","aria-valuemax","aria-valuenow","selectmenuId","ids","_drawButton","_drawMenu","aria-autocomplete","aria-owns","aria-haspopup","_setText","_resizeButton","_buttonEvents","menuItems","_refreshMenu","menuWrap","menuInstance","_setSelection","_select","focusIndex","_getSelectedItem","_parseOptions","_setAria","_toggleAttr","_documentClick","range","menuWidget","currentOptgroup","li","getSelection","removeAllRanges","addRange","rangeCount","getRangeAt","_selectFocusedItem","oldIndex","aria-activedescendant","orientation","slide","numPages","_keySliding","_mouseSliding","_animateOff","_handleIndex","_detectOrientation","_calculateNewMax","_createRange","_createHandles","handleCount","existingHandles","_valueMin","_handleEvents","normValue","closestHandle","mouseOverHandle","elementSize","_normValueFromMouse","_valueMax","thisDistance","_lastChangedValue","_start","_clickOffset","_slide","_stop","pixelTotal","pixelMouse","percentMouse","valueTotal","valueMouse","_trimAlignValue","uiHash","newVal","otherVal","newValues","allowed","vals","_values","valsLength","valModStep","alignValue","_precision","precision","_precisionOf","decimal","lastValPercent","valPercent","valueMin","valueMax","oRange","_set","curVal","culture","up","incremental","numberFormat","page","spin","_draw","_events","mousewheel","spinning","_spin","mousewheelTimer","mousedown .ui-spinner-button","_repeat","mouseup .ui-spinner-button","mouseenter .ui-spinner-button","mouseleave .ui-spinner-button","uiSpinner","_uiSpinnerHtml","_buttonHtml","steps","_adjustValue","_increment","aboveMin","prevValue","_parse","_format","Globalize","isValid","allowAny","stepUp","_stepUp","stepDown","_stepDown","pageUp","pages","pageDown","beforeLoad","_isLocal","anchor","anchorUrl","locationUrl","decodeURIComponent","running","_processTabs","_initialActive","tabs","anchors","locationHash","tab","_getPanelForTab","_tabKeydown","focusedTab","goingForward","_handlePageNav","activating","_focusNextTab","_panelKeydown","_findNextTab","constrain","lastTabIndex","_setupDisabled","_setupHeightStyle","_sanitizeSelector","lis","tablist","prevTabs","prevAnchors","_getList","anchorId","originalAriaControls","_createPanel","aria-controls","oldTab","newTab","_getIndex","_ajaxSettings","tooltipClass","track","_addDescribedBy","describedby","_removeDescribedBy","tooltips","_disable","tooltipData","_updateContent","_enable","blurEvent","_registerCloseHandlers","contentOption","positionOption","tooltip","delayedShow","a11yContent","_find","_tooltip","mousemove","fakeEvent","_removeTooltip","closing","hiding","clamp","allowEmpty","propTypes","stringParse","color","_rgba","stringParsers","parser","re","spaceName","space","spaces","colors","transparent","hue2rgb","stepHooks","rplusequals","execResult","Color","green","blue","alpha","red","hue","saturation","lightness","byte","degrees","supportElem","from","same","localCache","isCache","_space","used","transition","other","startColor","startValue","endValue","blend","opaque","rgb","toRgbaString","toHslaString","toHexString","includeAlpha","local","vtype","_hsla","hook","colorInit","borderColor","part","aqua","black","fuchsia","gray","lime","maroon","navy","olive","purple","silver","teal","white","yellow","getElementStyles","styleDifference","oldStyle","newStyle","shorthandStyles","classAnimationActions","borderBottom","borderLeft","borderRight","borderWidth","setAttr","animateClass","applyClassChange","baseClass","allAnimations","action","styleInfo","dfd","force","switchClass","_normalizeArguments","standardAnimationOption","save","restore","setMode","mode","getBaseline","createWrapper","fontSize","removeWrapper","setTransition","factor","cssUnit","effectMethod","baseEasings","Sine","Circ","Elastic","Back","Bounce","pow2","bounce","easeIn","blind","rpositivemotion","ref","ref2","motion","upAnim","downAnim","times","anims","queuelen","clip","vert","explode","childComplete","pieces","rows","cells","animComplete","mx","fade","fold","horizFirst","widthFirst","animation1","animation2","highlight","baseline","props0","props1","props2","cProps","vProps","hProps","zero","c_original","toRef","puff","pulsate","showhide","animateTo","shake","positiveMotion","transfer","targetFixed","fixTop","fixLeft","endPosition","startPosition","NUMPAD_ENTER","Timepicker","ampm","amNames","pmNames","timeFormat","timeSuffix","timeOnlyTitle","timeText","hourText","minuteText","secondText","millisecText","timezoneText","timeOnly","showHour","showMinute","showSecond","showMillisec","showTimezone","showTime","stepHour","stepMinute","stepSecond","stepMillisec","hour","minute","millisec","timezone","hourMin","minuteMin","secondMin","millisecMin","hourMax","minuteMax","secondMax","millisecMax","minDateTime","maxDateTime","hourGrid","minuteGrid","secondGrid","millisecGrid","alwaysSetTime","separator","altFieldTimeOnly","showTimepicker","timezoneIso8609","timezoneList","extendRemove","timepicker","$input","$altInput","$timeObj","hour_slider","minute_slider","second_slider","millisec_slider","timezone_select","hourMinOriginal","minuteMinOriginal","secondMinOriginal","millisecMinOriginal","hourMaxOriginal","minuteMaxOriginal","secondMaxOriginal","millisecMaxOriginal","formattedDate","formattedTime","formattedDateTime","tp_inst","inlineSettings","attrName","attrValue","eval","dp_inst","_updateDateTime","dateText","timeDefined","_addTimePicker","currDT","_parseTime","_limitMinMaxDateTime","_injectTimePicker","timeString","withDate","treg","regstr","_getPatternAmpm","_getFormatPositions","dp_dateFormat","specials","Number","tz","markers","finds","orders","$dp","secMax","dp_id","noDisplay","hourGridSize","minuteGridSize","secondGridSize","millisecGridSize","tmph","$tp","slider","_onTimeChange","borderCollapse","aph","_onSelectHandler","textAlign","$buttonPanel","onSelectDelegate","adjustSliders","dp_date","minDateTimeDate","getMinutes","getSeconds","getMilliseconds","maxDateTimeDate","hasChanged","_formatTime","inputEl","tmptime","_ampm","dt","dateFmt","formatCfg","timeAvailable","tmp_args","datetimepicker","_base_selectDate","stay_open","_base_updateDatepicker","_base_doKeyPress","dateChars","datetimeChars","_base_doKeyUp","log","_disableTimepickerDatepicker","_enableTimepickerDatepicker","_setTime","defaults","_setTimeDatepicker","tp_date","_base_setDateDatepicker","_base_getDateDatepicker","_base_parseDate","_base_formatDate","_base_optionDatepicker","onselect","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidMonth","invalidFormat","userInvalidated","iso","mb","suppressDeprecationWarnings","warn","ordinal","quarter","week","millisecond","_milliseconds","_days","_months","_bubble","valueOf","Ab","_d","setTime","hb","gb","fb","updateOffset","bc","cc","_lang","utc","isFinite","UTC","getUTCDate","bb","_a","_pf","tb","ub","sb","vb","wb","xb","yb","_overflowDayOfYear","_isValid","_strict","_isUTC","zone","_offset","abbr","zb","Bb","require","Fb","hc","dc","invalidDate","longDateFormat","Gb","lastIndex","Rb","Tb","Ub","Jb","Wb","Vb","Kb","Sb","Ib","Mb","_l","_meridiemParse","Pb","Nb","Ob","Lb","Hb","Qb","T","S","_b","monthsParse","_dayOfYear","parseTwoDigitYear","_isPm","isPM","_useUTC","_tzm","weekdaysParse","_w","invalidWeekday","GG","W","_week","gg","cb","dayOfYear","Q","Z","getUTCMonth","Y","setUTCMinutes","getUTCMinutes","_i","getUTCFullYear","R","_f","V","U","score","Xb","Zb","$b","createFromInputFallback","X","Cb","setFullYear","setUTCFullYear","relativeTime","ab","rb","ec","dd","dm","getUTCDay","db","invalid","preparse","isMoment","eb","ib","jb","kb","lb","ender","nb","qb","moment","ob","pb","_isAMomentObject","Db","Eb","Yb","ac","Milliseconds","Seconds","Minutes","Hours","Days","Months","Years","ms","DDD","dayofyear","isoweekday","isoweek","weekyear","isoweekyear","fc","gc","MMM","monthsShort","MMMM","months","weekdaysMin","ddd","weekdaysShort","dddd","weekdays","isoWeek","YY","YYYY","YYYYY","YYYYYY","weekYear","gggg","ggggg","isoWeekYear","GGGG","GGGGG","weekday","isoWeekday","meridiem","hours","minutes","seconds","milliseconds","SS","SSS","SSSS","ZZ","zoneAbbr","zz","zoneName","unix","ic","DDDD","_monthsShort","_monthsParse","_weekdays","_weekdaysShort","_weekdaysMin","_weekdaysParse","_longDateFormat","LT","LL","LLL","LLLL","_calendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","_relativeTime","future","past","mm","hh","MM","yy","pastFuture","_ordinal","postformat","_invalidDate","isDuration","defaultFormat","momentProperties","relativeTimeThreshold","_abbr","langData","normalizeUnits","parseZone","toDate","toISOString","isDSTShifted","parsingFlags","invalidAt","startOf","humanize","fromNow","isLeapYear","isDST","endOf","isAfter","isBefore","isSame","getTimezoneOffset","_changeInProgress","hasAlignedHourOffset","isoWeeksInYear","weeksInYear","days","weeks","isoWeeks","quarters","as","toIsoString","asSeconds","asMonths","1","2","3","4","5","6","7","8","9","0","Ù¡","Ù¢","Ù£","Ù¤","Ù¥","Ù¦","Ù§","Ù¨","Ù©","Ù ","70","80","20","50","100","10","30","60","90","১","২","৩","৪","৫","৬","à§","৮","৯","০","monthsNominativeEl","monthsGenitiveEl","_monthsGenitiveEl","_monthsNominativeEl","calendarEl","_calendarEl","ll","lll","llll","Û±","Û²","Û³","Û´","Ûµ","Û¶","Û·","Û¸","Û¹","Û°","१","२","३","४","५","६","à¥","८","९","०","nominative","accusative","ss","meridiemParse","words","correctGrammaticalCase","translate","genitive","config","eve","nt","nts","Raphael","_engine","hex","bezierBBox","isBBoxIntersect","findDotsAtSegment","t1","t2","_path2curve","segment1","segment2","bez1","bez2","ka","percents","totalOrigin","initstatus","ca","paper","customAttributes","ba","getRGB","Ia","Na","real","matrix","transform","getBBox","La","easing_formulas","la","timestamp","del","repeat","circle","rect","ellipse","was","_ISURL","NaN","-Infinity","aa","_availableAttrs","arrow-end","arrow-start","clip-rect","cx","cy","fill","fill-opacity","font","font-family","font-size","font-style","font-weight","gradient","letter-spacing","rx","ry","stroke","stroke-dasharray","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke-width","text-anchor","_availableAnimAttrs","da","ea","hs","rg","fa","ga","ha","ia","ja","_radial_gradient","ma","_rectPath","na","oa","_getPath","_getBBox","pa","mapPath","_g","SVGAngle","implementation","hasFeature","qa","ra","behavior","adj","vml","_Paper","_id","_oid","angle","atan2","rad","deg","snapTo","createUUID","setWindow","initWin","sa","createPopup","createTextRange","queryCommandValue","ta","ua","va","wa","xa","hsb2rgb","hsl2rgb","rgb2hsl","rgb2hsb","_path2string","_preload","hsb","hsl","getColor","parsePathString","ya","Aa","parseTransformString","ps","sleep","Ha","isPointInsideBBox","pathIntersection","pathIntersectionNumber","isPointInsidePath","pathBBox","_removedFactory","za","bbox","Ba","_pathToRelative","Ca","_pathToAbsolute","Da","Ea","Fa","tan","Ga","curve","bx","by","qx","qy","Ja","_parseDots","_tear","Ka","_tofront","_toback","_insertafter","_insertbefore","toMatrix","transformPath","_extractTransform","rotate","dirtyT","sx","sy","Ma","_equaliseTransform","_getContainer","pixelWidth","pixelHeight","pathToRelative","path2curve","toFilter","scalex","shear","scaley","acos","isSimple","isSuperSimple","noRotation","toTransformString","Oa","Pa","Qa","Ra","Sa","Ta","targetTouches","Ua","Va","touches","_drag","getElementByPoint","move_scope","Wa","unmousemove","unmouseup","end_scope","start_scope","Xa","Ya","shape","getData","mouseout","unhover","unmouseover","unmouseout","Za","onDragOver","undrag","unmousedown","__set__","setStart","setFinish","getSize","setSize","setViewBox","raphael","$a","elementFromPoint","getIntersectionList","raphaelid","getElementsByBBox","getElementsByPoint","isPointInside","realPath","removed","dirty","bboxwt","glow","offsetx","offsety","getTotalLength","getPointAtLength","getSubpath","getPath","<","<>","backIn","backOut","elastic","easeOut","easeInOut","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","paused","animateWith","onAnimation","pause","resume","exclude","registerFont","face","fonts","glyphs","getFont","normal","bold","lighter","bolder","print","descent","fullfill","ninja","st","block","classic","diamond","oval","setAttributeNS","webkitTapHighlightColor","defs","fy","gradientTransform","stop-color","stop-opacity","pathname","patternTransform","arrows","endPath","endMarker","startPath","startMarker","markerHeight","markerWidth","orient","refX","refY","xlink:href","startdx","enddx","-",".","-.","-..",". ","- ","--","- .","--.","--..","square","butt","clip-path","startString","endString","patternUnits","toFront","toBack","stdDeviation","_blur","preserveAspectRatio","_viewBox","xmlns","xmlns:xlink","_left","_top","renderfix","_vbSize","viewBox","getScreenCTM","createSVGMatrix","desc","fillpos","coordsize","rotation","coordorigin","fillsize","clipRect","textpath","fontFamily","fontStyle","weight","joinstyle","miterlimit","endcap","dashstyle","span","bbx","color2","focussize","focusposition","_viewBoxShift","skew","auxGetBBox","Path","textpathok","styleSheets","createStyleSheet","addRule","rvml","predicate","thisArg","kValue","replacement","allowPageScroll","swipe","swipeStatus","tap","a4","av","aN","bd","aB","excludedElements","aR","be","ag","aP","aJ","a1","aZ","aq","aQ","aj","fingers","aX","ai","au","pinchStatus","af","longTapThreshold","ao","a3","bh","am","bf","aH","a2","ar","a7","aL","al","aS","aM","aI","triggerOnTouchEnd","triggerOnTouchLeave","bg","aY","aC","ad","an","a6","aF","a9","aK","aD","ay","aA","aG","ah","aV","swipeLeft","swipeRight","swipeUp","swipeDown","a8","pinchIn","pinchOut","aW","doubleTapThreshold","doubleTap","longTap","threshold","cancelThreshold","aT","ae","pinchThreshold","maxTimeThreshold","preventDefaultEvents","aO","aU","ax","a0","a5","fingerReleaseThreshold","aw","aE","az","fallbackToMouseEvents","ak","msPointerEnabled","pointerEnabled","phases","PHASE_START","PHASE_MOVE","PHASE_END","PHASE_CANCEL","directions","IN","OUT","pageScroll","NONE","HORIZONTAL","VERTICAL","AUTO","ONE","TWO","THREE","ALL","safeAdd","lsw","bitRotateLeft","cnt","md5cmn","md5ff","md5gg","md5hh","md5ii","binlMD5","olda","oldb","oldc","oldd","binl2rstr","length32","rstr2binl","length8","charCodeAt","rstrMD5","rstrHMACMD5","bkey","ipad","opad","rstr2hex","hexTab","str2rstrUTF8","unescape","rawMD5","hexMD5","rawHMACMD5","hexHMACMD5","md5","origXHR","hasFlash","mimeTypes","origSend","__requestHeaders","__progress","__load","__url","__fileApiXHR","__isShim","formData","fileApiXHR","loaded","__total","lengthComputable","FileAPI","__hasFlash","wrapFileApi","__isWrapped","changeFnWrapper","evt","getFiles","isFileChange","HTMLInputElement","origAddEventListener","origAttachEvent","jsUrl","basePath","allScripts","jsPath","staticPath","constructEvent","_this","loadStarted","onabort","onloadstart","onloadend","onprogress","listener","readAsBinaryString","readAsDataURL","readAsText","minErr","template","templateArgs","toJson","isArrayLike","isString","iterator","sortedKeys","forEachSorted","reverseParams","iteratorFn","nextUid","digit","uid","setHashKey","$$hashKey","dst","int","inherit","identity","valueFn","isUndefined","isDefined","isObject","isNumber","isDate","isRegExp","isScope","$evalAsync","$watch","isFile","isBlob","isElement","includes","arrayRemove","destination","stackSource","stackDest","ngMinErr","shallowCopy","equals","o1","o2","keySet","csp","securityPolicy","isActive","querySelector","array1","array2","sliceArgs","startIndex","curryArgs","toJsonReplacer","pretty","fromJson","toBoolean","lowercase","startingTag","jqLite","elemHtml","tryDecodeURIComponent","parseKeyValue","keyValue","key_value","toKeyValue","arrayValue","encodeUriQuery","encodeUriSegment","pctEncodeSpaces","angularInit","bootstrap","appElement","NG_APP_CLASS_REGEXP","modules","doBootstrap","injector","$provide","createInjector","invoke","$apply","NG_DEFER_BOOTSTRAP","angular","resumeBootstrap","extraModules","snake_case","SNAKE_CASE_REGEXP","bindJQuery","JQLitePrototype","isolateScope","controller","inheritedData","jqLitePatchJQueryRemove","JQLite","assertArg","reason","assertArgFn","acceptArrayAnnotation","assertNotHasOwnProperty","bindFnToScope","lastInstance","getBlockElements","startNode","endNode","setupModuleLoader","ensure","$injectorMinErr","$$minErr","requires","configFn","invokeLater","provider","insertMethod","invokeQueue","moduleInstance","runBlocks","_invokeQueue","_runBlocks","service","constant","directive","publishExternalAPI","uppercase","callbacks","$$csp","angularModule","$LocaleProvider","$$sanitizeUri","$$SanitizeUriProvider","$CompileProvider","htmlAnchorDirective","inputDirective","textarea","formDirective","scriptDirective","selectDirective","styleDirective","optionDirective","ngBind","ngBindDirective","ngBindHtml","ngBindHtmlDirective","ngBindTemplate","ngBindTemplateDirective","ngClass","ngClassDirective","ngClassEven","ngClassEvenDirective","ngClassOdd","ngClassOddDirective","ngCloak","ngCloakDirective","ngController","ngControllerDirective","ngForm","ngFormDirective","ngHide","ngHideDirective","ngIf","ngIfDirective","ngInclude","ngIncludeDirective","ngInit","ngInitDirective","ngNonBindable","ngNonBindableDirective","ngPluralize","ngPluralizeDirective","ngRepeat","ngRepeatDirective","ngShow","ngShowDirective","ngStyle","ngStyleDirective","ngSwitch","ngSwitchDirective","ngSwitchWhen","ngSwitchWhenDirective","ngSwitchDefault","ngSwitchDefaultDirective","ngOptions","ngOptionsDirective","ngTransclude","ngTranscludeDirective","ngModel","ngModelDirective","ngList","ngListDirective","ngChange","ngChangeDirective","required","requiredDirective","ngRequired","ngValue","ngValueDirective","ngIncludeFillContentDirective","ngAttributeAliasDirectives","ngEventDirectives","$anchorScroll","$AnchorScrollProvider","$animate","$AnimateProvider","$browser","$BrowserProvider","$cacheFactory","$CacheFactoryProvider","$controller","$ControllerProvider","$document","$DocumentProvider","$exceptionHandler","$ExceptionHandlerProvider","$filter","$FilterProvider","$interpolate","$InterpolateProvider","$interval","$IntervalProvider","$http","$HttpProvider","$httpBackend","$HttpBackendProvider","$location","$LocationProvider","$log","$LogProvider","$parse","$ParseProvider","$rootScope","$RootScopeProvider","$q","$QProvider","$sce","$SceProvider","$sceDelegate","$SceDelegateProvider","$sniffer","$SnifferProvider","$templateCache","$TemplateCacheProvider","$timeout","$TimeoutProvider","$window","$WindowProvider","$$rAF","$$RAFProvider","$$asyncCallback","$$AsyncCallbackProvider","jqNextId","jqId","SPECIAL_CHARS_REGEXP","MOZ_HACK_REGEXP","dispatchThis","filterElems","getterIfNoArguments","removePatch","setIndex","setLength","childIndex","childLength","fireEvent","originalJqFn","$original","jqLiteIsTextNode","HTML_REGEXP","jqLiteBuildFragment","jj","TAG_NAME_REGEXP","XHTML_TAG_REGEXP","jqLiteParseHTML","SINGLE_TAG_REGEXP","jqLiteMinErr","jqLiteAddNodes","jqLiteClone","jqLiteDealoc","jqLiteRemoveData","jqLiteOff","unsupported","jqLiteExpandoStore","eventHandler","removeEventListenerFn","expandoId","ng339","expandoStore","jqCache","$destroy","jqLiteData","isSetter","keyDefined","isSimpleGetter","jqLiteHasClass","jqLiteRemoveClass","cssClasses","cssClass","jqLiteAddClass","existingClasses","jqLiteController","jqLiteInheritedData","ii","jqLiteEmpty","getBooleanAttrName","booleanAttr","BOOLEAN_ATTR","BOOLEAN_ELEMENTS","createEventHandler","prevent","msie","hashKey","nextUidFn","objType","HashMap","isolatedUid","put","annotate","$inject","fnText","argDecl","STRIP_COMMENTS","FN_ARGS","FN_ARG_SPLIT","FN_ARG","underscore","modulesToLoad","supportObject","provider_","providerInjector","instantiate","$get","providerCache","providerSuffix","factoryFn","$injector","instanceCache","decorator","serviceName","decorFn","origProvider","orig$get","origInstance","instanceInjector","$delegate","loadModules","moduleFn","loadedModules","invokeArgs","createInternalInjector","getService","INSTANTIATING","locals","Type","returnedValue","Constructor","servicename","autoScrollingEnabled","disableAutoScrolling","getFirstAnchor","elm","scrollIntoView","supported","Browser","completeOutstandingRequest","outstandingRequestCount","outstandingRequestCallbacks","startPoller","pollFns","pollFn","pollTimeout","fireUrlChange","newLocation","lastBrowserUrl","urlChangeListeners","rawDocument","pendingDeferIds","isMock","$$completeOutstandingRequest","$$incOutstandingRequestCount","notifyWhenNoOutstandingRequests","addPollFn","baseElement","replaceState","urlChangeInit","onUrlChange","baseHref","lastCookies","lastCookieString","cookiePath","cookies","cookieLength","cookieArray","escape","timeoutId","deferId","cacheFactory","cacheId","entry","freshEnd","staleEnd","nextEntry","prevEntry","caches","stats","capacity","MAX_VALUE","lruHash","lruEntry","removeAll","info","$$sanitizeUriProvider","hasDirectives","Suffix","COMMENT_DIRECTIVE_REGEXP","CLASS_DIRECTIVE_REGEXP","EVENT_HANDLER_ATTR_REGEXP","registerDirective","directiveFactory","directives","priority","restrict","aHrefSanitizationWhitelist","regexp","imgSrcSanitizationWhitelist","$compileNodes","transcludeFn","maxPriority","ignoreDirective","previousCompileContext","compositeLinkFn","compileNodes","safeAddClass","cloneConnectFn","transcludeControllers","parentBoundTranscludeFn","$linkNode","nodeList","$rootElement","nodeLinkFn","childLinkFn","$node","childScope","childBoundTranscludeFn","nodeListLength","stableNodeList","linkFns","$new","transcludeOnThisElement","createBoundTranscludeFn","transclude","templateOnThisElement","linkFnFound","Attributes","collectDirectives","applyDirectivesToNode","terminal","previousBoundTranscludeFn","transcludedScope","cloneFn","controllers","scopeCreated","$$transcluded","attrsMap","$attr","addDirective","directiveNormalize","nodeName_","nName","ngAttrName","isNgAttr","nAttrs","attrStartName","attrEndName","NG_ATTR_BINDING","addAttrInterpolateDirective","addTextInterpolateDirective","byPriority","groupScan","attrStart","attrEnd","hasAttribute","$compileMinErr","groupElementsLinkFnWrapper","linkFn","compileNode","templateAttrs","jqCollection","originalReplaceDirective","preLinkFns","postLinkFns","addLinkFns","pre","post","directiveName","newIsolateScopeDirective","$$isolateScope","cloneAndAnnotateFn","getControllers","elementControllers","retrievalMethod","optional","linkNode","boundTranscludeFn","controllersBoundTransclude","cloneAttachFn","hasElementTranscludeDirective","$$element","LOCAL_REGEXP","templateDirective","$$originalDirective","definition","scopeName","lastValue","parentGet","parentSet","$$isolateBindings","$observe","$$observers","$$scope","assign","parentValue","controllerDirectives","controllerInstance","$scope","$attrs","$transclude","controllerAs","scopeToChild","templateUrl","newScopeDirective","$template","directiveValue","terminalPriority","nonTlbTranscludeDirective","hasTranscludeDirective","hasTemplate","$compileNode","replaceDirective","childTranscludeFn","$$start","$$end","assertNoDuplicate","$$tlb","denormalizeTemplate","newTemplateAttrs","templateDirectives","unprocessedDirectives","markDirectivesAsIsolate","mergeTemplateAttributes","compileTemplateUrl","tDirectives","startAttrName","endAttrName","srcAttr","dstAttr","$set","tAttrs","afterTemplateNodeLinkFn","afterTemplateChildLinkFn","linkQueue","beforeTemplateCompileNode","origAsyncDirective","derivedSyncDirective","getTrustedResourceUrl","tempTemplateAttrs","beforeTemplateLinkNode","linkRootElement","oldClasses","ignoreChildLinkFn","rootElement","previousDirective","interpolateFn","templateNode","hasCompileParent","getTrustedContext","attrNormalizedName","HTML","RESOURCE_URL","$$inter","$updateClass","elementsToRemove","newNode","firstElementToRemove","removeCount","j2","kk","annotation","$normalize","$addClass","classVal","$removeClass","newClasses","toAdd","tokenDifference","toRemove","setClass","writeAttr","booleanKey","startSymbol","endSymbol","PREFIX_REGEXP","str1","str2","tokens1","tokens2","outer","CNTRL_REG","register","exception","cause","parseHeaders","line","headersGetter","headersObj","transformData","JSON_START","JSON_END","PROTECTION_PREFIX","CONTENT_TYPE_APPLICATION_JSON","Content-Type","transformResponse","transformRequest","common","Accept","patch","xsrfCookieName","xsrfHeaderName","interceptorFactories","interceptors","responseInterceptorFactories","responseInterceptors","requestConfig","resp","mergeHeaders","execHeaders","headerContent","headerFn","defHeaderName","lowercaseDefHeaderName","reqHeaderName","defHeaders","reqHeaders","defaultHeadersIteration","serverRequest","reqData","sendReq","chain","reversedInterceptors","interceptor","requestError","responseError","thenFn","rejectFn","createShortMethods","createShortMethodsWithData","headersString","resolvePromise","$$phase","removePendingReq","pendingRequests","cachedResp","buildUrl","defaultCache","xsrfValue","urlIsSameOrigin","interceptorFactory","responseFn","createXhr","createHttpBackend","$browserDefer","jsonpReq","callbackId","called","addEventListenerFn","ABORTED","timeoutRequest","jsonpDone","completeRequest","urlResolve","mustHaveExpression","trustedContext","endIndex","hasInterpolation","startSymbolLength","endSymbolLength","$interpolateMinErr","getTrusted","newErr","invokeApply","iteration","skipApply","$$intervalId","intervals","NUMBER_FORMATS","DECIMAL_SEP","GROUP_SEP","PATTERNS","minInt","minFrac","maxFrac","posPre","posSuf","negPre","negSuf","gSize","lgSize","CURRENCY_SYM","DATETIME_FORMATS","MONTH","SHORTMONTH","DAY","SHORTDAY","AMPMS","medium","short","fullDate","longDate","mediumDate","shortDate","mediumTime","shortTime","pluralCat","encodePath","segments","parseAbsoluteUrl","absoluteUrl","locationObj","appBase","parsedUrl","$$protocol","$$host","hostname","$$port","port","DEFAULT_PORTS","parseAppUrl","relativeUrl","prefixed","$$path","$$search","$$hash","beginsWith","begin","whole","stripHash","stripFile","lastIndexOf","serverBase","LocationHtml5Url","basePrefix","$$html5","appBaseNoFile","$$parse","pathUrl","$locationMinErr","$$compose","$$url","$$absUrl","$$rewrite","appUrl","prevAppUrl","LocationHashbangUrl","hashPrefix","removeWindowsDriveName","firstPathSegmentMatch","windowsFilePathExp","withoutBaseUrl","withoutHashUrl","LocationHashbangInHtml5Url","locationGetter","locationGetterSetter","preprocess","html5Mode","afterLocationChange","oldUrl","$broadcast","absUrl","LocationMode","initialUrl","absHref","animVal","rewrittenUrl","newUrl","$digest","changeCounter","currentReplace","$$replace","debugEnabled","formatError","sourceURL","consoleLog","logFn","hasApply","arg1","arg2","ensureSafeMemberName","fullExpression","$parseMinErr","ensureSafeObject","ensureSafeFunction","CALL","APPLY","BIND","setValue","fullExp","propertyObj","unwrapPromises","promiseWarning","$$v","cspSafeGetterFn","key0","key1","key2","key3","key4","pathVal","simpleGetterFn1","simpleGetterFn2","getterFn","getterFnCache","pathKeys","pathKeysLength","evaledFnGetter","$parseOptions","logPromiseWarnings","promiseWarningCache","parsedExpression","lexer","Lexer","Parser","qFactory","nextTick","exceptionHandler","defaultCallback","defaultErrback","promises","createInternalRejectedPromise","errback","progressback","wrappedCallback","wrappedErrback","wrappedProgressback","catch","finally","makePromise","resolved","handleCallback","isResolved","callbackOutput","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","webkitCancelRequestAnimationFrame","rafSupported","raf","TTL","$rootScopeMinErr","lastDirtyWatch","digestTtl","Scope","$id","$parent","$$watchers","$$nextSibling","$$prevSibling","$$childHead","$$childTail","$root","$$destroyed","$$asyncQueue","$$postDigestQueue","$$listeners","$$listenerCount","beginPhase","phase","clearPhase","compileToFn","decrementListenerCount","initWatchVal","isolate","$$childScopeClass","watchExp","objectEquality","watcher","listenFn","oldVal","originalFn","$watchCollection","$watchCollectionWatch","objGetter","newLength","internalArray","oldLength","changeDetected","bothNaN","internalObject","$watchCollectionAction","initRun","veryOldValue","trackVeryOldValue","watch","watchers","logIdx","logMsg","asyncTask","asyncQueue","postDigestQueue","ttl","watchLog","$eval","traverseScopesLoop","$on","$$postDigest","namedListeners","$emit","targetScope","listenerArgs","currentScope","uri","isImage","normalizedVal","escapeForRegexp","adjustMatcher","$sceMinErr","adjustMatchers","adjustedMatchers","SCE_CONTEXTS","resourceUrlWhitelist","resourceUrlBlacklist","matchUrl","isResourceUrlAllowedByPolicy","generateHolderType","Base","holderType","trustedValue","$$unwrapTrustedValue","trustAs","byType","maybeTrusted","trustedValueHolderBase","htmlSanitizer","CSS","URL","JS","msieDocumentMode","sce","isEnabled","parseAs","enumValue","lName","vendorPrefix","eventSupport","android","boxee","vendorRegex","bodyStyle","transitions","animations","webkitTransition","webkitAnimation","divElm","deferreds","$$timeoutId","urlParsingNode","requestUrl","originUrl","currencyFilter","dateFilter","filterFilter","jsonFilter","limitToFilter","lowercaseFilter","numberFilter","orderByFilter","uppercaseFilter","comparator","comparatorType","predicates","objKey","filtered","$locale","formats","currencySymbol","number","fractionSize","groupSep","decimalSep","isNegative","numStr","formatedText","hasExponent","fractionLen","fraction","lgroup","padNumber","neg","dateGetter","dateStrGetter","shortForm","timeZoneGetter","paddedZone","ampmGetter","jsonStringToDate","R_ISO8601_STR","tzHour","tzMin","dateSetter","timeSetter","setUTCHours","NUMBER_STRING","DATE_FORMATS_SPLIT","DATE_FORMATS","limit","sortPredicate","reverseOrder","comp","reverseComparator","descending","v1","v2","arrayCopy","ngDirective","FormController","toggleValidCss","validationErrorKey","INVALID_CLASS","VALID_CLASS","parentForm","nullFormCtrl","invalidCount","errors","$error","$name","$dirty","$pristine","$valid","$invalid","$addControl","PRISTINE_CLASS","control","$removeControl","validationToken","$setValidity","$setDirty","DIRTY_CLASS","$setPristine","validate","ctrl","validatorName","validity","testFlags","flags","addNativeHtml5Validators","badFlags","ignoreFlags","$$hasNativeValidators","validator","$parsers","textInputType","VALIDITY_STATE_PROPERTY","noevent","$$validityState","composing","ev","ngTrim","revalidate","$viewValue","$setViewValue","deferListener","$render","$isEmpty","patternValidator","ngPattern","validateRegex","patternObj","$formatters","ngMinlength","minlength","minLengthValidator","ngMaxlength","maxlength","maxLengthValidator","numberInputType","NUMBER_REGEXP","numberBadFlags","minValidator","maxValidator","urlInputType","urlValidator","URL_REGEXP","emailInputType","emailValidator","EMAIL_REGEXP","radioInputType","checkboxInputType","trueValue","ngTrueValue","falseValue","ngFalseValue","classDirective","arrayDifference","arrayClasses","digestClassCounts","removeClasses","classCounts","classesToUpdate","updateClasses","ngClassWatchAction","$index","old$index","manualLowercase","manualUppercase","full","major","minor","dot","codeName","lowercasedName","getNamedItem","textProp","NODE_TYPE_TEXT_PROPERTY","$dv","multiple","nodeCount","dealoc","onFn","eventFns","replaceNode","wrapNode","newElement","classCondition","nextElementSibling","arg3","$animateMinErr","$$selectors","classNameFilter","$$classNameFilter","enter","leave","move","PATH_MATCH","http","https","ftp","paramValue","OPERATORS","null","true","false","/","%","^","=","===","!==","==","!=","<=",">=","&&","||","&","|","!","'","\"","lex","lastCh","readString","peek","readNumber","isIdent","readIdent","isWhitespace","ch2","ch3","fn2","fn3","throwError","isExpOperator","colStr","peekCh","lastDot","peekIndex","methodName","ident","quote","rawString","rep","ZERO","statements","expect","filterChain","consume","arrayDeclaration","functionCall","objectIndex","fieldAccess","peekToken","e1","e2","e3","e4","unaryFn","ternaryFn","middle","binaryFn","statement","argsFn","fnInvoke","assignment","ternary","logicalOR","logicalAND","equality","relational","additive","multiplicative","unary","field","indexFn","contextGetter","fnPtr","elementFns","allConstant","elementFn","keyValues","yyyy","HH","sss","EEEE","EEE","xlinkHref","normalized","formDirectiveFactory","isNgForm","formElement","preventDefaultListener","parentFormCtrl","alias","inputType","email","NgModelController","$modelValue","$viewChangeListeners","ngModelGet","ngModelSet","formatters","ctrls","modelCtrl","formCtrl","viewValue","CONSTANT_VALUE_REGEXP","tpl","tplAttr","templateElement","getStringValue","getTrustedHtml","$event","previousElements","srcExp","onloadExp","autoScrollExp","autoscroll","previousElement","currentElement","cleanupLastIncludeContent","parseAsResourceUrl","afterAnimation","thisChangeId","newScope","$compile","BRACE","numberExp","whenExp","whens","whensExpFns","isWhen","attributeName","getBlockStart","getBlockEnd","NG_REMOVED","ngRepeatMinErr","trackByExp","trackByExpGetter","trackByIdExpFn","trackByIdArrayFn","trackByIdObjFn","lhs","rhs","valueIdentifier","keyIdentifier","hashFnLocals","lastBlockMap","nextNode","arrayLength","trackById","trackByIdFn","collectionKeys","previousNode","nextBlockMap","nextBlockOrder","$first","$last","$middle","$odd","$even","newStyles","oldStyles","cases","ngSwitchController","watchExpr","selectedTranscludes","selectedElements","selectedScopes","selectedTransclude","selectedScope","caseElement","ngOptionsMinErr","NG_OPTIONS_REGEXP","nullModelCtrl","nullOption","unknownOption","optionsMap","ngModelCtrl","databound","ngModelCtrl_","nullOption_","unknownOption_","addOption","removeOption","hasOption","renderUnknownOption","unknownVal","setupAsSingle","selectElement","selectCtrl","emptyOption","setupAsMultiple","lastView","setupAsOptions","render","optionGroupName","optionGroup","existingParent","existingOptions","existingOption","groupLength","groupIndex","lastElement","optionGroups","optionGroupNames","modelValue","valuesFn","keyName","selectedSet","trackFn","trackIndex","valueName","groupByFn","modelCast","displayFn","optionGroupsCache","optGroupTemplate","optionTemplate","optionsExp","optionElement","nullSelectCtrl","selectCtrlName","angularFileUpload","sendHttp","ArrayBuffer","__XHR","origThen","formDataAppender","fileFormName","fileFormDataName","isFileFormNameString","fileList","$files","dataTransfer","$RouteProvider","pathRegExp","insensitive","caseInsensitiveMatch","originalPath","slash","star","routes","route","reloadOnSearch","redirectPath","redirectTo","otherwise","$routeParams","switchRouteMatcher","updateRoute","parseRoute","$route","$$route","pathParams","forceReload","interpolate","loadedTemplateUrl","segment","segmentMatch","reload","$RouteParamsProvider","ngViewFactory","cleanupLastView","ngViewFillContentFactory","ngRouteModule","shallowClearAndCopy","$resourceMinErr","MEMBER_NAME_REGEX","Route","urlParams","resourceFactory","paramDefaults","actions","extractParams","actionParams","defaultResponseInterceptor","resource","Resource","DEFAULT_ACTIONS","hasBody","isInstanceCall","httpConfig","responseInterceptor","responseErrorInterceptor","setUrlParams","$promise","$resolved","Resource.bind","additionalParamDefaults","query","delete","actionUrl","encodedVal","urlParam","p1","leadingSlashes","tail","sanitizeText","buf","htmlSanitizeWriter","makeMap","htmlParser","parseStartTag","rest","blockElements","inlineElements","parseEndTag","optionalEndTagElements","voidElements","ATTR_REGEXP","doubleQuotedValue","singleQuotedValue","unquotedValue","decodeEntities","stack.last","specialElements","COMMENT_REGEXP","CDATA_REGEXP","comment","DOCTYPE_REGEXP","BEGING_END_TAGE_REGEXP","END_TAG_REGEXP","BEGIN_TAG_REGEXP","START_TAG_REGEXP","$sanitizeMinErr","spaceRe","spaceBefore","spaceAfter","hiddenPre","encodeEntities","NON_ALPHANUMERIC_REGEXP","uriValidator","ignore","validElements","lkey","validAttrs","uriAttrs","optionalEndTagBlockElements","optionalEndTagInlineElements","$SanitizeProvider","$sanitize","LINKY_URL_REGEXP","MAILTO_REGEXP","addText","addLink","browserCookies","updated","lastBrowserCookies","runEval","currentCookies","$cookies","bod","$animateProvider","extractElementNode","ELEMENT_NODE","stripCommentsFromElement","isMatchingElement","elm1","elm2","NG_ANIMATE_STATE","NG_ANIMATE_CLASS_NAME","rootAnimateState","lookup","flagMap","klass","selectorFactoryName","animationRunner","animationEvent","registerAnimation","animationFactory","afterFn","beforeFn","cancellations","allCompleteFn","afterAnimationComplete","classNameAdd","classNameRemove","isSetClassOperation","isClassBased","currentClassName","isAnimatableClassName","beforeComplete","beforeCancel","afterComplete","afterCancel","animationLookup","cancelFn","performAnimation","afterElement","domOperation","doneCallback","fireDOMCallback","animationPhase","elementEvents","fireBeforeCallbackAsync","fireAfterCallbackAsync","fireDoneCallbackAsync","fireDOMOperation","hasBeenRun","closeAnimation","runner","cleanup","localAnimationCount","ngAnimateState","runningAnimations","totalActiveAnimations","totalActive","lastAnimation","animationsDisabled","skipAnimation","animationsToCancel","operation","activeLeaveAnimation","globalAnimationCounter","cancelled","cancelChildAnimations","structural","removeAnimations","isRoot","$$animateReflow","afterReflow","cancelAnimationReflow","animationReflowQueue","lookupCache","animationCloseHandler","totalTime","animationElementQueue","futureTimestamp","closingTimestamp","closingTimer","closeAllAnimations","elementData","NG_ANIMATE_CSS_DATA_KEY","closeAnimationFn","getElementAnimationDetails","cacheKey","transitionDelayStyle","animationDelayStyle","transitionDurationStyle","transitionPropertyStyle","transitionDuration","transitionDelay","animationDuration","animationDelay","elementStyles","TRANSITION_PROP","DURATION_KEY","parseMaxTime","PROPERTY_KEY","DELAY_KEY","ANIMATION_PROP","aDuration","ANIMATION_ITERATION_COUNT_KEY","maxValue","getCacheKey","parentID","NG_ANIMATE_PARENT_KEY","parentCounter","animateSetup","calculationDecorator","eventCacheKey","itemIndex","stagger","staggerClassName","staggerCacheKey","applyClasses","formerData","timings","isCurrentlyAnimating","blockTransitions","blockKeyframeAnimations","isStructuralAnimation","isAnimating","NG_ANIMATE_BLOCK_CLASS_NAME","unblockTransitions","unblockKeyframeAnimations","animateRun","activeAnimationComplete","onEnd","css3AnimationEvents","onAnimationProgress","activeClassName","animateClose","appliedStyles","removeProperty","$manualTimeStamp","elapsedTime","ELAPSED_TIME_MAX_DECIMAL_PLACES","maxDelayTime","maxDuration","maxDelay","ONE_SECOND","ANIMATIONEND_EVENT","TRANSITIONEND_EVENT","propertyStyle","CSS_PREFIX","delayStyle","prepareStaggerDelay","staggerTime","animationTime","CLOSING_TIME_BUFFER","staggerDelay","animateBefore","animateAfter","animationComplete","preReflowCancellation","suffixClasses","ontransitionend","onwebkittransitionend","onanimationend","onwebkitanimationend","animationCompleted","beforeSetClass","cancellationMethod","beforeAddClass","beforeRemoveClass","PLURAL_CATEGORY","FEW","MANY","OTHER","macFrac","AgrimarketApp","AgrimarketFactories","AgrimarketDirectives","AgrimarketServices","AgrimarketControllers","mobileAndTabletcheck","vendor","redirectToMobile","urlIndex","urlMobile","newHref","urlSplitted","rejection","getItem","isLogged","$routeProvider","$httpProvider","useXDomain","/backdoor/","requireLogin","/backdoor/profile","/siteUnavailable","/login/","/loginHash/:paramForLoginHash?/:hashForLoginHash?/:page?/:showMenu?/:idLanguage?","/loginEditMode/:redirect?","/refresh/","/loginCerelio/:loginTiers?/:jeton?","/loginUAC/:loginTiers?/:jeton?/:AdresseIpSlc?","/access/:paramConnectorUrlReferrer?/:hideMenu?","/loginOuifield","/loginConnectorSso/:token?/:param?/:page?/:showMenu?","/UnsubscribeNewsMarketInfo/","/disconnect","/validateCGU","/disableSubscription","/user/commitments/view/:commitmentView","colonnesTypeCommitments","userTableService","GetById","colonnesContractTypeCommitmentAndProduct","colonnesContractProduct","colonnesContractTypeCommitment","colonnesListFixationsByIdCommitment","/user/commitmentsAll","colonnesCropProductTonnages","/resetPassword/:keyPassword?","/user/offers/view/:typeOffer/:idContractCommitment?/:quantity?/:targetPrice?/:idTypeFixationOnlyTargetPrice?/:idFirstComponentContractOrContractBase?","colonnesOffersFirmUser","colonnesOffersFirmTc","colonnesOffersCommitmentUser","colonnesOffersCommitmentTc","colonnesOffersOptionUser","colonnesOffersOptionTc","colonnesOffersBlankContract","colonnesOffersCommitmentSurfaceUser","colonnesOffersCommitmentSurfaceTc","colonnesOffersMultiCropsUser","colonnesOffersMultiCropsTc","/admin/offers/:idStatus?","/user/subscribe/contractBase/:idContractCommitment?/:idContractFuture?/:quantity?/:targetPrice?","colonnesContractFutureCompatibles","/user/subscribe/contractFirm/:idContractCommitment?/:idTypeFixation?/:idContractBase?/:quantity?/:targetPrice?","colonnesContractBaseCompatibles","/user/subscribe/contractCommitment","/user/subscribe/contractSurfaceCommitment","/user/subscribe/contractoption","colonnesStrikeOption","/user/subscribe/contractBlank","/user/subscribe/contractMultiCrops","/user/contracts/firm/view/:typeContract","colonnesValidated","colonnesPriced","colonnesCanceled","colonnesPending","colonnesDelayedSigning","/user/contracts/commitment/view/:typeContract","colonnesContractsCommitmentValidated","/user/contracts/surfaceCommitment/view/:typeContract","colonnesContractsSurfaceCommitmentValidated","/user/contracts/base/view/:typeContract","colonnesContractsBaseValidated","colonnesContractsBasePending","colonnesContractsBasePriced","colonnesContractsBaseCanceled","/user/contracts/option/view/:typeContract","colonnesContractsOptionExpired","colonnesContractsOptionPending","/user/supply/delivery","colonnes","/user/supply/commands/:idExtCommand?","/user/supply/request/asking","colonnesCart","/user/supply/request/asked","/user/smsalert","/admin/offer/createoffer/:idoffer","/admin/offer/dupliquer/:idoffer","/admin/offer/builtPriceManager/:idoffer","/admin/contracts/firm/view/:typeContract","colonnesValidatedNotCover","colonnesValidatedCovered","colonnesValidatedPendingCover","colonnesPricedNotCover","colonnesPricedPendingCover","colonnesPendingNotCover","colonnesPendingCovered","colonnesPendingPendingCover","colonnesToValidated","columnsDelayedSigning","/admin/contracts/builtPrice/view/:typeContract","colonnesContractsSubscription","colonnesContractsObservation","colonnesContractsFixed","colonnesContractsCanceled","/admin/contracts/commitment/view/:typeContract","/admin/contracts/surfaceCommitment/view/:typeContract","/admin/contracts/base/view/:typeContract","/admin/contracts/option/view/:typeContract","colonnesContractsOptionDetails","/admin/editorial/view/mails/:idLanguage?/:viewMode?","/admin/editorial/view/contracts/:idLanguage?","/admin/editorial/comMarketInfo/:msgConf?","colonnesCommunicationMarketInfo","/admin/editorial/saveComMarketInfo/:id?","/admin/editorial/alertMail","colonnesAlertMail","/admin/editorial/createAlertMail/:idAlertMail","/admin/editorial/duplicateAlertMail/:idAlertMail","/admin/contents/notifications","colonnesNotifications","/admin/contents/saveNotification/:idNotification?","/admin/editorial/editionMobile","/admin/editorial/editTemplateContract/:idtemplate","/admin/editorial/editTemplateMail/:idTypeTemplateMail/:idRole/:idLanguage/:viewMode?","/admin/parameters/crops","/admin/parameters/global","/admin/parameters/products","/admin/parameters/homePageApplicationMobiles","/admin/parameters/compagnies","/admin/parameters/closeDay","/admin/routing/cover/view/:typeView","/admin/routing/portfolio/view/:typeView","contractsColumns","ordersColumns","/admin/dataManagment/weatherData","colonnesAccuWeatherCall","/admin/parameters/conditions/view/:typeView","/admin/parameters/categoryoffer","/admin/contents/quotes","/admin/manage/users","/admin/manage/groupusers","/admin/manage/tc","/admin/manage/admins","/tc/manage/users","/tc/contracts/firm/view/:typeContract","columnsValidated","columnsPriced","columnsCanceled","columnsPending","/tc/contracts/base/view/:typeContract","/tc/contracts/commitment/view/:typeContract","/tc/contracts/surfaceCommitment/view/:typeContract","/user/dashboard","/tc/dashboard","/user/userManagement/:typeTab?","/user/accounts/outstandings","/user/accounts/bills","/user/accounts/accountStatement","/admin/contents/news/","/admin/contents/news/saveNews/:idnews","/admin/contents/fluxrss/","/admin/contents/video/","/admin/contents/content/","/admin/contents/content/savePage/:indexMenu/:indexPage","/user/content/:IdMenu?/:IdPage","/tc/content/:IdMenu?/:IdPage","/admin/contents/infoMarketHashtagri/view/:typeView","/admin/contents/infoMarketHashtagri/saveContentInfoMarket/:idWritingContentInfoMarket","/admin/contents/carouselpicture/","/admin/ceremisDashboard","/admin/contents/contacts","/user/contributions/","/user/documents/","/user/marketinfos/","/user/redirectOnOuiField/","/common/messenger/reception/","colonnesMessageSended","colonnesMessageReceived","/common/messenger/sended/","/common/messenger/read/:IdMessage","/common/messenger/newmessage/:IdMessage?","/common/quotes/:withBtnBack?","colonnesQuote","colonnesQuoteWithoutRealTime","/tc/nomoduleactivated","/testsocket/:ActionToOrder","currentUserFactory","configurationFactory","messengerService","enumFactory","buildReactAppUrl","strParams","trustAsResourceUrl","ex","User","idUser","IdClientSelectedFromTc","IdUser","idCrop","crop","IdCrop","idConnection","idConnectionLogged","reactTitle","isTcSigningForUser","IdRole","Roles","TC","goToDelayedSigning","idContractForDelayedSigning","idContract","idTypeContract","TypeContract","Ferme","ContratVierge","idOfferSelected","idOffer","idExpirySelected","idOfferExpiry","idTypeOrderSelected","isSold","TypeOrders","Vente","IdTypeOrder","Prixobjectif","idTypeCommitmentSelected","Url","Mobile","Index","googleAnalytics","gtag","page_title","page_location","page_path","goTo","goToEditMode","redirect","DefaultUserEditionMode","goToEditModeTc","DefaultTcEditionMode","getPagesByKey","editableMenus","Key","PagesEditableVms","getValueByKey","Label","getPageValueByKey","keyMenu","keyPage","rv","appName","firstLoad","currentPath","refreshCotations","Role","Modules","ModuleMessagerie","Active","GetNbMessage","nbmessage","newPath","Connection","Parameters","EditableObjects","icoVisible","getItemByKey","getIsVisibleByKey","IsVisible","getContentByKey","IdTypeEditableObject","ButtonCancel","Content","ButtonConfirm","getIdTypeEditableObjectByKey","coops","Ducroquet","Uneal","Nutrinor","Prograin","Creully","roles","Admin","Gateway","typeUserActions","EnvoyerIdentifiants","ActiverAcces","DesactiverAcces","ChangerDatesAbonnement","EnvoyerMail","GroupeUtilisateur","ActiverConnexionAgri","DesactiverConnexionAgri","EnregistrerLiaisonTC","typeRequest","Disponibilite","Tarif","Coops","TypeQuotes","Fixe","IndexeCoursCompensation","Indexe3FoisParJour","IndexeTempsReel","LabelAction","Engagement","Option","EngagementSurface","Action","Action_Signing","EditableKey","ContentDefault","Action_Modification","Action_Cancel","Action_Detail","Action_DisplayPdf","Action_Delete","Action_Validate","Action_Refuse","Action_Duplicate","ActionOption","Action_Execute","Action_Abandon","CommitmentAction","CommitFixation","StateArticle","DELIVERED","NOT_DELIVERED","PARTIALLY_DELIVERED","ProductAndTypeCommitAction","CommitOffer","CommitDetail","ContractState","AttenteValidation","Valide","Annulé","Refusé","AttenteAnnulationOrdreLie","AttenteDernierComposant","Abandonne","EnAttenteExecution","Exécuté","PrixConstruitSouscrit","PrixConstruitEnCoursCalcul","GroupParameters","Crop","Offer","Cover","Documentation","MyAccount","DelayedCover","ContractingDelay","ManagementSite","ManagementMessage","Module","Ecommerce","News","Cotation","Hashtagri","TypeCover","Automatique","Differee","Manuel","TypeOffer","PrixConstruit","MultiCampagne","TypeCommitment","Libre","StatusBills","IsPayed","IsNotPayed","Undetermined","TypeParameters","RadioButton","CheckBox","DropDownList","TimePicker","FileUpload","HourTimePicker","DoubleHourTimePicker","DoubleDouble","TypeTemplates","Objectif","VenteBase","ObjectifBase","BlankContract","ExerciseOption","ContratBuiltPrice","ExitAnticipatedBuiltPrice","TargetExerciseOption","MultiCrop","TypeChart","Name","Value","TypeDashboardActuality","NEWS","HASHTAGRI","VIDEO","CAROUSEL","CONTACTS","UserTable","FluxRss","Commands","Outstandings","Bills","Contributions","ManageUser","ManageTc","ManageUserFromTc","Profiles","TypeInvoiceState","Facture","NonFacture","CommandState","Sold","NoSold","Tous","Aucun","TypeBills","Appros","Apport","Cereal","TypeUserActions","TypeUserActionsList","TypeRequest","TypeRequestList","ListRoles","TypesMails","Confirmation prise d'une vente","Modification d'un prix objectif","Annulation d'un prix objectif","Validation d'un prix objectif","Fin de validité d'un prix objectif","Annulation partielle d'un ordre","Rejet d'un ordre","Mot de passe perdu","Envoyer les identifiants","Demande de tarif / disponibilité","Rejet prix objectif coupure du routage d'ordre","Rejet couverture différée coupure du routage d'ordre","Demande de couverture manuelle pour un prix Objectif","Seuil de tonnage limite atteinte","Annulation d'' un ordre","Confirmation d'un prix objectif","Alerte mail","OfferStatus","Enabled","Disabled","Expired","IdStateCover","NotCovered","PendingCover","Covered","Texte","ElementsInfoMarketHomePage","Quotes","IdElementInfoMarketHomePage","LabelDefault","Synthesis","ValidityDurations","Day","Week","Month","EndDateOffer","TabContract","Validated","Priced","Canceled","Pending","ToValidated","delayedSigning","ContentBlocDispositions","Id","TypeBlockEditables","Bandeau","TypeCategoryInfoMarket","Cereales","Oleagineux","GlobalMacro","Eleveurs","INFOOS","TypeOfferCommitment","EngagementFacultatif","EngagementObligatoire","ObligerSansEngagement","EuronextRoyalTy","Choice1","Choice2","Choice3","Choice4","Choice5","TypeSends","Immediat","Journalier","Hebdomadaire","Mensuel","ValuesIncidenceRuleGroup","MoinsAvantageuse","PlusAvantageuse","TypeTargetPriceMessage","Mail","Sms","TypeFixations","IdTypeFixation","Future","GlobalPrice","ExerciceOption","TypeOption","Call","Put","SubscribeActions","BaseSold","BaseTargetPrice","FutureSold","FutureTargetPrice","GlobalSold","GlobalTargetPrice","SoldExerciceOption","TargetExerciceOption","CommitCommitment","CommitCommitmentSurface","SubscribeOption","SubscribeBlankContract","TypeCategoryTypeTemplateMail","Contract","Commitment","RoutingOrder","Other","BuiltPrice","TypeEffortTc","Price","TypeFixationBases","Obligatoire","Automatic","TypeCalculOption","Manual","UsersOfTcActions","Action_EditInfosPerso","Action_SendIdentifiers","OfferActions","Action_SetLimitsAlertSms","Origins","Web","Projection","Passerelle","AppMobile","AthenaOrderTypes","Market","Limit","VisibilityOffer","All","Tc_Only","User_Only","Dr_Ra","Siege","AthenaOrderStates","PendingCancel","ModificationAborted","PendingNew","New","PartiallyFilled","Filled","Cancel","Reject","TypeFreeInputs","Numeric","AlphaNumeric","TypePages","DirectUrl","TypePageAccess","Page","iFrame","disableTextSelection","$style","restoreTextSelection","body_onselectstart_save","body_unselectable_save","swapNodes","aparent","asibling","dragHandle","maxMovingRows","excludeFooter","onlyHeaderThreshold","dragaccept","persistState","restoreState","exact","clickDelay","beforeStart","beforeMoving","beforeReorganize","originalTable","selectedHandle","sortableTable","movingRow","_restoreState","persistObj","_bubbleCols","col1","col2","thtb","_rearrangeTableBackroundProcessing","_rearrangeTable","_generateSortable","attrsString","rowAttrsArr","heightArr","widthArr","totalWidth","difference","sortableHtml","row_content","screenX","screenY","bindTo","downTimer","redraw","nbdecimal","converterCoeff","uniqueList","numToFixed","trustAsHtml","jgrid","recordtext","emptyrecords","loadtext","pgtext","Find","Reset","odata","oper","groupOps","edit","addCaption","editCaption","bSubmit","bCancel","bClose","saveData","bYes","bNo","bExit","minValue","integer","nodefined","novalue","customarray","customfcheck","view","edittext","edittitle","addtext","addtitle","deltext","deltitle","searchtext","searchtitle","refreshtext","refreshtitle","alertcap","alerttext","viewtext","viewtitle","errcap","nourl","norecords","model","formatter","thousandsSeparator","decimalSeparator","decimalPlaces","currency","AmPm","srcformat","newformat","parseRe","masks","ISO8601Long","ISO8601Short","ShortDate","LongDate","FullDateTime","MonthDay","ShortTime","LongTime","SortableDateTime","UniversalSortableDateTime","YearMonth","reformatAfterEdit","baseLinkUrl","showAction","idName","doCopy","pInt","mag","log2lin","math","LN10","lin2log","erase","defined","UNDEFINED","splat","pick","isIE","attribs","nopad","extendClass","members","decimals","decPoint","thousandsSep","defaultOptions","mathAbs","decimalPoint","pad","formatSingle","floatRegex","decRegex","ctx","valueAndFormat","splitter","isInside","getMagnitude","mathFloor","normalizeTickInterval","multiples","magnitude","allowDecimals","normalizeTimeTickInterval","tickInterval","unitsOption","units","MILLISECOND","SECOND","MINUTE","HOUR","WEEK","YEAR","timeUnits","lessThan","mathMax","unitRange","unitName","getTimeTicks","normalizedInterval","startOfWeek","tickPositions","higherRanks","useUTC","minMonth","minDateDate","timezoneOffset","makeTime","totalRange","ChartCounters","symbol","stableSort","sortFunction","sortValue","ss_i","arrayMin","arrayMax","destroyObjectProperties","except","discardElement","garbageBin","DIV","correctFloat","toPrecision","setAnimation","chart","globalAnimation","setTimeMethods","GET","SET","setOptions","getOptions","SVGElement","Tick","noLabel","isNew","addLabel","PlotLineOrBand","StackItem","stackOption","stacking","inverted","points","alignOptions","align","verticalAlign","Axis","Tooltip","Pointer","Legend","Chart","Scroller","chartOptions","navigatorOptions","navigatorEnabled","scrollbarOptions","scrollbar","scrollbarEnabled","scrollbarHeight","scrollbarButtons","elementsToDestroy","setBaseSeries","outlineHeight","RangeSelector","Renderer","pathAnim","mathRound","mathCeil","mathMin","mathCos","mathSin","mathPI","deg2rad","isOpera","docMode8","isWebKit","isFirefox","SVG_NS","hasSVG","hasBidiBug","useCanVG","hasTouch","ontouchstart","symbolSizes","idCounter","charts","PRODUCT","VERSION","ABSOLUTE","RELATIVE","HIDDEN","PREFIX","VISIBLE","PX","TRACKER_FILL","NORMAL_STATE","HOVER_STATE","SELECT_STATE","LINEAR_GRADIENT","STOPS","STROKE_WIDTH","seriesTypes","Highcharts","capitalize","dayOfMonth","fullYear","langWeekdays","replacements","shortMonths","dateFormats","wrapColor","wrapSymbol","fromD","toD","endLength","startBaseLine","endBaseLine","bezier","numParams","sixify","isArea","startVal","HighchartsAdapter","dSetter","Fx","Step","opacityHook","ends","highcharts","constr","renderTo","adapterRun","addEvent","eventArguments","defaultFunction","detachedType","layerX","layerY","washMouseEvent","$el","globalAdapter","adapter","defaultLabelOptions","symbols","loading","numericSymbols","resetZoom","resetZoomTitle","canvasToolsURL","VMLRadialGradientURL","borderRadius","defaultSeriesType","ignoreHiddenSeries","spacing","plotBorderColor","resetZoomButton","theme","subtitle","plotOptions","allowPointSelect","showCheckbox","lineWidth","marker","radius","lineColor","states","fillColor","point","dataLabels","cropThreshold","pointRange","stickyTracking","labels","layout","labelFormatter","navigation","activeColor","inactiveColor","shadow","itemStyle","itemHoverStyle","itemHiddenStyle","itemCheckboxStyle","symbolWidth","symbolPadding","labelStyle","dateTimeLabelFormats","headerFormat","pointFormat","whiteSpace","credits","defaultPlotOptions","defaultSeriesOptions","rgbaRegEx","hexRegEx","rgbRegEx","stops","brighten","setOpacity","renderer","attrSetters","animOptions","skipAttr","titleNode","hasSetSymbolSize","doTransform","shadows","hasStroke","symbolName","symbolAttr","cutHeight","textStr","bBox","added","buildText","updateTransform","crisp","strokeWidth","normalizer","elemWrapper","textWidth","serializedCss","hyphenate","svgElement","touchEventFired","onclick","setRadialReference","coordinates","radialReference","translateX","translateY","htmlCss","htmlGetBBox","htmlUpdateTransform","alignOnAdd","alignCorrection","nonLeft","invertChild","quad","radians","costheta","sintheta","xCorr","yCorr","currentTextTransform","cTT","setSpanRotation","fontMetrics","rotationStyle","scaleX","scaleY","alignByTranslate","vAlign","alignTo","alignedObjects","placed","alignAttr","forExport","isSVG","otherElement","otherZIndex","inserted","parentWrapper","parentGroup","parentInverted","handleZ","safeRemoveChild","grandParent","parentToClean","onmouseout","onmouseover","onmousemove","clipPath","shadowOptions","cutOff","shadowWidth","shadowElementOpacity","offsetX","offsetY","isShadow","SVGRenderer","Element","boxWrapper","loc","gradients","subPixelFix","rendererDefs","draw","textNode","lines","styleRegex","hrefRegex","parentX","textStyles","textLineHeight","lineNo","spans","spanNo","spanStyle","tspan","tooLong","actualWidth","clipHeight","_clipHeight","softLineNo","measureSpanWidth","normalState","hoverState","pressedState","disabledState","stateOptions","stateStyle","normalStyle","hoverStyle","pressedStyle","disabledStyle","curState","STYLE","verticalGradient","linearGradient","setState","crispLine","arc","innerR","imageSrc","imageSize","centerImage","symbolFn","imageRegex","isImg","cpw","triangle","triangle-down","innerRadius","cosStart","sinStart","cosEnd","sinEnd","longArc","colorObject","gradName","gradAttr","gradientObject","stopColor","stopOpacity","regexRgba","radialGradient","gradientUnits","stopObject","useHTML","defaultChartStyle","fakeSVG","svgGroupWrapper","htmlGroup","htmlGroupStyle","anchorX","anchorY","updateBoxSize","boxX","boxY","paddingLeft","baselineOffset","needsBox","alignFactor","deferredAttr","updateTextPadding","boxAttr","getSizeAfterAdd","wrapperX","wrapperY","crispAdjust","baseCss","VMLRenderer","VMLElement","markup","isDiv","prepVML","deferUpdateTransform","pathToVML","clockwise","isArc","elemStyle","strokeweight","cutOffPath","updateClipping","stroked","strokeElem","filled","clipMembers","cssRet","destroyClip","getCSS","modifiedPath","VMLRendererExtension","isIE8","isVML","hcv","isObj","isShape","member","fillType","opacity1","opacity2","color1","firstStop","lastStop","fillAttr","addFillNode","atan","sizex","sizey","applyRadialGradient","propNodes","vmlStyle","isCircle","parentStyle","measuringSpan","CanVGRenderer","CanVGController","drawDeferred","callIndex","callLength","deferredRenderCalls","scriptLocation","dateTimeLabelFormat","horiz","categories","labelOptions","staggerLines","plotWidth","chartWidth","isFirst","isLast","tickPositionInfo","isDatetimeAxis","isLog","labelAlign","ellipsis","labelGroup","getLabelSize","labelBBox","getLabelSides","leftSide","handleOverflow","xy","reversed","sides","rightSide","plotLeft","plotRight","neighbour","ticks","neighbourEdge","getPosition","tickmarkOffset","cHeight","oldChartHeight","chartHeight","transB","opposite","oldChartWidth","getLabelPosition","transA","labelOffset","getMarkPath","tickLength","tickWidth","gridLinePath","markPath","gridLine","gridPrefix","tickPrefix","gridLineWidth","gridLineColor","dashStyle","tickColor","tickPosition","mark","reverseCrisp","getPlotLinePath","gridGroup","axisGroup","showFirstLabel","showLastLabel","xs","ys","plotLine","halfPointRange","optionsLabel","isBand","svgElem","getPlotBandPath","onGetPath","plotLinesAndBands","formatOption","xOffset","xWidth","stackItem","yZero","xAxis","plotHeight","stackBox","isInsidePlot","endOnTick","minPadding","maxPadding","minorGridLineColor","minorGridLineWidth","minorTickColor","minorTickLength","minorTickPosition","startOnTick","tickmarkPlacement","tickPixelInterval","defaultYAxisOptions","stackLabels","defaultLeftAxisOptions","defaultRightAxisOptions","defaultBottomAxisOptions","defaultTopAxisOptions","userOptions","isXAxis","isX","xOrY","defaultLabelFormatter","minPixelPadding","zoomEnabled","isLinked","linkedTo","minorTicks","alternateBands","minRange","userMinRange","maxZoom","stacks","oldStacks","stackExtremes","axes","series","removePlotBand","removePlotBandOrLine","removePlotLine","val2lin","lin2val","newOptions","_addedPlotLB","userMin","userMax","isDirtyBox","multi","numericSymbolDetector","getSeriesExtremes","hasVisibleSeries","dataMin","dataMax","buildStacks","xData","seriesDataMin","seriesDataMax","seriesOptions","getExtremes","ignoreMinPadding","ignoreMaxPadding","backwards","cvsCoord","handleLog","pointPlacement","axisLength","sign","cvsOffset","localA","oldTransA","localMin","oldMin","postTranslate","toPixels","paneCoordinates","toValue","pixel","axisLeft","axisTop","translatedValue","cWidth","toPath","getLinearTickPositions","lastPos","roundedMin","roundedMax","getLogTickPositions","positions","_minorAutoInterval","intermediate","break2","realMin","realMax","tickIntervalOption","filteredTickIntervalOption","tickPixelIntervalOption","totalPixelLength","getMinorTickPositions","minorTickInterval","minorTickPositions","adjustForMinRange","zoomOffset","closestDataRange","loopLength","minArgs","maxArgs","spaceAvailable","xIncrement","setAxisTranslation","saveOld","closestPointRange","ordinalCorrection","minPointOffset","pointRangePadding","linkedParent","seriesPointRange","seriesClosestPointRange","noSharedTooltip","ordinalSlope","translationSlope","setTickPositions","secondPass","linkedParentExtremes","keepTwoTicksOnly","tickPositioner","minTickIntervalOption","minTickInterval","beforePadding","usePercentage","isRadial","oldMax","beforeSetTickPositions","postProcessTickInterval","ordinalPositions","getNonLinearTimeTicks","singlePad","setMaxTicks","maxTicks","_maxTicksKey","alignTicks","adjustTickAmount","tickAmount","oldTickAmount","calculatedTickAmount","isDirty","setScale","isDirtyData","isDirtyAxisLength","oldAxisLength","setAxisSize","forceRedraw","oldUserMin","oldUserMax","cum","setExtremes","newMin","newMax","eventArgs","isDirtyExtremes","allowZoomOutside","displayBtn","offsetRight","plotTop","getThreshold","addPlotBand","addPlotBandOrLine","addPlotLine","coll","autoLabelAlign","getOffset","showAxis","titleOffsetOption","sortedPositions","lastRight","overlap","invertedSide","titleOffset","titleMargin","axisTitleOptions","axisOffset","clipOffset","directionFactor","autoStaggerLines","maxStaggerLines","showEmpty","gridZIndex","axisTitle","low","axisTitleMargin","getLinePath","lineLeft","lineTop","getTitlePosition","alongAxis","offAxis","linePath","stackLabelOptions","alternateGridColor","hasRendered","slideInTicks","plotLines","plotBands","plotLineOptions","forDestruction","destroyInactiveItems","axisLine","stackKey","oneStack","stackCategory","stackTotalGroup","setTitle","newTitleOptions","pointer","setStackedPoints","setPercentStacks","setCategories","keepEvents","crosshairs","shared","crosshair","hideTimer","tooltipTimeout","hoverPoints","hideDelay","hideCrosshairs","getAnchor","mouseEvent","yAxis","plotX","plotY","tooltipPos","followPointer","chartX","normalize","chartY","plotLow","plotHigh","boxWidth","boxHeight","alignedRight","pointX","pointY","defaultFormatter","tooltipHeaderFormatter","tooltipFormatter","tooltipOptions","footerFormat","currentSeries","textConfig","pointConfig","crosshairsOptions","getLabelConfig","category","updatePosition","stackY","modifyValue","positioner","zoomX","zoomY","chartEvents","zoomType","zoomHor","zoomVert","runChartClick","pinchDown","lastValidTouch","setDOMEvents","chartPosition","ePos","getCoordinates","getIndex","runPointActions","hoverPoint","hoverSeries","enableMouseTracking","tooltipPoints","_dist","hoverX","tracker","onMouseOver","allowMove","onMouseOut","scaleGroups","seriesAttribs","getPlotBox","markerGroup","dataLabelsGroup","clipBox","pinchTranslate","selectionMarker","pinchTranslateDirection","forcedScale","selectionWH","selectionXY","clipXY","outOfBounds","transformScale","scaleKey","XY","sChartXY","wh","plotLeftTop","bounds","singleTouch","touch0Start","touch0Now","touch1Start","touch1Now","pinch","followTouchMove","touchesLength","pinchHor","pinchVert","hasZoom","fireClickEvent","inClass","runTrackerClick","absMin","absMax","plotBox","hasPinched","mouseIsDown","cancelClick","mouseDownX","mouseDownY","clickedInside","hasDragged","hasCartesianSeries","selectionMarkerFill","panning","pan","runZoom","selectionData","selectionBox","selectionLeft","selectionTop","selectionMin","selectionMax","onContainerMouseDown","onDocumentMouseUp","onDocumentMouseMove","onContainerMouseLeave","onContainerMouseMove","openMenu","elemClassName","onTrackerMouseOut","onContainerClick","firePointEvent","onContainerTouchStart","onContainerTouchMove","onDocumentTouchEnd","eventConfig","itemMarginTop","initialItemX","initialItemY","maxItemWidth","lastLineHeight","positionCheckboxes","colorizeItem","legendItem","legendLine","legendSymbol","hiddenColor","textColor","symbolColor","markerOptions","isMarker","convertAttribs","positionItem","ltr","legendItemPos","_legendItemPos","itemX","itemY","legendGroup","legendWidth","destroyItem","scrollOffset","legendHeight","allItems","legendItemWidth","renderTitle","titleOptions","titleHeight","contentGroup","renderItem","itemWidth","itemDistance","widthOption","itemMarginBottom","itemOptions","scrollGroup","drawLegendSymbol","labelFormat","strLegendItemClick","fnLegendItemClick","setVisible","browserEvent","lastItemY","legendBorderWidth","legendBackgroundColor","serie","showInLegend","legendItems","legendType","legendIndex","isResizing","optionsY","alignTop","spaceHeight","spacingBox","navOptions","arrowSize","pageCount","currentPage","fullHeight","pager","scrollBy","runPositionItem","optionsChart","splashArray","showAxes","reflow","initReflow","pointCount","counters","firstRender","initSeries","addSeries","isDirtyLegend","linkSeries","addAxis","adjustTickAmounts","hasStackedSeries","hasDirtyStacks","redrawLegend","seriesLength","isHiddenChart","afterRedraw","cloneRenderTo","layOutTitles","getStacks","getMargins","drawChartBox","isCartesian","showLoading","loadingDiv","loadingOptions","loadingSpan","loadingShown","showDuration","hideLoading","hideDuration","getAxes","optionsArray","xAxisOptions","yAxisOptions","axisOptions","getSelectedPoints","getSelectedSeries","showResetZoom","btnOptions","relativeTo","zoomOut","resetSelection","hasZoomed","displayButton","axisData","doRedraw","mousePos","startPos","extremes","subtitleOptions","chartTitleOptions","chartSubtitleOptions","autoWidth","getChartSize","renderToClone","containerWidth","getContainer","oldChartIndex","containerId","indexAttrName","-webkit-tap-highlight-color","legendOptions","legendMargin","legendX","legendY","resetMargins","extraBottomMargin","extraTopMargin","setChartSize","hasUserSize","reflowTimeout","fireEndResize","skipAxes","clipX","clipY","plotBorderWidth","plotSizeX","plotSizeY","mgn","bgAttr","chartBackground","plotBackground","plotBorder","plotBGImage","chartBorderWidth","chartBackgroundColor","plotBackgroundColor","plotBackgroundImage","plotShadow","propFromSeries","chartSeries","linkedSeries","creditsHref","seriesGroup","setTooltipPoints","isReadyToRender","canvg","serieOptions","oVar","tArray","Point","applyOptions","pointAttr","colorByPoint","colorCounter","pointValKey","optionsToObject","autoIncrement","firstItemType","pointArrayMap","valueCount","_hasPointLabels","_hasPointMarkers","graphic","dataLabel","destroyElements","stackTotal","accumulate","loopPoint","seriesTooltipOptions","valueDecimals","valuePrefix","valueSuffix","getAttribs","yData","toYData","zData","fixedBox","importEvents","hasImportedEvents","newSymbol","normalDisabled","markerStateOptions","stateDisabled","stateMarkerGraphic","pointMarker","currentSymbol","Series","pointClass","sorted","requireSorting","pointAttrToOptions","bindAxes","getSymbol","setData","AXIS","pointStart","pointInterval","getSegments","lastNull","pointsLength","connectNulls","typeOptions","colorIndex","defaultColors","_colorIndex","symbolIndex","seriesMarkerOption","defaultSymbols","_symbolIndex","legendItemGroup","verticalCenter","addPoint","isInTheMiddle","graph","currentShift","dataOptions","graphNeg","areaNeg","generatePoints","firstPoint","pt","dataLength","turboThreshold","hasToYData","isRemoving","croppedData","cropped","processedXData","processedYData","cropStart","forceCrop","cropData","cropEnd","cropShoulder","processedDataLength","hasGroupedData","stackedYData","yDataLength","negKey","negStacks","pointExtremes","totalFactor","validValue","withinRange","activeYData","activeCounter","xExtremes","xMin","xMax","getExtremesFromAll","hasModifyValue","dynamicallyPlaced","pointStack","stackValues","xValue","yValue","yBottom","pointXOffset","barW","negative","renew","nextPoint","tooltipLen","orderTooltipPoints","wrappedClientX","xDateFormat","isDateTime","mouseOver","mouseOut","markerClipRect","sharedClipKey","animationTimeout","afterAnimate","drawPoints","pointMarkerOptions","seriesMarkerOptions","base1","base2","base3","conversion","pointStateOptionsHover","hasPointSpecificOptions","normalOptions","stateOptionsHover","seriesColor","normalDefaults","seriesPointAttr","negativeColor","defaultLineColor","brightness","oldOptions","oldType","issue134","drawDataLabels","pointOptions","generalOptions","dlProcessOptions","plotGroup","labelConfig","connector","alignDataLabel","justifyDataLabel","justified","getSegmentPath","segmentPath","lastPoint","getPointSpline","getGraphPath","graphPath","singlePoints","drawGraph","roundCap","linecap","graphKey","clipNeg","translatedThreshold","posAttr","negAttr","above","below","negativeFillColor","posClip","negClip","chartSizeMax","invertGroups","setInvert","groupName","chartSeriesGroup","drawTracker","wasDirtyData","vis","showOrHide","oldVisibility","otherSeries","singlePoint","trackByArea","trackerPath","areaPath","trackerPathLength","LineSeries","AreaSeries","pointMap","areaSegmentPath","segLength","closedStacks","closeSegment","areaKey","spline","SplineSeries","leftContX","leftContY","rightContX","rightContY","smoothing","denom","correction","lastX","lastY","nextX","nextY","areaspline","areaProto","AreaSplineSeries","column","groupPadding","pointPadding","minPointLength","ColumnSeries","trackerGroups","getColumnMetrics","columnIndex","reversedXAxis","stackGroups","grouping","otherOptions","otherYAxis","categoryWidth","groupWidth","pointOffsetWidth","optionPointWidth","pointWidth","colIndex","columnMetrics","metrics","seriesBarW","xCrisp","yCrisp","fromTop","fromLeft","barX","barY","barH","shapeType","shapeArgs","_hasTracking","dlBox","inside","bar","BarSeries","scatter","ScatterSeries","takeOrdinalPosition","pie","ignoreHiddenPoint","slicedOffset","PiePoint","toggleSlice","sliced","translation","slicedTranslation","shadowGroup","PieSeries","startAngleRad","getCenter","handleSlicingRoom","isPercent","slicingRoom","centerOption","innerSize","smallestSize","radiusX","radiusY","cumulative","connectorOffset","startAngle","endAngleRad","endAngle","circ","labelDistance","getX","half","labelPos","groupTranslation","sortByAngle","connectorPath","dataLabelWidth","labelHeight","rankArr","connectorPadding","connectorWidth","softConnector","distanceOption","seriesCenter","centerY","outside","halves","slotsLength","slotIndex","slots","usedSlots","rank","slotI","slot","naturalY","justify","_attr","connX","connY","verifyDataLabelOverflow","placeDataLabels","connectorColor","newSize","seriesProto","baseProcessData","baseGeneratePoints","baseDestroy","baseTooltipHeaderFormatter","NUMBER","commonOptions","approximation","groupPixelWidth","specificOptions","arearange","areasplinerange","columnrange","candlestick","ohlc","defaultDataGroupingUnits","approximations","hasNulls","average","groupData","groupPositions","groupedY","groupedXData","groupedYData","handleYData","approximationFn","pointArrayMapLength","dataGroupingOptions","groupingEnabled","_stock","destroyGroupedData","getGroupPixelWidth","nonGroupedPointRange","groupIntervalFactor","getGroupIntervalFactor","groupedXandY","smoothed","currentDataGrouping","groupedData","xDateFormatEnd","labelFormats","formattedKey","dataGrouping","dgOptions","doGrouping","forced","OHLCSeries","upColorProp","upColor","seriesDownPointAttr","plotOpen","plotClose","crispCorr","halfWidth","crispX","CandlestickSeries","upLineColor","hoverStroke","selectStroke","topBox","bottomBox","hasTopWhisker","hasBottomWhisker","stackDistance","leftPoint","rightPoint","optionsOnSeries","onSeries","onData","xAxisExt","stackIndex","raised","_y","otherPoint","labelTopOrBottomY","buttonGradient","maskFill","outlineColor","outlineWidth","barBackgroundColor","barBorderRadius","barBorderWidth","barBorderColor","buttonArrowColor","buttonBackgroundColor","buttonBorderColor","buttonBorderRadius","buttonBorderWidth","rifleColor","trackBackgroundColor","trackBorderColor","trackBorderWidth","liveRedraw","drawHandle","tempElem","scroller","handlesOptions","rendered","scrollerLeft","drawScrollbarButton","scrollbarGroup","scrollerWidth","pxMin","pxMax","navigatorLeft","navigatorWidth","zoomedMin","zoomedMax","scrX","scrWidth","centerBarX","verb","unionExtremes","navigatorGroup","scrollbarTrack","scrollbarMinWidth","halfOutline","scrollbarPad","scrollbarStrokeWidth","outlineTop","getUnionExtremes","fixedWidth","leftShade","rightShade","outline","trackBorderRadius","scrollbarRifles","addEvents","mouseDownHandler","mouseMoveHandler","mouseUpHandler","removeEvents","baseSeries","updatedDataHandler","dragOffset","defaultBodyCursor","fixedMax","ext","isOnNavigator","baseXAxis","handleSensitivity","grabbedLeft","otherHandlePos","fixedExtreme","fixedRange","grabbedRight","grabbedCenter","toFixedRange","fixedMin","triggerOp","DOMEvent","xAxisIndex","yAxisIndex","addBaseSeries","scrollTrackWidth","valueRange","returnFalseOnNoBaseSeries","baseAxis","navAxis","navAxisOptions","baseSeriesOption","mergedNavSeriesOptions","navigatorData","baseOptions","baseData","navigatorSeriesOptions","hasNavigatorData","padXAxis","isInternal","adaptToUpdatedData","updatedData","stickToMin","stickToMax","baseExtremes","baseMin","baseMax","baseDataMin","baseDataMax","navigatorSeries","navXData","hasSetExtremes","previousZoom","rangeSelector","buttonTheme","inputPosition","rangeSelectorZoom","rangeSelectorFrom","rangeSelectorTo","clickButton","rangeOptions","baseXAxisOptions","rangeMin","timeName","_range","MIN_VALUE","rangeSelectorButton","defaultButtons","selectedOption","blurInputs","minInput","maxInput","computeButtonRange","updateButtonStates","isTooGreatRange","isTooSmallRange","isAllButAlreadyShowingAll","isYTDButNotAvailable","fixedTimes","setInputValue","HCTime","inputEditDateFormat","inputDateFormat","drawInput","dateBox","chartStyle","isMin","inputGroup","inputBoxWidth","inputBoxHeight","inputBoxBorderColor","inputStyle","onfocus","onblur","onchange","inputValue","inputDateParser","yAlign","buttonLeft","navButtonOptions","exporting","inputEnabled","zoomText","buttonSpacing","renderScroller","renderRangeSelector","afterSetExtremesHandlerScroller","afterSetExtremesHandlerRangeSelector","destroyEvents","StockChart","disableStartOnTick","lineOptions","columnOptions","pinchType","pinchX","pinchY","seriesInit","seriesProcessData","pointTooltipFormatter","setCompare","compareValue","changeDecimals","baseInit","baseGetSegments","ordinalIndex","hasOrdinalExtension","minIndex","maxIndex","slope","useOrdinal","ordinalOffset","toIndex","ordinalLength","fromIndex","linearEquivalentLeft","linearEquivalentRight","getExtendedPositions","fakeAxis","fakeSeries","median","distances","closestDistance","findHigherRanks","segmentPositions","hasCrossedHigherRank","posLength","outsideMax","lastGroupPosition","itemToRemove","translated","lastTranslated","medianDistance","translatedArr","baseChartPan","runBase","trimmedRange","searchAxisLeft","searchAxisRight","pointPixelWidth","movedUnits","extendedAxis","gapSize","no","product","iElement","iAttrs","uiItems","uiTarget","globParam","popupConfirm","dialog","confirmFunction","popupCancel","confirmCancelFunction","callFunctionName","viewportHeight","popupWidth","popupTitle","popupHeight","popupSubmit","popupsubmitCheck","popupsubmitSave","popupsubmitOpen","popupsubmitWidth","datepickerOffer","datepickerMinDate","datepickerMaxDate","datepickerTarget","timeSeparator","defaultTime","timepickerHour","timepickerMin","timepickerSec","timepickerFormat","timepickerTarget","displayBloc","hideBloc","widthContainer","_x","tooltipAutoSizeDisableWatch","$tooltip","cursorPosition","_listener","positionInDiv","tooltipHeight","offsetop","renverse","notSorted","topSorted","bottomSorted","indexActive","ngEnter","postLinkFn","checklistModel","checklistValue","newArr","oldArr","tElement","dateService","parametersService","parametersFactory","moduleFactory","authenticationService","userService","editableObjectsFactory","routeService","setRootScopeUserSelected","userSelected","manageMenu","skin","bDeployMenuWhenLogged","redirectFromLogin","DefaultCrop","locationByParam","CurrentUserRole","firstMenu","Visible","PathRoute","firstMenuPage","loginErrorMessage","Error_Login_NotAccessToMenuPage","Error_Login_NotAccessMenu","authenticateResult","menuAndPageContentVms","Message","ResetPassword","KeyPassword","keyPassword","Token","titleBloc","idExploitationSelected","displaySelectExploitationBloc","displayLoginBloc","usersOfConnection","UsersOfConnection","authenticateProcess","IdCompagny","Skin","skinMultiple","ContentMenuEditable","globalLabels","Table_Item","AllItems","AllItems_F","Edit","Edit_Table","Edit_Actions","Edit_Fixations_Actions","Edit_Blocks","Reduce_Menu","Text","BlockText","UnitQuotes","LastUpdatedOn","PublishedOn","Language","Welcome","SocialCapital","MyPersonalInfo","Disconnect","Save","EnterContractNumber","EnterClientNumber","EnterContractorNumber","EnterContractBaseNumber","ModificationOfThe","Yes","No","Validate","ValidateOption","SocialCapitalCurrency","NoCommitment","Confirmation","BackToOffers","SendNewCode","Varieties","Select","ClickHere","SeeOffers","SeeContracts","Fix","Details","ShowPdf","NoBase","NoFuture","EnterAgriNumber","EnterNameOffer","Currency","CurrencyWithMarketWsdCoefficent","UnitQuantity","QuotesAccess","SettingMenu","Overview","MaxDateForResetPassword","resetPasswordData","showResetPasswordBanner","setNewPasswordBannerLinkText","SetNewPasswordBannerLinkText","setNewPasswordBannerText","SetNewPasswordBannerText","toStringddMMyyyy","bValidateCGUIsFirstConnection","bValidatedCGU","IdUserToValidateCGU","Login","SiteUnavailable","modeEdition","showMenu","IdConnection","ListTypeOrders","TypeOrderLabel","ListTypeFixationTypeOrders","ListElementInfoMarketHomePages","ListTypeFixations","MenuEditableVms","MenuAndPageContentVms","ModuleAutomaticCover","ModuleObjectifAutomatique","ModuleEcommerce","ModulePrixConstruit","ModuleNews","ModuleCotation","ModuleMyAccount","ModuleHashtagri","ModuleMultipleCompagnies","ModuleMultilingue","ModuleAlertesSms","ModuleEngagementALaMasse","ModuleEngagementDeSurface","ModuleEngagementSurface","ModuleMultiCampagne","ModuleOption","paramEuronextRoyaltyChoice","EuronextRoyaltyChoice","paramUrlEuronextQuotes","UrlEuronextQuotes","parambDesactivateModificationObjectifPrice","bDesactivateModificationObjectifPrice","languages","ListLanguages","language","IdLanguage","IdLanguageDefaultOrSave","IsDefault","paramIsTerrenaGroup","IsTerrenaGroup","paramIsSynoaCoop","IsSynoaCoop","paramBCommitmentHomePageAll","bCommitmentHomePageAll","parambPreFillTonnage","bPreFillTonnage","paramNameCoop","NameCoop","paramDelayedSigning","DelayedSigning","paramBUseOperation","bUseOperation","paramBDisableSubscription","bDisableSubscription","paramIsTCAuthorizedToSignInModeDelayed","IsTCAuthorizedToSignInModeDelayed","paramIsTcAuthorizedToForcedDate","IsTcAuthorizedToForcedDate","parambActivedParamRollExpiry","bActivedParamRollExpiry","parambActivedSubscribeOfferWithZeroPrice","ActiveSubscribeOfferWithZeroPrice","parambAuthorizeContributionsForBuiltPrice","bAuthorizeContributionsForBuiltPrice","parambAutorizeBlockingSubscriptionInOfferCommitment","bAutorizeBlockingSubscriptionInOfferCommitment","ModuleExportProjection","ModuleElectronicSignature","ModuleSignatureElectroniqueYouSign","paramBUseDeliveriesDates","bUseDeliveriesDates","paramBUsePaymentDate","bUsePaymentDate","paramActivateNetPrice","ActivateNetPrice","activateSignature","ActivateSignature","paramBUseTableConnections","bUseTableConnections","parambUseLoginSecondary","bUseLoginSecondary","parambActiveLinkWithCeremis","bActiveLinkWithCeremis","paramBDisplaySocialReasonInManageGroupUsers","bDisplaySocialReasonInManageGroupUsers","typePresentOffers","TypePresentOffers","ModuleRequestPrices","bExclusiveSignatureForTc","bDisplayCapitalSocial","crops","ListCrops","parambManageActionUsersOfTc","bManageActionUsersOfTc","paramSelectTcUserGlobally","SelectTcUserGlobally","lstClientsFromTc","UsersOfTc","minlengthAutocomplete","IsSuperTc","getUserSession","login","LoginByConnectorWithUrlReferrer","paramForLoginHash","hashForLoginHash","ConnectorLoginHash","AuthorizedBackdoor","currentUserRole","showMenuCotation","sendMailErrorMessage","selectedClientFromTc","selectedClientFromTcForSubscribe","Password","editableObjectConnected","editableObjectPassword","editableObjectForgetPassword","editableObjectPasswordOrLoginForget","editableObjectSendButton","editableObjectBackButton","loginTiers","jeton","adresseIpSlc","AdresseIpSlc","fromConnectorOrUAC","idLanguage","paramConnectorUrlReferrer","hideMenu","urlLogin","useTableConnections","allConnections","allUsers","userlst_selection","connectionlst_selection","allTc","tclst_selection","allAdmin","adminlst_selection","nbUserActif","GetEditableObjectsForLoginPage","goToSelectExploitation","GoToEuronextQuote","controlerLink","idExpiry","GoToInterfaceTc","resetInput","DisconnectClientSelectedFromTC","errorMessage","GoToInterfaceAdmin","GoToSelectExploitation","DisconnectExploitation","CancelPopUpChangeClientFromTc","oldClientSelectedFromTc","ConnectionToClient","client","openPopUp","SaveClientSelectedFromTC","LoginForBackdoor","connection","LoginByToken","LoginEditionMode","LoginByConnectorOrUAC","LoginByConnectorForCerelio","LoginByConnectorSso","UnsubscribeNewsMarketInfoByIdExt","errorMessageConnector","errorMessageUnsubscribeNewsMarketInfoByIdExt","LogProfileByBackdoor","profile","LogProfileConnectionByBackdoor","referrer","LoginByConnectorWithGuid","SelectExploitation","selectExploitationErrorMessage","ResetMessages","askAccessCodeErrorMessage","askAccessCodeMessage","mail","MenuLoaded","countMax","ManageMenu","SetCurrentClass","listPathCurrentClass","currentclass","AsChangedLanguage","SaveLanguageSelected","ShowAskAccessCodeLink","EditableObjectNumTvaIsVisible","EditableObjectSiretIsVisible","EditableObjectSocialReasonIsVisible","EditableObjectFirstNameIsVisible","EditableObjectLastNameIsVisible","cgu","Accepted","bPdfCGU","bPdfPrivacyPolicy","UrlCGU","UrlPrivacyPolicy","IdUserToValidate","ReceiveNewsMarketInfo","bAskAuthorizeSendMail","FileTermeUse","FilePrivacyPolicy","Error_ValidateCGU_ReceiveNewsMarketInfo_NotSelected","SaveValidatedCGU","Error_ValidateCGU_NotAccepted","onRefresh","backdoorService","loginbackdoorErrorMessage","LogToBackdoor","backPassword","backLogin","LogBackdoor","dataProfile","statusProfile","NbUserActived","FullName","resetErrorMessage","errorResetPasswordMessage","resetPasswordMessage","editableObjectsService","typeOrdersService","elementInfoMarketHomePagesService","typeFixationsService","openPopEditable","textDefault","editableErrorMessage","editableObject","IdEditableObject","editableObjectBeforeChange","titlePopUp","ClosePopEditable","SaveDataPopEditable","dataToApi","SaveEditableObject","openPopEditableGraph","ClosePopEditableGraph","SaveDataPopEditableGraph","openPopEditableTable","idDefaultTable","editableTableErrorMessage","ClosePopEditableTable","GetTableById","setScopeColumns","SaveDataPopEditableTable","checkDataEditableTable","columns","oldColumns","columnsFiltered","dataVisible","columnName","databaseVar","IdDefaultTable","DataVisible","ColumnName","PutColumn","tabColumnNameDefault","ColumnNameDefault","tabDataVisibleDefault","DataVisibleDefault","tabDataVisible","tabColumnName","indexLabel","indexLabelDefault","labelDefault","openPopEditableMenu","editableMenuErrorMessage","GetEditableMenuByKey","ClosePopEditableMenu","checkDataEditableMenu","SaveDataPopEditableMenu","Position","subMenu","SaveEditableObjects","openPopEditableEnum","editableEnumErrorMessage","ClosePopEditableEnum","enumKey","enumObjects","enumObject","idTypeFixation","SaveDataPopEditableEnum","dto","UpdateContentEditableObject","PutTypeOrderLabelAction","PutTypeFixationLabelAction","PutSubscribeActionLabels","openPopEditableBlock","editableBlockErrorMessage","ClosePopEditableBlock","blockObjects","blockKey","blockObject","typeBloc","typeObject","NewsTitle","blockObjectCarousel","CarouselTitle","SaveDataPopEditableBlock","dataElementInfoMarketHomePages","dataEditableObjects","dataToPush","dataToPushEditableObject","PutElementInfoMarketHomePageLabel","refreshOnrefresh","FLOAT_REGEXP","$upload","uploadService","fileNameValue","percentValue","linkFileValue","buttonFunctionName","idInput","uploadFunctionName","$file","idAttachment","modelIdAttachement","PublicLabel","listAttachment","uploadFinishFunction","errorValue","deleteFunctionName","idAttachement","IdAttachment","DeleteUpload","parampop","viewportWidth","$defer","app","checkLoaded","CKEDITOR","disableAutoInline","EMPTY_HTML","onLoad","toolbar","toolbar_full","disableNativeSpellChecker","uiColor","useSimplyEditor","ckeditor","configLoaderDef","setModelData","setPristine","onUpdateModelData","onFocus","editor","forceLoad","getTable","tableau","frozen","GetDivFrozen","AddHeader","AddRow","pagination","AddFooter","selectlist","nbcols","ttcolspan","colspans","datavisible","propriete","customcolumn","ReturnClass","getContentCell","nbcolspan","valuecolspan","icofunction","occurence","ReturnData","getAction","actionfunctions","getDescendantProp","arrayparam","dragable","selectnbrow","actionfunction","formatdate","colonnefrozen","duplicate","clickable","icoaction1","icoaction2","icoaction3","icoaction4","icoaction5","icoaction6","icoaction7","icoaction8","icoaction9","icoaction10","action1","action2","action3","action4","action5","action6","action7","action8","action9","action10","templateNamespace","maxrow","intervalmin","intervalmax","nbpage","currentpage","checkall","watchedit","GoToPage","SelectAll","IsChecked","PrevPage","NextPage","columnselected","Filtre","valeur","dragtable","table","Freez","pdf","tablecss","datatd","classtd","actionrow","actionpdf","rowtotal","addspecificrows","emptytext","conditions","conditionfunction","valuespecificrows","labeloperationselected","condition1","condition2","condition3","condition4","condition5","condition6","condition7","condition8","condition9","condition10","saveposition","filteredItems","totalused","GetNbPage","nbrow","OldPosition","NewPosition","GetSum","tt","intraindex","colspantotal","Format","pref","suf","returnOrder","menuArray","sortableParentElement","sortableElement","childElementHtml","placeHolder","idElemString","classElem","idElem","nbChildren","sortableChildElement","tableSizes","idSsElemString","classSsElem","idSsElem","posArray","canUpdate","InitSwitchElement","clickSizeElement","itemSize","useChildSortable","Start","MovedId","MovedParentIndexStart","MovedIndexStart","End","MovedParentIdEnd","MovedIndexEnd","MovedParentIndexEnd","onchangeposition","angularFilter","GenerateEuronextSerie","euronextSeries","serietmp","graphSettle","graphVolume","jour","mois","annee","Settle","Open","High","Low","Voltt","showSerie","newType","drawChart","allButtonsEnabled","namechart","euronext","selectedObject","dataField","titleField","descriptionField","imageField","imageUri","inputClass","userPause","localData","searchFields","minLengthUser","matchClass","searchStr","launchFunction","popUpComfirm","inputwidth","lastSearchTerm","justChanged","searchTimer","isNewSearchNeeded","newTerm","oldTerm","processResults","responseData","titleFields","titleCode","description","strPart","resultRow","originalObject","searchTimerComplete","hideResults","showDropdown","resetHideResults","hoverRow","keyPressed","selectResult","oldSelectedItem","handleInputChange","newval","initial","extractTitle","callOrAssign","handleRequired","clickoutHandlerForDropdown","mousedownOn","ie8EventNormalizer","selectedObjectData","callFunctionOrIdentity","setInputString","clearSelected","clearResults","extractValue","findMatchString","valid","notEmpty","validState","fieldRequired","inputName","requiredClassName","keyupHandler","KEY_LF","KEY_RT","KEY_UP","KEY_EN","KEY_DW","initResults","KEY_ES","inputField","handleOverrideSuggestions","overrideSuggestions","cancelHttpRequest","dropdownRow","dropdownRowTop","dropdownScrollTopTo","updateInputField","keydownHandler","rowTop","isScrollOn","dropdownHeight","dropdownRowOffsetHeight","KEY_TAB","httpSuccessCallbackGen","responseFormatter","remoteUrlDataField","httpErrorCallback","errorRes","remoteUrlErrorCallback","httpCanceller","getRemoteResults","remoteUrl","remoteUrlRequestFormatter","remoteUrlRequestWithCredentials","getRemoteResultsWithCustomHandler","remoteApiHandler","displaySearching","focusFirst","getLocalResults","parseInput","checkExactMatch","localSearch","formattedText","formattedDesc","autoMatch","displayNoResults","showAll","unbindInitialValue","MIN_LENGTH","REQUIRED_CLASS","oldval","elementId","onFocusHandler","focusIn","BLUR_TIMEOUT","focusOut","inputChangeHandler","inputChanged","fieldRequiredClass","PAUSE","initialValue","textSearching","TEXT_SEARCHING","textNoResults","TEXT_NORESULTS","MAX_LENGTH","disableInput","remoteUrlResponseFormatter","fieldTabindex","startSym","endSym","interpolatedHtml","elemLeft","idTooltip","hoverFunction","leaveFunction","randomInteger","leaveOnClick","elemH","posT","posFromBottomWindow","posL","posElT","posElL","verticalPosition","subNavTouch","navWidth","$container","resizeEvt","counterType","counterCicularSize","counterLinearWidth","strokeWidthBg","showShadow","showRays","colorRays","fontColor","colorCounterBg","colorCounterHalf","colorCounterThird","circular","xloc","yloc","MyRay","topWidth","bottomWidth","nbOccurence","xLeftTop","counterSize","yLeftTop","yLeftBottom","pathObj","stoke-width","drawCircular","myBgArc","widthShadow","colorShadow","offsetXShadow","offsetYShadow","myArc","totalSeconds","line-height","sizeRays","nbRays","animateCircular","obj1","obj2","obj3","setTimeHalfTimerAnimCirc","setTimeThirdTimerAnimCirc","setTimeCircular","tiers","timerHalfCirc","timerThirdCirc","textCirc","posx","canvasWidth","tooltipWidth","lineBloc","MyLinearRay","tooltipMargin","drawLinear","myLine","counterPosition","myMaskLine","myBloc","tooltipColor","myCount","tooltipFontSize","animateLinear","setTimetimerHalfLinear","setTimetimerThirdLinear","setTimeLinear","timerHalfLinear","timerThirdLinear","textLinear","valString","canvasHeight","secondes","chartdata","titlekey","titledefault","chartype","chartcolor","renderto","drawPlot","plotBorderHeight","chartunit","animchart","idsource","chartLabels","labelsEnabled","axisLineWidth","grafContainer","heightContainer","paddingContainer","heightLi","distGraf","closeGraf","icoAction","hrefLink","contentAction","contentBody","contentVisible","icoAlterClass","blockClick","agrimarketEditableKey","agrimarketEditableContentAction","agrimarketEditableHref","agrimarketEditableIcoAlterClass","agrimarketEditableGraphKey","contentDefault","agrimarketEditableTableIddefaulttable","agrimarketEditableEnumKey","agrimarketEditableEnumLabel","agrimarketEditableBlockKey","datawatch","tickerInterval","splitNews","trimmedString","ticker","nbEl","tempHeight","initAnim","tickerTitle","tickerDatawatch","singleExpander","expanders","gotOpened","selectedExpander","expander","showMe","addExpander","openDefault","accordionController","dirPaginateDirective","paginationService","dirPaginationCompileFn","dirPaginate","filterPattern","itemsPerPageFilterRemoved","collectionGetter","addNoCompileAttributes","rawId","paginationId","DEFAULT_ID","registerInstance","repeatExpression","getRepeatExpression","addNgRepeatToElement","removeTemporaryAttributes","compiled","currentPageGetter","makeCurrentPageGetterFn","setCurrentPageParser","totalItems","setAsyncModeTrue","setCollectionLength","setAsyncModeFalse","collectionLength","idDefinedInFilter","defaultCurrentPage","multiElement","noCompileDirective","dirPaginationControlsTemplateInstaller","dirPaginationControlsDirective","paginationTemplate","dirPaginationControlsLinkFn","goToPage","isRegistered","isValidPageNumber","oldPageNumber","generatePagesArrayResults","generatePagesArray","getCollectionLength","getItemsPerPage","paginationRange","totalPages","updateRangeValues","onPageChange","newPageNumber","generatePagination","getCurrentPage","setCurrent","itemsPerPage","lower","upper","numberRegex","idMessage","maxSize","directionLinks","boundaryLinks","setCurrentPage","rowsPerPage","halfWay","ellipsesNeeded","pageNumber","calculatePageNumber","openingEllipsesNeeded","closingEllipsesNeeded","DDO","logavivItemLabel","logavivSep","templateString","getString","itemsPerPageFilter","isAsyncMode","setItemsPerPage","slicedObject","objKeys","lastRegisteredInstance","instanceId","asyncMode","deregisterInstance","getLastInstanceId","currentPageParser","paginationTemplateProvider","templatePath","setPath","setString","focusMe","contractsService","cropsService","athenaOrdersService","conditionsService","idTabContracts","Init","tableValidatedContractsNotCoverDataVisible","tableValidatedContractsNotCoverLibelle","tableValidatedContractsCoveredDataVisible","tableValidatedContractsCoveredLibelle","tableValidatedContractsPendingCoverDataVisible","tableValidatedContractsPendingCoverLibelle","tablePendingContractsNotCoverDataVisible","tablePendingContractsNotCoverLibelle","tablePendingContractsCoveredDataVisible","tablePendingContractsCoveredLibelle","tablePendingContractsPendingCoverDataVisible","tablePendingContractsPendingCoverLibelle","tableToValidatedContractsDataVisible","tableToValidatedContractsLibelle","tablePricedContractsNotCoverDataVisible","tablePricedContractsNotCoverLibelle","tablePricedContractsPendingCoverDataVisible","tablePricedContractsPendingCoverLibelle","tableCanceledContractsDataVisible","tableCanceledContractsLibelle","tableDelayedSigningContractsDataVisible","tableDelayedSigningContractsLibelle","dataValidated","sortKey","dataPending","dataToValidated","dataPriced","dataCanceled","dataDelayedSigning","editShowValueAutoComplete","validatedPageNo","totalPending","pendingPageNo","toValidatedPageNo","totalPriced","pricedPageNo","canceledPageNo","delayedSigningPageNo","idCropSelected","idProductSelected","idTypeOrderContractSelected","idTypeFixationSelected","idCompagnySelected","dateSelected","selectedClient","viewMode","typeContract","showDetails","showDetailsPendingCover","showDetailsCover","allSelected","automaticCover","AutomaticCover","automaticCoverModule","automaticTargetPriceModule","fixTargetPrice","FixTargetPrice","moduleElectronicSignatureIsActive","moduleYousignIsActive","bActivateContractsValidation","coverContract","Admin_ContractFirmMonitoring_CoverContract","Button_PositionOnMarket","Admin_ContractFirmMonitoring_Button_PositionOnMarket","PopUpCoverContractsSelected_Title","Admin_ContractFirmMonitoring_PopUpCoverContractsSelected_Title_PositioningConfirmation","PopUpCoverContractsSelected_Text","Admin_ContractFirmMonitoring_PopUpCoverContractsSelected_Text","lstProducts","lstTypeOrders","lstTypeFixations","listIdContractsToCover","enumIdStateCover","allContractsInView","IsActionFixed","FixContract","prixTargetPricedContractFixed","Iscover","regexfloat","refreshUsers","Filter","refreshContractors","converDate","GetValidatedContractsWithFilter","idStateCover","globalLoading","selectedIdContract","selectedIdClient","selectedIdContractBase","GetValidatedContractsPaginate","Total","contractsNoCover","ListVm","contractsPendingCover","contractsCover","contract","GetPendingContractsWithFilter","GetPendingContractsPaginate","GetToValidatedContractsWithFilter","selectedIdContractor","GetToValidatedContractsPaginate","totalToValidated","contractsToValidated","GetCanceledContractsWithFilter","GetCanceledContractsPaginate","totalCanceled","contractsCanceled","GetPricedContractsWithFilter","GetPricedContractsPaginate","GetDelayedSigningContractsWithFilter","GetDelayedSigningContractsPaginate","totalDelayedSigning","contractsDelayedSigning","GetCrops","GetCropsVisible","defaultCropInCrops","GetFiltersWithContracts","GetFiltersWithContractsByCropAndTabContract","LstProductFilterVm","LstTypeOrderFilterVm","lstCompagnies","LstCompagnies","LstTypeFixationFilterVm","IdProduct","ProductLabel","GetIdContractsToSelect","data2","status2","SelectContract","CheckContractSelected","showPopConfirm","errorMessagePopUpContractsNoCover","errorMessageContractsNoCover","successMessageContractsNoCover","CheckPopUpFixedContractSelected","Admin_ContractFirmMonitoring_PopUpFixedContractsSelected_Error_NoTargetPrice","CoverContractsSelected","isValidatePriceObjectifView","CoverContrats","GetData","pageNo","Sort","successMessage","GetDetail","modalTitle","detailedContract","detailedIdContract","GetAthenaOrdersVmByIdContract","lstAthenaOrdersVm","ShowPopUpDeleted","openPopUpDeleted","idContractSelected","SetIsLogicallyDeleted","ShowPopUpValidatedContract","openPopUpValidatedContract","MessageValidatedContract","Admin_ContractsFirm_ToValidated_PopupValidatedContract_Text","ConfirmValidatedContract","ValidatedContract","ShowPopUpRefusedContract","openPopUpRefusedContract","MessageRefusedContract","Admin_ContractsFirm_ToValidated_PopupRefusedContract_Text","ConfirmRefusedContract","RefusedContract","CalculPriceCondPartsOnChange","contractSelected","LstTreeUserGroupConditionSelectedVms","CheckAndSetGroupConditions","conditionParticulars","totalActuel","totalCondPartDiff","TotalConditions","NewPrice","TargetPrice","ShowPopUpEditedContract","openPopUpEditedContract","contractFirm","IdTypeContract","NewQuantity","Quantity","GetContractCondParts","IdContract","contractCondParts","GetCondParts","IdOffer","IdTree","IdContractCommitment","IdExpiry","IdVariety","ConditionParticularsOnChange","AutocompletConditionParticularsOnChange","selectedValue","IdTreeCondition","conditionSelected","AutocompleteCondPartSearch","LstOptions","LstConditionParticularsChilds","ChkEditedContract","editedContractErrorMessage","Error_ContractsFirm_ToValidated_PopupEditedContract_MessageError_Price","Error_ContractsFirm_ToValidated_PopupEditedContract_MessageError_Tonnage","ConfirmEditedContract","EditedContract","ValidateFixedContractSelected","showPopupFixedContract","PopupFixedContractsSelectedTitle","CancelContractPopUp","showPopUpContract","PopUpMessageDeleteContract","MessageDeleteContractFirmTargetPrice","PopupCanceledContractsSelectedTitle","HistoContractPopUp","currentContract","openPopUpHisto","GetHistoContract","IdInit","lstHistoContract","ModalTitle","CancelContract","UpdateContract","PopUpContractPendingCover","openPopUpContractPendingCover","idContractPendingCoverSelected","coverContractPopUpTitle","Admin_ContractFirmMonitoring_CoverContract_PopUp_Title","coverContractPopUpText","Admin_ContractFirmMonitoring_CoverContract_PopUp_Text","UpdateContractPendingCover","ResetListeContractFixed","ExportValidatedContracts","downloadPath","ExportPricedContracts","ExportCanceledContracts","ExportPendingContracts","ExportToValidatedContracts","getCropsWithContractsCommitment","GetCropsWithContracts","GetFiltersWithContractsCommitment","tableContractsCommitmentValidatedDataVisible","tableContractsCommitmentValidatedLibelle","idTypeCommitmentContractSelected","showDetailsValidated","lstTypeCommitments","titleFixContractCommitmentPopUp","Admin_ContractCommitment_PopupFix_Title","getContractsCommitmentValidated","GetContractsCommitmentValidatedPaginate","totalValidated","contractsCommitmentValidated","GetFiltersWithContractsCommitmentByCrop","LstTypeCommitmentFilterVm","IdTypeCommitment","LabelTypeCommitment","OpenFixContractCommitmentPopUp","fixContractCommimentErrorMessage","fixContractCommimentNoOfferMessage","GetInfosForFixContractCommitment","fixContractCommitmentVm","Admin_ContractCommitment_PopupFix_NoOfferMessage","ChkFixContractCommitmentIsValid","QuantityToFix","QuantityLeftToFix","Admin_ContractCommitment_PopupFix_QtyErrorMessage","FixContractCommitment","FixNewContractFromContractCommitment","Admin_ContractCommitment_FixContractCommitment_SuccessMessage","getCropsWithContractsSurfaceCommitment","GetFiltersWithContractsSurfaceCommitment","tableContractsSurfaceCommitmentValidatedDataVisible","tableContractsSurfaceCommitmentValidatedLibelle","getContractsSurfaceCommitmentValidated","GetContractsSurfaceCommitmentValidatedPaginate","contractsSurfaceCommitmentValidated","GetFiltersWithContractsSurfaceCommitmentByCrop","contractBaseService","tableContractsBaseValidatedDataVisible","tableContractsBaseValidatedLibelle","tableContractsBasePendingDataVisible","tableContractsBasePendingLibelle","tableContractsBasePricedDataVisible","tableContractsBasePricedLibelle","tableContractsBaseCanceledDataVisible","tableContractsBaseCanceledLibelle","GetCropsWithContractsBase","GetFiltersWithContractsBaseByCrop","GetContractsBaseValidateWithFilter","GetContractsBasePendingWithFilter","GetContractsBasePricedWithFilter","GetContractsBaseCancelWithFilter","pagenum","errorMessageContractBaseValidated","GetContractsBasePaginate","ContractsBasesValidated","errorMessageContractBasePending","ContractsBasesPending","errorMessageContractBasePriced","ContractsBasesPriced","errorMessageContractBaseCanceld","ContractsBasesCanceled","PopUpMessageCancelContract","MessageDeleteContractBaseTargetPrice","CanceledContract","IdContractBase","CancelContractBaseSuccessMessage","Success_AdminContractBasesMonitoring_CancelContractsBaseMessage","UpdateContractBase","ExportValidatedContractsBase","ExportPricedContractsBase","ExportCanceledContractsBase","ExportPendingContractsBase","tableContractsSubscriptionDataVisible","tableContractsSubscriptionLibelle","tableContractsObservationDataVisible","tableContractsObservationLibelle","tableContractsFixedDataVisible","tableContractsFixedLibelle","tableContractsCanceledDataVisible","tableContractsCanceledLibelle","subscriptionPageNo","observationPageNo","fixedPageNo","GetCropsWithContractsBuiltPrice","GetFiltersWithContractsBuiltPriceByCrop","GetContractsBuiltPriceSubscriptionWithFilter","GetContractsBuiltPriceObservationWithFilter","GetContractsBuiltPriceFixedWithFilter","GetContractsBuiltPriceCanceledWithFilter","errorMessageContractBuiltPriceSubscription","GetContractsBuiltPricePaginate","totalSubscription","ContractsSubscription","errorMessageContractBuiltPriceObservation","totalObservation","ContractsObservation","errorMessageContractBuiltPriceFixed","totalFixed","ContractsFixed","errorMessageContractBuiltPriceCanceled","errorMessageContractBuiltPriceContractSubscription","ContractsCanceled","ShowPopUpEditBuiltPriceContract","openPopUpEditedBuiltPriceContract","MessageInfo","Admin_ContractBuiltPriceContract_Subscription_PopupEditedBuiltPriceContract_Label_NumContract","Admin_ContractBuiltPriceContract_Subscription_PopupEditedBuiltPriceContract_Label_Of","UserFullName","editedBuiltPriceContractErrorMessage","CheckEditedBuiltPriceContract","Error_AdminEditQuantityContractBuiltPrices_Quantity_Min","Error_AdminEditQuantityContractBuiltPrices_Quantity","ConfirmEditedBuiltPriceContract","EditedBuiltPriceContract","templateMailsService","enumRoles","succesMessageTemplate","templates","TypeTemplateSelected","CompagnySelected","LanguageSelected","enumCategoryTypeTemplateMails","CheckLanguage","GetAllTypeTemplateMails","clickTab","EditTemplateMail","typeTemplateMail","idRole","TemplateAdmin","Editable","IdTypeTemplateMail","TemplateAgri","TemplateTC","typeTemplateMails","SaveConfigMails","typeTemplateMailFiltereds","IdCategoryTypeTemplateMail","isDefaultLanguage","templatesService","lstTypesTemplates","templatesFilter","Action_Disable","Admin_EditorialContract_Action_Disable","PopUpDisable_Title","Admin_EditorialContract_PopUpDisable_Title","PopUpDisable_Message","Admin_EditorialContract_PopUpDisable_Message","PopUpDisable_Button_Yes","PopUpDisable_Button_No","GetEnableTemplates","GetTemplates","IsEnable","lstLanguages","filterGeneral","IdTypeTemplate","TypeTemplate","Compagny","Delete","idTemplate","DeleteTemplate","Disable","DisableTemplate","Admin_EditorialContract_PopUpDisable_MessageSuccess","AddTemplate","EditTemplateContract","contractsOptionService","tableContractsOptionExpiredDataVisible","tableContractsOptionExpiredLibelle","tableContractsOptionPendingDataVisible","tableContractsOptionPendingLibelle","tableContractsOptionDetailsDataVisible","tableContractsOptionDetailsLibelle","expiredPageNo","dataExpired","idTypeOptionSelected","date2Filter","dateExecutedSelected","dateAbandonedSelected","detailsMessage","Admin_ContractsOption_DetailsMessage","detailsMessageList","Admin_ContractsOption_DetailsMessage_List","date3Filter","GetCropsWithContractsOption","GetFiltersWithContractsOption","GetFiltersWithContractsOptionByCrop","lstTypeOption","LstTypeOptionFilterVm","IdTypeOption","TypeOptionLabel","GetContractsOptionExpiredWithFilter","GetContractsOptionPendingWithFilter","errorMessageContractOptionExpired","GetMonitoringContractOptionExpiredPaginate","totalExpired","ContractsOptionExpired","errorMessageContractOptionPending","GetMonitoringContractOptionPendingPaginate","ContractsOptionPending","textDetail","textDetailList","GetContractOptionDetails","productsService","languageService","tagsService","compagnyService","getProducts","GetAllProductsLight","products","selectIdsProducts","idtemplate","tagselected","Template","disabledChangeType","disabledChangeCompagny","txtBtnSave","newTemplate","IsMultilingue","inputProductLabel","enumTypeTemplate","GetAll","SetDefautlLanguage","blocTitle","getTemplate","GetTypeTemplate","GetLanguages","GetTags","GetTagsByIdTypeTemplate","lstTags","AddTag","txtTemplate","insertHtml","GetAllTypeTemplate","Languages","GetDefaultLanguage","CheckTemplate","SaveTemplate","OverviewTemplate","fetch","blob","createObjectURL","Admin_Template_Error_NotAllElements","idsProductsSelected","ListProductIdsSelected","KeyTag","UploadImage","PrivateLabel","clickOnProductElement","idProduct","GetTemplateById","productAll","enumTypeTemplateMails","idTypeTemplateMail","GetTemplate","GetTypeTemplateMails","Focus","GetTemplateByIdTypeTemplateMailAndIdRoleAndIdLanguage","GetTagsForTemplatesMails","AddTagInput","ActiveElementMailObject","selectionStart","selectionEnd","FocusMailObject","SaveTemplateMail","communicationMarketInfoService","FirstLoad","tableCommunicationMarketInfoDataVisible","tableCommunicationMarketInfoLibelle","maxCommunicationMarketInfo","communicationMarketInfoPageNo","dataCommunicationMarketInfo","idCommunicationMarketInfoSelected","searchLabelCommunicationMarketInfotring","GetAllCommunicationMarketInfos","msgConf","FilterCommunicationMarketInfo","GetAllCommunicationMarketInfoPaginate","lstCommunicationMarketInfo","totalCommunicationMarketInfo","GetCommunicationMarketInfoSelected","contentSelected","SearchCommunicationMarketInfoByAutoComplete","searchString","defered","GetItemsCommunicationMarketInfoByAutoComplete","errorMessageContentInfosMarket","DeleteComMarketInfo","idCommunicationMarketInfo","DeleteCommunicationMarketInfo","comMarketInfo","idComMarketInfoSelected","weekDays","monthDays","enumTypeSends","setWeekAndMonthDays","checkComMarketInfoToSave","LstGroupContactSelecteds","IdTypeSend","HourSend","DayOfWeekSend","DayOfMonthSend","disabledButtonActions","txtComMarketInfoContent","tagSelected","toogleAllElementsLeft","allSelectedLeft","LstGroupContacts","toogleAllElementsRight","allSelectedRight","AddToSelectedGroups","indexItem","DeleteInSelectedGroups","alertMailService","groupContactService","labelButtonEnableOrDisableAlert","Admin_AlertMail_Button_Disable","tableAlertMailDataVisible","tableAlertMailLibelle","subTabAlertEnable","Admin_AlertMail_SubTab_AlertEnable","subTabAlertDisable","Admin_AlertMail_SubTab_AlertDisable","buttonAddAlertMail","Admin_AlertMail_Button_AddAlert","popUpDeleteTitle","Admin_AlertMail_PopUpDelete_Title","popUpDeleteText","Admin_AlertMail_PopUpDelete_Text","maxAlertMail","alertMailPageNo","dataAlertMail","alertMailAction","ListIdAlertMail","ActivatedAlertMail","GetAlertMails","GetAlertMailsPaginate","idGroupContactSelected","lstAlertMail","totalAlertMail","GetGroupContacts","lstGroupContacts","alertMail","IdAlertMail","SelectAlertMail","idAlertMail","DisableOrEnableAlertMail","EditAlertMailState","DeleteAlertMail","FilterGroupContact","Admin_AlertMail_Button_Enable","AddAlertMail","EditAlertMail","DuplicateAlertMail","operationService","ConvertSelectDaysOfWeekToString","valueString","lstDaysOfWeek","GetSelectedOperation","lstOperations","Checked","currentAlertMail","LstOperationSelecteds","SetSelectedOperation","IdOperation","CheckStep","isButtonSaveAndExit","SaveAlertMail","ManageStepAndData","disableSubmitedButton","ReturnListingAlertMail","idAlertmail","CancelLabel","Admin_CreateAlertMail_TitleAdd","Admin_CreateAlertMail_TitleEdit","Step1","Step2","Step3","Admin_CreateAlertMail_Breadrumb_GlobalInformation","Admin_CreateAlertMail_Breadrumb_DocumentChoice","Admin_CreateAlertMail_Breadrumb_MessageWriting","SaveAndExit","Next","Previous","Admin_CreateAlertMail_ProgrammationName","Admin_CreateAlertMail_SelectGroupContact","Admin_CreateAlertMail_AvailableGroups","Admin_CreateAlertMail_SelectAll","Add","Admin_CreateAlertMail_SelectedGroups","Admin_CreateAlertMail_FrequencyToSend","Admin_CreateAlertMail_SelectHourToSend","Admin_CreateAlertMail_SelectDayOrDaysToSend","Admin_CreateAlertMail_SelectDayToSend","The","OfEachMonth","Admin_CreateAlertMail_Table_ColunmName_OperationCode","Admin_CreateAlertMail_Table_ColunmName_OperationLabel","Admin_CreateAlertMail_MailObject","Admin_CreateAlertMail_MailContent","SelectWithPoint","ModeDupliquer","ModeEdition","loadAllData","GetAlertMailById","IsDuplicate","getGroupContacts","getTypeSends","getDaysOfWeek","getWeekNumbers","GetTypeSends","lstTypeSends","GetDaysOfWeek","SetCheckDaysOfWeek","GetWeekNumbers","lstWeekNumbers","IdGroupContact","setSelectedList","toogleAllElementsLeftGroup","master1","toogleAllElementsRightGroup","master2","ListToSelectedGroup","SelectedToListGroup","DaysOfWeekSend","Check","NextStep","GetDataStep2","GetDataStep3","SaveStep","goToStep","GetOperationsForAlertMail","PrevStep","mailContent","MailObject","accuWeatherCallService","tableAccuWeatherCallDataVisible","tableAccuWeatherCallLibelle","buttonValidate","resultLabel","Admin_AccuWheather_Result","columnMonth","Admin_AccuWheather_TableSumMonth_ColunmName_Month","columnCallNumber","Admin_AccuWheather_TableSumMonth_ColunmName_CallNumber","buttonDetail","Admin_AccuWheather_Details","maxAccuWeatherCall","accuWeatherCallPageNo","dataAccuWeatherCall","GetFilterAccuWeatherCall","GetAccuWeatherCalls","GetAccuWeatherCallsPaginate","startDateFilter","endDateFilter","lstAccuWeatherCalls","totalAccuWeatherCalls","GetSumMonthAccuWeatherCalls","lstSumMonthAccuWeatherCalls","lstMontsForFilter","ListMonth","StartDate","EndDate","ValidateFilter","ShowTableAccuWheather","ClickDetails","receiveMessage","openPopEditableMobile","mobileEditableObjectKey","ClosePopEditableMobile","SaveDataPopEditableMobile","typeCommitmentsService","offerService","typeQuotesService","typeOffersService","strikeService","getAllOfferUserIncidence","errorOfferUserIncidenceMessage","currentOfferUserIncidence","GetDataOfferUserIncidence","offerUserIncidenceUpdate","listOfferUserIncidence","LstOfferUserIncidence","listUserOfferGroupContact","LstUserOfferGroupContact","filterCrop","filterName","filterProduct","filterTypeQuote","filterTypeOffer","filterCompagny","filterMarket","filterComment","filterOperation","filterTypeCommitmentForSubscribe","showAllExpiryOffer","AddOffer","parambUseIncidenceOffer","bUseIncidenceOffer","parambManageIncidenceBase","bManageIncidenceBase","IsUneal","parambUseNotificationPush","bUseNotificationPush","parambUseNotificationSms","bUseNotificationSms","moduleOptionActif","offerAction","LstIdOffer","IsDisable","selectedUserAutoCompleteObject","TotalTonnage","Admin_Offer_Step5_TotalTonnage","TotalSurface","Admin_Offer_Step5_TotalSurface","ActionOfferMessage_Add","Admin_ListingOffer_ActionOfferMessage_AddMessage","ActionOfferMessage_Edit","Admin_ListingOffer_ActionOfferMessage_EditMessage","ActionOfferMessage_Delete","Admin_ListingOffer_ActionOfferMessage_DeleteMessage","PopUpOfferMessage_Title","Admin_ListingOffer_PopUpOfferMessage_Title","bActiveDecomposeBase","parambActiveOfferGroupContactIncidence","bActiveOfferGroupContactIncidence","ActionOfferOption_RecalculateStrikes","Admin_ListingOffer_ActionOfferOption_RecalculateStrikes","ActionOfferOption_ShowStrikes","Admin_ListingOffer_ActionOfferOption_ShowStrikes","enumTypeOffer","enumTypeCalculOption","groupContactsMenuItems","idsGroupContactChecked","callBack","filtersListingOffers","idStatus","getAllOffersCallback","allOffers","lstMarketWsd","offerGroupContactIncidenceVm","IdMarketWSD","LabelMarket","ListGroupContactVm","grContactShow","showed","lenghtGroupContact","tooltipTextGrContact","tooltipDataGrContact","groupContactsString","itemGrp","GroupContactsString","ListVarieryOfferVm","VarietiesString","itemVariety","ListOfferGroupContactTonnageVm","IsTonnageLimit","offerGrQuantityShow","sumQuantity","showedQuantity","lenghtOfferQuantity","tooltipTextQuantity","tooltipDataQuantity","QuantityLimit","offerGroupContactQuantitystring","typeQuantityText","IdTypeOffer","itemOfferGroupContactQuantity","OfferGroupContactQuantitystring","QuantityLeft","quantityLeft","QuotesExpiryOfferManagerVM","PaymentDate","ListOfferGroupContactPricesVm","Incidence","selectIdsGroupContact","ChangeElementSelected","GetAllOffers","GetDefaultFilters","GetCropsInOffers","GetProductsInOffers","GetTypeQuotesInOffers","typeQuotes","GetOperationsInOffers","Operations","GetTypeOffers","typeOffers","GetGroupContactsInOffers","lstGroupContact","groupContact","idGroupContact","filterByClickGroupContactsMenuItem","setGroupContactMultiSelectValues","groupContactLabel","groupContactAll","groupContactsMenuItem","GetTypeCommitments","reloadOffers","offers","filtreGeneral","IdTypeQuote","IdStatus","IdTypeCommitmentForSubscribe","Comment","buttonDesactivateOfferName","titlePopUpDesactivateOffer","textPopUpDesactivateOffer","lstOffer","DeleteOffer","showPopUpMessage","PopUpDeleteOffer","deletepopup","idOffre","PopUpDeleteOfferMessage","popUpDeleteOfferMessage","idOfferMessage","PopUpOfferMessage_Text","Admin_ListingOffer_PopUpOfferMessage_Text","DeleteOfferMessage","cancelOfferMessage","PopUpAddOfferMessage","showPopUpAddOfferMessage","offer","popUpOfferMessage_OfferMessage","errorPopupOfferMessageHtml","popUpAddOfferMessage_Title","Admin_ListingOffer_PopUpAddOfferMessage_Title","popUpAddOfferMessage_TypeNotification","Admin_ListingOffer_PopUpAddOfferMessage_TypeNotification","popUpAddOfferMessage_SendingProgramming","Admin_ListingOffer_PopUpAddOfferMessage_SendingProgramming","popUpAddOfferMessage_Instantly","Admin_ListingOffer_PopUpAddOfferMessage_Instantly","popUpAddOfferMessage_CustomDateAndHour","Admin_ListingOffer_PopUpAddOfferMessage_CustomDateAndHour","popUpAddOfferMessage_CustomDateAndHour_Date","Admin_ListingOffer_PopUpAddOfferMessage_CustomDateAndHour_Date","popUpAddOfferMessage_CustomDateAndHour_Hour","Admin_ListingOffer_PopUpAddOfferMessage_CustomDateAndHour_Hour","popUpAddOfferMessage_TitleMessage","Admin_ListingOffer_PopUpAddOfferMessage_TitleMessage","popUpAddOfferMessage_TextMessage","Admin_ListingOffer_PopUpAddOfferMessage_TextMessage","popUpAddOfferMessage_TextTagsEnabledForMessage","Admin_ListingOffer_PopUpAddOfferMessage_TextTagsEnabledForMessage","popUpOfferMessage_ListTypeNotificationVm","ListTypeNotificationVm","GetOfferMessageVm","IdOfferMessage","bSendingImmediate","IdTypeNotification","Admin_OfferMessage_DefaultText","SaveOfferMessage","PostOfferMessageVm","errorHtml","PopUpAddOfferUserIncidence","showPopUpAddOfferUserIncidence","popUpAddOfferUserIncidence_Title","Admin_ListingOffer_PopUpAddOfferUserIncidence_Title","popUpAddOfferUserIncidence_AddUserButton","Admin_ListingOffer_PopUpAddOfferUserIncidence_AddUserButton","popUpAddOfferUserIncidence_TitleUsersColumn","Admin_ListingOffer_PopUpAddOfferUserIncidence_TitleUsersColumn","popUpAddOfferUserIncidence_TitleValuesColumn","Admin_ListingOffer_PopUpAddOfferUserIncidence_TitleValuesColumn","popUpAddOfferUserIncidence_PlaceholderIncidenceInput","Admin_ListingOffer_PopUpAddOfferUserIncidence_PlaceholderIncidenceInput","PopUpAddOfferUserIncidence_PlaceholderUserAutoComplet","Admin_ListingOffer_PopUpAddOfferUserIncidence_PlaceholderUserAutoComplet","PopUpDeleteOfferUserIncidence","popUpDeleteOfferUserIncidence","idOfferUserIncidence","PopUpDeleteOfferUserIncidence_Title","Admin_ListingOffer_PopUpDeleteOfferUserIncidence_Title","PopUpDeleteOfferUserIncidence_Message","Admin_ListingOffer_PopUpDeleteOfferUserIncidence_Message","SetSelectedUser","SaveOfferUserIncidence","UpdateOfferUserIncidence","offerUserIncidence","IdOfferUserIncidence","DeleteOfferUserIncidence","EditFinaliser","Dupliquer","SaveVariablesForOffers","IncidenceBaseErrorMessage","Admin_Offer_EditIncidenceBase_NotANumberErrorMessage","PrimeErrorMessage","Admin_Offer_EditPrime_NotANumberErrorMessage","MarginErrorMessage","Admin_Offer_EditMargin_NotANumberErrorMessage","FinancialCostsErrorMessage","Admin_Offer_EditFinancialCosts_NotANumberErrorMessage","LogisticCostsErrorMessage","Admin_Offer_EditLogisticCosts_NotANumberErrorMessage","DepotErrorMessage","Admin_Offer_EditDepot_NotANumberErrorMessage","OthersErrorMessage","Admin_Offer_EditOthers_NotANumberErrorMessage","BaseErrorMessage","Admin_Offer_EditBase_NotANumberErrorMessage","EditVariableForBaseSuccessMessage","Admin_Offer_EditVariableForBase_SuccessMessage","DatePaymentForBaseErrorMessage","Admin_Offer_EditDatePayment_NotADateErrorMessage","lstInfosForOffer","regexDate","Order","IdFirstExpiry","ExpiryBase","IncidenceBase","Prime","Margin","FinancialCosts","LogisticCosts","Depot","Others","ConvertDateToDateAPI","lstOfferGroupContactIncidenceVm","propertyKey","postData","offerVariablesInfos","offerGroupContactIncidencesInfos","editInfosForOffer","ChangeTab","offerItem","CanDisableOrEnableOffer","SelectOffer","PopUpDesactivateOffer","showPopUpDesactivateOffer","DesactivateOffer","DisableOrEnableOffers","initGroupContacts","groupContactLabelsMenuItems","toggleSublistAndRecalculHeight","RecalculateStrikes","Admin_Offer_RecalculateStrikes_SuccessMessage","GetStrikesByIdExpiry","offerOptionExpirySelected","errorPopupDetailStrikesMessage","expiryStrikeDetail","PopUpShowDetailStrikes","showPopUpDetailStrikes","offerOptionExpiriesVm","LabelExpiry","TextExpiryLabel","Common_Expiry_Label","HeaderExerciceDate","Admin_Offer_Strike_ExerciceDate","HeaderPrime","Admin_Offer_Strike_Prime","HeaderSubscriptionCost","Admin_Offer_Strike_SubscriptionCost","HeaderStrike","Admin_Offer_Strike_Strike","wsdApiService","typeOptionsService","typeCalculOptionsService","offerVisibilityService","deliveryPeriodService","validityDurationService","typeOfferCommitmentsService","typeFixationBasesService","currencyService","unitService","categoryOfferService","ceremisApiService","criteriaOfferService","modulesFactory","typePriceService","SaveOffer","currentOffer","checkDistinct","checkIfOfferSubCropsExist","cmpt","lstTypePrices","IdTypePrice","enumTypeOffers","IdCriteriaOffer","IdsSubCrops","Admin_Offer_MultiCrop_ErrorMessage_step1","Admin_Offer_MultiCrop_ErrorMessage2_step1","blankContract","fixe","contractBuiltPrice","IdMarket","multiCampagne","lstOfferExpiry","validExpiries","checkStrike","IdTypeCalculOption","expiry","Strikes","Admin_Offer_Option_ErrorExpiryStrike","strike","ExerciceDate","Variation","Admin_Offer_Option_ErrorStrike","strikesInTheMoney","Error_CreateOffer_Strikes_GapInTheMoney","paramBActiveLinkWithCeremis","BasisMajorationEnabled","BasisMajorationMonth","BasisMajorationValue","StartVisibility","EndVisibility","TypeFixationTypeOrders","SoldFuture","SoldGlobalPrice","StartPosition","EndPosition","startpriseposition","endpriseposition","TargetPriceFuture","TargetPriceGlobalPrice","StartTargetPrice","EndTargetPrice","Admin_CreateOffer_Error_Times_TargetPrice","startpriseobjectif","endpriseobjectif","Admin_CreateOffer_Error_Times_TargetPrice2","SoldBase","StartPositionBase","EndPositionBase","startprisepositionBase","endprisepositionBase","TargetPriceBase","StartTargetPriceBase","EndTargetPriceBase","startpriseobjectifBase","endpriseobjectifBase","StartPositionExerciceOption","EndPositionExerciceOption","Admin_CreateOffer_Error_MissingFixingTime_ExerciceOption","startprisepositionExerciceOption","endprisepositionExerciceOption","Admin_CreateOffer_Error_InvalidDateFormat_ExerciceOption","Admin_CreateOffer_Error_InvalidFixingTime_ExerciceOption","StartPositionTargetExerciceOption","EndPositionTargetExerciceOption","Admin_CreateOffer_Error_MissingFixingTime_TargetExerciceOption","startPositionTargetExerciceOption","endPositionTargetExerciceOption","Admin_CreateOffer_Error_InvalidDateFormat_TargetExerciceOption","Admin_CreateOffer_Error_InvalidFixingTime_TargetExerciceOption","IdValidityDuration","Admin_CreateOffer_Error_SelectDurationValidity_TargetPrice","AllowDateEndTargetPrice","IdTypeFixationBase","IdTypeOfferCommitment","enumTypeOfferCommitments","Admin_CreateOffer_Error_SelectTypeCommitment","moduleAutomaticCover","AutomaticSwitchExpiry","FixationGlobalPrice","OfferCurrencyUnits","IdCurrencyFinal","IdCurrencyForComponents","IdUnitFinal","IdUnitForComponents","DecimalFinal","FixationBase","FixationFuture","DecimalForComponents","parambChooseEntryModeActive","LotEntryMode","Admin_Offer_EntryMode_Error","TargetPriceWithBaseAcquisition","Admin_Offer_TargetPriceWithBaseAcquisition_ErrorSoldBaseNotSelected","tab1","tab2","date1","date2","date3","date4","SubscriptionPeriodBuiltPriceStartDate","SubscriptionPeriodBuiltPriceEndDate","ObservationPeriodBuiltPriceStartDate","ObservationPeriodBuiltPriceEndDate","StartValidity","EndValidity","DeliveryStartDate","Admin_Offer_Expiry_DeliveryStartDate_Error","DeliveryEndDate","Admin_Offer_Expiry_DeliveryEndDate_Error","compareDate","Admin_Offer_Expiry_DateError_EndDateBeforeStartDate","Admin_Offer_Expiry_PaymentDate_Error","CommitmentMin","CommitmentMax","Quotity","GroupContacts","Templates","validTypeTemplateNotSame","HasQuantityLimit","OfferGroupContactTonnageVm","OfferGroupContactTonnage","Label_Admin_Offer_ErrorMessage_Step5_TonnageGroup","TotalQuantityLimit","Label_Admin_Offer_ErrorMessage_Step5_TonnageByGroup","Label_Admin_Offer_ErrorMessage_Step5_Sum_LowerTonnage","Label_Admin_Offer_ErrorMessage_Step5_Sum_HigherTonnage","Clear","IdDestination","isVisibleH24","isPositionH24","isTargetPriceH24","isPositionExerciceOptionH24","isTargetExerciceOptionH24","loadStrikeAutoVm","strikeAutoVm","IdExpiryWsd","IdExpiryWSD","DateClosedExpiry","DateClosed","GapsStrikeAutoVm","indexStrike","Cost","IsStrikeToTheMoney","removeExpiryClosed","dateDuJour","lstOfferDuplicateTmp","dateClosedSplitted","findIndex","loadMarkets","callbackFn","GetMarketsFutureAndCash","lstMarkets","GetMarketsWSDToEuronext","loadAndFilterOffersCeremis","GetCrop","GetOffersCeremis","IdExt","lstOffersCeremis","lstmarketTmp","loadExpiries","market","GetExpiriesWSDByIdMarketWithQuotes","TypeLocat","lstExpiry","Expiries","lstExpiryTmp","GetExpiriesWSDByIdMarket","typeCalculOption","manageCheckBoxStrikeForDelta","offerExpiry","currentIndexForStrikeDelta","strikeDeltaPopUp","strikeToTheMoney","strikesInfos","currentStrikeToTheMoneyForStrikeDelta","Strike","strikeinfoVm","deltaCurrentStrikeAndStrikeToTheMoney","deltaValue","indexInOfferExpiryListStrikeDelta","ListStrikeDelta","SelectStrikeForDelta","showStrikesErrorMessage","Admin_Offer_Strike_NoStrikeToTheMoneyAvailable","infosMultiCropMessage","Admin_Offer_MultiCrop_Text_step1","lstSelectedVarieties","lstSelectedGroup","lstSelectedContract","lstSelectedtmp","refIdsSubCrops","tmpOffer","watchEditBuiltPrice","watchTypeFixation","watchFixationBaseConstraint","fileName","paramWatcher","enumTypeQuotes","enumValidityDurations","enumTypeCommitments","paramDisplaySurfaceYield","DisplaySurfaceYield","enumTypeOption","enumVisibilityOffer","EditableObjectComment","bChooseEntryMode","pushNotificationEnabled","GoogleConsoleCloudServiceFilename","bActivateSignatureOffer","paramBActivateModeDeltaForStrike","bActivateModeDeltaForStrike","paramBActiveOfferOptionCapacityControl","bActiveOfferOptionCapacityControl","step2_Title","Admin_CreateOffer_Step2_Label","Label_Admin_Offer_Strike_ExerciceDate","Label_Admin_Offer_Strike_Prime","Label_Admin_Offer_Strike_SubscriptionCost","Label_Admin_Offer_Strike_Variations","Admin_Offer_Strike_Variations","Label_Admin_Offer_Strike_Add","Admin_Offer_Strike_Add","Label_Admin_Offer_Strike_Edit","Admin_Offer_Strike_Edit","Label_Admin_Offer_Strike_Strike","Admin_CreateOffer_PopUpStrikeAuto_Title","Admin_CreateOffer_PopUpStrikeAuto_Label_Margin","Admin_CreateOffer_PopUpStrikeAuto_Label_Cost","Admin_CreateOffer_PopUpStrikeAuto_Column_Label_ExcerciceLimitDate","Admin_CreateOffer_PopUpStrikeAuto_Column_Label_Gap","Admin_CreateOffer_PopUpStrikeAuto_Button_Add","Admin_CreateOffer_PopUpStrikeAuto_NbStrikes","Admin_CreateOffer_PopUpStrikeAuto_GapVariation","Admin_CreateOffer_PopUpStrikeAuto_ExerciceDate","Label_Admin_Offer_Step3_Display","Admin_Offer_Step3_Display","Label_Admin_Offer_Step3_FixationMode","Admin_Offer_Step3_FixationMode","Label_Admin_Offer_Step3_CommitmentConstraint","Admin_Offer_Step3_CommitmentConstraint","Label_Admin_Offer_Step3_TypeCommitment","Admin_Offer_Step3_TypeCommitment","Label_Admin_Offer_Step3_FixationBaseConstraint","Admin_Offer_Step3_FixationBaseConstraint","Label_Admin_Offer_Step3_FixationCurrencyUnit","Admin_Offer_Step3_FixationCurrencyUnit","Label_Admin_Offer_Step3_FixationDecimal","Admin_Offer_Step3_FixationDecimal","Label_Admin_Offer_Step3_FixationExerciceOption","Admin_Offer_Step3_FixationExerciceOption","Label_Admin_Offer_Step3_HoursOpenFixationExerciceOption","Admin_Offer_Step3_HoursOpenFixationExerciceOption","Label_Admin_Offer_Step3_HoursOpenFixationTargetExerciceOption","Admin_Offer_Step3_HoursOpenFixationTargetExerciceOption","Label_Admin_Offer_Step3_StartOpenFixationCommon","Admin_Offer_Step3_StartOpenFixationCommon","Label_Admin_Offer_Step3_EndOpenFixationCommon","Admin_Offer_Step3_EndOpenFixationCommon","Label_Admin_Offer_Step3_OpenH24FixationCommon","Admin_Offer_Step3_OpenH24FixationCommon","Label_Admin_Offer_Step1_CategoryOffer","Admin_Offer_Step1_CategoryOffer","Label_Admin_Offer_Step1_CriteriaOffer","Admin_Offer_Step1_CriteriaOffer","Label_Admin_Offer_Step4_TonnageLimit","Admin_Offer_Step4_TonnageLimit","Label_Admin_Offer_Step4_SurfaceLimit","Admin_Offer_Step4_SurfaceLimit","Label_Admin_Offer_Step4_Label_TonnageLimit","Admin_Offer_Step4_Label_TonnageLimit","Label_Admin_Offer_Step4_Label_SurfaceLimit","Admin_Offer_Step4_Label_SurfaceLimit","Label_Admin_Offer_Step4_Tonnes","Admin_Offer_Step4_Tonnes","Label_Admin_Offer_Step4_Hectares","Admin_Offer_Step4_Hectares","Label_Admin_Offer_Step5_DistributionTonnageLimit","Admin_Offer_Step5_DistributionTonnageLimit","Label_Admin_Offer_Step5_TotalTonnage","Label_Admin_Offer_Step5_DistributionSurfaceLimit","Admin_Offer_Step5_DistributionSurfaceLimit","Label_Admin_Offer_Step5_TotalSurface","Label_Admin_Offer_Step2_Comment","Admin_Offer_Step2_Comment","Label_Admin_Offer_Step2_Strike_Button_Validate","Admin_Offer_Strike_Button_Validate","Admin_Offer_ErrorMessage_Step5_TonnageByGroup","Admin_Offer_ErrorMessage_Step5_Sum_LowerTonnage","Admin_Offer_ErrorMessage_Step5_Sum_HigherTonnage","Admin_Offer_ErrorMessage_Step5_TonnageGroup","Label_Admin_Offer_ErrorMessage_Step4_DistributionTonnage","Admin_Offer_ErrorMessage_Step4_DistributionTonnage","Label_Admin_Offer_PrimeExpiry","Admin_Offer_PrimeExpiry_ErrorMessage","Label_Admin_Offer_MarginExpiry","Admin_Offer_MarginExpiry_ErrorMessage","Label_Admin_Offer_FinancialCostsExpiry","Admin_Offer_FinancialCostsExpiry_ErrorMessage","Label_Admin_Offer_LogisticCostsExpiry","Admin_Offer_LogisticCostsExpiry_ErrorMessage","Label_Admin_Offer_DepotExpiry","Admin_Offer_DepotExpiry_ErrorMessage","Label_Admin_Offer_OthersExpiry","Admin_Offer_OthersExpiry_ErrorMessage","signingSmsGlobalyActived","lstAllTypeQuotes","lstTypeFixationBasesOrigin","nbStep","idoffer","ducroquetValidTypeCoverPopUp","lstEntryModes","TonLabel","LotLabel","GetAllProducts","lstAllProducts","GetBodyOffer","OfferOptionCapacityControlActivated","VarietiesVm","OfferGroupContactTonnages","IsVisibleTC","ContractSigningEnabled","IdVisibilityOffer","OfferExpiriesVm","GetOfferById","isPositionBaseH24","isTargetPriceBaseH24","Admin_CreateOffer_Step2_Label_Commitment","ObservationPeriodStarted","offerExpiries","DateStart","OptionLimitExerciceDate","DateMin","HasContract","HasContractBase","HasContractOption","GetDataStep5","Attachment","GetExpiries","VerifChangementData","oe","FilterProducts","lstTypeOffer","GetOperationsByTreatment","GetTypePrices","GetTypeQuotes","updateLstTypeQuote","lstCrops","GetTreesForSelect","lstTree","GetTypeOptions","GetTypeCalculOptions","lstTypeCalculOption","defaultLanguage","GetAllCategoryOffers","lstCategoryOffer","GetAllCriteriaOffers","lstCriteriaOffer","updateLstTypeQuoteAndSetContractValidationDisabled","ContractValidationDisabled","lstTypeQuotes","lstValidityDuration","GetTypeFixationBases","lstTypeFixationBases","GetTypeOfferCommitments","lstTypeOfferCommitments","GetAllCurrencies","lstCurrencies","IdOfferCurrencyUnit","IdCurrency","GetAllUnits","lstUnits","IdUnit","indexTypeFixationBaseAuto","UpdateOfferGroupContact","currentGroupContact","offerGroup","IdOfferGroupContactTonnage","SumTonnageLimit","GetOfferVisibilities","lstVisibilityOffer","lstTemplates","typeTemplatesNecessary","IdTemplate","noWatchBuiltPriceData","noWatch","noWatchTypeFixation","nowatchFixationBaseConstraint","VerifChangementBuiltPriceData","showPopUpEditOffer","disableWatcher","ClearStep","cancelModif","showPopUpEditBuiltPriceOffer","disableWatcherBuiltPriceData","cancelModifBuiltPriceData","ValidTargetContractBasesFix","ValidTargetContracts","lstvarieteTmp","idCompagny","resetIdProduct","lstProductsFiltre","Compagnies","greaterThan","idCropRef","minLabel","LstMultiCrop","GetVarieties","lstVarieties","lstVarietiesByProduct","variety","isInit","ChangeTypeCalculOption","ChangeQuantityLimit","lstGroup","CheckExpiries","CheckSameTypeTemplate","CheckAndSaveOffer","showPopUpTypeCover","TmpSave","confirmPopUpTypeCover","idTypeTemplateToCheck","contractLabel","CreateOffer_Template_ContractCommitement","checkTemplateForType","CreateOffer_Template_ContractCommitmentSurface","CreateOffer_Template_BlankContract","CreateOffer_Template_Error_MustSelectContractType","CreateOffer_Template_Error_ForTypeOrder","CreateOffer_Template_ContractMultiCrop","CreateOffer_Template_ContratBuiltPrice","CreateOffer_Template_ExitAnticipatedBuiltPrice","CreateOffer_Template_ContractOption","CreateOffer_Template_ExerciseOption","CreateOffer_Template_TargetExerciseOption","CreateOffer_Template_ContractSell","CreateOffer_Template_ContractObjectifPrice","CreateOffer_Template_ContractBaseSell","CreateOffer_Template_ContractBaseObjectifPrice","checkCrossTypeTemplate","offerSelectedCompagny","some","CreateOffer_Template_Error_ForSociety","CreateOffer_Template_Error_InLanguage","CreateOffer_Template_Error_ForAllSociety","compangny","itemTemplate","CreateOffer_Template_Error_NotAuthorized","tabStartValidity","tabEndValidity","tabSubscriptionPeriodBuiltPriceStartDate","tabSubscriptionPeriodBuiltPriceEndDate","tabObservationPeriodBuiltPriceStartDate","tabObservationPeriodBuiltPriceEndDate","listContractBasesToValide","listContractsToValide","GetTargetContractBasesFixToValidate","dataContractBase","GetTargetContractsToValidate","dataContract","statusContract","showPopUpListContractsFixToValidate","ListToSelected","SelectedToList","master3","master4","toogleAllElementsLeftContract","master5","toogleAllElementsRightContract","master6","ListToSelectedContract","SelectedToListContract","CheckDateObjectif","AddExpiry","expiryVm","expriryWSD","marketVm","LabelledWSD","ExpiryNameFR","CloseDate","IsNew","DeleteExpiry","GetTotalBase","offerExpiryBaseValueToRound","dateClosed","OptionSubscribeCost","Admin_Offer_ExpiryOption_SubscribeCost_Error","compareDate1SuperiorDate2","Admin_Offer_ExpiryOption_LimitExerciceDate_Error","Admin_Offer_ExpiryOption_NoStrikeSelected_Error","sameTypeTemplates","orderByExpiries","setVisibilityOfferH24","setPositionOfferH24","setTargetPriceOfferH24","setPositionOfferBaseH24","setTargetPriceOfferBaseH24","setPositionExerciceOptionH24","setTargetExerciceOptionH24","setAutomaticSwitchExpiry","addStrike","deleteStrike","strikeToDelete","IdStrike","CanDeleteStrike","canDelete","Error_OfferSubscribe_Delete_Strike","ShowAutomaticStrike","indexStrikeAutoToInsert","strikeAutoErrorMessage","addStrikeGap","Error_CreateOffer_PopUpStrikeAuto_ExerciceDate","NbStrikes","Error_CreateOffer_PopUpStrikeAuto_NbStrikes","GapVariation","Error_CreateOffer_PopUpStrikeAuto_GapVariation","nbStrikesInTheMoney","DeleteStrikeAuto","ChkStrikeAuto","Error_CreateOffer_PopUpStrikeAuto_Margin","Error_CreateOffer_PopUpStrikeAuto_Cost","Error_CreateOffer_PopUpStrikeAuto_NoGaps","numLine","Error_CreateOffer_PopUpStrikeAuto_ExcerciceDate","Error_CreateOffer_PopUpStrikeAuto_Gap","cancelPopUpStrikeAutoButton","cancelPopUpStrikeAuto","ValidStrikeAuto","GenerateStrikeAuto","onFileSelect","linkFile","resetFile","DeleteAttachement","ShowStrikes","showStrikesTitleByExpiryWsd","Admin_Offer_Strike_StrikesVisibility","GetCeremisStrikes","ListStrikeInfoVm","Admin_Offer_Strike_NoStrikeAvailable","confirmPopUpStrikes","strikeDelta","closePopUpStrikes","coverService","getInfosPopUpAthenaOrderBuiltPrice","openPopup","GetInfosPopUpAthenaOrderBuiltPrice","labelExpiry","orderPopUp","IdAccount","Direction","IdOrderType","IdMarketWsd","TxtQtyToSend","Admin_Built_Price_Manager_PopUp_TxtQtyToSend","QtyToSend","IdOfferBuiltPrice","openPopupOrder","popupOrderErrorMessage","ModalTitleAddOrder","getAccounts","GetAllAccounts","lstAccounts","isPopUpBuiltPriceOrder","successMessageEditable","titlePage","Menu_Admin_Offer_BuiltPriceManager","offerLabel","Admin_Offer_BuiltPriceManager_OfferLabel","totalQtyLabel","Admin_Offer_BuiltPriceManager_QuantityTotalLabel","qtyExitBuiltPriceLabel","Admin_Offer_BuiltPriceManager_QuantityOfContractsAnticipatedExitLabel","qtyAvailableLabel","Admin_Offer_BuiltPriceManager_QuantityAvailableForAnticipatedExitLabel","dateObservation_Label","Admin_Built_Price_Manager_Date_Observation","percentDay_Label","Admin_Built_Price_Manager_PercentDay","percentFixeAccount_Label","Admin_Built_Price_Manager_PercentFixedAccount","qtyToCovered_Label","Admin_Built_Price_Manager_QtyToCovered","qtyExitAnticipated_Label","Admin_Built_Price_Manager_QtyExitAnticipated","qtyCoveredWithLots_Label","Admin_Built_Price_Manager_QtyCoveredWithLots","qtyCovered_Label","Admin_Built_Price_Manager_QtyCovered","qtyToExitAnticipated_Label","Admin_Built_Price_Manager_QtyToExitAnticipated","qtyRemainingToSell_Label","Admin_Built_Price_Manager_QtyRemainingToSell","expiryCover_Label","Admin_Built_Price_Manager_ExpiryCover","TotalBaseComponent_Label","Admin_Built_Price_Manager_TotalBaseComponentValue","averageMarketPriceWithoutExitAnticipated_Label","Admin_Built_Price_Manager_AverageMarketPriceWithoutExitAnticipated","averagePriceWithoutExitAnticipated_Label","Admin_Built_Price_Manager_AveragePriceWithoutExitAnticipated","startDateFilter_Label","Admin_Built_Price_Manager_StartDateFilter","endDateFilter_Label","Admin_Built_Price_Manager_EndDateFilter","market_Label","Admin_Built_Price_Manager_Market_Label","nbLotsCover_Label","Admin_Built_Price_Manager_NbLotsCover","nbLotsToCover","Admin_Built_Price_Manager_NbLotsToCover","paramNbDaysFilterDateBuiltPriceObservations","NbDaysFilterDateBuiltPriceObservations","price_Label","Admin_Built_Price_Manager_Price","numOrder_Label","Admin_Built_Price_Manager_NumOrder","numExt_Label","Admin_Built_Price_Manager_NumExt","tonsCovered_Label","Admin_Built_Price_Manager_TonsCovered","lotCovered_Label","Admin_Built_Price_Manager_LotCovered","anyLot_Label","Admin_Built_Price_Manager_AnyLot","date_Label","Admin_Built_Price_Manager_Date","GetInfoBuiltPriceForAdmin","isEuronextOpen","IsEuronextOpen","qtyAvailableForExit","QuantityAvailableForAnticipatedExitBuiltPrice","StartDateFilter","InfoBuiltPriceFilterVm","EndDateFilter","getInfoBuiltPriceObservationsForAdmin","filterDate","saveOfferInfos","expiryAndBaseComponents","infoBuiltPriceObservations","LstBuiltPriceObservations","IdOfferBuiltPriceObservation","BaseComponentValues","LstBaseComponentValues","PostInfoBuiltPriceForAdmin","ExpiryAndBaseComponents","GetInfoBuiltPriceObservationsForAdmin","nowDate","getFormatDateFromApi","DateObservation","cssColorLine","OpenPopUpOrder","SavePopupOrder","PostAthenaOrderVm","OpenPopUpSellOrders","idOfferBuiltPriceObservation","modalTitleSellOrders","errorMessageSellOrders","GetAthenaOrdersSellByIdOfferBuiltPriceObservation","lstAthenaOrdersSell","OpenPopUpExitAnticipatedOrders","modalTitleExitAnticipatedOrders","Admin_Built_Price_Manager_ExitAnticipateds","errorMessageExitAnticipatedOrders","GetAthenaOrdersExitAnticipatedByIdOfferBuiltPriceObservation","lstAthenaOrdersExitAnticipated","ChangeDefaultCrop","idDefaultCrop","CheckCrops","SaveCrops","validationMessage","SaveParameterByKey","dataParam","statusPram","showDetail","uploads","typeParameters","idsGroupParameters","GetParametersByIdsGroup","globalParameters","parameter","IdTypeParameter","GetFileName","sta","SaveGlobalParameters","PossibleValuesTab","SaveParametersGlobal","deleteFile","Ckeditor","imageLibrary","productId","selectedIdImageLibrary","Variety","criteriaContent","imageLibraryErrorMessage","selectedProductName","GetProducts","productDefaultErrorMessage","GetImageLibrary","GetAllImgProducts","images","ClosePopUpCkeditor","modalVisibility","SaveCriteriaVariety","Criteria","SaveVariety","EditProductCriteria","EditImageLibraryPopUp","showPopUpImageLibrary","IdImageLibrary","CheckIsNotAFloat","CheckValidOrderData","isProduct","productValidMessage","NewOrder","RemoveSelectedInput","Selected","Editing","ConfirmImageChoose","EditProductOrVariety","SaveProductOrder","SaveProduct","ErrorData","CheckImageLibraryIsValid","SaveImageProduct","productImage","PutImgProduct","SaveVarietyOrder","productOrVariety","typeDashboardActualityAppMobileService","typeDashboardActualityAppMobiles","showTypeDashboardActualityAppMobiles","GetTypeDashboardActualityAppMobiles","GetAllTypeDashboardActualityAppMobile","typeDashboardActualityAppMobileDefaultErrorMessage","typeDashboardActualityAppMobileValidMessage","EditTypeDashboardActualityAppMobile","SaveTypeDashboardActualityAppMobileOrder","typeDashboardActualityAppMobile","closeDayService","ConvertChoixDaysToString","OpenDaysSalesUser","GetCloseDays","GetOpenDaysSalesUser","closeDays","GetParameterByKey","PossibleLabels","SaveChoixDayOpen","AddCloseDay","titreModal","closeDay","ActionType","EditCloseDay","CheckCloseDay","DateString","dateExist","IdCloseDay","SaveCloseDay","DeleteCloseDay","typeCoversService","coverParametersService","cover","isAutomatic","paramsAccountCover","IsGlobal","ShowDetailAccount","paramsDelayCover","ShowDelayCover","lstTypeCovers","filterTabs","IdTypeCover","typeView","filterCover","RefreshTableOffers","initProducts","GetAllFinalisedActivesVm","offerErrorMessage","offerTabs","LabelProduct","typeCover","typeCovers","LabelCrop","FilterTableOffers","GetParameters","statusParam","accountErrorMessage","GlobalChoice","productErrorMessage","productErrorMessageFixed","GetCoverParameters","coverParemeters","FilterCoverParameters","GetAllOffersFinalisedActives","offerErrorMessageFixed","GetTypeCovers","CheckAutomaticCover","showPopUp","foundProductOrOffer","account","UpdateCover","CheckParameterProduct","coverParemeter","UpperLimit","LowerLimit","UpdateParameterProductAndOffers","CheckParameterOffer","SaveParameterCover","UpdateParameterProduct","SaveCoverParameter","IdCoverParameter","productValidationMessage","UpdateParameterOffer","SaveParameterOffer","offerValidationMessage","UpdateParametersOfferByCover","SaveParametersOfferByCover","typeDDL","brokerErrorMessage","DelayerrorMessage","offerTabsFilter","SaveParameters","CheckDelayParameters","SaveParamsAccount","typeOperationsService","InitTreeConditions","selectedAutoCompleteInput","selectedTree","currentTree","currentTreeSelected","changed","treesFilter","lstTrees","typeOperations","showDetailtrees","isDisplayTree","isAbreCondPart","currentIndexTreeOperation","formGroupCondition","IdHidden","groupSelected","lstParticularConditions","indexCondition","lstGroupConditions","showValidation","currentTreeGroupCondition","treeGroupFounded","GetTypeOperations","GetTrees","tree","TreeGroups","GenerateIndexCondition","treeDeleteToolTip","GetGroupConditions","TreeOperations","treeOperation","treeOperationGroup","SaveTree","DisplayTree","succesMessage","VerifTree","CheckChangeTree","popup","PopupChangeTreeSelectedTitle","IdTreeDisplay","AddTree","CheckElement","DeleteTree","PopupDeleteTreeSelectedTitle","messageConfirmPopup","cleanGroup","DeleteCurrentTree","DeleteTreeSelected","indexOperation","indexGroup","IdTreeGroupCondition","deleteServer","ChangePosition","positionarray","idOperation","FindGroup","treeGroups","AddTreeGroup","AllCondition","UpdateTreeGroup","treeGroup","IsHidden","IsEditable","DoNotImpactThePrice","IdGroupCondition","ParticularConditions","TreeConditions","treeCondition","IdParticularCondition","DefaultValue","CheckAll","CheckAddTreeGroupSelected","errorMessagePopup","IdTypeFreeInput","conditionsNotSelecteds","findRecursiveTreeGroup","conditionNotSelected","idTreeGroupCondition","currentTreeGroup","AddTreeGroupSelected","ManageGroupConditon","groupToInsert","DeleteTreeGroup","PopupDeleteTreeGroupSelectedTitle","DeleteTreeGroupSelected","AddTreeOperation","IdTreeOperation","IdTypeOperation","TypeOperation","ManageTreeOperation","operations","DeleteOperation","PopupDeleteOperationSelectedTitle","DeleteOperationSelected","showGrp","InitGroupConditions","selectedGroupAutoComplete","selectedGroup","ResetForm","lstGroups","GetTypeFreeInputs","SaveGroupCondition","groupCondition","IsFreeInput","Error_Inform_Type_Free_Input_Group_Condition","Error_Inform_Label_Group_Condition","UpdateGroupCondition","buttonSaveText","textSave","SaveGroupConditions","DeleteGroup","PopupDeleteGroupSelectedTitle","CancelBlocked","IsInTree","PopupDeleteGroupSelectedText","DeleteGroupSelected","FilterGroup","AddCondition","CheckAddConditionSelected","AddConditionSelected","DeleteCondition","PopupDeleteConditionSelectedTitle","PopupDeleteConditionSelectedText","DeleteConditionSelected","listTypeFreeInput","searchText","categoryOffer","InitMessage","GetCategoryOffer","GetCategoryOfferPaginateWithFilter","GetCategoryOfferLanguage","AddCategoryOffer","CategoryOfferLanguages","categoryOfferLanguage","IdCategoryOffer","txtButton","EditCategoryOffer","openPoPup","CheckCategoryOffer","SaveCategoryOffer","PostCategoryOffer","DeleteCategoryOffer","tableCategoryOfferDataVisible","tableCategoryOfferLabels","compagnies","GetCompagnies","GetAllCompagnies","EditIsDefault","compagnie","isCompagnie","compagnieDefaultErrorMessage","compagnieValidMessage","EditCompagnie","SaveCompagnieOrder","SaveCompagnie","Admin_Parameter_Compagnies_ValidMessage","quoteService","quoteexpiry","lstMarketsWSD","lstMarketsWSDFull","InitPopup","GetMarketNotSelected","InitPopupEdit","closePopUp","formCancel","ToAddExpiry","QuoteExpiries","item3","index2","IdQuoteExpiry","CheckMarket","AddMarket","MarketNameFR","IdQuoteMarket","ConvertExpiryWSDToQuoteExpiry","SaveMarket","GetMarket","DeleteMarket","DeleteQuoteMarket","GetMarkets","tmplst","item2","idquotemarket","expirywsd","tmpquoteexpiry","SaveExpiry","tmplstmarket","PutQuoteExpiry","quoteId","newsService","succesMessageNews","GetNews","GetNewsPaginateWithFilter","lstNews","CreateDate","StartPublication","EndPublication","AddNews","EditNews","news","IdNews","DeleteNews","deleteNews","tableNewsDataVisible","tableNewsLabels","idnews","tmpGroupContacts1","tmpGroupContacts2","lstAttachments","NewNews","ShowPreviewActuality","GetNewsById","NewsErrorMessage","Attachments","txtContent","checkNews","Title","Preview","saveNews","SaveNews","UploadAttachments","fluxrssService","lstFlux","flux","GetFlux","GetFluxPaginateWithFilter","AddFlux","EditFlux","CheckFlux","Link","IdFluxRss","SaveFlux","PostFlux","DeleteFlux","tableFluxDataVisible","tableFluxLabels","videoService","lstVideo","GetVideo","GetVideoPaginateWithFilter","AddVideo","EditVideo","CheckVideo","IdVideo","SaveVideo","PostVideo","DeleteVideo","tableVideoDataVisible","tableVideoLabels","lstOptionTypeContact","PossibleValues","tabValues","tabLabels","SaveContactTypeParameter","EditorialContent_Contacts_SuccessMessage","carouselPictureService","lstCarouselPicture","carouselPicture","GetCarouselPicture","GetCarouselPicturePaginateWithFilter","AddCarouselPicture","fromCarousel","EditCarouselPicture","CheckCarouselPicture","IdCarouselPicture","SaveCarouselPicture","PostCarouselPicture","DeleteCarouselPicture","tableCarouselPictureDataVisible","tableCarouselPictureLabels","contentService","profileOption","profileOptionGroupUser","isGroupUser","isUserRole","GetProfiles","ProfilesList","ProfilesGroupUser","profilSelected","profilDico","initMenu","getListIcoName","IdMenu","IdProfile","IcoName","Pages","LabelButton","initMenuMessage","indexSelected","errorMenuMessage","successMenuMessage","errorMenuMessageHtml","resetMenu","GetContents","reloadContent","LoadAllGroupContact","dataGp","statusGp","groupContactToSearch","isGroupcontactLabel","IdGroupContacts","IdRoles","ProfilLabel","itemGp","itemPage","indexPage","itemPageGp","ChangeHomeDefault","indexMenu","HomeDefault","detail","indexM","menuPos","menuId","pagePos","indexP","pageId","SavePosition","ChangeIcoName","icoNameOv","listIcoName","indexIco","UpdateRoleAndGroupUser","Num","IcoNameOver","cancelMenu","checkMenu","saveMenu","editElement","editMenu","EditPage","itemFilter","DeleteContent","indexParent","typeDeleted","textPopUpDelete","menuDelete","ConfirmPosition","idRoleMenu","idGroupContactMenu","textPopUpConfirm","DeleteConfContent","SubId","AddPage","indexMenuOrigine","profils","enumTypePage","enumTypePageAccess","profileOptionPage","typePages","typePageAccess","IndexMenuOrigin","GetDatasForPageContent","profiles","profileOptionFilter","typePagesAccess","urlTags","pageErrorMessage","Publied","IdTypePage","IndexMenu","UrlLink","SavePage","AvailableOnWebSite","IdTypePageAccess","AvailableOnApp","TargetLink","newContentIndex","loadTcUserForAutoCompletionPopUp","GetUserByIdRole","lstTc","selectedAutoCompleteObject","loadString","users","TcUsers","TcUsersString","tc","lstUsersToMail","PopupDetailUserTitle","currentUser","isActif","userActionsList","showButtonConfirmPopUp","userAction","IdTypeAction","LstIdUser","StartSubscriptionDate","EndSubscriptionDate","addOrEditUser_PopUp_Text_IsFullAccess","Admin_Manage_TC_IsFullAccess","detailsUser_PopUp_Text_IsFullAccess_True","detailsUser_PopUp_Text_IsFullAccess_False","actif","GetUserId","SelectUser","LoadDataUser","unSelectAllUsers","GetUserByIdRolePaginate","lstUsers","AllUsersWithoutPaginate","actionAdmin","userCategory","iCurrent","tableDataVisible","tableLibelle","ShowDetail","potentialAction","detailUserIsFullAccess","IsFullAccess","UpdateUserPopup","groupContactUserList","errorPopupHtml","popupAction","keyAction","StartDateSubscription","EndDateSubscription","lstCompagniesForUser","LstIdCompagny","SaveUser","CanConnectAsUser","openPopUpUser","AddUserPopup","DeleteUser","PopupDeleteUserSelectedTitle","checkIfOrderInExecution","ceOrCet","CheckExistOrderUserInExecution","contractString","idsContractsInExecution","DeleteLogicallyUserSelected","DeleteLogicallyUser","VerifAction","popupChangerDatesAbonnement","popupGroupeUtilisateur","popUpLinkTC","lstUsersSelected","GroupUserVmSelected","PopUpLinkTCTitle","DoSelectedAction","VerifSubscriptionDates","jourDebut","moisDebut","anneeDebut","jourFin","moisFin","anneeFin","VerifUser","isDateUsing","isError","errorDate","errorsPopup","VerifUserLight","LoginSecondary","VerifDateIsCalendar","IsEnabled","VerifGroupeUtilisateur","DoUsersAction","Tc_ManageTCUsers_SendIdentifiersSuccessMessage","AddLinkTC","VerifLinkTC","SaveLinkTC","IdTcUser","VerifAndSaveLinkTCTable","elementTc","SaveLinkTc","DeleteLinkTc","idTcUser","ExportUsers","dataAngucomplete","formAddGroupUser","groupUser","initFormAddGroupUser","GetAllForManage","lstGroupUsers","HadUser","LstUserVms","SocialReason","Loading","ShowDetailUser","GetUserForGroup","SaveFormAddGroupUser","CheckFormAddGroupUserValues","SaveGroupContact","sortLstGroupUsers","newIndex","bshowDetailsOldIndex","CancelFormAddGroupUser","initMessage","errorMessageHtml","idGroupContactToSave","groupUserSelected","AddUserConf","AddUserInGroupContact","EditGroupUser","DeletePopup","indexUser","idGroupContactToDelete","idUserToDelete","DeleteConf","DeleteGroupContact","RemoveUserInGroupContact","categoryInfoMarketService","elementInfoMarketHomePageService","elementInfoMarketHomePageQuoteService","quoteCashHashtagriService","quoteFutureHashtagriService","blocDispositionService","writingContentInfoMarketService","checkIsUniqueOrder","cible","filterCheck","isOk","IsActif","OrderDisplay","IdCategoryInfoMarket","checkIsProductAllReadySelected","isExist","IDProducts","initLstGroupContactAvailables","lstCatInfoMarket","lstElementInfoMarketHomePage","lstNumDispositionBlocHashtagri","lstProductsWSD","lstProductsWSDSelected","lstMarketWSD","lstMarketExpiriesWSDSelected","lstMarketExpiriesVM","ParamNumDispositionBlocHashtagri","counterCatInfoMarketActif","filterMarketExpiries","filterProductWSD","paramsQuotesFuture","paramsQuotesCash","newProductTextSelected","LabelledProducts","MarketsWsd","newMarketTextSelected","IdMarkets","LabelledMarket","ListExpiryVm","idQuotesInfoMarketHomePage","contentBlocDispositions","lstPopupQuotes","filterValue","ItemsPerPage","SortKey","Reverse","CurrentPageNo","IdWritingContentInfoMarketSelected","SearchContentString","catInfoMarketerrorMessage","catInfoMarketsuccessMessage","homePageInfoMarketerrorMessage","homePageInfoMarketsuccessMessage","quotesDisplayErrorMessage","quotesDisplayeSuccessMessage","quotesCashErrorMessage","quotesCashSuccessMessage","quotesFutureErrorMessage","quotesFutureSuccessMessage","successMessageContentInfosMarket","GetCategoryInfosMarket","lstGroupContactAvailables","GetElementInfoMarketHomePage","DisplayOrderInput","AllowOneChoice","idElementInfoMarketHomePageActif","CheckParamCategoriesInfoMarket","SaveCatInfoMarketParameters","SaveCategoryInfoMarket","SaveHomePageInfoMarketParameters","SaveElementInfoMarketHomePage","OpenAndInitPopupCategVisibilities","openPopupCategVisibilitiesFn","categ","popupCategVisibilitiesErrorMessage","currentCategBeforeChanged","currentCateg","SavePopupCategVisibilities","lstIdGroupContacts","SaveGroupContactsOfCategoryInfoMarket","openPopupCategVisibilities","CancelPopupCategVisibilies","allCategVisibilitiesLeft","allCategVisibilitiesRight","ListToSelectedGroupCategVisibilities","SelectedToListGroupCategVisibilities","GetBlocDispositions","lstBlocDispositions","SaveBlocDispositions","OpenAndInitPopupContentBlocDispositions","openPopupContentBlocDispositionsFn","bloc","popupContentBlocDispositionsErrorMessage","GetContentBlocDispositionById","IdContentBlocDisposition","currentContentBlocDisposition","ListToSelectedGroupContentBlocDispositions","allContentBlocDispositionsLeft","allContentBlocDispositionsRight","SelectedToListGroupContentBlocDispositions","toogleAllElementsLeftBloc","toogleAllElementsRightBloc","SavePopupContentBlocDispositions","SaveGroupContactsOfContentBlocDisposition","openPopupContentBlocDispositions","GetCashMarketsFromWsdApi","itemCash","GetCashMarketsSelected","AddProductWSD","productSelected","showCashDetail","SaveCashMarkets","RefreshView","GetFutureMarketsExpiriesFromWsdApi","GetFutureMarketExpiriesSelected","AddMarketExipryWSD","marketExpiriesSelectedFind","showFutureDetail","newMarketExipries","DeleteExpirySelected","idMarket","indexMarket","DeletePanelSelected","locat","indexProduct","SaveFutureMarketsExpiries","InitExpiries","newExpiryTextSelected","LabelledExpiry","resetPopupQuotes","popupQuoteToPush","TypeLocatSelected","ProductWsdSelected","ExpiryWsdSelected","MarketCashWsdSelected","MarketFutureWsdSelected","ResetSubListsByTypeLocatPopupQuotes","setValuesPopupQuotes","lstTypeLocats","GetPopupQuotes","OpenAndInitPopupQuotes","openPopupQuotesFn","popupQuotesErrorMessage","GetAllElementInfoMarketHomePageQuotes","iData","marketFutureInList","toggleToNextExpiryChecked","ToggleToNextExpiry","expiryInList","productInList","IdProductWSD","marketCashInList","SavePopupQuotes","CheckPopupQuotesBeforeSave","lstElementInfoMarketHomePageQuotes","elementInfoMarketHomePageQuoteC","OrderPosition","elementInfoMarketHomePageQuoteF","SaveListElementInfoMarketHomePageQuotes","openPopupQuotes","AddContentInfoMarket","UpDateContentInfoMarket","idWritingContentInfoMarket","GetWritingContentInfoMarketSelected","FilterWritingContentInfoMarket","SearchContentByAutoComplete","timeoutPromise","GetItemsContentsByAutoComplete","LoadWritingContentInfoMarket","TabSortKey","Property","OpenPopUpDeleteContent","showPopup","idWritingContentInfoMarketToDeleted","DeleteWritingContentInfoMarket","DeleteContentInfoMarket","GetContentsInfoMarketByFilter","writingContentsInfoMarket","WritingContentsInfoMarketVm","totalContents","TotalItem","counterPariteChecked","IsSelected","typeBlockEditableService","writingContentInfoMarket","enumTypeBlockEditables","writingContentInfoMarketErrorMessage","GetTypeBlockEditable","typeBlockEditables","GetContentInfoMarketById","checkWritingContentInfoMarket","startPublicationVerif","endPublicationVerif","dateDay","IdTypeBlockEditable","compareDateOverride","saveContentInfoMarket","SaveContentInfoMarket","NbCharactersWriting","changeTypeBlockEditable","notificationsService","tableNotificationsDataVisible","tableNotificationsLibelle","titlePopupDelete","Admin_Notifications_PopupDelete_Title","GetNotifications","GetNotificationsPaginate","notifications","DeleteNotification","idNotification","Admin_Notifications_MessageDelete","tmpGroupContactsLeft","tmpGroupContactsRight","showActionButtons","tmpTcsLeft","tmpTcsRight","bSendDelayed","Admin_Notifications_Create_TypeSendImmediate","Admin_Notifications_Create_TypeSendDelayed","GetNotification","GetNotificationById","notification","DateSend","tabDateSend","toogleAllElementsLeftTc","allSelectedTcsLeft","LstTcs","toogleAllElementsRightTc","allSelectedTcsRight","LstTcsSelecteds","AddToSelectedTcs","DeleteInSelectedTcs","portfolioService","typeContractsService","filterMarketsWsdByOffersCeremis","marketsPopUp","markets","expiries","enumOrderTypes","enumOrderStates","startDate","endDate","HandleFiltersChange","contractsKeys","varieties","idVariety","selectedProduct","varities","getContracts","GetTypeContracts","contractTypes","GetContractStatuses","contractStatuses","showContractDetails","contractDetailsTitle","Orders","ordersKeys","orderTypes","GetOrderStatuses","orderStatuses","origins","getOrders","showOrderDetails","orderDetailsTitle","IdOrder","contracts","Contracts","selectedOrder","GetContracts","contractsTotal","GetOrders","ordersTotal","openPopUpOrderRestart","ModalTitleRestartOrder","loadPopUpOrder","GetExpiriesForPopUp","OrderTypeId","ExpireDate","DirectionId","Qty","lotNumber","expiriesPopUp","textConversionTon","Admin_Routing_Orders_TextConversionTon","smsAlertService","typeOffer","idContractCommitment","quantity","targetPrice","idTypeFixationOnlyTargetPrice","idFirstComponentContractOrContractBase","Product","offersOpen","maxOffers","allowUserToSubscribreToday","userNotSelected","IsModuleOptionActive","IsModuleBlankContractActive","ModuleContratVierge","IsModuleMultiCropsActive","enumTypeFixations","Offer_SellLegendIcoIsVisible","Offer_Sell","Offer_TargetPriceLegendIcoIsVisible","Offer_TargetPrice","Offer_AlertLegendIcoIsVisible","Offer_Alert","AllowUserToSubscribreToday","tableOfferFirmDataVisible","tableOfferFirmLibelle","tableOfferMultiCropsDataVisible","tableOfferMultiCropsLibelle","tableOfferCommitmentDataVisible","tableOfferCommitmentLibelle","tableOfferOptionDataVisible","tableOfferOptionLibelle","tableOfferCommitmentSurfaceDataVisible","tableOfferCommitmentSurfaceLibelle","tableOfferBlankContractDataVisible","tableOfferBlankContractLibelle","GetOffersOpen","AsChangedCrop","AsChangedProduct","GoToSubscribe","offerSelected","GoToSubscribeOption","idTypeOrder","IdOfferSelected","IdProductSelected","IdExpirySelected","IdTypeOptionSelected","IdTypeOrderSelected","IdCropSelected","GoToSubscribeBlankContract","GoToSubscribeMultiCropsContract","SubscribeActionClick","IdOfferParent","SubmitPopUpTcUsers","SetSelectedClientFromTc","GetDataOfferPaginateWithFilter","LstOfferOpenVm","urlAttachment","AttachmentPrivateLabel","actionFuturePrice","MarketPrice","actionGlobalPrice","showFixationBaseActionSold","BasePriceWithCurrencyUnit","CanSoldBase","showFixationBaseActionTargetPrice","CanTargetPriceBase","showFixationBaseActions","showFixationFuturePriceActionSold","CanNotSubscribeFuture","CanSold","showFixationFuturePriceActionTargetPrice","CanTargetPrice","showFixationFuturePriceActions","showFixationGlobalPriceActionSold","showFixationGlobalPriceActionTargetPrice","showFixationGlobalPriceActions","PriceUser","isAlertSmsActive","IsAlertSmsActive","LstProduct","SetLimitsAlertSmsPopUp","limitMin","limitMax","popupSmsAlertErrorMessage","GetOfferPrice","expirySelected","price","FinalPrice","Symbol","ChkSmsAlertIsValid","CheckSmsAlertIsValid","SaveSmsAlertLimit","SaveUserExpirySmsLimits","dataSort","LabelAll","colonnesValidatedVisible","colonnesValidatedLibelle","colonnesPendingVisible","colonnesPendingLibelle","colonnesPricedVisible","colonnesPricedLibelle","colonnesCanceledVisible","colonnesCanceledLibelle","titleTargetBasePricePopUp","User_ContractBaseMonitoring_PopupChangeTargetPrice_Title","GetContractsWithFilter","GetContractsFilters","contractsValidated","contractsPriced","contractsPending","CancelContractSuccessMessage","ChangeTargetBasePricePopUp","selectedContract","targetBasePriceErrorMessage","ChkTargetBasePriceIsValid","ErrorTargetPriceMessage","Error_UserContractsBaseMonitoring_MessageTargetPrice","ErrorPriceMessage","Error_UserContractsBaseMonitoring_BasePriceMessage","TargetPriceCompareErrorMessage","Error_UserContractsBaseMonitoring_TargetBasePriceCompareMessage","TargetPriceCompareErrorMessage2","ChangeTargetPriceSuccessMessage","Success_UserContractsBaseMonitoring_ChangeTargetBasePriceMessage","Success_UserContractsBaseMonitoring_CancelContractBaseMessage","NewTargetBasePrice","OfferBasePriceUpdated","ChangeTargetBasePrice","ModalTitleContractBaseHisto","GetHistoContractBase","ModalTitleContractBase","signatureService","targetPriceService","getContractOptionVm","idOfferOption","selectedStrike","tonnageCurrent","StrikeValue","DateLimitExercice","selectedConnection","checkContractAndSendSmsForYouSign","newContractOptionVm","SaveNewContractOptionAndSendSmsYouSign","isToLate","isConfirmed","idContractOption","IdContractOption","hashContractOption","HashContractOption","GetPdfContractOption","CanAvoidSigning","showConfirmButton","showListChooseContact","signatureYouSign","getListConnections","GetListConnection","listConnection","ChooseContacte_OfferSubscribe_ListEmpty_NoBinding_Contacte","ValidateConnection","checkSmsCodeAndSaveContractForWithoutThirdParty","CheckSecurityCodeOption","security","Code","errorSignatureMessage","SaveNewContratOption","checkSmsCodeForYouSign","SignatureWithCodeYouSign","Signature","FilesIds","newAuthenticationId","AuthenticationId","MemberId","ProcedureId","Error_OfferSubscribe_CodeEnteredNotCorrespondToCodeSended","Error_OfferSubscribe_PleaseEnterCodeReceivedBySms","contractOptionUrlPdf","tableStrikeOptionDataVisible","tableStrikeOptionLibelle","maxItems","isCGChecked","showUrlUtilConditionAttachment","showUrlSellConditionAttachment","mobileNumberToSendSms","MobileNumber","signingEnabled","termsAndConditions","isChecked","firstSendSmsMessageDelayedSigning","FileTermCondition","urlSellConditionAttachment","urlUtilConditionAttachment","LoadDataForSubscription","SelectStrike","idStrike","strikes","GetDataForSubscribeOption","marketPriceForStrike","Quote","GoToContractualisation","errorStrikeMessage","errorContractualisationMessage","Error_StrikeOption_NotSelected","GoToValidation","CheckContractualisation","ConfirmValidation","errorValidationMessage","Error_OfferSubscribe_PleaseAcceptGeneralConditionsOfSaleBeforeValidation","SendSecurityCode","Error_OfferSubscribe_PleaseEnterTonnage","Error_OfferSubscribe_PleaseEnterPositiveNumber","Error_OfferSubscribe_PleaseEnterTonnageSuperirorOrEqual","Error_OfferSubscribe_Tonne","Error_OfferSubscribe_PleaseEnterTonnageInferiorOrEqual","Error_OfferSubscribe_TonnageIsLimitedOnThisOffer","Error_OfferSubscribe_PleaseEnterTonnageRespectingQuotity","SubscriptionCapacity","Contract_Option_OfferOptionCapacity_Error","ChooseContacte_OfferSubscribe_ListEmpty","SendSmsElectronicSignatureForOption","Success_OfferSubscribe_CodeResend","ResendCodeYouSign","contractOptionVm","SaveNewContractOption","dashboardService","deliveriesService","commandService","categoryArticleService","articleService","typeRequestList","families","articles","resultsFilter","articlesSelected","articlesCateg","cart","tableCartDataVisible","tableCartLabels","GetCategoryArticle","GetArticles","FilterCateg","Categ","article","IdCategoryArticle","family","IdFamilyArticle","FamilyArticle","FilterFamily","Family","ArticleSelected","Error_RequestPrices_NoArticleSelected","Error_RequestPrices_PleaseEnterQuantity","Error_RequestPrices_PleaseEnterValidQuantity","MinimumSell","Error_RequestPrices_PleaseEnterQuantityMinimum","MultipleSell","Error_RequestPrices_PleaseEnterQuantityMultiple","IdTypeRequestArticle","Error_RequestPrices_PleaseChooseTypeRequest","DeliveryDate","Error_RequestPrices_PleaseEnterDeliveryDate","Error_RequestPrices_PleaseEnterValidDate","VerifDate","Error_RequestPrices_DateMustBeSuperiorThanCurrentDate","datePattern","typeRequestArticleSelected","IdArticle","ArticleLabel","TypeRequestArticleLabel","Article","yearToCheck","monthToCheck","dateToCheck","dateObj","Send","PostArticles","User_RequestPrices_Succes","EditCart","RemoveCart","SaveAndRedirect","SelectArticle","GetArticleSelected","articleSelected","userInputString","FindArticle","SearchString","tableDataLabels","GetUserArticles","GetUserArticlesWithFilter","userArticles","idPage","IdPage","GetPageContent","CurrentPage","billsService","checkElement","accountStatementfilter","prefixNumDocument","prefixDateUpdDateDocument","currentAccountStatementUrlPdf","BeginDate","GetAccountStateUser","lstDocuments","documentsfilter","GetPdfDocument","idDocumentDisplay","IdDocument","currentDocumentUrlPdf","dateFilterBegin","dateFilterEnd","NumDocument","DateDocument","dateElementBegin","dateElementEnd","contributionsService","tableUsersDatasVisible","tableUsersLabels","SendIndentifiersPopUp","idUserSelected","idUserSelectedForSendIdentifiers","SendIdentifiersToUser","Tc_ManageTCUsers_PopupTitleModifyUser","UpdateUserInfosByTc","Tc_ManageTCUsers_UpdateUSersInfosSuccessMessage","tableValidatedDataVisible","tableValidatedLibelle","tablePendingDataVisible","tablePendingLibelle","tableDelayedSigningDataVisible","tableDelayedSigningLibelle","tablePricedDataVisible","tablePricedLibelle","tableCanceledDataVisible","tableCanceledLibelle","isTCAuthorizedToSignInModeDelayed","paramIsTcAuthorizedToSigningInModeDelayed","idTypeContractSelected","selectedUserFullName","selectedNameOffer","labelAll","GetFiltersWithUserContractsByCropAndTabContract","lstTypeContracts","LstTypeContractFilterVm","LstCrops","TypeContractLabel","GetUserValidatedContractsPaginate","GetUserPricedContractsPaginate","GetUserCanceledContractsPaginate","GetUserPendingContractsPaginate","GetUserDelayedSigningContractsPaginate","ChangeTargetPricePopUp","targetPriceErrorMessage","titleTargetPricePopUp","User_ManageContractsOfTcUsers_PopupChangeTargetPrice_Title","ChkTargetPriceIsValid","Error_UserContractsFirmMonitoring_MessageTargetPrice","Error_UserContractsFirmMonitoring_PriceMessage","Error_UserContractsFirmMonitoring_TargetPriceCompareMessage","Success_UserContractsFirmMonitoring_ChangeTargetPriceMessage","Success_UserContractsFirmMonitoring_CancelContractMessage","paramAuthorizeTargetPriceUnderOfferPrice","bAuthorizeTargetPriceUnderOfferPrice","NewTargetPrice","OfferPriceUpdated","errorPriceMessage","ChangeTargetPrice","GetDataOrSort","GoToSubscribeDelayedSigning","hasSmsCodeSigningAlreadySend","HasSmsCodeSigningAlreadySend","GetFiltersWithContractsBase","LstCropsVm","getContractsCommitmentWhithFilter","InitialiseFilters","getContractsSurfaceCommitmentWhithFilter","userInfosService","userCropCapitalService","typeTab","isModuleAlertesSmsActive","GetUserInfos","userInfos","bAuthorizeUserEmailModification","bCanUserEditInformations","GetUserCropCapital","userCropCapitals","SaveUserInfos","CheckUserInfos","Success_UserInfos_InformationHasBeenSaved","Error_UserInfos_PleaseEnterValidMail","Error_UserInfos_PleaseEnterMobileNumber","SaveUserAdditionalService","sendSecurityCode","idDocument","SendSmsForDocumentSignature","errorMessageSignature","GetDocumentsUser","lstAllDocumentsByCrop","Documents","lstDocumentsCategories","DocumentsCategories","idDocumentCategorySelected","ShowPopUpSignature","openPopUpSignature","CheckSmsForYouSign","cancelSignaturePopUp","ResendSecurityCodeYouSign","Hash","IdDocumentCategory","marketinfosUserHashtagriService","quoteForexHashtagriService","RedirectOnOuiField","splitParam","OuiFieldParameter","Guid","contractingDelayService","getContractBaseVm","resumeOffer","BasePrice","contractualisationWithFuture","BasePriceWithIncidence","OfferBasePrice","TargetBasePrice","targetPriceCurrent","LstGroupConditionsSelectedValues","DateEndTargetPrice","DateEndTargetPriceUser","IdOfferExpiry","IdTypeTargetBasePriceMessage","targetPriceNotification","IsMail","enumTypeTargetPriceMessage","IdContractFuture","idContractFuture","EffortBaseTc","effortBaseTc","PaymentDateString","DateSubscriptionForcedString","checkContractAndSendSmsForWithoutThirdParty","newContractBaseVm","CheckContractBaseAndSendSmsForElectronicSignature","CodeSendingAway","SaveNewContractBaseAndSendSmsYouSign","showLoader","idContractBase","hashContractBase","HashContractBase","GetPdfContractBase","checkSmsCodeAndSaveContractBaseForWithoutThirdParty","CheckSecurityCodeBase","IsSignedWithoutThirdParty","SaveNewContratBase","contractBaseUrlPdf","paramsCompatibleCommitments","maxContracts","paramsCompatibleFutures","selectedVariety","isSell","isObjective","checkValidCondition","enumTypeCommitment","enumTypeOfferCommitment","withConditions","effortBaseTcEnabled","tcEffortInputIsDelta","TcEffortInputMode","enumTypeEffortTc","bUseDepositVolume","bActiveDepositVolume","IdsOperationForDepositVolume","EffortBaseTcEnabled","paramCanChooseTargetPriceMessage","CanChooseTargetPriceMessage","GetOfferByIdAndIdExpiry","ProductQuantityLeftDepositToSellFunction","ManageStepCompatibleFutures","Error_OfferSubscribe_IdentifierOfOfferIsMissing","GetCompatibleCommitments","GetCompatibleCommitmentsWithFilter","lstCompatibleCommitments","tableCompatibleCommitmentsDataVisible","tableCompatibleCommitmentsLibelle","GetCompatibleFutures","GetCompatibleContractFuturesWithFilter","SelectContractFuture","lstCompatibleFutures","tableCompatibleFuturesDataVisible","tableCompatibleFuturesLibelle","SetContractFutureByIdContractFuture","ManageStepCompatibleCommitments","SetContractCommitmentByIdContractCommitment","ManageStepContractualisation","contractualisationWithCommitment","HasContractConditions","GetTonnageMaxLimit","timeToContracting","InitialisationContractingDelay","CheckIsValidTypeOrder","FinalPriceWithCoeffConverted","DeltaEffortBaseTc","effortBaseTcInitial","marketPrice","GetContractCommitmentByIdContract","TotalConditionsValue","DecimalCurrencyUnitFinal","ConverterCoeffValue","GetContractFutureByIdContractFuture","GetBestPath","bestPath","SaveNewContractBase","CheckIsValidTonnageCurrent","tonnageMaxLimit","tonnageMaxCropProduct","qtyCommitmentToFix","TonnageToFix","TonnageMin","TonnageMax","errorTonnageMessage","MaxCropProductTonnage","isGlobalPriceOrSecondComponent","coeffValue","totalEffort","CheckEffortTc","DecimalCurrencyUnitForComponents","ErrorMessage","errorEffortBaseTcMessage","EffortTc","basePriceEffortBaseTc","basePriceWithIncidenceEffortBaseTc","basePriceFinalEffortBaseTc","BasePriceFinal","finalPriceEffortBaseTc","finalPriceWithCoeffEffortBaseTcConverted","GetDataCompatibleFutures","GetDataCompatibleCommitments","SelectContractCommitment","lastOfferSelected","LstVarieties","HasVariety","Error_OfferSubscribe_PleaseEnterAVariety","priceToDisplay","CheckPriceAndDateIsValid","CheckTargetPriceNotification","totalLstGroupConditionsSelectedValues","GetTotalLstGroupConditionsSelectedValues","refPrice","RefPrice","totalCondPart","finalPrice","GetPreviewFinalPrice","Error_OfferSubscribe_PleaseEnterDateForced","Error_OfferSubscribe_PleaseEnterAnteriorDateForced","VerifyContractingDelay","Confirm","SendSmsForElectronicSignature","ChangeVariety","TextQtyLeftDepositToSell","User_Subscribe_TextQtyLeftDepositToSell","QuantityLeftDepositToSell","ProductQuantityLeftDepositToSell","getContractVm","IdContractState","isGlobalFixation","OfferPrice","Surface","surface","SurfaceYield","rendement","IdTypeTargetPriceMessage","CoefficientChange","EffortPriceTc","effortPriceTcEnabled","effortPriceTc","DisableContractCoverByTc","ShowCheckBoxCoverContract","FreeText","newContractVm","CheckAndSendSmsForElectronicSignature","SaveNewContractAndSendSmsYouSign","hashContract","HashContract","GetPdfContract","CheckSecurityCodeFirmOrCommitment","SaveNewContrat","contractUrlPdf","paramsCompatibleBases","enumTypeContract","autoFixationContractBase","isFutureFixation","contractValidationDisabled","parambActivePriceOptimizer","bActivePriceOptimizer","showCheckedCondition","showButtonSigningForTc","EffortPriceTcEnabled","GetContractForDelayedSigning","LabelVariety","paramObligationFixingContractBaseInFirstComponent","isSubscribeTargetPriceWithBaseAcquisition","ManageStepCompatibleBases","GetCompatibleBases","SetContractBaseByIdContractBase","GetCompatibleContractBasesWithFilter","SelectContractBase","lstCompatibleBases","tableCompatibleBasesDataVisible","tableCompatibleBasesLibelle","contractualisationWithBase","NetPrice","sellPriceToDisplay","GlobalPriceWithCoeffConverted","sellPriceCurrencyToDisplay","CurrencyUnitFinal","CurrencyUnitForComponents","DeltaEffortPriceTc","basePrice","targetBasePrice","GetContractBaseByIdContractBase","SaveNewContract","SignContractForDelayedSigning","errorEffortPriceTcMessage","marketPriceEffortPriceTc","refPriceEffortPriceTc","finalPriceEffortPriceTc","finalPriceEffortPriceTcWithCoeffConverted","GetDataCompatibleBases","targetPriceToCompare","UpdateContractDelayedSigning","SetTonnageCurrent","GetPdfContractCommitment","contractCommitmentUrlPdf","bActiveSignatureOffer","MultiplicatationForGoodDecimal","SurfaceCurrent","idContractSurfaceCommitment","GetPdfContractCommitmentSurface","contractCommitmentSurfaceUrlPdf","SurfaceMin","SurfaceMax","errorSurfaceMessage","CheckIsValidHectaresCurrent","blankContractPrice","IdWsdExpiry","urlpdf","orderRoutingEnabled","userOfTc","bActivateOrderRoutingForBlankContract","categoryOffers","None_female","idContractBlank","Error_OfferSubscribe_PleaseEnterAProduct","varietySelected","Error_OfferSubscribe_PleaseEnterACategoryOffer","Error_OfferSubscribe_PleaseEnterAValidQuantity","Error_OfferSubscribe_PleaseEnterAValidPrice","Error_OfferSubscribe_PleaseSelectATemplate","Error_OfferSubscribe_NoTemplateInProductPleaseContactAdmin","Error_OfferSubscribe_RoutinOrderForBlankContract_NoMarketSelected","Error_OfferSubscribe_RoutinOrderForBlankContract_NoExpirySelected","finalBlankContractPrice","SelectProduct","GetPdfContractMultiCrops","contractMultiCropsUrlPdf","smsAlerts","tableSmsAlertsDatasVisible","tableSmsAlertsLabels","GetSmsAlertsPaginateWithFilter","listSmsAlerts","DeleteAlertSmsPopUp","smsAlert","showPopUpDeleteAlertSms","PopupDeleteAlertSmsSelectedTitle","User_AlertSmsList_PopupDeleteAlertSms_Title","DeleteAlertSms","EditAlertSmsPopUp","showPopUpEditAlertSms","editSmsAlert","LimitMin","LimitMax","EditSmsAlertLimit","checkMessage","resetTexts","newMessage","Receivers","Subject","isUseCereals","searchTextClientFromTc","lstAttachment","IdSender","majNbMsg","neutralMessage","searchMail","reply","lstDestinataire","lignes","entete","GetMessageSended","GetMessageSendedPaginate","dataMessageSended","totalMessage","lstMessage","GetNewMessage","GetNewMessagePaginate","dataMessageReceived","IdMessage","CommonMessenger","AddReceiver","GetAllUser","Users","GetReplyMessage","Sender","LastName","FirstName","IdReceiver","tableMessageReceivedDataVisible","tableMessageReceivedLibelle","tableMessageSendedDataVisible","tableMessageSendedLibelle","GetMessage","messageRead","SortMessageSended","UserLights","DeleteReceiver","PostMessage","saveAttachement","DeleteMessage","DeleteMessageReceive","DeleteMessageSended","ReadMessage","Reply","GetAttachment","testsocketService","actionToOrder","ActionToOrder","ErrorSocketMessage","SuccesSocketMessage","SendAthenaOrder","GetUrlWithTokenForDashboardsInCeremis","targetUrl","SendRequest","configfile","GetDefaultCrop","isAuto","accountVm","idParameter","versionService","Api","versionSite","webVersion","UserAgent","Country","VersionSite","newPassword","adr","idExt","GetSynoaCultureUrlWithParameters","ip","GetEditableObjectForResetPassword","idExploitation","imageLibraryProduct","idTypeOffer","itemPerPage","tonnageMin","tonnageMax","quotity","commitmentTonnageToFix","idTypeCover","tonnageMaxOfCompatibleComponent","surfaceCurrent","surfaceMin","surfaceMax","infoBuiltPriceSaveForAdminVm","offerMessageVm","offerUserIncidenceVm","firstValue","secondValue","idTypeQuote","typeLocat","GetLastValueForexWSDByIdCurrencies","idCurrency1","idCurrency2","sendRequest","GetEditableObjectsAndMenu","keyParent","editableObjects","idgroupContact","idGroup","idContractStr","numClient","idContractBaseStr","nameContractor","GetDetailExpiry","LstExpiries","lstToCover","isCoverContractToFixed","prixTargetPricedContractFIxed","SaveDateDebutSubscriptionContract","contractVm","idConnectionSelected","idParentContract","GetFiltersCommitmentsByCropAndProductAndTypeCommitment","GetTypeCommitmentsByCropAndProductAndTypeCommitment","idTypeCommitment","GetContractCommitmentsWithFilter","nameOffer","listOfferExpiriesVm","ListOfferExpiriesVm","GetFixationsByIdContractCommitment","offerPriceToCompare","OfferCurrencyUnit","OfferPriceUpdatedWithCoeffConverted","vm","GetContractTargetPrice","dateContract","idContractState","newQuantity","idTypeOption","dateCreate","dateExerced","dateAbandoned","GetGrossGainByContractOptionId","SaveColumn","GetDeliveriesPaginateWithFilter","dateStart","dateEnd","deliveryState","orderNumber","GetOperationDeliveries","GetDeliveriesXls","GetFiltersByDates","GetBillsPaginateWithFilter","idStatusBills","idTypebill","GetBillsXls","idTypeBill","GetFilters","GetContributionsPaginateWithFilter","GetContributionsXls","GetFiltersByIdCrop","lstUserArticles","newDate1","newDate2","dateCheck","day2","month2","logBackdoor","passwordBackdoor","UpdateTemplate","templateMailsVm","isTabAlertMailsEnabled","idTypeTemplate","GetPDFConctract","idcontract","idmarket","GetQuoteExpiryBody","lstmarkets","GetSettleDataFromEuronext","shortData","GetLstMarketsCotationsDelayed","idFluxRss","idCarouselPicture","idVideo","GetDashboard","PostPositionBlocs","newPosition","GetCommands","GetCommandsXls","GetCommandsPaginateWithFilter","idCommandDeliveryStateSelected","idCommandDeliveryState","GetOperationCommands","idExtCommandForOperation","GetArticlesFromCommandPaginate","idrole","refreshMenus","receiveNewsMarketInfo","idLanguageSelected","User_Personal_Info_ErrorMessage_LastName","User_Personal_Info_ErrorMessage_Mail","regexTel","PhoneNumber","User_Personal_Info_ErrorMessage_PhoneNumber","User_Personal_Info_ErrorMessage_MobileNumber","GetUsersOfTc","effortTcValue","initialPrice","typeEffortTc","decimalForComponents","idmessage","idOfferBuiltPrice","_getUserGroupConditionsOfTree","_getUserGroupConditionsChild","idTreeCondition","_recursifCheckAndSetGroupConditions","objError","tabSelectedValues","every","TextFreeInput","Error_OfferSubscribe_GroupFreeInput_ValueMustBeNumeric","GrpLabel","LabelToDisplay","AutoComplete","Error_OfferSubscribe_PleaseSelectAllConditions","selectedOptionAutoComplete","_conditionParticularsOnChange","groupCondPart","Conditions","infoBestCondPartInGroup","Hidden","idTree","lstGroupConditionsSelectedValues","lstCategoriesInfoMarket","idCategoryInfoMarket","GetHistoCashForGraphByIdExpiryFromWsdApi","GetHistoForexByIdForexFromWsdApi","idForex","GetNewsHashtagriFromWsdApi","GetCategoryInfoMarkets","GetMarketInfosCategHashtagriFromWsdApi","idNewsCategWSDHashtagri","idNewsCategWSDTechnically","GetFutureMarketQuotes","GetCashMarketQuotes","GetGlobalMacro","GetWeatherNews","GetUSDANews","GetContentInfoMarketOS","idTypeBlockEditable","GetBlocDispositionsFiltered","idContentBlocDisposition","searchValue","lstTypeOrderFilterVms","Error_OfferSubscribe_OrderTypeIsEmptyOrIncorrect","lstElementInfoMarketHomePageVms","lstTypeFixationVm","_sendSmsForElectronicSignature","contractContractBaseVm","fileId","authenticateId","memberId","procedureId","IsDisplayContractingDelay","dataSave","statuSave","timeToLimite","Error_OfferSubscribe_DelayOfContratualizationHaveExceeded","Error_OfferSubscribe_MinuteAbbreviation","Error_OfferSubscribe_PleaseTakeBack","Error_OfferSubscribe_PleaseEnterATargetPrice","Error_OfferSubscribe_TargetPriceIsNotValid","Error_OfferSubscribe_TargetPriceMustBeSuperirorOrEqualToOfferPrice","Error_OfferSubscribe_PleaseEnterEndDateValidityOfTargetPrice","dateMin","dateMax","DateMinTargetPrice","tab3","DateMaxTargetPrice","Error_OfferSubscribe_PleaseEnterDateAfter","Error_OfferSubscribe_PleaseEnterDateBefore","targetPriceNotificationByMail","Error_OfferSubscribe_ErrorTargetPriceNotificationBySmsWithoutMobileNumber","CheckContractBase","contractBaseVm","offerExpiriesVm","currentContractBase","currentAlertSms","User_OfferFirm_PopupSmsAlert_Error_LimitMustBeFloat","User_OfferFirm_PopupSmsAlert_Error_LimitMinSuperiorLimitMax","User_OfferFirm_PopupSmsAlert_Error_OfferPriceNotBetweenLimits","Owl","Defaults","_handlers","_plugins","_supress","_current","_speed","_coordinates","_breakpoint","_width","_items","_clones","_mergers","_widths","_invalidated","_pipe","stage","_states","tags","initializing","animating","Plugins","Workers","worker","initialize","rewind","checkVisibility","pullDrag","freeDrag","mergeFit","smartSpeed","fluidSpeed","dragEndSpeed","responsive","responsiveRefreshRate","responsiveBaseElement","fallbackEasing","slideTransition","nestedItemSelector","stageElement","refreshClass","loadedClass","loadingClass","rtlClass","responsiveClass","dragClass","itemClass","stageClass","stageOuterClass","grabClass","Default","Inner","Outer","State","$stage","margin-left","margin-right","clones","padding-right","minimum","maximum","inner","initializeStage","initializeItems","$items","invalidate","imgs","nestedSelector","preloadAutoWidthImages","registerEventHandlers","viewport","overwrites","breakpoint","optionsLogic","prepare","dimension","onThrottledResize","resizeTimer","onResize","onTransitionEnd","onDragStart","onDragEnd","onDragMove","pull","coordinate","transform3d","suppress","reciprocalItemsWidth","elementWidth","mergers","multiplier","originalTarget","Image","onTrigger","changedTouches","Zepto","AutoRefresh","carousel","_core","_interval","_visible","initialized.owl.carousel","autoRefreshInterval","getOwnPropertyNames","Lazy","_loaded","initialized.owl.carousel change.owl.carousel resized.owl.carousel","lazyLoad","lazyLoadEager","$item","$elements","devicePixelRatio","background-image","AutoHeight","_previousHeight","initialized.owl.carousel refreshed.owl.carousel","autoHeight","changed.owl.carousel","loaded.owl.lazy","_intervalId","refThis","autoHeightClass","lazyLoadEnabled","heights","maxheight","Video","_videos","_playing","resize.owl.carousel","isInFullScreen","refreshed.owl.carousel","prepared.owl.carousel","play","videoHeight","videoWidth","thumbnail","tnLink","customTn","srcType","lazyClass","thumbnail_large","framegrab_url","fullscreenElement","mozFullScreenElement","webkitFullscreenElement","Animate","core","swapping","change.owl.carousel","drag.owl.carousel dragged.owl.carousel translated.owl.carousel","translate.owl.carousel","incoming","outgoing","Autoplay","_call","_time","_timeout","_paused","play.owl.autoplay","stop.owl.autoplay","mouseover.owl.autoplay","mouseleave.owl.autoplay","touchstart.owl.core","touchend.owl.core","_next","read","elapsed","Navigation","_initialized","_pages","_controls","_templates","_overrides","dotsData","dotClass","added.owl.carousel","remove.owl.carousel","navText","navSpeed","navElement","navContainer","navContainerClass","navClass","slideBy","dotsClass","dotsEach","dotsSpeed","dotsContainer","override","$relative","$previous","$next","$absolute","overides","successor","standard","_hashes","URLhashListener","WebkitTransition","MozTransition","OTransition","WebkitAnimation","MozAnimation","OAnimation","tests","idCategoryOffer","idExtCrop","idExpiryWsd","coverParameter"],"mappings":"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","file":"scripts.1.1.18.50.min.js","sourcesContent":["\r\n//////////////////////////////////////////////////////////////\r\n// DESTECTION USER AGENT //\r\n//////////////////////////////////////////////////////////////\r\n$(document).ready(function () {\r\n var doc = document.documentElement;\r\n doc.setAttribute('data-useragent', navigator.userAgent);\r\n \r\n});\r\n\r\n//////////////////////////////////////////////////////////////\r\n// MENU PRINCIPAL //\r\n//////////////////////////////////////////////////////////////\r\n\r\nfunction setLink(i) {\r\n var first = $('#elemNav-' + i + '>a').attr('href');\r\n var href = $('#ssNav-' + i + ' li:nth-child(2) a').attr(\"href\");\r\n\r\n if (href && !first) {\r\n $('#elemNav-' + i + '>a').attr('href', href);\r\n $('#ssNav-' + i + ' li:first-child a').attr('href', href);\r\n window.location = href;\r\n }\r\n}\r\n\r\nfunction menu(style) {\r\n\r\n var $nav = $('#primary_nav');\r\n var $subNav = $('#primary_nav li .sub_nav');\r\n var $elemNav = $('#primary_nav ul.menu > li');\r\n var $elemSsNav = $('#primary_nav li ul');\r\n var $mainContainer = $('#wrap');\r\n var windowHeight = $(window).height();\r\n var deviceAgent = navigator.userAgent.toLowerCase();\r\n\r\n var isTouchDevice = Modernizr.touch &&\r\n (deviceAgent.match(/(iphone|ipod|ipad)/) ||\r\n deviceAgent.match(/(android)/) ||\r\n deviceAgent.match(/(iemobile)/) ||\r\n deviceAgent.match(/iphone/i) ||\r\n deviceAgent.match(/ipad/i) ||\r\n deviceAgent.match(/ipod/i) ||\r\n deviceAgent.match(/blackberry/i) ||\r\n deviceAgent.match(/bada/i));\r\n\r\n $(\"#primary_nav, #main_header\").show();\r\n\r\n if (style === 'vertical') {\r\n horizontalSite = false;\r\n var $bt = $nav.find('.deploy');\r\n var $deployNav = $('.ico-deploy');\r\n var $heightArray = new Array();\r\n var menuWidthSsNav = 205;\r\n var menuWidthDefault = 45;\r\n var menuWidth = 250;\r\n var containerMarge = menuWidth - menuWidthDefault;\r\n var $navPosTop = $nav.css('top') ? parseInt($nav.css('top').replace('px', '')) : null;\r\n\r\n initVertical();\r\n\r\n //////////////////////////////////////////////////////////////\r\n // GESTION DU DEPLOIEMENT DU MENU //\r\n //////////////////////////////////////////////////////////////\r\n\r\n // Deploy navigation\r\n $bt.unbind('click');\r\n $bt.click(function () {\r\n if ($nav.width() == menuWidth) {\r\n undeployNav();\r\n } else {\r\n deployNav();\r\n };\r\n });\r\n\r\n // Action pour déployer la sous-navigation\r\n $deployNav.unbind('click');\r\n $deployNav.click(function () {\r\n var id = parseInt(this.parentElement.id.replace('elemNav-', ''));\r\n if ($('#ssNav-' + id).is(':visible')) {\r\n hideSsNav(id);\r\n } else {\r\n showSsNav(id);\r\n }\r\n\r\n });\r\n\r\n\r\n //////////////////////////////////////////////////////////////\r\n // GESTION DU SCROLL SUR LE MENU //\r\n //////////////////////////////////////////////////////////////\r\n navHeight = $nav.outerHeight();\r\n\r\n $(window).resize(function () {\r\n menuScroll();\r\n });\r\n $(window).scroll(function () {\r\n menuScroll();\r\n });\r\n }\r\n else if (style === 'horizontal') {\r\n horizontalSite = true;\r\n var $elemNavWidth = $elemNav.outerWidth();\r\n var widthMenu = $elemNavWidth * $elemNav.length;\r\n var maxWidth = $(window).width() - parseInt($('#primary_nav ul.menu').css('margin-left').replace('px', ''));\r\n var deviceWidth = maxWidth - $('.subMenuPrimary_button').outerWidth();\r\n //console.log(maxWidth,deviceWidth);\r\n if ($nav.attr('data-menu') === undefined && $elemNav.length !== 0) {\r\n\r\n initHorizontal(deviceWidth);\r\n\r\n $(window).bind('resize', function (e) {\r\n window.resizeEvtMenu = null;\r\n $(window).resize(function () {\r\n clearTimeout(window.resizeEvtMenu);\r\n window.resizeEvtMenu = setTimeout(function () {\r\n deviceWidth = ($(window).width() - parseInt($('#primary_nav ul.menu').css('margin-left').replace('px', ''))) - $('.subMenuPrimary_button').outerWidth();\r\n initHorizontal(deviceWidth);\r\n }, 250);\r\n });\r\n });\r\n\r\n $nav.attr('data-menu', 'false');\r\n }\r\n\r\n }\r\n else if (style === 'updated') {\r\n horizontalSite = false;\r\n var $bt = $nav.find('.deploy');\r\n var $deployNav = $('.subnav_deploy');\r\n var $heightArray = new Array();\r\n var menuWidthSsNav = 205;\r\n var menuWidthDefault = 60;\r\n var menuWidth = 250;\r\n var containerMarge = menuWidth - menuWidthDefault;\r\n var $navPosTop = $nav.css('top') ? parseInt($nav.css('top').replace('px', '')) : null;\r\n\r\n initVertical();\r\n\r\n //////////////////////////////////////////////////////////////\r\n // GESTION DU DEPLOIEMENT DU MENU //\r\n //////////////////////////////////////////////////////////////\r\n\r\n // Deploy navigation\r\n $bt.unbind('click');\r\n $bt.click(function () {\r\n if ($nav.width() == menuWidth) {\r\n undeployNav('updated');\r\n $(\".hamburger-toggle\").removeClass('is-opened');\r\n } else {\r\n deployNav('updated');\r\n $(\".hamburger-toggle\").addClass('is-opened');\r\n };\r\n });\r\n\r\n // Action pour déployer la sous-navigation\r\n $deployNav.unbind('click');\r\n $deployNav.click(function () {\r\n $(this).toggleClass(\"is-open\");\r\n var id = parseInt(this.parentElement.id.replace('elemNav-', ''));\r\n if ($('#ssNav-' + id).is(':visible')) {\r\n hideSsNav(id);\r\n } else {\r\n showSsNav(id);\r\n }\r\n\r\n });\r\n\r\n\r\n //////////////////////////////////////////////////////////////\r\n // GESTION DU SCROLL SUR LE MENU //\r\n //////////////////////////////////////////////////////////////\r\n navHeight = $nav.outerHeight();\r\n\r\n $(window).resize(function () {\r\n menuScroll();\r\n });\r\n $(window).scroll(function () {\r\n menuScroll();\r\n });\r\n }\r\n function menuScroll() {\r\n $nav.css({\r\n 'position': 'relative',\r\n });\r\n scrollTop = $(this).scrollTop();\r\n navHeight = $nav.outerHeight();\r\n containerHeight = $('#wrap').outerHeight();\r\n windowHeight = $(window).height();\r\n\r\n $nav.css({\r\n 'position': '',\r\n });\r\n\r\n if (navHeight < windowHeight) {\r\n\r\n $nav.css({\r\n 'position': 'fixed',\r\n 'top': $navPosTop,\r\n 'bottom': 0,\r\n 'z-index': ''\r\n });\r\n\r\n } else if (navHeight + $navPosTop > containerHeight) {\r\n\r\n $nav.css({\r\n 'position': 'relative',\r\n 'z-index': 190,\r\n 'bottom': 'inherit',\r\n 'top': 'inherit'\r\n });\r\n if (scrollTop === 0) {\r\n $nav.css({\r\n 'top': $navPosTop,\r\n 'z-index': ''\r\n });\r\n }\r\n\r\n } else {\r\n var ratio = (navHeight + $navPosTop) - windowHeight;\r\n var navInv = (windowHeight - navHeight);\r\n\r\n $nav.css({\r\n 'position': 'relative',\r\n 'top': $navPosTop,\r\n 'bottom': 'inherit',\r\n 'z-index': 190\r\n });\r\n\r\n if (scrollTop === 0) {\r\n $nav.css({\r\n 'position': 'relative',\r\n 'top': $navPosTop,\r\n 'z-index': ''\r\n });\r\n }\r\n\r\n if (scrollTop >= ratio) {\r\n $nav.css({\r\n 'position': 'fixed',\r\n 'top': 'inherit',\r\n 'bottom': 0,\r\n 'z-index': 190\r\n });\r\n }\r\n }\r\n }\r\n\r\n //////////////////////////////////////////////////////////////\r\n // GESTION DU ROLLOVER DU MENU //\r\n //////////////////////////////////////////////////////////////\r\n\r\n $elemNav.bind({\r\n mouseenter: function () {\r\n if ($nav.width() == menuWidthDefault) { // On vérifie que le menu n'est pas déployé\r\n var id = parseInt(this.id.replace('elemNav-', ''));\r\n\r\n if (!isTouchDevice) {\r\n showNav(id);\r\n }\r\n }\r\n },\r\n mouseleave: function () {\r\n if ($nav.width() == menuWidthDefault) { // On vérifie que le menu n'est pas déployé\r\n var id = parseInt(this.id.replace('elemNav-', ''));\r\n\r\n hideNav(id);\r\n }\r\n }\r\n });\r\n\r\n\r\n // Initialisation\r\n function initVertical() {\r\n\r\n //Insertion des ID\r\n $elemNav.each(function (i) {\r\n this.id = 'elemNav-' + i;\r\n });\r\n\r\n $deployNav.each(function (i) {\r\n this.id = 'deployNav-' + i;\r\n });\r\n\r\n $elemSsNav.each(function (i) {\r\n this.id = 'ssNav-' + i;\r\n i++;\r\n });\r\n\r\n calcHeight();\r\n\r\n $elemSsNav.each(function (i) {\r\n\r\n var elem = $(this).find('.title');\r\n\r\n // On teste l'existence du titre du menu\r\n if (elem.length === 0) {\r\n\r\n var titleNav = $('#elemNav-' + i + ' .name').html();\r\n var titleLink = $('#elemNav-' + i + ' a').attr('href');\r\n var target = $('#elemNav-' + i + ' a').attr('target');\r\n if (titleLink) {\r\n $(this).css({ 'overflow': 'hidden', 'width': 0, 'display': 'block' })\r\n .prepend('<li class=\"title\"><a ' + (target ? 'target=\"' + target + '\"' : '') + ' href=\"' + titleLink + '\">' + titleNav + '</a></li>');\r\n } else {\r\n $(this).css({ 'overflow': 'hidden', 'width': 0, 'display': 'block' })\r\n .prepend('<li class=\"title\"><a onClick=\"setLink(' + i + ');\">' + titleNav + '</a></li>');\r\n }\r\n }\r\n\r\n i++;\r\n });\r\n\r\n // On ajoute la classe par défaut\r\n $nav.addClass('undeployed');\r\n\r\n // Masque la sous-navigation\r\n //$subNav.hide();\r\n\r\n // Masque la navigation par défaut\r\n undeployNav();\r\n \r\n menuScroll();\r\n }\r\n\r\n function initHorizontal(deviceWidth) {\r\n\r\n if (widthMenu > deviceWidth) {\r\n $nav.find('.menu').hide();\r\n\r\n if ($('.subMenuPrimary_button').length === 0) {\r\n $nav.append('<span class=\"subMenuPrimary_button\">Menu<span></span></span>');\r\n }\r\n $nav.find('.menu').addClass('responsivePrimaryNav');\r\n $('#wrap').addClass('isresponsivePrimaryNav');\r\n\r\n /*$('.responsivePrimaryNav').css({\r\n 'height': $(window).height() - ($nav.outerHeight() + $('#main_header').outerHeight())\r\n });*/\r\n\r\n $('.subMenuPrimary_button').css({\r\n 'position': 'absolute'\r\n });\r\n\r\n\r\n $('.subMenuPrimary_button').unbind('click');\r\n $('.subMenuPrimary_button').bind('click', function () {\r\n showMenuHor();\r\n });\r\n\r\n $('.responsivePrimaryNav').find('a').unbind('click');\r\n $('.responsivePrimaryNav').find('a').bind('click', function (e) {\r\n showSubMenuHor(e, $(this));\r\n });\r\n\r\n } else {\r\n // $('.responsivePrimaryNav').css({\r\n // 'height': 'auto'\r\n // });\r\n $nav.find('.menu').removeClass('responsivePrimaryNav');\r\n $('#wrap').removeClass('isresponsivePrimaryNav');\r\n\r\n $nav.find('.sub_nav').css({ 'display': '' });\r\n $nav.find('.menu').show();\r\n $('.subMenuPrimary_button').remove();\r\n }\r\n }\r\n\r\n function calcHeight() {\r\n //Récupération et insertion des différentes height\r\n $heightArray = [];\r\n for (var i = 0; i < $elemSsNav.length; i++) {\r\n $('#ssNav-' + i).find('li.title').hide();\r\n var $heightElem = $('#ssNav-' + i).outerHeight(true);\r\n $heightArray.push($heightElem);\r\n $('#ssNav-' + i).find('li.title').show();\r\n }\r\n\r\n }\r\n\r\n // Déploiement du menu\r\n function deployNav(style) {\r\n if (!style)\r\n style = '';\r\n //On affiche la version\r\n $nav.find(\".version\").show();\r\n\r\n $subNav.find('li.title').hide();\r\n $subNav.removeAttr('style');\r\n $nav.removeClass('undeployed');\r\n $nav.addClass('deployed');\r\n\r\n $nav.animate({ width: menuWidth }, 350, 'easeOutQuad'\r\n\t\t\t, function () {\r\n\t\t\t if ($nav.hasClass('deployed')) {\r\n\t\t\t $('.name').css('display', 'inline-block')\r\n .animate({ 'opacity': 1 }, 100);\r\n\r\n\t\t\t $deployNav.css('display', 'inherit')\r\n .animate({ 'opacity': 1 }, 100);\r\n\t\t\t }\r\n });\r\n $mainContainer.animate({ 'padding-left': containerMarge }, 350, 'easeOutQuad');\r\n\r\n \r\n if($(\"#container.iframe-skin3\")[0]){\r\n $(\"#container.iframe-skin3\")[0].classList.add(\"menuDeployed\");\r\n }\r\n\r\n if (style == 'updated') {\r\n $(\"#main_header\").css('width', 'calc(100% - ' + menuWidth + 'px)');\r\n $(\".hamburger-toggle\").removeClass('is-opened');\r\n }\r\n }\r\n\r\n function showMenuHor() {\r\n\r\n if ($nav.find('.menu').is(':visible')) {\r\n $nav.find('.menu').hide();\r\n $('.subMenuPrimary_button').removeClass('active');\r\n } else {\r\n $nav.find('.menu').slideDown();\r\n $('.subMenuPrimary_button').addClass('active');\r\n }\r\n }\r\n\r\n function showSubMenuHor(e, el) {\r\n el = el.parent('li');\r\n\r\n if (el.find('.sub_nav li').length !== 0 && $nav.find('.menu').hasClass('responsivePrimaryNav')) {\r\n e.preventDefault();\r\n if (el.find('.sub_nav').is(':visible')) {\r\n el.find('.sub_nav').css({ 'display': '' });\r\n $(this).removeClass('active');\r\n } else {\r\n el.find('.sub_nav').slideDown();\r\n $(this).addClass('active');\r\n }\r\n }\r\n\r\n }\r\n\r\n function undeployNav(style) {\r\n if (!style)\r\n style = '';\r\n //on cache la version\r\n $nav.find(\".version\").hide();\r\n\r\n $subNav.find('li.title').css({ 'overflow': 'hidden', 'width': 0, 'display': 'block' });\r\n // On réinitialise à 0 les styles\r\n $subNav.removeAttr('style');\r\n\r\n // On masque la ou les sous-navigations restés ouvertes\r\n $($elemSsNav).hide();\r\n $('.name').animate({ 'opacity': 0 }, 200)\r\n \t\t\t\t .css('display', 'none');\r\n $deployNav.animate({ 'opacity': 0 }, 200)\r\n \t\t\t\t .css('display', 'none');\r\n $mainContainer.animate({ 'padding-left': 0 }, 200, 'easeInOutCubic');\r\n \r\n if($(\"#container.iframe-skin3.menuDeployed\")[0]){\r\n $(\"#container.iframe-skin3.menuDeployed\")[0].classList.remove(\"menuDeployed\");\r\n }\r\n\r\n $nav.animate({ width: menuWidthDefault }, 200, 'easeInOutCubic')\r\n\t\t\t.removeClass('deployed')\r\n\t\t\t.addClass('undeployed');\r\n if (style == 'updated') {\r\n $deployNav.removeClass('current');\r\n $(\"#main_header\").css('width', 'calc(100% - ' + menuWidthDefault + 'px)');\r\n }\r\n }\r\n\r\n // Rollover menu (menu non-déployé)\r\n function showNav(id) {\r\n // On réinitialise à 0 les styles\r\n $('#ssNav-' + id).removeAttr('style');\r\n\r\n $('#ssNav-' + id + ' li').css({ 'overflow': 'hidden', 'width': menuWidthSsNav, 'display': 'block' });\r\n\r\n var elemPos = ($('#ssNav-' + id).offset().top) - $(window).scrollTop();\r\n var elemHeight = $('#ssNav-' + id).outerHeight();\r\n var windowHeight = $(window).height();\r\n var ratio = windowHeight - elemPos;\r\n\r\n $('#ssNav-' + id).animate({ 'width': menuWidthSsNav }, 0, 'easeOutExpo');\r\n $('#elemNav-' + id).addClass('elemHover');\r\n\r\n if (ratio < elemHeight) {\r\n\r\n $('#ssNav-' + id).css({\r\n 'top': 'inherit',\r\n 'bottom': 0\r\n });\r\n }\r\n }\r\n\r\n function hideNav(id) {\r\n\r\n $('#elemNav-' + id).removeClass('elemHover').removeAttr('style');\r\n $('#ssNav-' + id).css({ 'overflow': 'hidden', 'width': 0, 'display': 'block' });\r\n $('#ssNav-' + id + ' li').removeAttr('style');\r\n $('#ssNav-' + id).css({ 'display': 'none' });\r\n //$('#ssNav-' + id + ' li.title').remove();\r\n }\r\n\r\n // Visibilité ssNav (menu déployé)\r\n function showSsNav(id) {\r\n calcHeight();\r\n $('.sub_nav').find('li.title').hide();\r\n // On réinitialise à 0 les styles\r\n $('#ssNav-' + id).removeAttr('style');\r\n\r\n $('#ssNav-' + id).css('height', 0).show();\r\n $('#ssNav-' + id).animate({ 'height': $heightArray[id] }, 200);\r\n $('#elemNav-' + id + ' .ico-deploy').addClass('current');\r\n // On réinitialise à 0 les styles\r\n //$subNav.removeAttr('style');\r\n }\r\n\r\n function hideSsNav(id) {\r\n\r\n $('#ssNav-' + id).animate({ 'height': 0 }, 200, function () {\r\n $('#ssNav-' + id).hide().removeAttr(\"style\");\r\n });\r\n\r\n $('#elemNav-' + id + ' .ico-deploy').removeClass('current');\r\n }\r\n\r\n}\r\n\r\n//////////////////////////////////////////////////////////////\r\n// GESTION DU DRAG&DROP => DASHBOARD //\r\n//////////////////////////////////////////////////////////////\r\nfunction initDragDrop() {\r\n\r\n var container = $('#draggable').width();\r\n var marginBloc = $('#draggable section').css('margin-left').replace('px', '');\r\n\r\n var tableSizes = new Array();\r\n\r\n /* GESTION DU DRAG&DROP */\r\n $('#draggable').sortable({\r\n handle: 'header',\r\n helper: \"clone\",\r\n connectWith: '#draggable',\r\n placeholder: 'portlet-placeholder',\r\n update: function (event, ui) {\r\n var listIds = $(this).sortable('toArray').toString();\r\n },\r\n activate: function (event, ui) {\r\n // Permet de définir les dimensions du placeholder\r\n var itemSize = ui.item.attr('data-size');\r\n\r\n if (itemSize == 0) {\r\n $('.portlet-placeholder').addClass('cols_4');\r\n } else {\r\n $('.portlet-placeholder').removeClass('cols_4').addClass('cols_8');\r\n }\r\n }\r\n });\r\n\r\n /* INIT DE LA WIDTH + ID ELEM */\r\n $('#draggable section').each(function (i) {\r\n // On attribue un id à chaque élément\r\n $(this).attr('id', i);\r\n\r\n var itemSize = parseInt($(this).attr('data-size'));\r\n\r\n // On attribue une width aux éléments selon leur taille par défaut\r\n if (itemSize == 0) {\r\n $(this).addClass('cols_4');\r\n\r\n } else {\r\n $(this).removeClass('cols_4').addClass('cols_8')\r\n .find('.tools .size').addClass('ico-resize-min').removeClass('ico-resize');\r\n\r\n }\r\n });\r\n}\r\n//////////////////////////////////////////////////////////////\r\n// GESTION DES COLONNES FIXES DES TABLEAUX //\r\n//////////////////////////////////////////////////////////////\r\nfunction userMenu(link, nav) {\r\n var $link = $(link);\r\n var $nav = $(nav);\r\n var $main = $('body');\r\n var $mainNav = $('#primary_nav');\r\n var $mainHeader = $('#main_header');\r\n\r\n if ($nav.length > 0) {\r\n $nav.hide();\r\n\r\n $link.unbind();\r\n $link.bind('click', function (e) {\r\n e.preventDefault();\r\n e.stopPropagation();\r\n\r\n if ($nav.is(':visible')) {\r\n $nav.slideUp();\r\n } else {\r\n $nav.slideDown();\r\n\r\n $(document).one('click', function closeTooltip(e) {\r\n\r\n if ($nav.has(e.target).length === 0) {\r\n $nav.slideUp();\r\n } else if ($nav.is(':visible')) {\r\n $(document).one('click', closeTooltip);\r\n }\r\n });\r\n }\r\n\r\n });\r\n\r\n }\r\n}\r\n\r\nfunction moveVehicle() {\r\n setTimeout(\r\n function () {\r\n var currentDistance = $(\"[class^='breadcrumb'] .current\").position().left + ($(\"[class^='breadcrumb'] .current\").width() / 2) - $('.icofont-vehicle-trucktor').width() + 10;\r\n $('.icofont-vehicle-trucktor').css(\"left\", \"\" + currentDistance + \"px\");\r\n }\r\n , 200);\r\n}\r\n\r\n\r\n\r\n//////////////////////////////////////////////////////////////\r\n// Carousel page dashboard //\r\n//////////////////////////////////////////////////////////////\r\nfunction dashboardCarousel() {\r\n var largeCarousel = $(\".bloc_carousel\").hasClass(\"cols_8\");\r\n var owl = $('.owl-carousel');\r\n \r\n\r\n owl.owlCarousel({\r\n autoplay: true,\r\n autoplayHoverPause: true,\r\n autoplayTimeout: 8000,\r\n autoplaySpeed: 1000,\r\n center: true,\r\n items: 1.4,\r\n stagePadding: largeCarousel ? 200 : 50,\r\n loop: true,\r\n margin: 15,\r\n animateOut: 'slide-up',\r\n animateIn: 'slide-down',\r\n nav: false,\r\n dots: true,\r\n mouseDrag: true,\r\n touchDrag: true,\r\n //navText: [\r\n // '<i class=\"icofont-rounded-left\"></i>',\r\n // '<i class=\"icofont-rounded-right\"></i>'\r\n //],\r\n \r\n });\r\n\r\n if ($('.owl-dot').length > 5) {\r\n owl.addClass('customDotsPosition');\r\n\r\n var position = ($('.owl-dot.active').position().left - $('.owl-carousel').width() / 2 + 11) * -1;\r\n $('.owl-dots').css('left', position);\r\n\r\n owl.on('changed.owl.carousel', function (event) {\r\n dotsPosition();\r\n })\r\n }\r\n}\r\n\r\nfunction dotsPosition() {\r\n var position = ($('.owl-dot.active').position().left - $('.owl-carousel').width() / 2 + 11) * -1;\r\n $('.owl-dots').css('left', position);\r\n}\r\n\r\nfunction refreshCarousel() {\r\n setTimeout(function () {\r\n var largeCarousel = $(\".bloc_carousel\").hasClass(\"cols_8\");\r\n\r\n var options = $('.owl-carousel').data('owl.carousel').options;\r\n options.stagePadding = largeCarousel ? 200 : 50;\r\n\r\n $('.owl-carousel').trigger('refresh.owl.carousel');\r\n }, 200)\r\n};\r\n\r\n\r\n//////////////////////////////////////////////////////////////\r\n// GESTION DES COLONNES FIXES DES TABLEAUX // - \r\n//////////////////////////////////////////////////////////////\r\n\r\n//function columnFixer(colFix1,colFix2) {\r\n//\tvar nbTable = $('table').length;\r\n//\tvar nbColumn = $('th').length;\r\n//\tvar nbLine = $('tr').length;\r\n\r\n//\tvar $thFixed1 = $('th:eq(' + (parseInt(colFix1) - 1) + ')');\r\n//\tvar $thFixed2 = $('th:eq(' + (parseInt(colFix2) - 1) + ')');\r\n//\tvar $tdFixed1 = $('td:eq(' + (parseInt(colFix1) - 1) + ')');\r\n//\tvar $tdFixed2 = $('td:eq(' + (parseInt(colFix2) - 1) + ')');\r\n\r\n//\tvar $thFixed1Width = $thFixed1.outerWidth(true);\r\n//\tvar $thFixed2Width = $thFixed2.outerWidth(true);\r\n//\tvar $thFixed1Height = $thFixed1.outerHeight(true);\r\n//\tvar $thFixed2Height = $thFixed2.outerHeight(true);\r\n\r\n//\tvar tableWidth = $('table').outerWidth(true);\r\n\r\n\r\n\r\n\r\n//\t// J'encadre le tableau d'un conteneur\r\n//\t$('table').wrap('<div class=\"tableContainer\"></div>');\r\n\r\n//\t// Je créé les conteneurs de la colonne 1 et 2\r\n//\t$('.tableContainer').parent().append('<div class=\"firstColumnContainer\"><table><thead></thead><tbody></tbody></table></div>');\r\n//\t$('.tableContainer').parent().append('<div class=\"secondColumnContainer\"><table><thead></thead><tbody></tbody></table></div>');\r\n\r\n//\t// Je duplique les colonnes dans leur conteneur correspondant\r\n//\tvar $thFixed1Content = $thFixed1.html();\r\n//\tvar $thFixed2Content = $thFixed2.html();\r\n//\tvar $tdFixed1Content = $tdFixed1.html();\r\n//\tvar $tdFixed2Content = $tdFixed2.html();\r\n\r\n//\t//console.log($thFixed1Content);\r\n//\t//console.log($thFixed2Content);\r\n//\t//console.log($tdFixed1Content);\r\n//\t//console.log($tdFixed2Content);\r\n\r\n//\t$('<tr></tr>').appendTo('.firstColumnContainer thead');\r\n//\t$('.firstColumnContainer').css({ 'width': $thFixed1Width, 'height': $thFixed1Height });\r\n//\t$thFixed1.clone().appendTo('.firstColumnContainer thead tr');\r\n//\t//$tdFixed1.clone().appendTo('.firstColumnContainer tbody');\r\n\r\n//\t$('<tr></tr>').appendTo('.secondColumnContainer thead');\r\n//\t$('.secondColumnContainer').css({ 'width': $thFixed2Width, 'height': $thFixed2Height });\r\n//\t$thFixed2.clone().appendTo('.secondColumnContainer thead tr');\r\n//\t//$tdFixed2.clone().appendTo('.secondColumnContainer tbody');\r\n\r\n//\t$('.tableContainer tbody tr').each(function (i) {\r\n//\t\t$('<tr></tr>').appendTo('.firstColumnContainer tbody');\r\n//\t\t$('<tr></tr>').appendTo('.secondColumnContainer tbody');\r\n\r\n//\t\t$(this).find($tdFixed1).clone().appendTo('.firstColumnContainer tbody tr:last-child');\r\n//\t\t$(this).find($tdFixed2).clone().appendTo('.secondColumnContainer tbody tr:last-child');\r\n//\t});\r\n//}","// Gestion des hauteurs de ligne des tableaux responsive\r\n// Directive à appliquer sur le table .t_resp_center\r\n// @Author : Alexandre Riquet\r\n// [responsivetable]\r\n// @Param : singleExpander => option permettant de limiter l'ouverture à un seul accordéon.\r\n\r\nAgrimarketDirectives.directive('responsivetable', function ($timeout) {\r\n return {\r\n restrict: 'EA',\r\n scope: {\r\n data: '=loadedData'\r\n },\r\n link: function ($scope, elem, attrs) {\r\n\r\n $(window).resize(function () {\r\n onHeightCalcul(elem, $timeout, false, 0);\r\n });\r\n\r\n $scope.$watch(\"data\", function (newValue) {\r\n if (newValue !== undefined && newValue !== null) {\r\n onHeightCalcul(elem, $timeout, true, 0);\r\n }\r\n });\r\n\r\n $(\".deploy\").click(function () {\r\n onHeightCalcul(elem, $timeout, true, 200);\r\n });\r\n }\r\n };\r\n});\r\n\r\nvar oldHeaderHeight;\r\n\r\nfunction onHeightCalcul(elem, timeout, dataChanged, time) {\r\n var tableLeft = $(elem).find('.t_resp_left'),\r\n tableScrollable = $(elem).find('.t_resp_center'),\r\n tableRight = $(elem).find('.t_resp_right'),\r\n currentHeaderHeight = $('#idForReCalculHeight').find('.t_resp_center thead').outerHeight();\r\n\r\n\r\n if (dataChanged) {\r\n timeout(function () {\r\n tableScrollable.find('tr').each(function (i) {\r\n var currentLineHeight = $(this)[0].offsetHeight;\r\n\r\n tableLeft.find('tr').eq(i).css({\r\n 'height': currentLineHeight\r\n });\r\n \r\n tableScrollable.find('tr').eq(i).css({\r\n 'height': currentLineHeight\r\n });\r\n \r\n tableRight.find('tr').eq(i).css({\r\n 'height': currentLineHeight\r\n });\r\n\r\n i++;\r\n });\r\n }, time);\r\n }\r\n else if (currentHeaderHeight !== oldHeaderHeight) {\r\n oldHeaderHeight = currentHeaderHeight;\r\n\r\n timeout(function () {\r\n $('#idForReCalculHeight .t_resp_left thead tr').css({ 'height': currentHeaderHeight });\r\n $('#idForReCalculHeight .t_resp_right thead tr').css({ 'height': currentHeaderHeight });\r\n }, time);\r\n }\r\n var startt = new Date();\r\n}\r\n\r\n","// XDomain - v0.6.17 - https://github.com/jpillora/xdomain\r\n// Jaime Pillora <dev@jpillora.com> - MIT Copyright 2014\r\n(function(a,b){(function(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};r=a.document,d=\"before\",c=\"after\",l=\"readyState\",k=\"addEventListener\",j=\"removeEventListener\",g=\"dispatchEvent\",o=\"XMLHttpRequest\",h=\"FormData\",m=[\"load\",\"loadend\",\"loadstart\"],e=[\"progress\",\"abort\",\"error\",\"timeout\"],u=parseInt((/msie (\\d+)/.exec(navigator.userAgent.toLowerCase())||[])[1]),isNaN(u)&&(u=parseInt((/trident\\/.*; rv:(\\d+)/.exec(navigator.userAgent.toLowerCase())||[])[1])),(y=Array.prototype).indexOf||(y.indexOf=function(a){var b,c,d,e;for(b=d=0,e=this.length;e>d;b=++d)if(c=this[b],c===a)return b;return-1}),w=function(a,b){return Array.prototype.slice.call(a,b)},q=function(a){return\"returnValue\"===a||\"totalSize\"===a||\"position\"===a},t=function(a,b){var c,d;for(c in a)if(d=a[c],!q(c))try{b[c]=a[c]}catch(e){}return b},v=function(a,b,c){var d,e,f,h;for(e=function(a){return function(d){var e,f,h;e={};for(f in d)q(f)||(h=d[f],e[f]=h===b?c:h);return c[g](a,e)}},f=0,h=a.length;h>f;f++)d=a[f],b[\"on\"+d]=e(d)},s=function(a){var b;if(null!=r.createEventObject)return b=r.createEventObject(),b.type=a,b;try{return new Event(a)}catch(c){return{type:a}}},f=function(a){var c,d,e;return d={},e=function(a){return d[a]||[]},c={},c[k]=function(a,c,f){d[a]=e(a),d[a].indexOf(c)>=0||(f=f===b?d[a].length:f,d[a].splice(f,0,c))},c[j]=function(a,c){var f;return a===b?void(d={}):(c===b&&(d[a]=[]),f=e(a).indexOf(c),void(-1!==f&&e(a).splice(f,1)))},c[g]=function(){var d,f,g,h,i,j,k,l;for(d=w(arguments),f=d.shift(),a||(d[0]=t(d[0],s(f))),h=c[\"on\"+f],h&&h.apply(b,d),l=e(f).concat(e(\"*\")),g=j=0,k=l.length;k>j;g=++j)i=l[g],i.apply(b,d)},a&&(c.listeners=function(a){return w(e(a))},c.on=c[k],c.off=c[j],c.fire=c[g],c.once=function(a,b){var d;return d=function(){return c.off(a,d),b.apply(null,arguments)},c.on(a,d)},c.destroy=function(){return d={}}),c},x=f(!0),x.EventEmitter=f,x[d]=function(a,b){if(a.length<1||a.length>2)throw\"invalid hook\";return x[k](d,a,b)},x[c]=function(a,b){if(a.length<2||a.length>3)throw\"invalid hook\";return x[k](c,a,b)},x.enable=function(){a[o]=n},x.disable=function(){a[o]=x[o]},p=x.headers=function(a,b){var c,d,e,f,g,h,i,j,k;switch(null==b&&(b={}),typeof a){case\"object\":d=[];for(e in a)g=a[e],f=e.toLowerCase(),d.push(\"\"+f+\":\t\"+g);return d.join(\"\\n\");case\"string\":for(d=a.split(\"\\n\"),i=0,j=d.length;j>i;i++)c=d[i],/([^:]+):\\s*(.+)/.test(c)&&(f=null!=(k=RegExp.$1)?k.toLowerCase():void 0,h=RegExp.$2,null==b[f]&&(b[f]=h));return b}},i=a[h],i&&(x[h]=i,a[h]=function(a){var b;this.fd=a?new i(a):new i,this.form=a,b=[],Object.defineProperty(this,\"entries\",{get:function(){var c;return c=a?w(a.querySelectorAll(\"input,select\")).filter(function(a){var b;return\"checkbox\"!==(b=a.type)&&\"radio\"!==b||a.checked}).map(function(a){return[a.name,\"file\"===a.type?a.files:a.value]}):[],c.concat(b)}}),this.append=function(a){return function(){var c;return c=w(arguments),b.push(c),a.fd.append.apply(a.fd,c)}}(this)}),x[o]=a[o],n=a[o]=function(){var b,i,j,n,q,r,s,w,y,A,B,C,D,E,F,G,H;return b=-1,H=new x[o],A={},D=null,r=void 0,E=void 0,B=void 0,y=function(){var a,c,d,e;if(B.status=D||H.status,D===b&&10>u||(B.statusText=H.statusText),D!==b){e=p(H.getAllResponseHeaders());for(a in e)d=e[a],B.headers[a]||(c=a.toLowerCase(),B.headers[c]=d)}},w=function(){\"responseText\"in H&&(B.text=H.responseText),\"responseXML\"in H&&(B.xml=H.responseXML),\"response\"in H&&(B.data=H.response)},G=function(){q.status=B.status,q.statusText=B.statusText},F=function(){\"text\"in B&&(q.responseText=B.text),\"xml\"in B&&(q.responseXML=B.xml),\"data\"in B&&(q.response=B.data)},n=function(a){for(;a>i&&4>i;)q[l]=++i,1===i&&q[g](\"loadstart\",{}),2===i&&G(),4===i&&(G(),F()),q[g](\"readystatechange\",{}),4===i&&setTimeout(j,0)},j=function(){r||q[g](\"load\",{}),q[g](\"loadend\",{}),r&&(q[l]=0)},i=0,C=function(a){var b,d;return 4!==a?void n(a):(b=x.listeners(c),d=function(){var a;return b.length?(a=b.shift(),2===a.length?(a(A,B),d()):3===a.length&&A.async?a(A,B,d):d()):n(4)},void d())},q=A.xhr=f(),H.onreadystatechange=function(){try{2===H[l]&&y()}catch(a){}4===H[l]&&(E=!1,y(),w()),C(H[l])},s=function(){r=!0},q[k](\"error\",s),q[k](\"timeout\",s),q[k](\"abort\",s),q[k](\"progress\",function(){3>i?C(3):q[g](\"readystatechange\",{})}),v(e,H,q),(\"withCredentials\"in H||x.addWithCredentials)&&(q.withCredentials=!1),q.status=0,q.open=function(a,b,c,d,e){i=0,r=!1,E=!1,A.headers={},A.headerNames={},A.status=0,B={},B.headers={},A.method=a,A.url=b,A.async=c!==!1,A.user=d,A.pass=e,C(1)},q.send=function(b){var c,e,f,g,i,j,k,l;for(l=[\"type\",\"timeout\",\"withCredentials\"],j=0,k=l.length;k>j;j++)e=l[j],f=\"type\"===e?\"responseType\":e,f in q&&(A[e]=q[f]);A.body=b,i=function(){var b,c,d,g,i,j;for(E=!0,H.open(A.method,A.url,A.async,A.user,A.pass),i=[\"type\",\"timeout\",\"withCredentials\"],d=0,g=i.length;g>d;d++)e=i[d],f=\"type\"===e?\"responseType\":e,e in A&&(H[f]=A[e]);j=A.headers;for(b in j)c=j[b],H.setRequestHeader(b,c);a[h]&&A.body instanceof a[h]&&(A.body=A.body.fd),H.send(A.body)},c=x.listeners(d),(g=function(){var a,b;return c.length?(a=function(a){return\"object\"!=typeof a||\"number\"!=typeof a.status&&\"number\"!=typeof B.status?void g():(t(a,B),z.call(a,\"data\")<0&&(a.data=a.response||a.text),void C(4))},a.head=function(a){return t(a,B),C(2)},a.progress=function(a){return t(a,B),C(3)},b=c.shift(),1===b.length?a(b(A)):2===b.length&&A.async?b(A,a):a()):i()})()},q.abort=function(){D=b,E?H.abort():q[g](\"abort\",{})},q.setRequestHeader=function(a,b){var c,d;c=null!=a?a.toLowerCase():void 0,d=A.headerNames[c]=A.headerNames[c]||a,A.headers[d]&&(b=A.headers[d]+\", \"+b),A.headers[d]=b},q.getResponseHeader=function(a){var b;return b=null!=a?a.toLowerCase():void 0,B.headers[b]},q.getAllResponseHeaders=function(){return p(B.headers)},H.overrideMimeType&&(q.overrideMimeType=function(){return H.overrideMimeType.apply(H,arguments)}),H.upload&&(q.upload=A.upload=f(),v(e.concat(m),H.upload,q.upload)),q},\"function\"==typeof this.define&&this.define.amd?define(\"xhook\",[],function(){return x}):(this.exports||this).xhook=x}).call(this,a);var c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P;E=null,g=function(a){var b,c;null===E&&(E={},s());for(b in a)c=a[b],y(\"adding slave: \"+b),E[b]=c},o={},p=function(a,b){var c;return o[a]?o[a]:(c=l.createElement(\"iframe\"),c.id=c.name=q(),y(\"creating iframe \"+c.id),c.src=\"\"+a+b,c.setAttribute(\"style\",\"display:none;\"),l.body.appendChild(c),o[a]=c.contentWindow)},s=function(){var a,b,c;return b=function(a,b){var c,d,e,f,g;return e=a[0],f=a[1],c=u(f,\"Blob\"),d=u(f,\"File\"),c||d?(g=new FileReader,g.onload=function(){return a[1]=null,d&&(a[2]=f.name),b([\"XD_BLOB\",a,this.result,f.type])},g.readAsArrayBuffer(f),1):0},a=function(a,c){var d;a.forEach(function(b,c){var d,e,f,g,h;if(e=b[0],f=b[1],u(f,\"FileList\"))for(a.splice(c,1),g=0,h=f.length;h>g;g++)d=f[g],a.splice(c,0,[e,d])}),d=0,a.forEach(function(e,f){d+=b(e,function(b){a[f]=b,0===--d&&c()})}),0===d&&c()},c=function(b,c){var d,e,f;return c.on(\"xhr-event\",function(){return b.xhr.dispatchEvent.apply(null,arguments)}),c.on(\"xhr-upload-event\",function(){return b.xhr.upload.dispatchEvent.apply(null,arguments)}),e=I(b),e.headers=b.headers,b.withCredentials&&(e.credentials=l.cookie),f=function(){return c.emit(\"request\",e)},b.body&&(e.body=b.body,u(e.body,\"FormData\"))?(d=e.body.entries,e.body=[\"XD_FD\",d],void a(d,f)):void f()},\"addWithCredentials\"in M||(M.addWithCredentials=!0),M.before(function(a,b){var d,e,f;return e=C(a.url),e&&e.origin!==k?E[e.origin]?(y(\"proxying request to slave: '\"+e.origin+\"'\"),a.async===!1?(K(\"sync not supported\"),b()):(d=p(e.origin,E[e.origin]),f=h(d),f.on(\"response\",function(a){return b(a),f.close()}),a.xhr.addEventListener(\"abort\",function(){return f.emit(\"abort\")}),void(f.ready?c(a,f):f.once(\"ready\",function(){return c(a,f)})))):(e&&y(\"no slave matching: '\"+e.origin+\"'\"),b()):b()})},A=null,f=function(a){var b,c;null===A&&(A={},t());for(b in a)c=a[b],y(\"adding master: \"+b),A[b]=c},t=function(){return w(function(a,b){var c,d,e,f;\"null\"===a&&(a=\"*\"),e=null;for(c in A){f=A[c];try{if(d=J(c),d.test(a)){e=J(f);break}}catch(g){}}return e?(b.once(\"request\",function(a){var c,d,f,g,h,i,j,k,l,m,n;if(y(\"request: \"+a.method+\" \"+a.url),i=C(a.url),!i||!e.test(i.path))return K(\"blocked request to path: '\"+i.path+\"' by regex: \"+e),void b.close();k=new XMLHttpRequest,k.open(a.method,a.url),k.addEventListener(\"*\",function(a){return b.emit(\"xhr-event\",a.type,I(a))}),k.upload&&k.upload.addEventListener(\"*\",function(a){return b.emit(\"xhr-upload-event\",a.type,I(a))}),b.once(\"abort\",function(){return k.abort()}),k.onreadystatechange=function(){var a;if(4===k.readyState){a={status:k.status,statusText:k.statusText,data:k.response,headers:M.headers(k.getAllResponseHeaders())};try{a.text=k.responseText}catch(c){}return b.emit(\"response\",a)}},a.withCredentials&&(a.headers[\"XDomain-Cookie\"]=a.credentials),a.timeout&&(k.timeout=a.timeout),a.type&&(k.responseType=a.type),n=a.headers;for(h in n)j=n[h],k.setRequestHeader(h,j);if(a.body instanceof Array&&\"XD_FD\"===a.body[0]){for(g=new M.FormData,f=a.body[1],l=0,m=f.length;m>l;l++)c=f[l],\"XD_BLOB\"===c[0]&&4===c.length&&(d=new Blob([c[2]],{type:c[3]}),c=c[1],c[1]=d),g.append.apply(g,c);a.body=g}k.send(a.body||null)}),void y(\"slave listening for requests on socket: \"+b.id)):void K(\"blocked request from: '\"+a+\"'\")}),a===a.parent?K(\"slaves must be in an iframe\"):a.parent.postMessage(\"XDPING_\"+d,\"*\")},B=function(b){return l.addEventListener?a.addEventListener(\"message\",b):a.attachEvent(\"onmessage\",b)},e=\"XD_CHECK\",r=null,G={},v=!0,H=function(){return B(function(a){var c,e,f,g;if(c=a.data,\"string\"==typeof c){if(/^XDPING(_(V\\d+))?$/.test(c)&&RegExp.$2!==d)return K(\"your master is not compatible with your slave, check your xdomain.js version\");if(/^xdomain-/.test(c))c=c.split(\",\");else if(v)try{c=JSON.parse(c)}catch(h){return}}if(c instanceof Array&&(f=c.shift(),/^xdomain-/.test(f)&&(g=G[f],null!==g))){if(g===b){if(!r)return;g=j(f,a.source),r(a.origin,g)}e=\"string\"==typeof c[1]?\": '\"+c[1]+\"'\":\"\",y(\"receive socket: \"+f+\": '\"+c[0]+\"'\"+e),g.fire.apply(g,c)}})},j=function(a,b){var d,f,g,h,i,j;return i=!1,j=G[a]=M.EventEmitter(!0),j.id=a,j.once(\"close\",function(){return j.destroy(),j.close()}),h=[],j.emit=function(){var b,c;b=F(arguments),c=\"string\"==typeof b[1]?\": '\"+b[1]+\"'\":\"\",y(\"send socket: \"+a+\": \"+b[0]+c),b.unshift(a),i?g(b):h.push(b)},g=function(a){v&&(a=JSON.stringify(a)),b.postMessage(a,\"*\")},j.close=function(){j.emit(\"close\"),y(\"close socket: \"+a),G[a]=null},j.once(e,function(b){for(v=\"string\"==typeof b,i=j.ready=!0,j.emit(\"ready\"),y(\"ready socket: \"+a+\" (emit #\"+h.length+\" pending)\");h.length;)g(h.shift())}),f=0,d=function(){return function(){b.postMessage([a,e,{}],\"*\"),i||(f++>=L.timeout/c?(K(\"Timeout waiting on iframe socket\"),m.fire(\"timeout\"),j.fire(\"abort\")):setTimeout(d,c))}}(this),setTimeout(d),y(\"new socket: \"+a),j},h=function(a){var b;return b=j(q(),a)},w=function(a){r=a},M=(this.exports||this).xhook,L=function(a){a&&(a.masters&&f(a.masters),a.slaves&&g(a.slaves))},L.masters=f,L.slaves=g,L.debug=!1,L.timeout=15e3,c=100,l=a.document,x=a.location,k=L.origin=x.protocol+\"//\"+x.host,q=function(){return\"xdomain-\"+Math.round(Math.random()*Math.pow(2,32)).toString(16)},F=function(a,b){return Array.prototype.slice.call(a,b)},i=a.console||{},m=null,D=function(){m=M.EventEmitter(!0),L.on=m.on},M&&D(),z=function(a){return function(b){b=\"xdomain (\"+k+\"): \"+b,m.fire(a,b),(\"log\"!==a||L.debug)&&(a in L?L[a](b):a in i?i[a](b):\"warn\"===a&&alert(b))}},y=z(\"log\"),K=z(\"warn\"),P=[\"postMessage\",\"JSON\"];for(N=0,O=P.length;O>N;N++)if(n=P[N],!a[n])return void K(\"requires '\"+n+\"' and this browser does not support it\");u=function(b,c){return c in a?b instanceof a[c]:!1},d=\"V1\",C=L.parseUrl=function(a){return/^((https?:)?\\/\\/[^\\/\\?]+)(\\/.*)?/.test(a)?{origin:(RegExp.$2?\"\":x.protocol)+RegExp.$1,path:RegExp.$3}:(y(\"failed to parse absolute url: \"+a),null)},J=function(a){var b;return a instanceof RegExp?a:(b=a.toString().replace(/\\W/g,function(a){return\"\\\\\"+a}).replace(/\\\\\\*/g,\".*\"),new RegExp(\"^\"+b+\"$\"))},I=function(a){var b,c,d,e;b={};for(c in a)\"returnValue\"!==c&&(d=a[c],\"function\"!=(e=typeof d)&&\"object\"!==e&&(b[c]=d));return b},function(){var a,b,c,d,e,h,i,j,k,m,n;for(a={debug:function(a){return\"string\"==typeof a?L.debug=\"false\"!==a:void 0},slave:function(a){var b,c;if(a&&(b=C(a)))return c={},c[b.origin]=b.path,g(c)},master:function(a){var b,c;if(a&&(c=\"*\"===a?{origin:\"*\",path:\"*\"}:C(a)))return b={},b[c.origin]=c.path.replace(/^\\//,\"\")?c.path:\"*\",f(b)}},m=l.getElementsByTagName(\"script\"),h=0,j=m.length;j>h;h++)if(e=m[h],/xdomain/.test(e.src))for(n=[\"\",\"data-\"],i=0,k=n.length;k>i;i++){d=n[i];for(c in a)(b=a[c])(e.getAttribute(d+c))}}(),H(),\"function\"==typeof this.define&&this.define.amd?define(\"xdomain\",[\"xhook\"],function(a){return M=a,D(),L}):(this.exports||this).xdomain=L}).call(this,window);","/* Modernizr 2.8.3 (Custom Build) | MIT & BSD\r\n * Build: http://modernizr.com/download/#-fontface-backgroundsize-borderimage-borderradius-boxshadow-flexbox-flexboxlegacy-hsla-multiplebgs-opacity-rgba-textshadow-cssanimations-csscolumns-generatedcontent-cssgradients-cssreflections-csstransforms-csstransforms3d-csstransitions-applicationcache-canvas-canvastext-draganddrop-hashchange-history-audio-video-indexeddb-input-inputtypes-localstorage-postmessage-sessionstorage-websockets-websqldatabase-webworkers-geolocation-inlinesvg-smil-svg-svgclippaths-touch-webgl-shiv-cssclasses-teststyles-testprop-testallprops-hasevent-prefixes-domprefixes-load\r\n */\r\n; window.Modernizr = function (a, b, c) { function C(a) { j.cssText = a } function D(a, b) { return C(n.join(a + \";\") + (b || \"\")) } function E(a, b) { return typeof a === b } function F(a, b) { return !!~(\"\" + a).indexOf(b) } function G(a, b) { for (var d in a) { var e = a[d]; if (!F(e, \"-\") && j[e] !== c) return b == \"pfx\" ? e : !0 } return !1 } function H(a, b, d) { for (var e in a) { var f = b[a[e]]; if (f !== c) return d === !1 ? a[e] : E(f, \"function\") ? f.bind(d || b) : f } return !1 } function I(a, b, c) { var d = a.charAt(0).toUpperCase() + a.slice(1), e = (a + \" \" + p.join(d + \" \") + d).split(\" \"); return E(b, \"string\") || E(b, \"undefined\") ? G(e, b) : (e = (a + \" \" + q.join(d + \" \") + d).split(\" \"), H(e, b, c)) } function J() { e.input = function (c) { for (var d = 0, e = c.length; d < e; d++) u[c[d]] = c[d] in k; return u.list && (u.list = !!b.createElement(\"datalist\") && !!a.HTMLDataListElement), u }(\"autocomplete autofocus list placeholder max min multiple pattern required step\".split(\" \")), e.inputtypes = function (a) { for (var d = 0, e, f, h, i = a.length; d < i; d++) k.setAttribute(\"type\", f = a[d]), e = k.type !== \"text\", e && (k.value = l, k.style.cssText = \"position:absolute;visibility:hidden;\", /^range$/.test(f) && k.style.WebkitAppearance !== c ? (g.appendChild(k), h = b.defaultView, e = h.getComputedStyle && h.getComputedStyle(k, null).WebkitAppearance !== \"textfield\" && k.offsetHeight !== 0, g.removeChild(k)) : /^(search|tel)$/.test(f) || (/^(url|email)$/.test(f) ? e = k.checkValidity && k.checkValidity() === !1 : e = k.value != l)), t[a[d]] = !!e; return t }(\"search tel url email datetime date month week time datetime-local number range color\".split(\" \")) } var d = \"2.8.3\", e = {}, f = !0, g = b.documentElement, h = \"modernizr\", i = b.createElement(h), j = i.style, k = b.createElement(\"input\"), l = \":)\", m = {}.toString, n = \" -webkit- -moz- -o- -ms- \".split(\" \"), o = \"Webkit Moz O ms\", p = o.split(\" \"), q = o.toLowerCase().split(\" \"), r = { svg: \"http://www.w3.org/2000/svg\" }, s = {}, t = {}, u = {}, v = [], w = v.slice, x, y = function (a, c, d, e) { var f, i, j, k, l = b.createElement(\"div\"), m = b.body, n = m || b.createElement(\"body\"); if (parseInt(d, 10)) while (d--) j = b.createElement(\"div\"), j.id = e ? e[d] : h + (d + 1), l.appendChild(j); return f = [\"­\", '<style id=\"s', h, '\">', a, \"</style>\"].join(\"\"), l.id = h, (m ? l : n).innerHTML += f, n.appendChild(l), m || (n.style.background = \"\", n.style.overflow = \"hidden\", k = g.style.overflow, g.style.overflow = \"hidden\", g.appendChild(n)), i = c(l, a), m ? l.parentNode.removeChild(l) : (n.parentNode.removeChild(n), g.style.overflow = k), !!i }, z = function () { function d(d, e) { e = e || b.createElement(a[d] || \"div\"), d = \"on\" + d; var f = d in e; return f || (e.setAttribute || (e = b.createElement(\"div\")), e.setAttribute && e.removeAttribute && (e.setAttribute(d, \"\"), f = E(e[d], \"function\"), E(e[d], \"undefined\") || (e[d] = c), e.removeAttribute(d))), e = null, f } var a = { select: \"input\", change: \"input\", submit: \"form\", reset: \"form\", error: \"img\", load: \"img\", abort: \"img\" }; return d }(), A = {}.hasOwnProperty, B; !E(A, \"undefined\") && !E(A.call, \"undefined\") ? B = function (a, b) { return A.call(a, b) } : B = function (a, b) { return b in a && E(a.constructor.prototype[b], \"undefined\") }, Function.prototype.bind || (Function.prototype.bind = function (b) { var c = this; if (typeof c != \"function\") throw new TypeError; var d = w.call(arguments, 1), e = function () { if (this instanceof e) { var a = function () { }; a.prototype = c.prototype; var f = new a, g = c.apply(f, d.concat(w.call(arguments))); return Object(g) === g ? g : f } return c.apply(b, d.concat(w.call(arguments))) }; return e }), s.flexbox = function () { return I(\"flexWrap\") }, s.flexboxlegacy = function () { return I(\"boxDirection\") }, s.canvas = function () { var a = b.createElement(\"canvas\"); return !!a.getContext && !!a.getContext(\"2d\") }, s.canvastext = function () { return !!e.canvas && !!E(b.createElement(\"canvas\").getContext(\"2d\").fillText, \"function\") }, s.webgl = function () { return !!a.WebGLRenderingContext }, s.touch = function () { var c; return \"ontouchstart\" in a || a.DocumentTouch && b instanceof DocumentTouch ? c = !0 : y([\"@media (\", n.join(\"touch-enabled),(\"), h, \")\", \"{#modernizr{top:9px;position:absolute}}\"].join(\"\"), function (a) { c = a.offsetTop === 9 }), c }, s.geolocation = function () { return \"geolocation\" in navigator }, s.postmessage = function () { return !!a.postMessage }, s.websqldatabase = function () { return !!a.openDatabase }, s.indexedDB = function () { return !!I(\"indexedDB\", a) }, s.hashchange = function () { return z(\"hashchange\", a) && (b.documentMode === c || b.documentMode > 7) }, s.history = function () { return !!a.history && !!history.pushState }, s.draganddrop = function () { var a = b.createElement(\"div\"); return \"draggable\" in a || \"ondragstart\" in a && \"ondrop\" in a }, s.websockets = function () { return \"WebSocket\" in a || \"MozWebSocket\" in a }, s.rgba = function () { return C(\"background-color:rgba(150,255,150,.5)\"), F(j.backgroundColor, \"rgba\") }, s.hsla = function () { return C(\"background-color:hsla(120,40%,100%,.5)\"), F(j.backgroundColor, \"rgba\") || F(j.backgroundColor, \"hsla\") }, s.multiplebgs = function () { return C(\"background:url(https://),url(https://),red url(https://)\"), /(url\\s*\\(.*?){3}/.test(j.background) }, s.backgroundsize = function () { return I(\"backgroundSize\") }, s.borderimage = function () { return I(\"borderImage\") }, s.borderradius = function () { return I(\"borderRadius\") }, s.boxshadow = function () { return I(\"boxShadow\") }, s.textshadow = function () { return b.createElement(\"div\").style.textShadow === \"\" }, s.opacity = function () { return D(\"opacity:.55\"), /^0.55$/.test(j.opacity) }, s.cssanimations = function () { return I(\"animationName\") }, s.csscolumns = function () { return I(\"columnCount\") }, s.cssgradients = function () { var a = \"background-image:\", b = \"gradient(linear,left top,right bottom,from(#9f9),to(white));\", c = \"linear-gradient(left top,#9f9, white);\"; return C((a + \"-webkit- \".split(\" \").join(b + a) + n.join(c + a)).slice(0, -a.length)), F(j.backgroundImage, \"gradient\") }, s.cssreflections = function () { return I(\"boxReflect\") }, s.csstransforms = function () { return !!I(\"transform\") }, s.csstransforms3d = function () { var a = !!I(\"perspective\"); return a && \"webkitPerspective\" in g.style && y(\"@media (transform-3d),(-webkit-transform-3d){#modernizr{left:9px;position:absolute;height:3px;}}\", function (b, c) { a = b.offsetLeft === 9 && b.offsetHeight === 3 }), a }, s.csstransitions = function () { return I(\"transition\") }, s.fontface = function () { var a; return y('@font-face {font-family:\"font\";src:url(\"https://\")}', function (c, d) { var e = b.getElementById(\"smodernizr\"), f = e.sheet || e.styleSheet, g = f ? f.cssRules && f.cssRules[0] ? f.cssRules[0].cssText : f.cssText || \"\" : \"\"; a = /src/i.test(g) && g.indexOf(d.split(\" \")[0]) === 0 }), a }, s.generatedcontent = function () { var a; return y([\"#\", h, \"{font:0/0 a}#\", h, ':after{content:\"', l, '\";visibility:hidden;font:3px/1 a}'].join(\"\"), function (b) { a = b.offsetHeight >= 3 }), a }, s.video = function () { var a = b.createElement(\"video\"), c = !1; try { if (c = !!a.canPlayType) c = new Boolean(c), c.ogg = a.canPlayType('video/ogg; codecs=\"theora\"').replace(/^no$/, \"\"), c.h264 = a.canPlayType('video/mp4; codecs=\"avc1.42E01E\"').replace(/^no$/, \"\"), c.webm = a.canPlayType('video/webm; codecs=\"vp8, vorbis\"').replace(/^no$/, \"\") } catch (d) { } return c }, s.audio = function () { var a = b.createElement(\"audio\"), c = !1; try { if (c = !!a.canPlayType) c = new Boolean(c), c.ogg = a.canPlayType('audio/ogg; codecs=\"vorbis\"').replace(/^no$/, \"\"), c.mp3 = a.canPlayType(\"audio/mpeg;\").replace(/^no$/, \"\"), c.wav = a.canPlayType('audio/wav; codecs=\"1\"').replace(/^no$/, \"\"), c.m4a = (a.canPlayType(\"audio/x-m4a;\") || a.canPlayType(\"audio/aac;\")).replace(/^no$/, \"\") } catch (d) { } return c }, s.localstorage = function () { try { return localStorage.setItem(h, h), localStorage.removeItem(h), !0 } catch (a) { return !1 } }, s.sessionstorage = function () { try { return sessionStorage.setItem(h, h), sessionStorage.removeItem(h), !0 } catch (a) { return !1 } }, s.webworkers = function () { return !!a.Worker }, s.applicationcache = function () { return !!a.applicationCache }, s.svg = function () { return !!b.createElementNS && !!b.createElementNS(r.svg, \"svg\").createSVGRect }, s.inlinesvg = function () { var a = b.createElement(\"div\"); return a.innerHTML = \"<svg/>\", (a.firstChild && a.firstChild.namespaceURI) == r.svg }, s.smil = function () { return !!b.createElementNS && /SVGAnimate/.test(m.call(b.createElementNS(r.svg, \"animate\"))) }, s.svgclippaths = function () { return !!b.createElementNS && /SVGClipPath/.test(m.call(b.createElementNS(r.svg, \"clipPath\"))) }; for (var K in s) B(s, K) && (x = K.toLowerCase(), e[x] = s[K](), v.push((e[x] ? \"\" : \"no-\") + x)); return e.input || J(), e.addTest = function (a, b) { if (typeof a == \"object\") for (var d in a) B(a, d) && e.addTest(d, a[d]); else { a = a.toLowerCase(); if (e[a] !== c) return e; b = typeof b == \"function\" ? b() : b, typeof f != \"undefined\" && f && (g.className += \" \" + (b ? \"\" : \"no-\") + a), e[a] = b } return e }, C(\"\"), i = k = null, function (a, b) { function l(a, b) { var c = a.createElement(\"p\"), d = a.getElementsByTagName(\"head\")[0] || a.documentElement; return c.innerHTML = \"x<style>\" + b + \"</style>\", d.insertBefore(c.lastChild, d.firstChild) } function m() { var a = s.elements; return typeof a == \"string\" ? a.split(\" \") : a } function n(a) { var b = j[a[h]]; return b || (b = {}, i++, a[h] = i, j[i] = b), b } function o(a, c, d) { c || (c = b); if (k) return c.createElement(a); d || (d = n(c)); var g; return d.cache[a] ? g = d.cache[a].cloneNode() : f.test(a) ? g = (d.cache[a] = d.createElem(a)).cloneNode() : g = d.createElem(a), g.canHaveChildren && !e.test(a) && !g.tagUrn ? d.frag.appendChild(g) : g } function p(a, c) { a || (a = b); if (k) return a.createDocumentFragment(); c = c || n(a); var d = c.frag.cloneNode(), e = 0, f = m(), g = f.length; for (; e < g; e++) d.createElement(f[e]); return d } function q(a, b) { b.cache || (b.cache = {}, b.createElem = a.createElement, b.createFrag = a.createDocumentFragment, b.frag = b.createFrag()), a.createElement = function (c) { return s.shivMethods ? o(c, a, b) : b.createElem(c) }, a.createDocumentFragment = Function(\"h,f\", \"return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&(\" + m().join().replace(/[\\w\\-]+/g, function (a) { return b.createElem(a), b.frag.createElement(a), 'c(\"' + a + '\")' }) + \");return n}\")(s, b.frag) } function r(a) { a || (a = b); var c = n(a); return s.shivCSS && !g && !c.hasCSS && (c.hasCSS = !!l(a, \"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}\")), k || q(a, c), a } var c = \"3.7.0\", d = a.html5 || {}, e = /^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i, f = /^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i, g, h = \"_html5shiv\", i = 0, j = {}, k; (function () { try { var a = b.createElement(\"a\"); a.innerHTML = \"<xyz></xyz>\", g = \"hidden\" in a, k = a.childNodes.length == 1 || function () { b.createElement(\"a\"); var a = b.createDocumentFragment(); return typeof a.cloneNode == \"undefined\" || typeof a.createDocumentFragment == \"undefined\" || typeof a.createElement == \"undefined\" }() } catch (c) { g = !0, k = !0 } })(); var s = { elements: d.elements || \"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video\", version: c, shivCSS: d.shivCSS !== !1, supportsUnknownElements: k, shivMethods: d.shivMethods !== !1, type: \"default\", shivDocument: r, createElement: o, createDocumentFragment: p }; a.html5 = s, r(b) }(this, b), e._version = d, e._prefixes = n, e._domPrefixes = q, e._cssomPrefixes = p, e.hasEvent = z, e.testProp = function (a) { return G([a]) }, e.testAllProps = I, e.testStyles = y, g.className = g.className.replace(/(^|\\s)no-js(\\s|$)/, \"$1$2\") + (f ? \" js \" + v.join(\" \") : \"\"), e }(this, this.document), function (a, b, c) { function d(a) { return \"[object Function]\" == o.call(a) } function e(a) { return \"string\" == typeof a } function f() { } function g(a) { return !a || \"loaded\" == a || \"complete\" == a || \"uninitialized\" == a } function h() { var a = p.shift(); q = 1, a ? a.t ? m(function () { (\"c\" == a.t ? B.injectCss : B.injectJs)(a.s, 0, a.a, a.x, a.e, 1) }, 0) : (a(), h()) : q = 0 } function i(a, c, d, e, f, i, j) { function k(b) { if (!o && g(l.readyState) && (u.r = o = 1, !q && h(), l.onload = l.onreadystatechange = null, b)) { \"img\" != a && m(function () { t.removeChild(l) }, 50); for (var d in y[c]) y[c].hasOwnProperty(d) && y[c][d].onload() } } var j = j || B.errorTimeout, l = b.createElement(a), o = 0, r = 0, u = { t: d, s: c, e: f, a: i, x: j }; 1 === y[c] && (r = 1, y[c] = []), \"object\" == a ? l.data = c : (l.src = c, l.type = a), l.width = l.height = \"0\", l.onerror = l.onload = l.onreadystatechange = function () { k.call(this, r) }, p.splice(e, 0, u), \"img\" != a && (r || 2 === y[c] ? (t.insertBefore(l, s ? null : n), m(k, j)) : y[c].push(l)) } function j(a, b, c, d, f) { return q = 0, b = b || \"j\", e(a) ? i(\"c\" == b ? v : u, a, b, this.i++, c, d, f) : (p.splice(this.i++, 0, a), 1 == p.length && h()), this } function k() { var a = B; return a.loader = { load: j, i: 0 }, a } var l = b.documentElement, m = a.setTimeout, n = b.getElementsByTagName(\"script\")[0], o = {}.toString, p = [], q = 0, r = \"MozAppearance\" in l.style, s = r && !!b.createRange().compareNode, t = s ? l : n.parentNode, l = a.opera && \"[object Opera]\" == o.call(a.opera), l = !!b.attachEvent && !l, u = r ? \"object\" : l ? \"script\" : \"img\", v = l ? \"script\" : u, w = Array.isArray || function (a) { return \"[object Array]\" == o.call(a) }, x = [], y = {}, z = { timeout: function (a, b) { return b.length && (a.timeout = b[0]), a } }, A, B; B = function (a) { function b(a) { var a = a.split(\"!\"), b = x.length, c = a.pop(), d = a.length, c = { url: c, origUrl: c, prefixes: a }, e, f, g; for (f = 0; f < d; f++) g = a[f].split(\"=\"), (e = z[g.shift()]) && (c = e(c, g)); for (f = 0; f < b; f++) c = x[f](c); return c } function g(a, e, f, g, h) { var i = b(a), j = i.autoCallback; i.url.split(\".\").pop().split(\"?\").shift(), i.bypass || (e && (e = d(e) ? e : e[a] || e[g] || e[a.split(\"/\").pop().split(\"?\")[0]]), i.instead ? i.instead(a, e, f, g, h) : (y[i.url] ? i.noexec = !0 : y[i.url] = 1, f.load(i.url, i.forceCSS || !i.forceJS && \"css\" == i.url.split(\".\").pop().split(\"?\").shift() ? \"c\" : c, i.noexec, i.attrs, i.timeout), (d(e) || d(j)) && f.load(function () { k(), e && e(i.origUrl, h, g), j && j(i.origUrl, h, g), y[i.url] = 2 }))) } function h(a, b) { function c(a, c) { if (a) { if (e(a)) c || (j = function () { var a = [].slice.call(arguments); k.apply(this, a), l() }), g(a, j, b, 0, h); else if (Object(a) === a) for (n in m = function () { var b = 0, c; for (c in a) a.hasOwnProperty(c) && b++; return b }(), a) a.hasOwnProperty(n) && (!c && !--m && (d(j) ? j = function () { var a = [].slice.call(arguments); k.apply(this, a), l() } : j[n] = function (a) { return function () { var b = [].slice.call(arguments); a && a.apply(this, b), l() } }(k[n])), g(a[n], j, b, n, h)) } else !c && l() } var h = !!a.test, i = a.load || a.both, j = a.callback || f, k = j, l = a.complete || f, m, n; c(h ? a.yep : a.nope, !!i), i && c(i) } var i, j, l = this.yepnope.loader; if (e(a)) g(a, 0, l, 0); else if (w(a)) for (i = 0; i < a.length; i++) j = a[i], e(j) ? g(j, 0, l, 0) : w(j) ? B(j) : Object(j) === j && h(j, l); else Object(a) === a && h(a, l) }, B.addPrefix = function (a, b) { z[a] = b }, B.addFilter = function (a) { x.push(a) }, B.errorTimeout = 1e4, null == b.readyState && b.addEventListener && (b.readyState = \"loading\", b.addEventListener(\"DOMContentLoaded\", A = function () { b.removeEventListener(\"DOMContentLoaded\", A, 0), b.readyState = \"complete\" }, 0)), a.yepnope = k(), a.yepnope.executeStack = h, a.yepnope.injectJs = function (a, c, d, e, i, j) { var k = b.createElement(\"script\"), l, o, e = e || B.errorTimeout; k.src = a; for (o in d) k.setAttribute(o, d[o]); c = j ? h : c || f, k.onreadystatechange = k.onload = function () { !l && g(k.readyState) && (l = 1, c(), k.onload = k.onreadystatechange = null) }, m(function () { l || (l = 1, c(1)) }, e), i ? k.onload() : n.parentNode.insertBefore(k, n) }, a.yepnope.injectCss = function (a, c, d, e, g, i) { var e = b.createElement(\"link\"), j, c = i ? h : c || f; e.href = a, e.rel = \"stylesheet\", e.type = \"text/css\"; for (j in d) e.setAttribute(j, d[j]); g || (n.parentNode.insertBefore(e, n), m(c, 0)) } }(this, document), Modernizr.load = function () { yepnope.apply(window, [].slice.call(arguments, 0)) };","/*!\r\n * jQuery JavaScript Library v1.11.0\r\n * http://jquery.com/\r\n *\r\n * Includes Sizzle.js\r\n * http://sizzlejs.com/\r\n *\r\n * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors\r\n * Released under the MIT license\r\n * http://jquery.org/license\r\n *\r\n * Date: 2014-01-23T21:02Z\r\n */\r\n\r\n(function( global, factory ) {\r\n\r\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\r\n\t\t// For CommonJS and CommonJS-like environments where a proper window is present,\r\n\t\t// execute the factory and get jQuery\r\n\t\t// For environments that do not inherently posses a window with a document\r\n\t\t// (such as Node.js), expose a jQuery-making factory as module.exports\r\n\t\t// This accentuates the need for the creation of a real window\r\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\r\n\t\t// See ticket #14549 for more info\r\n\t\tmodule.exports = global.document ?\r\n\t\t\tfactory( global, true ) :\r\n\t\t\tfunction( w ) {\r\n\t\t\t\tif ( !w.document ) {\r\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\r\n\t\t\t\t}\r\n\t\t\t\treturn factory( w );\r\n\t\t\t};\r\n\t} else {\r\n\t\tfactory( global );\r\n\t}\r\n\r\n// Pass this if window is not defined yet\r\n}(typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\r\n\r\n// Can't do this because several apps including ASP.NET trace\r\n// the stack via arguments.caller.callee and Firefox dies if\r\n// you try to trace through \"use strict\" call chains. (#13335)\r\n// Support: Firefox 18+\r\n//\r\n\r\nvar deletedIds = [];\r\n\r\nvar slice = deletedIds.slice;\r\n\r\nvar concat = deletedIds.concat;\r\n\r\nvar push = deletedIds.push;\r\n\r\nvar indexOf = deletedIds.indexOf;\r\n\r\nvar class2type = {};\r\n\r\nvar toString = class2type.toString;\r\n\r\nvar hasOwn = class2type.hasOwnProperty;\r\n\r\nvar trim = \"\".trim;\r\n\r\nvar support = {};\r\n\r\n\r\n\r\nvar\r\n\tversion = \"1.11.0\",\r\n\r\n\t// Define a local copy of jQuery\r\n\tjQuery = function( selector, context ) {\r\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\r\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\r\n\t\treturn new jQuery.fn.init( selector, context );\r\n\t},\r\n\r\n\t// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)\r\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\r\n\r\n\t// Matches dashed string for camelizing\r\n\trmsPrefix = /^-ms-/,\r\n\trdashAlpha = /-([\\da-z])/gi,\r\n\r\n\t// Used by jQuery.camelCase as callback to replace()\r\n\tfcamelCase = function( all, letter ) {\r\n\t\treturn letter.toUpperCase();\r\n\t};\r\n\r\njQuery.fn = jQuery.prototype = {\r\n\t// The current version of jQuery being used\r\n\tjquery: version,\r\n\r\n\tconstructor: jQuery,\r\n\r\n\t// Start with an empty selector\r\n\tselector: \"\",\r\n\r\n\t// The default length of a jQuery object is 0\r\n\tlength: 0,\r\n\r\n\ttoArray: function() {\r\n\t\treturn slice.call( this );\r\n\t},\r\n\r\n\t// Get the Nth element in the matched element set OR\r\n\t// Get the whole matched element set as a clean array\r\n\tget: function( num ) {\r\n\t\treturn num != null ?\r\n\r\n\t\t\t// Return a 'clean' array\r\n\t\t\t( num < 0 ? this[ num + this.length ] : this[ num ] ) :\r\n\r\n\t\t\t// Return just the object\r\n\t\t\tslice.call( this );\r\n\t},\r\n\r\n\t// Take an array of elements and push it onto the stack\r\n\t// (returning the new matched element set)\r\n\tpushStack: function( elems ) {\r\n\r\n\t\t// Build a new jQuery matched element set\r\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\r\n\r\n\t\t// Add the old object onto the stack (as a reference)\r\n\t\tret.prevObject = this;\r\n\t\tret.context = this.context;\r\n\r\n\t\t// Return the newly-formed element set\r\n\t\treturn ret;\r\n\t},\r\n\r\n\t// Execute a callback for every element in the matched set.\r\n\t// (You can seed the arguments with an array of args, but this is\r\n\t// only used internally.)\r\n\teach: function( callback, args ) {\r\n\t\treturn jQuery.each( this, callback, args );\r\n\t},\r\n\r\n\tmap: function( callback ) {\r\n\t\treturn this.pushStack( jQuery.map(this, function( elem, i ) {\r\n\t\t\treturn callback.call( elem, i, elem );\r\n\t\t}));\r\n\t},\r\n\r\n\tslice: function() {\r\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\r\n\t},\r\n\r\n\tfirst: function() {\r\n\t\treturn this.eq( 0 );\r\n\t},\r\n\r\n\tlast: function() {\r\n\t\treturn this.eq( -1 );\r\n\t},\r\n\r\n\teq: function( i ) {\r\n\t\tvar len = this.length,\r\n\t\t\tj = +i + ( i < 0 ? len : 0 );\r\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );\r\n\t},\r\n\r\n\tend: function() {\r\n\t\treturn this.prevObject || this.constructor(null);\r\n\t},\r\n\r\n\t// For internal use only.\r\n\t// Behaves like an Array's method, not like a jQuery method.\r\n\tpush: push,\r\n\tsort: deletedIds.sort,\r\n\tsplice: deletedIds.splice\r\n};\r\n\r\njQuery.extend = jQuery.fn.extend = function() {\r\n\tvar src, copyIsArray, copy, name, options, clone,\r\n\t\ttarget = arguments[0] || {},\r\n\t\ti = 1,\r\n\t\tlength = arguments.length,\r\n\t\tdeep = false;\r\n\r\n\t// Handle a deep copy situation\r\n\tif ( typeof target === \"boolean\" ) {\r\n\t\tdeep = target;\r\n\r\n\t\t// skip the boolean and the target\r\n\t\ttarget = arguments[ i ] || {};\r\n\t\ti++;\r\n\t}\r\n\r\n\t// Handle case when target is a string or something (possible in deep copy)\r\n\tif ( typeof target !== \"object\" && !jQuery.isFunction(target) ) {\r\n\t\ttarget = {};\r\n\t}\r\n\r\n\t// extend jQuery itself if only one argument is passed\r\n\tif ( i === length ) {\r\n\t\ttarget = this;\r\n\t\ti--;\r\n\t}\r\n\r\n\tfor ( ; i < length; i++ ) {\r\n\t\t// Only deal with non-null/undefined values\r\n\t\tif ( (options = arguments[ i ]) != null ) {\r\n\t\t\t// Extend the base object\r\n\t\t\tfor ( name in options ) {\r\n\t\t\t\tsrc = target[ name ];\r\n\t\t\t\tcopy = options[ name ];\r\n\r\n\t\t\t\t// Prevent never-ending loop\r\n\t\t\t\tif ( target === copy ) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Recurse if we're merging plain objects or arrays\r\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {\r\n\t\t\t\t\tif ( copyIsArray ) {\r\n\t\t\t\t\t\tcopyIsArray = false;\r\n\t\t\t\t\t\tclone = src && jQuery.isArray(src) ? src : [];\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject(src) ? src : {};\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Never move original objects, clone them\r\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\r\n\r\n\t\t\t\t// Don't bring in undefined values\r\n\t\t\t\t} else if ( copy !== undefined ) {\r\n\t\t\t\t\ttarget[ name ] = copy;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Return the modified object\r\n\treturn target;\r\n};\r\n\r\njQuery.extend({\r\n\t// Unique for each copy of jQuery on the page\r\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\r\n\r\n\t// Assume jQuery is ready without the ready module\r\n\tisReady: true,\r\n\r\n\terror: function( msg ) {\r\n\t\tthrow new Error( msg );\r\n\t},\r\n\r\n\tnoop: function() {},\r\n\r\n\t// See test/unit/core.js for details concerning isFunction.\r\n\t// Since version 1.3, DOM methods and functions like alert\r\n\t// aren't supported. They return false on IE (#2968).\r\n\tisFunction: function( obj ) {\r\n\t\treturn jQuery.type(obj) === \"function\";\r\n\t},\r\n\r\n\tisArray: Array.isArray || function( obj ) {\r\n\t\treturn jQuery.type(obj) === \"array\";\r\n\t},\r\n\r\n\tisWindow: function( obj ) {\r\n\t\t/* jshint eqeqeq: false */\r\n\t\treturn obj != null && obj == obj.window;\r\n\t},\r\n\r\n\tisNumeric: function( obj ) {\r\n\t\t// parseFloat NaNs numeric-cast false positives (null|true|false|\"\")\r\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\r\n\t\t// subtraction forces infinities to NaN\r\n\t\treturn obj - parseFloat( obj ) >= 0;\r\n\t},\r\n\r\n\tisEmptyObject: function( obj ) {\r\n\t\tvar name;\r\n\t\tfor ( name in obj ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n\r\n\tisPlainObject: function( obj ) {\r\n\t\tvar key;\r\n\r\n\t\t// Must be an Object.\r\n\t\t// Because of IE, we also have to check the presence of the constructor property.\r\n\t\t// Make sure that DOM nodes and window objects don't pass through, as well\r\n\t\tif ( !obj || jQuery.type(obj) !== \"object\" || obj.nodeType || jQuery.isWindow( obj ) ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\t// Not own constructor property must be Object\r\n\t\t\tif ( obj.constructor &&\r\n\t\t\t\t!hasOwn.call(obj, \"constructor\") &&\r\n\t\t\t\t!hasOwn.call(obj.constructor.prototype, \"isPrototypeOf\") ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t} catch ( e ) {\r\n\t\t\t// IE8,9 Will throw exceptions on certain host objects #9897\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Support: IE<9\r\n\t\t// Handle iteration over inherited properties before own properties.\r\n\t\tif ( support.ownLast ) {\r\n\t\t\tfor ( key in obj ) {\r\n\t\t\t\treturn hasOwn.call( obj, key );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Own properties are enumerated firstly, so to speed up,\r\n\t\t// if last one is own, then all properties are own.\r\n\t\tfor ( key in obj ) {}\r\n\r\n\t\treturn key === undefined || hasOwn.call( obj, key );\r\n\t},\r\n\r\n\ttype: function( obj ) {\r\n\t\tif ( obj == null ) {\r\n\t\t\treturn obj + \"\";\r\n\t\t}\r\n\t\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\r\n\t\t\tclass2type[ toString.call(obj) ] || \"object\" :\r\n\t\t\ttypeof obj;\r\n\t},\r\n\r\n\t// Evaluates a script in a global context\r\n\t// Workarounds based on findings by Jim Driscoll\r\n\t// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context\r\n\tglobalEval: function( data ) {\r\n\t\tif ( data && jQuery.trim( data ) ) {\r\n\t\t\t// We use execScript on Internet Explorer\r\n\t\t\t// We use an anonymous function so that context is window\r\n\t\t\t// rather than jQuery in Firefox\r\n\t\t\t( window.execScript || function( data ) {\r\n\t\t\t\twindow[ \"eval\" ].call( window, data );\r\n\t\t\t} )( data );\r\n\t\t}\r\n\t},\r\n\r\n\t// Convert dashed to camelCase; used by the css and data modules\r\n\t// Microsoft forgot to hump their vendor prefix (#9572)\r\n\tcamelCase: function( string ) {\r\n\t\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\r\n\t},\r\n\r\n\tnodeName: function( elem, name ) {\r\n\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\r\n\t},\r\n\r\n\t// args is for internal usage only\r\n\teach: function( obj, callback, args ) {\r\n\t\tvar value,\r\n\t\t\ti = 0,\r\n\t\t\tlength = obj.length,\r\n\t\t\tisArray = isArraylike( obj );\r\n\r\n\t\tif ( args ) {\r\n\t\t\tif ( isArray ) {\r\n\t\t\t\tfor ( ; i < length; i++ ) {\r\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\r\n\r\n\t\t\t\t\tif ( value === false ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor ( i in obj ) {\r\n\t\t\t\t\tvalue = callback.apply( obj[ i ], args );\r\n\r\n\t\t\t\t\tif ( value === false ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t// A special, fast, case for the most common use of each\r\n\t\t} else {\r\n\t\t\tif ( isArray ) {\r\n\t\t\t\tfor ( ; i < length; i++ ) {\r\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\r\n\r\n\t\t\t\t\tif ( value === false ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor ( i in obj ) {\r\n\t\t\t\t\tvalue = callback.call( obj[ i ], i, obj[ i ] );\r\n\r\n\t\t\t\t\tif ( value === false ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn obj;\r\n\t},\r\n\r\n\t// Use native String.trim function wherever possible\r\n\ttrim: trim && !trim.call(\"\\uFEFF\\xA0\") ?\r\n\t\tfunction( text ) {\r\n\t\t\treturn text == null ?\r\n\t\t\t\t\"\" :\r\n\t\t\t\ttrim.call( text );\r\n\t\t} :\r\n\r\n\t\t// Otherwise use our own trimming functionality\r\n\t\tfunction( text ) {\r\n\t\t\treturn text == null ?\r\n\t\t\t\t\"\" :\r\n\t\t\t\t( text + \"\" ).replace( rtrim, \"\" );\r\n\t\t},\r\n\r\n\t// results is for internal usage only\r\n\tmakeArray: function( arr, results ) {\r\n\t\tvar ret = results || [];\r\n\r\n\t\tif ( arr != null ) {\r\n\t\t\tif ( isArraylike( Object(arr) ) ) {\r\n\t\t\t\tjQuery.merge( ret,\r\n\t\t\t\t\ttypeof arr === \"string\" ?\r\n\t\t\t\t\t[ arr ] : arr\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\tpush.call( ret, arr );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\tinArray: function( elem, arr, i ) {\r\n\t\tvar len;\r\n\r\n\t\tif ( arr ) {\r\n\t\t\tif ( indexOf ) {\r\n\t\t\t\treturn indexOf.call( arr, elem, i );\r\n\t\t\t}\r\n\r\n\t\t\tlen = arr.length;\r\n\t\t\ti = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;\r\n\r\n\t\t\tfor ( ; i < len; i++ ) {\r\n\t\t\t\t// Skip accessing in sparse arrays\r\n\t\t\t\tif ( i in arr && arr[ i ] === elem ) {\r\n\t\t\t\t\treturn i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn -1;\r\n\t},\r\n\r\n\tmerge: function( first, second ) {\r\n\t\tvar len = +second.length,\r\n\t\t\tj = 0,\r\n\t\t\ti = first.length;\r\n\r\n\t\twhile ( j < len ) {\r\n\t\t\tfirst[ i++ ] = second[ j++ ];\r\n\t\t}\r\n\r\n\t\t// Support: IE<9\r\n\t\t// Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists)\r\n\t\tif ( len !== len ) {\r\n\t\t\twhile ( second[j] !== undefined ) {\r\n\t\t\t\tfirst[ i++ ] = second[ j++ ];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfirst.length = i;\r\n\r\n\t\treturn first;\r\n\t},\r\n\r\n\tgrep: function( elems, callback, invert ) {\r\n\t\tvar callbackInverse,\r\n\t\t\tmatches = [],\r\n\t\t\ti = 0,\r\n\t\t\tlength = elems.length,\r\n\t\t\tcallbackExpect = !invert;\r\n\r\n\t\t// Go through the array, only saving the items\r\n\t\t// that pass the validator function\r\n\t\tfor ( ; i < length; i++ ) {\r\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\r\n\t\t\tif ( callbackInverse !== callbackExpect ) {\r\n\t\t\t\tmatches.push( elems[ i ] );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn matches;\r\n\t},\r\n\r\n\t// arg is for internal usage only\r\n\tmap: function( elems, callback, arg ) {\r\n\t\tvar value,\r\n\t\t\ti = 0,\r\n\t\t\tlength = elems.length,\r\n\t\t\tisArray = isArraylike( elems ),\r\n\t\t\tret = [];\r\n\r\n\t\t// Go through the array, translating each of the items to their new values\r\n\t\tif ( isArray ) {\r\n\t\t\tfor ( ; i < length; i++ ) {\r\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\r\n\r\n\t\t\t\tif ( value != null ) {\r\n\t\t\t\t\tret.push( value );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t// Go through every key on the object,\r\n\t\t} else {\r\n\t\t\tfor ( i in elems ) {\r\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\r\n\r\n\t\t\t\tif ( value != null ) {\r\n\t\t\t\t\tret.push( value );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Flatten any nested arrays\r\n\t\treturn concat.apply( [], ret );\r\n\t},\r\n\r\n\t// A global GUID counter for objects\r\n\tguid: 1,\r\n\r\n\t// Bind a function to a context, optionally partially applying any\r\n\t// arguments.\r\n\tproxy: function( fn, context ) {\r\n\t\tvar args, proxy, tmp;\r\n\r\n\t\tif ( typeof context === \"string\" ) {\r\n\t\t\ttmp = fn[ context ];\r\n\t\t\tcontext = fn;\r\n\t\t\tfn = tmp;\r\n\t\t}\r\n\r\n\t\t// Quick check to determine if target is callable, in the spec\r\n\t\t// this throws a TypeError, but we will just return undefined.\r\n\t\tif ( !jQuery.isFunction( fn ) ) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\t// Simulated bind\r\n\t\targs = slice.call( arguments, 2 );\r\n\t\tproxy = function() {\r\n\t\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\r\n\t\t};\r\n\r\n\t\t// Set the guid of unique handler to the same of original handler, so it can be removed\r\n\t\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\r\n\r\n\t\treturn proxy;\r\n\t},\r\n\r\n\tnow: function() {\r\n\t\treturn +( new Date() );\r\n\t},\r\n\r\n\t// jQuery.support is not used in Core but other projects attach their\r\n\t// properties to it so it needs to exist.\r\n\tsupport: support\r\n});\r\n\r\n// Populate the class2type map\r\njQuery.each(\"Boolean Number String Function Array Date RegExp Object Error\".split(\" \"), function(i, name) {\r\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\r\n});\r\n\r\nfunction isArraylike( obj ) {\r\n\tvar length = obj.length,\r\n\t\ttype = jQuery.type( obj );\r\n\r\n\tif ( type === \"function\" || jQuery.isWindow( obj ) ) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif ( obj.nodeType === 1 && length ) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\treturn type === \"array\" || length === 0 ||\r\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\r\n}\r\nvar Sizzle =\r\n/*!\r\n * Sizzle CSS Selector Engine v1.10.16\r\n * http://sizzlejs.com/\r\n *\r\n * Copyright 2013 jQuery Foundation, Inc. and other contributors\r\n * Released under the MIT license\r\n * http://jquery.org/license\r\n *\r\n * Date: 2014-01-13\r\n */\r\n(function( window ) {\r\n\r\nvar i,\r\n\tsupport,\r\n\tExpr,\r\n\tgetText,\r\n\tisXML,\r\n\tcompile,\r\n\toutermostContext,\r\n\tsortInput,\r\n\thasDuplicate,\r\n\r\n\t// Local document vars\r\n\tsetDocument,\r\n\tdocument,\r\n\tdocElem,\r\n\tdocumentIsHTML,\r\n\trbuggyQSA,\r\n\trbuggyMatches,\r\n\tmatches,\r\n\tcontains,\r\n\r\n\t// Instance-specific data\r\n\texpando = \"sizzle\" + -(new Date()),\r\n\tpreferredDoc = window.document,\r\n\tdirruns = 0,\r\n\tdone = 0,\r\n\tclassCache = createCache(),\r\n\ttokenCache = createCache(),\r\n\tcompilerCache = createCache(),\r\n\tsortOrder = function( a, b ) {\r\n\t\tif ( a === b ) {\r\n\t\t\thasDuplicate = true;\r\n\t\t}\r\n\t\treturn 0;\r\n\t},\r\n\r\n\t// General-purpose constants\r\n\tstrundefined = typeof undefined,\r\n\tMAX_NEGATIVE = 1 << 31,\r\n\r\n\t// Instance methods\r\n\thasOwn = ({}).hasOwnProperty,\r\n\tarr = [],\r\n\tpop = arr.pop,\r\n\tpush_native = arr.push,\r\n\tpush = arr.push,\r\n\tslice = arr.slice,\r\n\t// Use a stripped-down indexOf if we can't use a native one\r\n\tindexOf = arr.indexOf || function( elem ) {\r\n\t\tvar i = 0,\r\n\t\t\tlen = this.length;\r\n\t\tfor ( ; i < len; i++ ) {\r\n\t\t\tif ( this[i] === elem ) {\r\n\t\t\t\treturn i;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn -1;\r\n\t},\r\n\r\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\r\n\r\n\t// Regular expressions\r\n\r\n\t// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\r\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\r\n\t// http://www.w3.org/TR/css3-syntax/#characters\r\n\tcharacterEncoding = \"(?:\\\\\\\\.|[\\\\w-]|[^\\\\x00-\\\\xa0])+\",\r\n\r\n\t// Loosely modeled on CSS identifier characters\r\n\t// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors\r\n\t// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\r\n\tidentifier = characterEncoding.replace( \"w\", \"w#\" ),\r\n\r\n\t// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\r\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + characterEncoding + \")\" + whitespace +\r\n\t\t\"*(?:([*^$|!~]?=)\" + whitespace + \"*(?:(['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|(\" + identifier + \")|)|)\" + whitespace + \"*\\\\]\",\r\n\r\n\t// Prefer arguments quoted,\r\n\t// then not containing pseudos/brackets,\r\n\t// then attribute selectors/non-parenthetical expressions,\r\n\t// then anything else\r\n\t// These preferences are here to reduce the number of selectors\r\n\t// needing tokenize in the PSEUDO preFilter\r\n\tpseudos = \":(\" + characterEncoding + \")(?:\\\\(((['\\\"])((?:\\\\\\\\.|[^\\\\\\\\])*?)\\\\3|((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes.replace( 3, 8 ) + \")*)|.*)\\\\)|)\",\r\n\r\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\r\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\r\n\r\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\r\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\r\n\r\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\r\n\r\n\trpseudo = new RegExp( pseudos ),\r\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\r\n\r\n\tmatchExpr = {\r\n\t\t\"ID\": new RegExp( \"^#(\" + characterEncoding + \")\" ),\r\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + characterEncoding + \")\" ),\r\n\t\t\"TAG\": new RegExp( \"^(\" + characterEncoding.replace( \"w\", \"w*\" ) + \")\" ),\r\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\r\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\r\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\r\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\r\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\r\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\r\n\t\t// For use in libraries implementing .is()\r\n\t\t// We use this for POS matching in `select`\r\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\r\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\r\n\t},\r\n\r\n\trinputs = /^(?:input|select|textarea|button)$/i,\r\n\trheader = /^h\\d$/i,\r\n\r\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\r\n\r\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\r\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\r\n\r\n\trsibling = /[+~]/,\r\n\trescape = /'|\\\\/g,\r\n\r\n\t// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\r\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\r\n\tfunescape = function( _, escaped, escapedWhitespace ) {\r\n\t\tvar high = \"0x\" + escaped - 0x10000;\r\n\t\t// NaN means non-codepoint\r\n\t\t// Support: Firefox\r\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\r\n\t\treturn high !== high || escapedWhitespace ?\r\n\t\t\tescaped :\r\n\t\t\thigh < 0 ?\r\n\t\t\t\t// BMP codepoint\r\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\r\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\r\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\r\n\t};\r\n\r\n// Optimize for push.apply( _, NodeList )\r\ntry {\r\n\tpush.apply(\r\n\t\t(arr = slice.call( preferredDoc.childNodes )),\r\n\t\tpreferredDoc.childNodes\r\n\t);\r\n\t// Support: Android<4.0\r\n\t// Detect silently failing push.apply\r\n\tarr[ preferredDoc.childNodes.length ].nodeType;\r\n} catch ( e ) {\r\n\tpush = { apply: arr.length ?\r\n\r\n\t\t// Leverage slice if possible\r\n\t\tfunction( target, els ) {\r\n\t\t\tpush_native.apply( target, slice.call(els) );\r\n\t\t} :\r\n\r\n\t\t// Support: IE<9\r\n\t\t// Otherwise append directly\r\n\t\tfunction( target, els ) {\r\n\t\t\tvar j = target.length,\r\n\t\t\t\ti = 0;\r\n\t\t\t// Can't trust NodeList.length\r\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\r\n\t\t\ttarget.length = j - 1;\r\n\t\t}\r\n\t};\r\n}\r\n\r\nfunction Sizzle( selector, context, results, seed ) {\r\n\tvar match, elem, m, nodeType,\r\n\t\t// QSA vars\r\n\t\ti, groups, old, nid, newContext, newSelector;\r\n\r\n\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\r\n\t\tsetDocument( context );\r\n\t}\r\n\r\n\tcontext = context || document;\r\n\tresults = results || [];\r\n\r\n\tif ( !selector || typeof selector !== \"string\" ) {\r\n\t\treturn results;\r\n\t}\r\n\r\n\tif ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {\r\n\t\treturn [];\r\n\t}\r\n\r\n\tif ( documentIsHTML && !seed ) {\r\n\r\n\t\t// Shortcuts\r\n\t\tif ( (match = rquickExpr.exec( selector )) ) {\r\n\t\t\t// Speed-up: Sizzle(\"#ID\")\r\n\t\t\tif ( (m = match[1]) ) {\r\n\t\t\t\tif ( nodeType === 9 ) {\r\n\t\t\t\t\telem = context.getElementById( m );\r\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\r\n\t\t\t\t\t// nodes that are no longer in the document (jQuery #6963)\r\n\t\t\t\t\tif ( elem && elem.parentNode ) {\r\n\t\t\t\t\t\t// Handle the case where IE, Opera, and Webkit return items\r\n\t\t\t\t\t\t// by name instead of ID\r\n\t\t\t\t\t\tif ( elem.id === m ) {\r\n\t\t\t\t\t\t\tresults.push( elem );\r\n\t\t\t\t\t\t\treturn results;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn results;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Context is not a document\r\n\t\t\t\t\tif ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\r\n\t\t\t\t\t\tcontains( context, elem ) && elem.id === m ) {\r\n\t\t\t\t\t\tresults.push( elem );\r\n\t\t\t\t\t\treturn results;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t// Speed-up: Sizzle(\"TAG\")\r\n\t\t\t} else if ( match[2] ) {\r\n\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\r\n\t\t\t\treturn results;\r\n\r\n\t\t\t// Speed-up: Sizzle(\".CLASS\")\r\n\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {\r\n\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\r\n\t\t\t\treturn results;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// QSA path\r\n\t\tif ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\r\n\t\t\tnid = old = expando;\r\n\t\t\tnewContext = context;\r\n\t\t\tnewSelector = nodeType === 9 && selector;\r\n\r\n\t\t\t// qSA works strangely on Element-rooted queries\r\n\t\t\t// We can work around this by specifying an extra ID on the root\r\n\t\t\t// and working up from there (Thanks to Andrew Dupont for the technique)\r\n\t\t\t// IE 8 doesn't work on object elements\r\n\t\t\tif ( nodeType === 1 && context.nodeName.toLowerCase() !== \"object\" ) {\r\n\t\t\t\tgroups = tokenize( selector );\r\n\r\n\t\t\t\tif ( (old = context.getAttribute(\"id\")) ) {\r\n\t\t\t\t\tnid = old.replace( rescape, \"\\\\$&\" );\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcontext.setAttribute( \"id\", nid );\r\n\t\t\t\t}\r\n\t\t\t\tnid = \"[id='\" + nid + \"'] \";\r\n\r\n\t\t\t\ti = groups.length;\r\n\t\t\t\twhile ( i-- ) {\r\n\t\t\t\t\tgroups[i] = nid + toSelector( groups[i] );\r\n\t\t\t\t}\r\n\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;\r\n\t\t\t\tnewSelector = groups.join(\",\");\r\n\t\t\t}\r\n\r\n\t\t\tif ( newSelector ) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tpush.apply( results,\r\n\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\r\n\t\t\t\t\t);\r\n\t\t\t\t\treturn results;\r\n\t\t\t\t} catch (qsaError) {\r\n\t\t\t\t\tvar g =qsaError;\r\n\t\t\t\t} finally {\r\n\t\t\t\t\tif ( !old ) {\r\n\t\t\t\t\t\tcontext.removeAttribute(\"id\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// All others\r\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\r\n}\r\n\r\n/**\r\n * Create key-value caches of limited size\r\n * @returns {Function(string, Object)} Returns the Object data after storing it on itself with\r\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\r\n *\tdeleting the oldest entry\r\n */\r\nfunction createCache() {\r\n\tvar keys = [];\r\n\r\n\tfunction cache( key, value ) {\r\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\r\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\r\n\t\t\t// Only keep the most recent entries\r\n\t\t\tdelete cache[ keys.shift() ];\r\n\t\t}\r\n\t\treturn (cache[ key + \" \" ] = value);\r\n\t}\r\n\treturn cache;\r\n}\r\n\r\n/**\r\n * Mark a function for special use by Sizzle\r\n * @param {Function} fn The function to mark\r\n */\r\nfunction markFunction( fn ) {\r\n\tfn[ expando ] = true;\r\n\treturn fn;\r\n}\r\n\r\n/**\r\n * Support testing using an element\r\n * @param {Function} fn Passed the created div and expects a boolean result\r\n */\r\nfunction assert( fn ) {\r\n\tvar div = document.createElement(\"div\");\r\n\r\n\ttry {\r\n\t\treturn !!fn( div );\r\n\t} catch (e) {\r\n\t\treturn false;\r\n\t} finally {\r\n\t\t// Remove from its parent by default\r\n\t\tif ( div.parentNode ) {\r\n\t\t\tdiv.parentNode.removeChild( div );\r\n\t\t}\r\n\t\t// release memory in IE\r\n\t\tdiv = null;\r\n\t}\r\n}\r\n\r\n/**\r\n * Adds the same handler for all of the specified attrs\r\n * @param {String} attrs Pipe-separated list of attributes\r\n * @param {Function} handler The method that will be applied\r\n */\r\nfunction addHandle( attrs, handler ) {\r\n\tvar arr = attrs.split(\"|\"),\r\n\t\ti = attrs.length;\r\n\r\n\twhile ( i-- ) {\r\n\t\tExpr.attrHandle[ arr[i] ] = handler;\r\n\t}\r\n}\r\n\r\n/**\r\n * Checks document order of two siblings\r\n * @param {Element} a\r\n * @param {Element} b\r\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\r\n */\r\nfunction siblingCheck( a, b ) {\r\n\tvar cur = b && a,\r\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\r\n\t\t\t( ~b.sourceIndex || MAX_NEGATIVE ) -\r\n\t\t\t( ~a.sourceIndex || MAX_NEGATIVE );\r\n\r\n\t// Use IE sourceIndex if available on both nodes\r\n\tif ( diff ) {\r\n\t\treturn diff;\r\n\t}\r\n\r\n\t// Check if b follows a\r\n\tif ( cur ) {\r\n\t\twhile ( (cur = cur.nextSibling) ) {\r\n\t\t\tif ( cur === b ) {\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn a ? 1 : -1;\r\n}\r\n\r\n/**\r\n * Returns a function to use in pseudos for input types\r\n * @param {String} type\r\n */\r\nfunction createInputPseudo( type ) {\r\n\treturn function( elem ) {\r\n\t\tvar name = elem.nodeName.toLowerCase();\r\n\t\treturn name === \"input\" && elem.type === type;\r\n\t};\r\n}\r\n\r\n/**\r\n * Returns a function to use in pseudos for buttons\r\n * @param {String} type\r\n */\r\nfunction createButtonPseudo( type ) {\r\n\treturn function( elem ) {\r\n\t\tvar name = elem.nodeName.toLowerCase();\r\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\r\n\t};\r\n}\r\n\r\n/**\r\n * Returns a function to use in pseudos for positionals\r\n * @param {Function} fn\r\n */\r\nfunction createPositionalPseudo( fn ) {\r\n\treturn markFunction(function( argument ) {\r\n\t\targument = +argument;\r\n\t\treturn markFunction(function( seed, matches ) {\r\n\t\t\tvar j,\r\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\r\n\t\t\t\ti = matchIndexes.length;\r\n\r\n\t\t\t// Match elements found at the specified indexes\r\n\t\t\twhile ( i-- ) {\r\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\r\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n}\r\n\r\n/**\r\n * Checks a node for validity as a Sizzle context\r\n * @param {Element|Object=} context\r\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\r\n */\r\nfunction testContext( context ) {\r\n\treturn context && typeof context.getElementsByTagName !== strundefined && context;\r\n}\r\n\r\n// Expose support vars for convenience\r\nsupport = Sizzle.support = {};\r\n\r\n/**\r\n * Detects XML nodes\r\n * @param {Element|Object} elem An element or a document\r\n * @returns {Boolean} True iff elem is a non-HTML XML node\r\n */\r\nisXML = Sizzle.isXML = function( elem ) {\r\n\t// documentElement is verified for cases where it doesn't yet exist\r\n\t// (such as loading iframes in IE - #4833)\r\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\r\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\r\n};\r\n\r\n/**\r\n * Sets document-related variables once based on the current document\r\n * @param {Element|Object} [doc] An element or document object to use to set the document\r\n * @returns {Object} Returns the current document\r\n */\r\nsetDocument = Sizzle.setDocument = function( node ) {\r\n\tvar hasCompare,\r\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc,\r\n\t\tparent = doc.defaultView;\r\n\r\n\t// If no document and documentElement is available, return\r\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\r\n\t\treturn document;\r\n\t}\r\n\r\n\t// Set our document\r\n\tdocument = doc;\r\n\tdocElem = doc.documentElement;\r\n\r\n\t// Support tests\r\n\tdocumentIsHTML = !isXML( doc );\r\n\r\n\t// Support: IE>8\r\n\t// If iframe document is assigned to \"document\" variable and if iframe has been reloaded,\r\n\t// IE will throw \"permission denied\" error when accessing \"document\" variable, see jQuery #13936\r\n\t// IE6-8 do not support the defaultView property so parent will be undefined\r\n\tif ( parent && parent !== parent.top ) {\r\n\t\t// IE11 does not have attachEvent, so all must suffer\r\n\t\tif ( parent.addEventListener ) {\r\n\t\t\tparent.addEventListener( \"unload\", function() {\r\n\t\t\t\tsetDocument();\r\n\t\t\t}, false );\r\n\t\t} else if ( parent.attachEvent ) {\r\n\t\t\tparent.attachEvent( \"onunload\", function() {\r\n\t\t\t\tsetDocument();\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t/* Attributes\r\n\t---------------------------------------------------------------------- */\r\n\r\n\t// Support: IE<8\r\n\t// Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)\r\n\tsupport.attributes = assert(function( div ) {\r\n\t\tdiv.className = \"i\";\r\n\t\treturn !div.getAttribute(\"className\");\r\n\t});\r\n\r\n\t/* getElement(s)By*\r\n\t---------------------------------------------------------------------- */\r\n\r\n\t// Check if getElementsByTagName(\"*\") returns only elements\r\n\tsupport.getElementsByTagName = assert(function( div ) {\r\n\t\tdiv.appendChild( doc.createComment(\"\") );\r\n\t\treturn !div.getElementsByTagName(\"*\").length;\r\n\t});\r\n\r\n\t// Check if getElementsByClassName can be trusted\r\n\tsupport.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {\r\n\t\tdiv.innerHTML = \"<div class='a'></div><div class='a i'></div>\";\r\n\r\n\t\t// Support: Safari<4\r\n\t\t// Catch class over-caching\r\n\t\tdiv.firstChild.className = \"i\";\r\n\t\t// Support: Opera<10\r\n\t\t// Catch gEBCN failure to find non-leading classes\r\n\t\treturn div.getElementsByClassName(\"i\").length === 2;\r\n\t});\r\n\r\n\t// Support: IE<10\r\n\t// Check if getElementById returns elements by name\r\n\t// The broken getElementById methods don't pick up programatically-set names,\r\n\t// so use a roundabout getElementsByName test\r\n\tsupport.getById = assert(function( div ) {\r\n\t\tdocElem.appendChild( div ).id = expando;\r\n\t\treturn !doc.getElementsByName || !doc.getElementsByName( expando ).length;\r\n\t});\r\n\r\n\t// ID find and filter\r\n\tif ( support.getById ) {\r\n\t\tExpr.find[\"ID\"] = function( id, context ) {\r\n\t\t\tif ( typeof context.getElementById !== strundefined && documentIsHTML ) {\r\n\t\t\t\tvar m = context.getElementById( id );\r\n\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\r\n\t\t\t\t// nodes that are no longer in the document #6963\r\n\t\t\t\treturn m && m.parentNode ? [m] : [];\r\n\t\t\t}\r\n\t\t};\r\n\t\tExpr.filter[\"ID\"] = function( id ) {\r\n\t\t\tvar attrId = id.replace( runescape, funescape );\r\n\t\t\treturn function( elem ) {\r\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\r\n\t\t\t};\r\n\t\t};\r\n\t} else {\r\n\t\t// Support: IE6/7\r\n\t\t// getElementById is not reliable as a find shortcut\r\n\t\tdelete Expr.find[\"ID\"];\r\n\r\n\t\tExpr.filter[\"ID\"] = function( id ) {\r\n\t\t\tvar attrId = id.replace( runescape, funescape );\r\n\t\t\treturn function( elem ) {\r\n\t\t\t\tvar node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(\"id\");\r\n\t\t\t\treturn node && node.value === attrId;\r\n\t\t\t};\r\n\t\t};\r\n\t}\r\n\r\n\t// Tag\r\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\r\n\t\tfunction( tag, context ) {\r\n\t\t\tif ( typeof context.getElementsByTagName !== strundefined ) {\r\n\t\t\t\treturn context.getElementsByTagName( tag );\r\n\t\t\t}\r\n\t\t} :\r\n\t\tfunction( tag, context ) {\r\n\t\t\tvar elem,\r\n\t\t\t\ttmp = [],\r\n\t\t\t\ti = 0,\r\n\t\t\t\tresults = context.getElementsByTagName( tag );\r\n\r\n\t\t\t// Filter out possible comments\r\n\t\t\tif ( tag === \"*\" ) {\r\n\t\t\t\twhile ( (elem = results[i++]) ) {\r\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\r\n\t\t\t\t\t\ttmp.push( elem );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn tmp;\r\n\t\t\t}\r\n\t\t\treturn results;\r\n\t\t};\r\n\r\n\t// Class\r\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\r\n\t\tif ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {\r\n\t\t\treturn context.getElementsByClassName( className );\r\n\t\t}\r\n\t};\r\n\r\n\t/* QSA/matchesSelector\r\n\t---------------------------------------------------------------------- */\r\n\r\n\t// QSA and matchesSelector support\r\n\r\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\r\n\trbuggyMatches = [];\r\n\r\n\t// qSa(:focus) reports false when true (Chrome 21)\r\n\t// We allow this because of a bug in IE8/9 that throws an error\r\n\t// whenever `document.activeElement` is accessed on an iframe\r\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\r\n\t// See http://bugs.jquery.com/ticket/13378\r\n\trbuggyQSA = [];\r\n\r\n\tif ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {\r\n\t\t// Build QSA regex\r\n\t\t// Regex strategy adopted from Diego Perini\r\n\t\tassert(function( div ) {\r\n\t\t\t// Select is set to empty string on purpose\r\n\t\t\t// This is to test IE's treatment of not explicitly\r\n\t\t\t// setting a boolean content attribute,\r\n\t\t\t// since its presence should be enough\r\n\t\t\t// http://bugs.jquery.com/ticket/12359\r\n\t\t\tdiv.innerHTML = \"<select t=''><option selected=''></option></select>\";\r\n\r\n\t\t\t// Support: IE8, Opera 10-12\r\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\r\n\t\t\tif ( div.querySelectorAll(\"[t^='']\").length ) {\r\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\r\n\t\t\t}\r\n\r\n\t\t\t// Support: IE8\r\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\r\n\t\t\tif ( !div.querySelectorAll(\"[selected]\").length ) {\r\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\r\n\t\t\t}\r\n\r\n\t\t\t// Webkit/Opera - :checked should return selected option elements\r\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r\n\t\t\t// IE8 throws error here and will not see later tests\r\n\t\t\tif ( !div.querySelectorAll(\":checked\").length ) {\r\n\t\t\t\trbuggyQSA.push(\":checked\");\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tassert(function( div ) {\r\n\t\t\t// Support: Windows 8 Native Apps\r\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\r\n\t\t\tvar input = doc.createElement(\"input\");\r\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\r\n\t\t\tdiv.appendChild( input ).setAttribute( \"name\", \"D\" );\r\n\r\n\t\t\t// Support: IE8\r\n\t\t\t// Enforce case-sensitivity of name attribute\r\n\t\t\tif ( div.querySelectorAll(\"[name=d]\").length ) {\r\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\r\n\t\t\t}\r\n\r\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\r\n\t\t\t// IE8 throws error here and will not see later tests\r\n\t\t\tif ( !div.querySelectorAll(\":enabled\").length ) {\r\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\r\n\t\t\t}\r\n\r\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\r\n\t\t\tdiv.querySelectorAll(\"*,:x\");\r\n\t\t\trbuggyQSA.push(\",.*:\");\r\n\t\t});\r\n\t}\r\n\r\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||\r\n\t\tdocElem.mozMatchesSelector ||\r\n\t\tdocElem.oMatchesSelector ||\r\n\t\tdocElem.msMatchesSelector) )) ) {\r\n\r\n\t\tassert(function( div ) {\r\n\t\t\t// Check to see if it's possible to do matchesSelector\r\n\t\t\t// on a disconnected node (IE 9)\r\n\t\t\tsupport.disconnectedMatch = matches.call( div, \"div\" );\r\n\r\n\t\t\t// This should fail with an exception\r\n\t\t\t// Gecko does not error, returns false instead\r\n\t\t\tmatches.call( div, \"[s!='']:x\" );\r\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\r\n\t\t});\r\n\t}\r\n\r\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\r\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\r\n\r\n\t/* Contains\r\n\t---------------------------------------------------------------------- */\r\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\r\n\r\n\t// Element contains another\r\n\t// Purposefully does not implement inclusive descendent\r\n\t// As in, an element does not contain itself\r\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\r\n\t\tfunction( a, b ) {\r\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\r\n\t\t\t\tbup = b && b.parentNode;\r\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\r\n\t\t\t\tadown.contains ?\r\n\t\t\t\t\tadown.contains( bup ) :\r\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\r\n\t\t\t));\r\n\t\t} :\r\n\t\tfunction( a, b ) {\r\n\t\t\tif ( b ) {\r\n\t\t\t\twhile ( (b = b.parentNode) ) {\r\n\t\t\t\t\tif ( b === a ) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\t/* Sorting\r\n\t---------------------------------------------------------------------- */\r\n\r\n\t// Document order sorting\r\n\tsortOrder = hasCompare ?\r\n\tfunction( a, b ) {\r\n\r\n\t\t// Flag for duplicate removal\r\n\t\tif ( a === b ) {\r\n\t\t\thasDuplicate = true;\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\t// Sort on method existence if only one input has compareDocumentPosition\r\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\r\n\t\tif ( compare ) {\r\n\t\t\treturn compare;\r\n\t\t}\r\n\r\n\t\t// Calculate position if both inputs belong to the same document\r\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\r\n\t\t\ta.compareDocumentPosition( b ) :\r\n\r\n\t\t\t// Otherwise we know they are disconnected\r\n\t\t\t1;\r\n\r\n\t\t// Disconnected nodes\r\n\t\tif ( compare & 1 ||\r\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\r\n\r\n\t\t\t// Choose the first element that is related to our preferred document\r\n\t\t\tif ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t\tif ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\r\n\t\t\t// Maintain original order\r\n\t\t\treturn sortInput ?\r\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\r\n\t\t\t\t0;\r\n\t\t}\r\n\r\n\t\treturn compare & 4 ? -1 : 1;\r\n\t} :\r\n\tfunction( a, b ) {\r\n\t\t// Exit early if the nodes are identical\r\n\t\tif ( a === b ) {\r\n\t\t\thasDuplicate = true;\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tvar cur,\r\n\t\t\ti = 0,\r\n\t\t\taup = a.parentNode,\r\n\t\t\tbup = b.parentNode,\r\n\t\t\tap = [ a ],\r\n\t\t\tbp = [ b ];\r\n\r\n\t\t// Parentless nodes are either documents or disconnected\r\n\t\tif ( !aup || !bup ) {\r\n\t\t\treturn a === doc ? -1 :\r\n\t\t\t\tb === doc ? 1 :\r\n\t\t\t\taup ? -1 :\r\n\t\t\t\tbup ? 1 :\r\n\t\t\t\tsortInput ?\r\n\t\t\t\t( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :\r\n\t\t\t\t0;\r\n\r\n\t\t// If the nodes are siblings, we can do a quick check\r\n\t\t} else if ( aup === bup ) {\r\n\t\t\treturn siblingCheck( a, b );\r\n\t\t}\r\n\r\n\t\t// Otherwise we need full lists of their ancestors for comparison\r\n\t\tcur = a;\r\n\t\twhile ( (cur = cur.parentNode) ) {\r\n\t\t\tap.unshift( cur );\r\n\t\t}\r\n\t\tcur = b;\r\n\t\twhile ( (cur = cur.parentNode) ) {\r\n\t\t\tbp.unshift( cur );\r\n\t\t}\r\n\r\n\t\t// Walk down the tree looking for a discrepancy\r\n\t\twhile ( ap[i] === bp[i] ) {\r\n\t\t\ti++;\r\n\t\t}\r\n\r\n\t\treturn i ?\r\n\t\t\t// Do a sibling check if the nodes have a common ancestor\r\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\r\n\r\n\t\t\t// Otherwise nodes in our document sort first\r\n\t\t\tap[i] === preferredDoc ? -1 :\r\n\t\t\tbp[i] === preferredDoc ? 1 :\r\n\t\t\t0;\r\n\t};\r\n\r\n\treturn doc;\r\n};\r\n\r\nSizzle.matches = function( expr, elements ) {\r\n\treturn Sizzle( expr, null, null, elements );\r\n};\r\n\r\nSizzle.matchesSelector = function( elem, expr ) {\r\n\t// Set document vars if needed\r\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\r\n\t\tsetDocument( elem );\r\n\t}\r\n\r\n\t// Make sure that attribute selectors are quoted\r\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\r\n\r\n\tif ( support.matchesSelector && documentIsHTML &&\r\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\r\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\r\n\r\n\t\ttry {\r\n\t\t\tvar ret = matches.call( elem, expr );\r\n\r\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\r\n\t\t\tif ( ret || support.disconnectedMatch ||\r\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\r\n\t\t\t\t\t// fragment in IE 9\r\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\t\t} catch(e) {}\r\n\t}\r\n\r\n\treturn Sizzle( expr, document, null, [elem] ).length > 0;\r\n};\r\n\r\nSizzle.contains = function( context, elem ) {\r\n\t// Set document vars if needed\r\n\tif ( ( context.ownerDocument || context ) !== document ) {\r\n\t\tsetDocument( context );\r\n\t}\r\n\treturn contains( context, elem );\r\n};\r\n\r\nSizzle.attr = function( elem, name ) {\r\n\t// Set document vars if needed\r\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\r\n\t\tsetDocument( elem );\r\n\t}\r\n\r\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\r\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\r\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\r\n\t\t\tfn( elem, name, !documentIsHTML ) :\r\n\t\t\tundefined;\r\n\r\n\treturn val !== undefined ?\r\n\t\tval :\r\n\t\tsupport.attributes || !documentIsHTML ?\r\n\t\t\telem.getAttribute( name ) :\r\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\r\n\t\t\t\tval.value :\r\n\t\t\t\tnull;\r\n};\r\n\r\nSizzle.error = function( msg ) {\r\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\r\n};\r\n\r\n/**\r\n * Document sorting and removing duplicates\r\n * @param {ArrayLike} results\r\n */\r\nSizzle.uniqueSort = function( results ) {\r\n\tvar elem,\r\n\t\tduplicates = [],\r\n\t\tj = 0,\r\n\t\ti = 0;\r\n\r\n\t// Unless we *know* we can detect duplicates, assume their presence\r\n\thasDuplicate = !support.detectDuplicates;\r\n\tsortInput = !support.sortStable && results.slice( 0 );\r\n\tresults.sort( sortOrder );\r\n\r\n\tif ( hasDuplicate ) {\r\n\t\twhile ( (elem = results[i++]) ) {\r\n\t\t\tif ( elem === results[ i ] ) {\r\n\t\t\t\tj = duplicates.push( i );\r\n\t\t\t}\r\n\t\t}\r\n\t\twhile ( j-- ) {\r\n\t\t\tresults.splice( duplicates[ j ], 1 );\r\n\t\t}\r\n\t}\r\n\r\n\t// Clear input after sorting to release objects\r\n\t// See https://github.com/jquery/sizzle/pull/225\r\n\tsortInput = null;\r\n\r\n\treturn results;\r\n};\r\n\r\n/**\r\n * Utility function for retrieving the text value of an array of DOM nodes\r\n * @param {Array|Element} elem\r\n */\r\ngetText = Sizzle.getText = function( elem ) {\r\n\tvar node,\r\n\t\tret = \"\",\r\n\t\ti = 0,\r\n\t\tnodeType = elem.nodeType;\r\n\r\n\tif ( !nodeType ) {\r\n\t\t// If no nodeType, this is expected to be an array\r\n\t\twhile ( (node = elem[i++]) ) {\r\n\t\t\t// Do not traverse comment nodes\r\n\t\t\tret += getText( node );\r\n\t\t}\r\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\r\n\t\t// Use textContent for elements\r\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\r\n\t\tif ( typeof elem.textContent === \"string\" ) {\r\n\t\t\treturn elem.textContent;\r\n\t\t} else {\r\n\t\t\t// Traverse its children\r\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\r\n\t\t\t\tret += getText( elem );\r\n\t\t\t}\r\n\t\t}\r\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\r\n\t\treturn elem.nodeValue;\r\n\t}\r\n\t// Do not include comment or processing instruction nodes\r\n\r\n\treturn ret;\r\n};\r\n\r\nExpr = Sizzle.selectors = {\r\n\r\n\t// Can be adjusted by the user\r\n\tcacheLength: 50,\r\n\r\n\tcreatePseudo: markFunction,\r\n\r\n\tmatch: matchExpr,\r\n\r\n\tattrHandle: {},\r\n\r\n\tfind: {},\r\n\r\n\trelative: {\r\n\t\t\">\": { dir: \"parentNode\", first: true },\r\n\t\t\" \": { dir: \"parentNode\" },\r\n\t\t\"+\": { dir: \"previousSibling\", first: true },\r\n\t\t\"~\": { dir: \"previousSibling\" }\r\n\t},\r\n\r\n\tpreFilter: {\r\n\t\t\"ATTR\": function( match ) {\r\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\r\n\r\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\r\n\t\t\tmatch[3] = ( match[4] || match[5] || \"\" ).replace( runescape, funescape );\r\n\r\n\t\t\tif ( match[2] === \"~=\" ) {\r\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\r\n\t\t\t}\r\n\r\n\t\t\treturn match.slice( 0, 4 );\r\n\t\t},\r\n\r\n\t\t\"CHILD\": function( match ) {\r\n\t\t\t/* matches from matchExpr[\"CHILD\"]\r\n\t\t\t\t1 type (only|nth|...)\r\n\t\t\t\t2 what (child|of-type)\r\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\r\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\r\n\t\t\t\t5 sign of xn-component\r\n\t\t\t\t6 x of xn-component\r\n\t\t\t\t7 sign of y-component\r\n\t\t\t\t8 y of y-component\r\n\t\t\t*/\r\n\t\t\tmatch[1] = match[1].toLowerCase();\r\n\r\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\r\n\t\t\t\t// nth-* requires argument\r\n\t\t\t\tif ( !match[3] ) {\r\n\t\t\t\t\tSizzle.error( match[0] );\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\r\n\t\t\t\t// remember that false/true cast respectively to 0/1\r\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\r\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\r\n\r\n\t\t\t// other types prohibit arguments\r\n\t\t\t} else if ( match[3] ) {\r\n\t\t\t\tSizzle.error( match[0] );\r\n\t\t\t}\r\n\r\n\t\t\treturn match;\r\n\t\t},\r\n\r\n\t\t\"PSEUDO\": function( match ) {\r\n\t\t\tvar excess,\r\n\t\t\t\tunquoted = !match[5] && match[2];\r\n\r\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\r\n\t\t\t\treturn null;\r\n\t\t\t}\r\n\r\n\t\t\t// Accept quoted arguments as-is\r\n\t\t\tif ( match[3] && match[4] !== undefined ) {\r\n\t\t\t\tmatch[2] = match[4];\r\n\r\n\t\t\t// Strip excess characters from unquoted arguments\r\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\r\n\t\t\t\t// Get excess from tokenize (recursively)\r\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\r\n\t\t\t\t// advance to the next closing parenthesis\r\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\r\n\r\n\t\t\t\t// excess is a negative index\r\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\r\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\r\n\t\t\t}\r\n\r\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\r\n\t\t\treturn match.slice( 0, 3 );\r\n\t\t}\r\n\t},\r\n\r\n\tfilter: {\r\n\r\n\t\t\"TAG\": function( nodeNameSelector ) {\r\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\r\n\t\t\treturn nodeNameSelector === \"*\" ?\r\n\t\t\t\tfunction() { return true; } :\r\n\t\t\t\tfunction( elem ) {\r\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\r\n\t\t\t\t};\r\n\t\t},\r\n\r\n\t\t\"CLASS\": function( className ) {\r\n\t\t\tvar pattern = classCache[ className + \" \" ];\r\n\r\n\t\t\treturn pattern ||\r\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\r\n\t\t\t\tclassCache( className, function( elem ) {\r\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute(\"class\") || \"\" );\r\n\t\t\t\t});\r\n\t\t},\r\n\r\n\t\t\"ATTR\": function( name, operator, check ) {\r\n\t\t\treturn function( elem ) {\r\n\t\t\t\tvar result = Sizzle.attr( elem, name );\r\n\r\n\t\t\t\tif ( result == null ) {\r\n\t\t\t\t\treturn operator === \"!=\";\r\n\t\t\t\t}\r\n\t\t\t\tif ( !operator ) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tresult += \"\";\r\n\r\n\t\t\t\treturn operator === \"=\" ? result === check :\r\n\t\t\t\t\toperator === \"!=\" ? result !== check :\r\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\r\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\r\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\r\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result + \" \" ).indexOf( check ) > -1 :\r\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\r\n\t\t\t\t\tfalse;\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\r\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\r\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\r\n\t\t\t\tofType = what === \"of-type\";\r\n\r\n\t\t\treturn first === 1 && last === 0 ?\r\n\r\n\t\t\t\t// Shortcut for :nth-*(n)\r\n\t\t\t\tfunction( elem ) {\r\n\t\t\t\t\treturn !!elem.parentNode;\r\n\t\t\t\t} :\r\n\r\n\t\t\t\tfunction( elem, context, xml ) {\r\n\t\t\t\t\tvar cache, outerCache, node, diff, nodeIndex, start,\r\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\r\n\t\t\t\t\t\tparent = elem.parentNode,\r\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\r\n\t\t\t\t\t\tuseCache = !xml && !ofType;\r\n\r\n\t\t\t\t\tif ( parent ) {\r\n\r\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\r\n\t\t\t\t\t\tif ( simple ) {\r\n\t\t\t\t\t\t\twhile ( dir ) {\r\n\t\t\t\t\t\t\t\tnode = elem;\r\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\r\n\t\t\t\t\t\t\t\t\tif ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {\r\n\t\t\t\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\r\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\r\n\r\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\r\n\t\t\t\t\t\tif ( forward && useCache ) {\r\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\r\n\t\t\t\t\t\t\touterCache = parent[ expando ] || (parent[ expando ] = {});\r\n\t\t\t\t\t\t\tcache = outerCache[ type ] || [];\r\n\t\t\t\t\t\t\tnodeIndex = cache[0] === dirruns && cache[1];\r\n\t\t\t\t\t\t\tdiff = cache[0] === dirruns && cache[2];\r\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\r\n\r\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\r\n\r\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\r\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\r\n\r\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\r\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\r\n\t\t\t\t\t\t\t\t\touterCache[ type ] = [ dirruns, nodeIndex, diff ];\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Use previously-cached element index if available\r\n\t\t\t\t\t\t} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {\r\n\t\t\t\t\t\t\tdiff = cache[1];\r\n\r\n\t\t\t\t\t\t// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\r\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\r\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\r\n\r\n\t\t\t\t\t\t\t\tif ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {\r\n\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\r\n\t\t\t\t\t\t\t\t\tif ( useCache ) {\r\n\t\t\t\t\t\t\t\t\t\t(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\tif ( node === elem ) {\r\n\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\r\n\t\t\t\t\t\tdiff -= last;\r\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t},\r\n\r\n\t\t\"PSEUDO\": function( pseudo, argument ) {\r\n\t\t\t// pseudo-class names are case-insensitive\r\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\r\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\r\n\t\t\t// Remember that setFilters inherits from pseudos\r\n\t\t\tvar args,\r\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\r\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\r\n\r\n\t\t\t// The user may use createPseudo to indicate that\r\n\t\t\t// arguments are needed to create the filter function\r\n\t\t\t// just as Sizzle does\r\n\t\t\tif ( fn[ expando ] ) {\r\n\t\t\t\treturn fn( argument );\r\n\t\t\t}\r\n\r\n\t\t\t// But maintain support for old signatures\r\n\t\t\tif ( fn.length > 1 ) {\r\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\r\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\r\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\r\n\t\t\t\t\t\tvar idx,\r\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\r\n\t\t\t\t\t\t\ti = matched.length;\r\n\t\t\t\t\t\twhile ( i-- ) {\r\n\t\t\t\t\t\t\tidx = indexOf.call( seed, matched[i] );\r\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}) :\r\n\t\t\t\t\tfunction( elem ) {\r\n\t\t\t\t\t\treturn fn( elem, 0, args );\r\n\t\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\treturn fn;\r\n\t\t}\r\n\t},\r\n\r\n\tpseudos: {\r\n\t\t// Potentially complex pseudos\r\n\t\t\"not\": markFunction(function( selector ) {\r\n\t\t\t// Trim the selector passed to compile\r\n\t\t\t// to avoid treating leading and trailing\r\n\t\t\t// spaces as combinators\r\n\t\t\tvar input = [],\r\n\t\t\t\tresults = [],\r\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\r\n\r\n\t\t\treturn matcher[ expando ] ?\r\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\r\n\t\t\t\t\tvar elem,\r\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\r\n\t\t\t\t\t\ti = seed.length;\r\n\r\n\t\t\t\t\t// Match elements unmatched by `matcher`\r\n\t\t\t\t\twhile ( i-- ) {\r\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\r\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}) :\r\n\t\t\t\tfunction( elem, context, xml ) {\r\n\t\t\t\t\tinput[0] = elem;\r\n\t\t\t\t\tmatcher( input, null, xml, results );\r\n\t\t\t\t\treturn !results.pop();\r\n\t\t\t\t};\r\n\t\t}),\r\n\r\n\t\t\"has\": markFunction(function( selector ) {\r\n\t\t\treturn function( elem ) {\r\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\r\n\t\t\t};\r\n\t\t}),\r\n\r\n\t\t\"contains\": markFunction(function( text ) {\r\n\t\t\treturn function( elem ) {\r\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\r\n\t\t\t};\r\n\t\t}),\r\n\r\n\t\t// \"Whether an element is represented by a :lang() selector\r\n\t\t// is based solely on the element's language value\r\n\t\t// being equal to the identifier C,\r\n\t\t// or beginning with the identifier C immediately followed by \"-\".\r\n\t\t// The matching of C against the element's language value is performed case-insensitively.\r\n\t\t// The identifier C does not have to be a valid language name.\"\r\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\r\n\t\t\"lang\": markFunction( function( lang ) {\r\n\t\t\t// lang value must be a valid identifier\r\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\r\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\r\n\t\t\t}\r\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\r\n\t\t\treturn function( elem ) {\r\n\t\t\t\tvar elemLang;\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\r\n\t\t\t\t\t\telem.lang :\r\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\r\n\r\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\r\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\r\n\t\t\t\treturn false;\r\n\t\t\t};\r\n\t\t}),\r\n\r\n\t\t// Miscellaneous\r\n\t\t\"target\": function( elem ) {\r\n\t\t\tvar hash = window.location && window.location.hash;\r\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\r\n\t\t},\r\n\r\n\t\t\"root\": function( elem ) {\r\n\t\t\treturn elem === docElem;\r\n\t\t},\r\n\r\n\t\t\"focus\": function( elem ) {\r\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\r\n\t\t},\r\n\r\n\t\t// Boolean properties\r\n\t\t\"enabled\": function( elem ) {\r\n\t\t\treturn elem.disabled === false;\r\n\t\t},\r\n\r\n\t\t\"disabled\": function( elem ) {\r\n\t\t\treturn elem.disabled === true;\r\n\t\t},\r\n\r\n\t\t\"checked\": function( elem ) {\r\n\t\t\t// In CSS3, :checked should return both checked and selected elements\r\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\r\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\r\n\t\t},\r\n\r\n\t\t\"selected\": function( elem ) {\r\n\t\t\t// Accessing this property makes selected-by-default\r\n\t\t\t// options in Safari work properly\r\n\t\t\tif ( elem.parentNode ) {\r\n\t\t\t\telem.parentNode.selectedIndex;\r\n\t\t\t}\r\n\r\n\t\t\treturn elem.selected === true;\r\n\t\t},\r\n\r\n\t\t// Contents\r\n\t\t\"empty\": function( elem ) {\r\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\r\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\r\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\r\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\r\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\r\n\t\t\t\tif ( elem.nodeType < 6 ) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t},\r\n\r\n\t\t\"parent\": function( elem ) {\r\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\r\n\t\t},\r\n\r\n\t\t// Element/input types\r\n\t\t\"header\": function( elem ) {\r\n\t\t\treturn rheader.test( elem.nodeName );\r\n\t\t},\r\n\r\n\t\t\"input\": function( elem ) {\r\n\t\t\treturn rinputs.test( elem.nodeName );\r\n\t\t},\r\n\r\n\t\t\"button\": function( elem ) {\r\n\t\t\tvar name = elem.nodeName.toLowerCase();\r\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\r\n\t\t},\r\n\r\n\t\t\"text\": function( elem ) {\r\n\t\t\tvar attr;\r\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\r\n\t\t\t\telem.type === \"text\" &&\r\n\r\n\t\t\t\t// Support: IE<8\r\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\r\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\r\n\t\t},\r\n\r\n\t\t// Position-in-collection\r\n\t\t\"first\": createPositionalPseudo(function() {\r\n\t\t\treturn [ 0 ];\r\n\t\t}),\r\n\r\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\r\n\t\t\treturn [ length - 1 ];\r\n\t\t}),\r\n\r\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\r\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\r\n\t\t}),\r\n\r\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\r\n\t\t\tvar i = 0;\r\n\t\t\tfor ( ; i < length; i += 2 ) {\r\n\t\t\t\tmatchIndexes.push( i );\r\n\t\t\t}\r\n\t\t\treturn matchIndexes;\r\n\t\t}),\r\n\r\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\r\n\t\t\tvar i = 1;\r\n\t\t\tfor ( ; i < length; i += 2 ) {\r\n\t\t\t\tmatchIndexes.push( i );\r\n\t\t\t}\r\n\t\t\treturn matchIndexes;\r\n\t\t}),\r\n\r\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\r\n\t\t\tvar i = argument < 0 ? argument + length : argument;\r\n\t\t\tfor ( ; --i >= 0; ) {\r\n\t\t\t\tmatchIndexes.push( i );\r\n\t\t\t}\r\n\t\t\treturn matchIndexes;\r\n\t\t}),\r\n\r\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\r\n\t\t\tvar i = argument < 0 ? argument + length : argument;\r\n\t\t\tfor ( ; ++i < length; ) {\r\n\t\t\t\tmatchIndexes.push( i );\r\n\t\t\t}\r\n\t\t\treturn matchIndexes;\r\n\t\t})\r\n\t}\r\n};\r\n\r\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\r\n\r\n// Add button/input type pseudos\r\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\r\n\tExpr.pseudos[ i ] = createInputPseudo( i );\r\n}\r\nfor ( i in { submit: true, reset: true } ) {\r\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\r\n}\r\n\r\n// Easy API for creating new setFilters\r\nfunction setFilters() {}\r\nsetFilters.prototype = Expr.filters = Expr.pseudos;\r\nExpr.setFilters = new setFilters();\r\n\r\nfunction tokenize( selector, parseOnly ) {\r\n\tvar matched, match, tokens, type,\r\n\t\tsoFar, groups, preFilters,\r\n\t\tcached = tokenCache[ selector + \" \" ];\r\n\r\n\tif ( cached ) {\r\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\r\n\t}\r\n\r\n\tsoFar = selector;\r\n\tgroups = [];\r\n\tpreFilters = Expr.preFilter;\r\n\r\n\twhile ( soFar ) {\r\n\r\n\t\t// Comma and first run\r\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\r\n\t\t\tif ( match ) {\r\n\t\t\t\t// Don't consume trailing commas as valid\r\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\r\n\t\t\t}\r\n\t\t\tgroups.push( (tokens = []) );\r\n\t\t}\r\n\r\n\t\tmatched = false;\r\n\r\n\t\t// Combinators\r\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\r\n\t\t\tmatched = match.shift();\r\n\t\t\ttokens.push({\r\n\t\t\t\tvalue: matched,\r\n\t\t\t\t// Cast descendant combinators to space\r\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\r\n\t\t\t});\r\n\t\t\tsoFar = soFar.slice( matched.length );\r\n\t\t}\r\n\r\n\t\t// Filters\r\n\t\tfor ( type in Expr.filter ) {\r\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\r\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\r\n\t\t\t\tmatched = match.shift();\r\n\t\t\t\ttokens.push({\r\n\t\t\t\t\tvalue: matched,\r\n\t\t\t\t\ttype: type,\r\n\t\t\t\t\tmatches: match\r\n\t\t\t\t});\r\n\t\t\t\tsoFar = soFar.slice( matched.length );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( !matched ) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\t// Return the length of the invalid excess\r\n\t// if we're just parsing\r\n\t// Otherwise, throw an error or return tokens\r\n\treturn parseOnly ?\r\n\t\tsoFar.length :\r\n\t\tsoFar ?\r\n\t\t\tSizzle.error( selector ) :\r\n\t\t\t// Cache the tokens\r\n\t\t\ttokenCache( selector, groups ).slice( 0 );\r\n}\r\n\r\nfunction toSelector( tokens ) {\r\n\tvar i = 0,\r\n\t\tlen = tokens.length,\r\n\t\tselector = \"\";\r\n\tfor ( ; i < len; i++ ) {\r\n\t\tselector += tokens[i].value;\r\n\t}\r\n\treturn selector;\r\n}\r\n\r\nfunction addCombinator( matcher, combinator, base ) {\r\n\tvar dir = combinator.dir,\r\n\t\tcheckNonElements = base && dir === \"parentNode\",\r\n\t\tdoneName = done++;\r\n\r\n\treturn combinator.first ?\r\n\t\t// Check against closest ancestor/preceding element\r\n\t\tfunction( elem, context, xml ) {\r\n\t\t\twhile ( (elem = elem[ dir ]) ) {\r\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\r\n\t\t\t\t\treturn matcher( elem, context, xml );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} :\r\n\r\n\t\t// Check against all ancestor/preceding elements\r\n\t\tfunction( elem, context, xml ) {\r\n\t\t\tvar oldCache, outerCache,\r\n\t\t\t\tnewCache = [ dirruns, doneName ];\r\n\r\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching\r\n\t\t\tif ( xml ) {\r\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\r\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\r\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\r\n\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\r\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\r\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\r\n\t\t\t\t\t\tif ( (oldCache = outerCache[ dir ]) &&\r\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\r\n\r\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\r\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\r\n\t\t\t\t\t\t\touterCache[ dir ] = newCache;\r\n\r\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\r\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\r\n\t\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n}\r\n\r\nfunction elementMatcher( matchers ) {\r\n\treturn matchers.length > 1 ?\r\n\t\tfunction( elem, context, xml ) {\r\n\t\t\tvar i = matchers.length;\r\n\t\t\twhile ( i-- ) {\r\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t} :\r\n\t\tmatchers[0];\r\n}\r\n\r\nfunction condense( unmatched, map, filter, context, xml ) {\r\n\tvar elem,\r\n\t\tnewUnmatched = [],\r\n\t\ti = 0,\r\n\t\tlen = unmatched.length,\r\n\t\tmapped = map != null;\r\n\r\n\tfor ( ; i < len; i++ ) {\r\n\t\tif ( (elem = unmatched[i]) ) {\r\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\r\n\t\t\t\tnewUnmatched.push( elem );\r\n\t\t\t\tif ( mapped ) {\r\n\t\t\t\t\tmap.push( i );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn newUnmatched;\r\n}\r\n\r\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\r\n\tif ( postFilter && !postFilter[ expando ] ) {\r\n\t\tpostFilter = setMatcher( postFilter );\r\n\t}\r\n\tif ( postFinder && !postFinder[ expando ] ) {\r\n\t\tpostFinder = setMatcher( postFinder, postSelector );\r\n\t}\r\n\treturn markFunction(function( seed, results, context, xml ) {\r\n\t\tvar temp, i, elem,\r\n\t\t\tpreMap = [],\r\n\t\t\tpostMap = [],\r\n\t\t\tpreexisting = results.length,\r\n\r\n\t\t\t// Get initial elements from seed or context\r\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\r\n\r\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\r\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\r\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\r\n\t\t\t\telems,\r\n\r\n\t\t\tmatcherOut = matcher ?\r\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\r\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\r\n\r\n\t\t\t\t\t// ...intermediate processing is necessary\r\n\t\t\t\t\t[] :\r\n\r\n\t\t\t\t\t// ...otherwise use results directly\r\n\t\t\t\t\tresults :\r\n\t\t\t\tmatcherIn;\r\n\r\n\t\t// Find primary matches\r\n\t\tif ( matcher ) {\r\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\r\n\t\t}\r\n\r\n\t\t// Apply postFilter\r\n\t\tif ( postFilter ) {\r\n\t\t\ttemp = condense( matcherOut, postMap );\r\n\t\t\tpostFilter( temp, [], context, xml );\r\n\r\n\t\t\t// Un-match failing elements by moving them back to matcherIn\r\n\t\t\ti = temp.length;\r\n\t\t\twhile ( i-- ) {\r\n\t\t\t\tif ( (elem = temp[i]) ) {\r\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( seed ) {\r\n\t\t\tif ( postFinder || preFilter ) {\r\n\t\t\t\tif ( postFinder ) {\r\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\r\n\t\t\t\t\ttemp = [];\r\n\t\t\t\t\ti = matcherOut.length;\r\n\t\t\t\t\twhile ( i-- ) {\r\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\r\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\r\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\r\n\t\t\t\ti = matcherOut.length;\r\n\t\t\t\twhile ( i-- ) {\r\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\r\n\t\t\t\t\t\t(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {\r\n\r\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t// Add elements to results, through postFinder if defined\r\n\t\t} else {\r\n\t\t\tmatcherOut = condense(\r\n\t\t\t\tmatcherOut === results ?\r\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\r\n\t\t\t\t\tmatcherOut\r\n\t\t\t);\r\n\t\t\tif ( postFinder ) {\r\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\r\n\t\t\t} else {\r\n\t\t\t\tpush.apply( results, matcherOut );\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n}\r\n\r\nfunction matcherFromTokens( tokens ) {\r\n\tvar checkContext, matcher, j,\r\n\t\tlen = tokens.length,\r\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\r\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\r\n\t\ti = leadingRelative ? 1 : 0,\r\n\r\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\r\n\t\tmatchContext = addCombinator( function( elem ) {\r\n\t\t\treturn elem === checkContext;\r\n\t\t}, implicitRelative, true ),\r\n\t\tmatchAnyContext = addCombinator( function( elem ) {\r\n\t\t\treturn indexOf.call( checkContext, elem ) > -1;\r\n\t\t}, implicitRelative, true ),\r\n\t\tmatchers = [ function( elem, context, xml ) {\r\n\t\t\treturn ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\r\n\t\t\t\t(checkContext = context).nodeType ?\r\n\t\t\t\t\tmatchContext( elem, context, xml ) :\r\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\r\n\t\t} ];\r\n\r\n\tfor ( ; i < len; i++ ) {\r\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\r\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\r\n\t\t} else {\r\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\r\n\r\n\t\t\t// Return special upon seeing a positional matcher\r\n\t\t\tif ( matcher[ expando ] ) {\r\n\t\t\t\t// Find the next relative operator (if any) for proper handling\r\n\t\t\t\tj = ++i;\r\n\t\t\t\tfor ( ; j < len; j++ ) {\r\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn setMatcher(\r\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\r\n\t\t\t\t\ti > 1 && toSelector(\r\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\r\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\r\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\r\n\t\t\t\t\tmatcher,\r\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\r\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\r\n\t\t\t\t\tj < len && toSelector( tokens )\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tmatchers.push( matcher );\r\n\t\t}\r\n\t}\r\n\r\n\treturn elementMatcher( matchers );\r\n}\r\n\r\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\r\n\tvar bySet = setMatchers.length > 0,\r\n\t\tbyElement = elementMatchers.length > 0,\r\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\r\n\t\t\tvar elem, j, matcher,\r\n\t\t\t\tmatchedCount = 0,\r\n\t\t\t\ti = \"0\",\r\n\t\t\t\tunmatched = seed && [],\r\n\t\t\t\tsetMatched = [],\r\n\t\t\t\tcontextBackup = outermostContext,\r\n\t\t\t\t// We must always have either seed elements or outermost context\r\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\r\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\r\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\r\n\t\t\t\tlen = elems.length;\r\n\r\n\t\t\tif ( outermost ) {\r\n\t\t\t\toutermostContext = context !== document && context;\r\n\t\t\t}\r\n\r\n\t\t\t// Add elements passing elementMatchers directly to results\r\n\t\t\t// Keep `i` a string if there are no elements so `matchedCount` will be \"00\" below\r\n\t\t\t// Support: IE<9, Safari\r\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\r\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\r\n\t\t\t\tif ( byElement && elem ) {\r\n\t\t\t\t\tj = 0;\r\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\r\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\r\n\t\t\t\t\t\t\tresults.push( elem );\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( outermost ) {\r\n\t\t\t\t\t\tdirruns = dirrunsUnique;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Track unmatched elements for set filters\r\n\t\t\t\tif ( bySet ) {\r\n\t\t\t\t\t// They will have gone through all possible matchers\r\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\r\n\t\t\t\t\t\tmatchedCount--;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Lengthen the array for every element, matched or not\r\n\t\t\t\t\tif ( seed ) {\r\n\t\t\t\t\t\tunmatched.push( elem );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Apply set filters to unmatched elements\r\n\t\t\tmatchedCount += i;\r\n\t\t\tif ( bySet && i !== matchedCount ) {\r\n\t\t\t\tj = 0;\r\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\r\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( seed ) {\r\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\r\n\t\t\t\t\tif ( matchedCount > 0 ) {\r\n\t\t\t\t\t\twhile ( i-- ) {\r\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\r\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\r\n\t\t\t\t\tsetMatched = condense( setMatched );\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Add matches to results\r\n\t\t\t\tpush.apply( results, setMatched );\r\n\r\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\r\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\r\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\r\n\r\n\t\t\t\t\tSizzle.uniqueSort( results );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Override manipulation of globals by nested matchers\r\n\t\t\tif ( outermost ) {\r\n\t\t\t\tdirruns = dirrunsUnique;\r\n\t\t\t\toutermostContext = contextBackup;\r\n\t\t\t}\r\n\r\n\t\t\treturn unmatched;\r\n\t\t};\r\n\r\n\treturn bySet ?\r\n\t\tmarkFunction( superMatcher ) :\r\n\t\tsuperMatcher;\r\n}\r\n\r\ncompile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {\r\n\tvar i,\r\n\t\tsetMatchers = [],\r\n\t\telementMatchers = [],\r\n\t\tcached = compilerCache[ selector + \" \" ];\r\n\r\n\tif ( !cached ) {\r\n\t\t// Generate a function of recursive functions that can be used to check each element\r\n\t\tif ( !group ) {\r\n\t\t\tgroup = tokenize( selector );\r\n\t\t}\r\n\t\ti = group.length;\r\n\t\twhile ( i-- ) {\r\n\t\t\tcached = matcherFromTokens( group[i] );\r\n\t\t\tif ( cached[ expando ] ) {\r\n\t\t\t\tsetMatchers.push( cached );\r\n\t\t\t} else {\r\n\t\t\t\telementMatchers.push( cached );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Cache the compiled function\r\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\r\n\t}\r\n\treturn cached;\r\n};\r\n\r\nfunction multipleContexts( selector, contexts, results ) {\r\n\tvar i = 0,\r\n\t\tlen = contexts.length;\r\n\tfor ( ; i < len; i++ ) {\r\n\t\tSizzle( selector, contexts[i], results );\r\n\t}\r\n\treturn results;\r\n}\r\n\r\nfunction select( selector, context, results, seed ) {\r\n\tvar i, tokens, token, type, find,\r\n\t\tmatch = tokenize( selector );\r\n\r\n\tif ( !seed ) {\r\n\t\t// Try to minimize operations if there is only one group\r\n\t\tif ( match.length === 1 ) {\r\n\r\n\t\t\t// Take a shortcut and set the context if the root selector is an ID\r\n\t\t\ttokens = match[0] = match[0].slice( 0 );\r\n\t\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\r\n\t\t\t\t\tsupport.getById && context.nodeType === 9 && documentIsHTML &&\r\n\t\t\t\t\tExpr.relative[ tokens[1].type ] ) {\r\n\r\n\t\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\r\n\t\t\t\tif ( !context ) {\r\n\t\t\t\t\treturn results;\r\n\t\t\t\t}\r\n\t\t\t\tselector = selector.slice( tokens.shift().value.length );\r\n\t\t\t}\r\n\r\n\t\t\t// Fetch a seed set for right-to-left matching\r\n\t\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\r\n\t\t\twhile ( i-- ) {\r\n\t\t\t\ttoken = tokens[i];\r\n\r\n\t\t\t\t// Abort if we hit a combinator\r\n\t\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tif ( (find = Expr.find[ type ]) ) {\r\n\t\t\t\t\t// Search, expanding context for leading sibling combinators\r\n\t\t\t\t\tif ( (seed = find(\r\n\t\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\r\n\t\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\r\n\t\t\t\t\t)) ) {\r\n\r\n\t\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\r\n\t\t\t\t\t\ttokens.splice( i, 1 );\r\n\t\t\t\t\t\tselector = seed.length && toSelector( tokens );\r\n\t\t\t\t\t\tif ( !selector ) {\r\n\t\t\t\t\t\t\tpush.apply( results, seed );\r\n\t\t\t\t\t\t\treturn results;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Compile and execute a filtering function\r\n\t// Provide `match` to avoid retokenization if we modified the selector above\r\n\tcompile( selector, match )(\r\n\t\tseed,\r\n\t\tcontext,\r\n\t\t!documentIsHTML,\r\n\t\tresults,\r\n\t\trsibling.test( selector ) && testContext( context.parentNode ) || context\r\n\t);\r\n\treturn results;\r\n}\r\n\r\n// One-time assignments\r\n\r\n// Sort stability\r\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\r\n\r\n// Support: Chrome<14\r\n// Always assume duplicates if they aren't passed to the comparison function\r\nsupport.detectDuplicates = !!hasDuplicate;\r\n\r\n// Initialize against the default document\r\nsetDocument();\r\n\r\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\r\n// Detached nodes confoundingly follow *each other*\r\nsupport.sortDetached = assert(function( div1 ) {\r\n\t// Should return 1, but returns 4 (following)\r\n\treturn div1.compareDocumentPosition( document.createElement(\"div\") ) & 1;\r\n});\r\n\r\n// Support: IE<8\r\n// Prevent attribute/property \"interpolation\"\r\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\r\nif ( !assert(function( div ) {\r\n\tdiv.innerHTML = \"<a href='#'></a>\";\r\n\treturn div.firstChild.getAttribute(\"href\") === \"#\" ;\r\n}) ) {\r\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\r\n\t\tif ( !isXML ) {\r\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\r\n\t\t}\r\n\t});\r\n}\r\n\r\n// Support: IE<9\r\n// Use defaultValue in place of getAttribute(\"value\")\r\nif ( !support.attributes || !assert(function( div ) {\r\n\tdiv.innerHTML = \"<input/>\";\r\n\tdiv.firstChild.setAttribute( \"value\", \"\" );\r\n\treturn div.firstChild.getAttribute( \"value\" ) === \"\";\r\n}) ) {\r\n\taddHandle( \"value\", function( elem, name, isXML ) {\r\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\r\n\t\t\treturn elem.defaultValue;\r\n\t\t}\r\n\t});\r\n}\r\n\r\n// Support: IE<9\r\n// Use getAttributeNode to fetch booleans when getAttribute lies\r\nif ( !assert(function( div ) {\r\n\treturn div.getAttribute(\"disabled\") == null;\r\n}) ) {\r\n\taddHandle( booleans, function( elem, name, isXML ) {\r\n\t\tvar val;\r\n\t\tif ( !isXML ) {\r\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\r\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\r\n\t\t\t\t\tval.value :\r\n\t\t\t\tnull;\r\n\t\t}\r\n\t});\r\n}\r\n\r\nreturn Sizzle;\r\n\r\n})( window );\r\n\r\n\r\n\r\njQuery.find = Sizzle;\r\njQuery.expr = Sizzle.selectors;\r\njQuery.expr[\":\"] = jQuery.expr.pseudos;\r\njQuery.unique = Sizzle.uniqueSort;\r\njQuery.text = Sizzle.getText;\r\njQuery.isXMLDoc = Sizzle.isXML;\r\njQuery.contains = Sizzle.contains;\r\n\r\n\r\n\r\nvar rneedsContext = jQuery.expr.match.needsContext;\r\n\r\nvar rsingleTag = (/^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/);\r\n\r\n\r\n\r\nvar risSimple = /^.[^:#\\[\\.,]*$/;\r\n\r\n// Implement the identical functionality for filter and not\r\nfunction winnow( elements, qualifier, not ) {\r\n\tif ( jQuery.isFunction( qualifier ) ) {\r\n\t\treturn jQuery.grep( elements, function( elem, i ) {\r\n\t\t\t/* jshint -W018 */\r\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\r\n\t\t});\r\n\r\n\t}\r\n\r\n\tif ( qualifier.nodeType ) {\r\n\t\treturn jQuery.grep( elements, function( elem ) {\r\n\t\t\treturn ( elem === qualifier ) !== not;\r\n\t\t});\r\n\r\n\t}\r\n\r\n\tif ( typeof qualifier === \"string\" ) {\r\n\t\tif ( risSimple.test( qualifier ) ) {\r\n\t\t\treturn jQuery.filter( qualifier, elements, not );\r\n\t\t}\r\n\r\n\t\tqualifier = jQuery.filter( qualifier, elements );\r\n\t}\r\n\r\n\treturn jQuery.grep( elements, function( elem ) {\r\n\t\treturn ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;\r\n\t});\r\n}\r\n\r\njQuery.filter = function( expr, elems, not ) {\r\n\tvar elem = elems[ 0 ];\r\n\r\n\tif ( not ) {\r\n\t\texpr = \":not(\" + expr + \")\";\r\n\t}\r\n\r\n\treturn elems.length === 1 && elem.nodeType === 1 ?\r\n\t\tjQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :\r\n\t\tjQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\r\n\t\t\treturn elem.nodeType === 1;\r\n\t\t}));\r\n};\r\n\r\njQuery.fn.extend({\r\n\tfind: function( selector ) {\r\n\t\tvar i,\r\n\t\t\tret = [],\r\n\t\t\tself = this,\r\n\t\t\tlen = self.length;\r\n\r\n\t\tif ( typeof selector !== \"string\" ) {\r\n\t\t\treturn this.pushStack( jQuery( selector ).filter(function() {\r\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\r\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}) );\r\n\t\t}\r\n\r\n\t\tfor ( i = 0; i < len; i++ ) {\r\n\t\t\tjQuery.find( selector, self[ i ], ret );\r\n\t\t}\r\n\r\n\t\t// Needed because $( selector, context ) becomes $( context ).find( selector )\r\n\t\tret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );\r\n\t\tret.selector = this.selector ? this.selector + \" \" + selector : selector;\r\n\t\treturn ret;\r\n\t},\r\n\tfilter: function( selector ) {\r\n\t\treturn this.pushStack( winnow(this, selector || [], false) );\r\n\t},\r\n\tnot: function( selector ) {\r\n\t\treturn this.pushStack( winnow(this, selector || [], true) );\r\n\t},\r\n\tis: function( selector ) {\r\n\t\treturn !!winnow(\r\n\t\t\tthis,\r\n\r\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\r\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\r\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\r\n\t\t\t\tjQuery( selector ) :\r\n\t\t\t\tselector || [],\r\n\t\t\tfalse\r\n\t\t).length;\r\n\t}\r\n});\r\n\r\n\r\n// Initialize a jQuery object\r\n\r\n\r\n// A central reference to the root jQuery(document)\r\nvar rootjQuery,\r\n\r\n\t// Use the correct document accordingly with window argument (sandbox)\r\n\tdocument = window.document,\r\n\r\n\t// A simple way to check for HTML strings\r\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\r\n\t// Strict HTML recognition (#11290: must start with <)\r\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]*))$/,\r\n\r\n\tinit = jQuery.fn.init = function( selector, context ) {\r\n\t\tvar match, elem;\r\n\r\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\r\n\t\tif ( !selector ) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\t// Handle HTML strings\r\n\t\tif ( typeof selector === \"string\" ) {\r\n\t\t\tif ( selector.charAt(0) === \"<\" && selector.charAt( selector.length - 1 ) === \">\" && selector.length >= 3 ) {\r\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\r\n\t\t\t\tmatch = [ null, selector, null ];\r\n\r\n\t\t\t} else {\r\n\t\t\t\tmatch = rquickExpr.exec( selector );\r\n\t\t\t}\r\n\r\n\t\t\t// Match html or make sure no context is specified for #id\r\n\t\t\tif ( match && (match[1] || !context) ) {\r\n\r\n\t\t\t\t// HANDLE: $(html) -> $(array)\r\n\t\t\t\tif ( match[1] ) {\r\n\t\t\t\t\tcontext = context instanceof jQuery ? context[0] : context;\r\n\r\n\t\t\t\t\t// scripts is true for back-compat\r\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\r\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\r\n\t\t\t\t\t\tmatch[1],\r\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\r\n\t\t\t\t\t\ttrue\r\n\t\t\t\t\t) );\r\n\r\n\t\t\t\t\t// HANDLE: $(html, props)\r\n\t\t\t\t\tif ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {\r\n\t\t\t\t\t\tfor ( match in context ) {\r\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\r\n\t\t\t\t\t\t\tif ( jQuery.isFunction( this[ match ] ) ) {\r\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\r\n\r\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn this;\r\n\r\n\t\t\t\t// HANDLE: $(#id)\r\n\t\t\t\t} else {\r\n\t\t\t\t\telem = document.getElementById( match[2] );\r\n\r\n\t\t\t\t\t// Check parentNode to catch when Blackberry 4.6 returns\r\n\t\t\t\t\t// nodes that are no longer in the document #6963\r\n\t\t\t\t\tif ( elem && elem.parentNode ) {\r\n\t\t\t\t\t\t// Handle the case where IE and Opera return items\r\n\t\t\t\t\t\t// by name instead of ID\r\n\t\t\t\t\t\tif ( elem.id !== match[2] ) {\r\n\t\t\t\t\t\t\treturn rootjQuery.find( selector );\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Otherwise, we inject the element directly into the jQuery object\r\n\t\t\t\t\t\tthis.length = 1;\r\n\t\t\t\t\t\tthis[0] = elem;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis.context = document;\r\n\t\t\t\t\tthis.selector = selector;\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t}\r\n\r\n\t\t\t// HANDLE: $(expr, $(...))\r\n\t\t\t} else if ( !context || context.jquery ) {\r\n\t\t\t\treturn ( context || rootjQuery ).find( selector );\r\n\r\n\t\t\t// HANDLE: $(expr, context)\r\n\t\t\t// (which is just equivalent to: $(context).find(expr)\r\n\t\t\t} else {\r\n\t\t\t\treturn this.constructor( context ).find( selector );\r\n\t\t\t}\r\n\r\n\t\t// HANDLE: $(DOMElement)\r\n\t\t} else if ( selector.nodeType ) {\r\n\t\t\tthis.context = this[0] = selector;\r\n\t\t\tthis.length = 1;\r\n\t\t\treturn this;\r\n\r\n\t\t// HANDLE: $(function)\r\n\t\t// Shortcut for document ready\r\n\t\t} else if ( jQuery.isFunction( selector ) ) {\r\n\t\t\treturn typeof rootjQuery.ready !== \"undefined\" ?\r\n\t\t\t\trootjQuery.ready( selector ) :\r\n\t\t\t\t// Execute immediately if ready is not present\r\n\t\t\t\tselector( jQuery );\r\n\t\t}\r\n\r\n\t\tif ( selector.selector !== undefined ) {\r\n\t\t\tthis.selector = selector.selector;\r\n\t\t\tthis.context = selector.context;\r\n\t\t}\r\n\r\n\t\treturn jQuery.makeArray( selector, this );\r\n\t};\r\n\r\n// Give the init function the jQuery prototype for later instantiation\r\ninit.prototype = jQuery.fn;\r\n\r\n// Initialize central reference\r\nrootjQuery = jQuery( document );\r\n\r\n\r\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\r\n\t// methods guaranteed to produce a unique set when starting from a unique set\r\n\tguaranteedUnique = {\r\n\t\tchildren: true,\r\n\t\tcontents: true,\r\n\t\tnext: true,\r\n\t\tprev: true\r\n\t};\r\n\r\njQuery.extend({\r\n\tdir: function( elem, dir, until ) {\r\n\t\tvar matched = [],\r\n\t\t\tcur = elem[ dir ];\r\n\r\n\t\twhile ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {\r\n\t\t\tif ( cur.nodeType === 1 ) {\r\n\t\t\t\tmatched.push( cur );\r\n\t\t\t}\r\n\t\t\tcur = cur[dir];\r\n\t\t}\r\n\t\treturn matched;\r\n\t},\r\n\r\n\tsibling: function( n, elem ) {\r\n\t\tvar r = [];\r\n\r\n\t\tfor ( ; n; n = n.nextSibling ) {\r\n\t\t\tif ( n.nodeType === 1 && n !== elem ) {\r\n\t\t\t\tr.push( n );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn r;\r\n\t}\r\n});\r\n\r\njQuery.fn.extend({\r\n\thas: function( target ) {\r\n\t\tvar i,\r\n\t\t\ttargets = jQuery( target, this ),\r\n\t\t\tlen = targets.length;\r\n\r\n\t\treturn this.filter(function() {\r\n\t\t\tfor ( i = 0; i < len; i++ ) {\r\n\t\t\t\tif ( jQuery.contains( this, targets[i] ) ) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\tclosest: function( selectors, context ) {\r\n\t\tvar cur,\r\n\t\t\ti = 0,\r\n\t\t\tl = this.length,\r\n\t\t\tmatched = [],\r\n\t\t\tpos = rneedsContext.test( selectors ) || typeof selectors !== \"string\" ?\r\n\t\t\t\tjQuery( selectors, context || this.context ) :\r\n\t\t\t\t0;\r\n\r\n\t\tfor ( ; i < l; i++ ) {\r\n\t\t\tfor ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {\r\n\t\t\t\t// Always skip document fragments\r\n\t\t\t\tif ( cur.nodeType < 11 && (pos ?\r\n\t\t\t\t\tpos.index(cur) > -1 :\r\n\r\n\t\t\t\t\t// Don't pass non-elements to Sizzle\r\n\t\t\t\t\tcur.nodeType === 1 &&\r\n\t\t\t\t\t\tjQuery.find.matchesSelector(cur, selectors)) ) {\r\n\r\n\t\t\t\t\tmatched.push( cur );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );\r\n\t},\r\n\r\n\t// Determine the position of an element within\r\n\t// the matched set of elements\r\n\tindex: function( elem ) {\r\n\r\n\t\t// No argument, return index in parent\r\n\t\tif ( !elem ) {\r\n\t\t\treturn ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;\r\n\t\t}\r\n\r\n\t\t// index in selector\r\n\t\tif ( typeof elem === \"string\" ) {\r\n\t\t\treturn jQuery.inArray( this[0], jQuery( elem ) );\r\n\t\t}\r\n\r\n\t\t// Locate the position of the desired element\r\n\t\treturn jQuery.inArray(\r\n\t\t\t// If it receives a jQuery object, the first element is used\r\n\t\t\telem.jquery ? elem[0] : elem, this );\r\n\t},\r\n\r\n\tadd: function( selector, context ) {\r\n\t\treturn this.pushStack(\r\n\t\t\tjQuery.unique(\r\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\r\n\t\t\t)\r\n\t\t);\r\n\t},\r\n\r\n\taddBack: function( selector ) {\r\n\t\treturn this.add( selector == null ?\r\n\t\t\tthis.prevObject : this.prevObject.filter(selector)\r\n\t\t);\r\n\t}\r\n});\r\n\r\nfunction sibling( cur, dir ) {\r\n\tdo {\r\n\t\tcur = cur[ dir ];\r\n\t} while ( cur && cur.nodeType !== 1 );\r\n\r\n\treturn cur;\r\n}\r\n\r\njQuery.each({\r\n\tparent: function( elem ) {\r\n\t\tvar parent = elem.parentNode;\r\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\r\n\t},\r\n\tparents: function( elem ) {\r\n\t\treturn jQuery.dir( elem, \"parentNode\" );\r\n\t},\r\n\tparentsUntil: function( elem, i, until ) {\r\n\t\treturn jQuery.dir( elem, \"parentNode\", until );\r\n\t},\r\n\tnext: function( elem ) {\r\n\t\treturn sibling( elem, \"nextSibling\" );\r\n\t},\r\n\tprev: function( elem ) {\r\n\t\treturn sibling( elem, \"previousSibling\" );\r\n\t},\r\n\tnextAll: function( elem ) {\r\n\t\treturn jQuery.dir( elem, \"nextSibling\" );\r\n\t},\r\n\tprevAll: function( elem ) {\r\n\t\treturn jQuery.dir( elem, \"previousSibling\" );\r\n\t},\r\n\tnextUntil: function( elem, i, until ) {\r\n\t\treturn jQuery.dir( elem, \"nextSibling\", until );\r\n\t},\r\n\tprevUntil: function( elem, i, until ) {\r\n\t\treturn jQuery.dir( elem, \"previousSibling\", until );\r\n\t},\r\n\tsiblings: function( elem ) {\r\n\t\treturn jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );\r\n\t},\r\n\tchildren: function( elem ) {\r\n\t\treturn jQuery.sibling( elem.firstChild );\r\n\t},\r\n\tcontents: function( elem ) {\r\n\t\treturn jQuery.nodeName( elem, \"iframe\" ) ?\r\n\t\t\telem.contentDocument || elem.contentWindow.document :\r\n\t\t\tjQuery.merge( [], elem.childNodes );\r\n\t}\r\n}, function( name, fn ) {\r\n\tjQuery.fn[ name ] = function( until, selector ) {\r\n\t\tvar ret = jQuery.map( this, fn, until );\r\n\r\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\r\n\t\t\tselector = until;\r\n\t\t}\r\n\r\n\t\tif ( selector && typeof selector === \"string\" ) {\r\n\t\t\tret = jQuery.filter( selector, ret );\r\n\t\t}\r\n\r\n\t\tif ( this.length > 1 ) {\r\n\t\t\t// Remove duplicates\r\n\t\t\tif ( !guaranteedUnique[ name ] ) {\r\n\t\t\t\tret = jQuery.unique( ret );\r\n\t\t\t}\r\n\r\n\t\t\t// Reverse order for parents* and prev-derivatives\r\n\t\t\tif ( rparentsprev.test( name ) ) {\r\n\t\t\t\tret = ret.reverse();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.pushStack( ret );\r\n\t};\r\n});\r\nvar rnotwhite = (/\\S+/g);\r\n\r\n\r\n\r\n// String to Object options format cache\r\nvar optionsCache = {};\r\n\r\n// Convert String-formatted options into Object-formatted ones and store in cache\r\nfunction createOptions( options ) {\r\n\tvar object = optionsCache[ options ] = {};\r\n\tjQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {\r\n\t\tobject[ flag ] = true;\r\n\t});\r\n\treturn object;\r\n}\r\n\r\n/*\r\n * Create a callback list using the following parameters:\r\n *\r\n *\toptions: an optional list of space-separated options that will change how\r\n *\t\t\tthe callback list behaves or a more traditional option object\r\n *\r\n * By default a callback list will act like an event callback list and can be\r\n * \"fired\" multiple times.\r\n *\r\n * Possible options:\r\n *\r\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\r\n *\r\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\r\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\r\n *\t\t\t\t\tvalues (like a Deferred)\r\n *\r\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\r\n *\r\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\r\n *\r\n */\r\njQuery.Callbacks = function( options ) {\r\n\r\n\t// Convert options from String-formatted to Object-formatted if needed\r\n\t// (we check in cache first)\r\n\toptions = typeof options === \"string\" ?\r\n\t\t( optionsCache[ options ] || createOptions( options ) ) :\r\n\t\tjQuery.extend( {}, options );\r\n\r\n\tvar // Flag to know if list is currently firing\r\n\t\tfiring,\r\n\t\t// Last fire value (for non-forgettable lists)\r\n\t\tmemory,\r\n\t\t// Flag to know if list was already fired\r\n\t\tfired,\r\n\t\t// End of the loop when firing\r\n\t\tfiringLength,\r\n\t\t// Index of currently firing callback (modified by remove if needed)\r\n\t\tfiringIndex,\r\n\t\t// First callback to fire (used internally by add and fireWith)\r\n\t\tfiringStart,\r\n\t\t// Actual callback list\r\n\t\tlist = [],\r\n\t\t// Stack of fire calls for repeatable lists\r\n\t\tstack = !options.once && [],\r\n\t\t// Fire callbacks\r\n\t\tfire = function( data ) {\r\n\t\t\tmemory = options.memory && data;\r\n\t\t\tfired = true;\r\n\t\t\tfiringIndex = firingStart || 0;\r\n\t\t\tfiringStart = 0;\r\n\t\t\tfiringLength = list.length;\r\n\t\t\tfiring = true;\r\n\t\t\tfor ( ; list && firingIndex < firingLength; firingIndex++ ) {\r\n\t\t\t\tif ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {\r\n\t\t\t\t\tmemory = false; // To prevent further calls using add\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfiring = false;\r\n\t\t\tif ( list ) {\r\n\t\t\t\tif ( stack ) {\r\n\t\t\t\t\tif ( stack.length ) {\r\n\t\t\t\t\t\tfire( stack.shift() );\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if ( memory ) {\r\n\t\t\t\t\tlist = [];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tself.disable();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\t// Actual Callbacks object\r\n\t\tself = {\r\n\t\t\t// Add a callback or a collection of callbacks to the list\r\n\t\t\tadd: function() {\r\n\t\t\t\tif ( list ) {\r\n\t\t\t\t\t// First, we save the current length\r\n\t\t\t\t\tvar start = list.length;\r\n\t\t\t\t\t(function add( args ) {\r\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\r\n\t\t\t\t\t\t\tvar type = jQuery.type( arg );\r\n\t\t\t\t\t\t\tif ( type === \"function\" ) {\r\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\r\n\t\t\t\t\t\t\t\t\tlist.push( arg );\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else if ( arg && arg.length && type !== \"string\" ) {\r\n\t\t\t\t\t\t\t\t// Inspect recursively\r\n\t\t\t\t\t\t\t\tadd( arg );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t})( arguments );\r\n\t\t\t\t\t// Do we need to add the callbacks to the\r\n\t\t\t\t\t// current firing batch?\r\n\t\t\t\t\tif ( firing ) {\r\n\t\t\t\t\t\tfiringLength = list.length;\r\n\t\t\t\t\t// With memory, if we're not firing then\r\n\t\t\t\t\t// we should call right away\r\n\t\t\t\t\t} else if ( memory ) {\r\n\t\t\t\t\t\tfiringStart = start;\r\n\t\t\t\t\t\tfire( memory );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Remove a callback from the list\r\n\t\t\tremove: function() {\r\n\t\t\t\tif ( list ) {\r\n\t\t\t\t\tjQuery.each( arguments, function( _, arg ) {\r\n\t\t\t\t\t\tvar index;\r\n\t\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\r\n\t\t\t\t\t\t\tlist.splice( index, 1 );\r\n\t\t\t\t\t\t\t// Handle firing indexes\r\n\t\t\t\t\t\t\tif ( firing ) {\r\n\t\t\t\t\t\t\t\tif ( index <= firingLength ) {\r\n\t\t\t\t\t\t\t\t\tfiringLength--;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif ( index <= firingIndex ) {\r\n\t\t\t\t\t\t\t\t\tfiringIndex--;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Check if a given callback is in the list.\r\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\r\n\t\t\thas: function( fn ) {\r\n\t\t\t\treturn fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );\r\n\t\t\t},\r\n\t\t\t// Remove all callbacks from the list\r\n\t\t\tempty: function() {\r\n\t\t\t\tlist = [];\r\n\t\t\t\tfiringLength = 0;\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Have the list do nothing anymore\r\n\t\t\tdisable: function() {\r\n\t\t\t\tlist = stack = memory = undefined;\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Is it disabled?\r\n\t\t\tdisabled: function() {\r\n\t\t\t\treturn !list;\r\n\t\t\t},\r\n\t\t\t// Lock the list in its current state\r\n\t\t\tlock: function() {\r\n\t\t\t\tstack = undefined;\r\n\t\t\t\tif ( !memory ) {\r\n\t\t\t\t\tself.disable();\r\n\t\t\t\t}\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Is it locked?\r\n\t\t\tlocked: function() {\r\n\t\t\t\treturn !stack;\r\n\t\t\t},\r\n\t\t\t// Call all callbacks with the given context and arguments\r\n\t\t\tfireWith: function( context, args ) {\r\n\t\t\t\tif ( list && ( !fired || stack ) ) {\r\n\t\t\t\t\targs = args || [];\r\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\r\n\t\t\t\t\tif ( firing ) {\r\n\t\t\t\t\t\tstack.push( args );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tfire( args );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// Call all the callbacks with the given arguments\r\n\t\t\tfire: function() {\r\n\t\t\t\tself.fireWith( this, arguments );\r\n\t\t\t\treturn this;\r\n\t\t\t},\r\n\t\t\t// To know if the callbacks have already been called at least once\r\n\t\t\tfired: function() {\r\n\t\t\t\treturn !!fired;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\treturn self;\r\n};\r\n\r\n\r\njQuery.extend({\r\n\r\n\tDeferred: function( func ) {\r\n\t\tvar tuples = [\r\n\t\t\t\t// action, add listener, listener list, final state\r\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks(\"once memory\"), \"resolved\" ],\r\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks(\"once memory\"), \"rejected\" ],\r\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks(\"memory\") ]\r\n\t\t\t],\r\n\t\t\tstate = \"pending\",\r\n\t\t\tpromise = {\r\n\t\t\t\tstate: function() {\r\n\t\t\t\t\treturn state;\r\n\t\t\t\t},\r\n\t\t\t\talways: function() {\r\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\t\t\t\tthen: function( /* fnDone, fnFail, fnProgress */ ) {\r\n\t\t\t\t\tvar fns = arguments;\r\n\t\t\t\t\treturn jQuery.Deferred(function( newDefer ) {\r\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\r\n\t\t\t\t\t\t\tvar fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];\r\n\t\t\t\t\t\t\t// deferred[ done | fail | progress ] for forwarding actions to newDefer\r\n\t\t\t\t\t\t\tdeferred[ tuple[1] ](function() {\r\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\r\n\t\t\t\t\t\t\t\tif ( returned && jQuery.isFunction( returned.promise ) ) {\r\n\t\t\t\t\t\t\t\t\treturned.promise()\r\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\r\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject )\r\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify );\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tfns = null;\r\n\t\t\t\t\t}).promise();\r\n\t\t\t\t},\r\n\t\t\t\t// Get a promise for this deferred\r\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\r\n\t\t\t\tpromise: function( obj ) {\r\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tdeferred = {};\r\n\r\n\t\t// Keep pipe for back-compat\r\n\t\tpromise.pipe = promise.then;\r\n\r\n\t\t// Add list-specific methods\r\n\t\tjQuery.each( tuples, function( i, tuple ) {\r\n\t\t\tvar list = tuple[ 2 ],\r\n\t\t\t\tstateString = tuple[ 3 ];\r\n\r\n\t\t\t// promise[ done | fail | progress ] = list.add\r\n\t\t\tpromise[ tuple[1] ] = list.add;\r\n\r\n\t\t\t// Handle state\r\n\t\t\tif ( stateString ) {\r\n\t\t\t\tlist.add(function() {\r\n\t\t\t\t\t// state = [ resolved | rejected ]\r\n\t\t\t\t\tstate = stateString;\r\n\r\n\t\t\t\t// [ reject_list | resolve_list ].disable; progress_list.lock\r\n\t\t\t\t}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );\r\n\t\t\t}\r\n\r\n\t\t\t// deferred[ resolve | reject | notify ]\r\n\t\t\tdeferred[ tuple[0] ] = function() {\r\n\t\t\t\tdeferred[ tuple[0] + \"With\" ]( this === deferred ? promise : this, arguments );\r\n\t\t\t\treturn this;\r\n\t\t\t};\r\n\t\t\tdeferred[ tuple[0] + \"With\" ] = list.fireWith;\r\n\t\t});\r\n\r\n\t\t// Make the deferred a promise\r\n\t\tpromise.promise( deferred );\r\n\r\n\t\t// Call given func if any\r\n\t\tif ( func ) {\r\n\t\t\tfunc.call( deferred, deferred );\r\n\t\t}\r\n\r\n\t\t// All done!\r\n\t\treturn deferred;\r\n\t},\r\n\r\n\t// Deferred helper\r\n\twhen: function( subordinate /* , ..., subordinateN */ ) {\r\n\t\tvar i = 0,\r\n\t\t\tresolveValues = slice.call( arguments ),\r\n\t\t\tlength = resolveValues.length,\r\n\r\n\t\t\t// the count of uncompleted subordinates\r\n\t\t\tremaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,\r\n\r\n\t\t\t// the master Deferred. If resolveValues consist of only a single Deferred, just use that.\r\n\t\t\tdeferred = remaining === 1 ? subordinate : jQuery.Deferred(),\r\n\r\n\t\t\t// Update function for both resolve and progress values\r\n\t\t\tupdateFunc = function( i, contexts, values ) {\r\n\t\t\t\treturn function( value ) {\r\n\t\t\t\t\tcontexts[ i ] = this;\r\n\t\t\t\t\tvalues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\r\n\t\t\t\t\tif ( values === progressValues ) {\r\n\t\t\t\t\t\tdeferred.notifyWith( contexts, values );\r\n\r\n\t\t\t\t\t} else if ( !(--remaining) ) {\r\n\t\t\t\t\t\tdeferred.resolveWith( contexts, values );\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\tprogressValues, progressContexts, resolveContexts;\r\n\r\n\t\t// add listeners to Deferred subordinates; treat others as resolved\r\n\t\tif ( length > 1 ) {\r\n\t\t\tprogressValues = new Array( length );\r\n\t\t\tprogressContexts = new Array( length );\r\n\t\t\tresolveContexts = new Array( length );\r\n\t\t\tfor ( ; i < length; i++ ) {\r\n\t\t\t\tif ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {\r\n\t\t\t\t\tresolveValues[ i ].promise()\r\n\t\t\t\t\t\t.done( updateFunc( i, resolveContexts, resolveValues ) )\r\n\t\t\t\t\t\t.fail( deferred.reject )\r\n\t\t\t\t\t\t.progress( updateFunc( i, progressContexts, progressValues ) );\r\n\t\t\t\t} else {\r\n\t\t\t\t\t--remaining;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// if we're not waiting on anything, resolve the master\r\n\t\tif ( !remaining ) {\r\n\t\t\tdeferred.resolveWith( resolveContexts, resolveValues );\r\n\t\t}\r\n\r\n\t\treturn deferred.promise();\r\n\t}\r\n});\r\n\r\n\r\n// The deferred used on DOM ready\r\nvar readyList;\r\n\r\njQuery.fn.ready = function( fn ) {\r\n\t// Add the callback\r\n\tjQuery.ready.promise().done( fn );\r\n\r\n\treturn this;\r\n};\r\n\r\njQuery.extend({\r\n\t// Is the DOM ready to be used? Set to true once it occurs.\r\n\tisReady: false,\r\n\r\n\t// A counter to track how many items to wait for before\r\n\t// the ready event fires. See #6781\r\n\treadyWait: 1,\r\n\r\n\t// Hold (or release) the ready event\r\n\tholdReady: function( hold ) {\r\n\t\tif ( hold ) {\r\n\t\t\tjQuery.readyWait++;\r\n\t\t} else {\r\n\t\t\tjQuery.ready( true );\r\n\t\t}\r\n\t},\r\n\r\n\t// Handle when the DOM is ready\r\n\tready: function( wait ) {\r\n\r\n\t\t// Abort if there are pending holds or we're already ready\r\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).\r\n\t\tif ( !document.body ) {\r\n\t\t\treturn setTimeout( jQuery.ready );\r\n\t\t}\r\n\r\n\t\t// Remember that the DOM is ready\r\n\t\tjQuery.isReady = true;\r\n\r\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\r\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// If there are functions bound, to execute\r\n\t\treadyList.resolveWith( document, [ jQuery ] );\r\n\r\n\t\t// Trigger any bound ready events\r\n\t\tif ( jQuery.fn.trigger ) {\r\n\t\t\tjQuery( document ).trigger(\"ready\").off(\"ready\");\r\n\t\t}\r\n\t}\r\n});\r\n\r\n/**\r\n * Clean-up method for dom ready events\r\n */\r\nfunction detach() {\r\n\tif ( document.addEventListener ) {\r\n\t\tdocument.removeEventListener( \"DOMContentLoaded\", completed, false );\r\n\t\twindow.removeEventListener( \"load\", completed, false );\r\n\r\n\t} else {\r\n\t\tdocument.detachEvent( \"onreadystatechange\", completed );\r\n\t\twindow.detachEvent( \"onload\", completed );\r\n\t}\r\n}\r\n\r\n/**\r\n * The ready event handler and self cleanup method\r\n */\r\nfunction completed() {\r\n\t// readyState === \"complete\" is good enough for us to call the dom ready in oldIE\r\n\tif ( document.addEventListener || event.type === \"load\" || document.readyState === \"complete\" ) {\r\n\t\tdetach();\r\n\t\tjQuery.ready();\r\n\t}\r\n}\r\n\r\njQuery.ready.promise = function( obj ) {\r\n\tif ( !readyList ) {\r\n\r\n\t\treadyList = jQuery.Deferred();\r\n\r\n\t\t// Catch cases where $(document).ready() is called after the browser event has already occurred.\r\n\t\t// we once tried to use readyState \"interactive\" here, but it caused issues like the one\r\n\t\t// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15\r\n\t\tif ( document.readyState === \"complete\" ) {\r\n\t\t\t// Handle it asynchronously to allow scripts the opportunity to delay ready\r\n\t\t\tsetTimeout( jQuery.ready );\r\n\r\n\t\t// Standards-based browsers support DOMContentLoaded\r\n\t\t} else if ( document.addEventListener ) {\r\n\t\t\t// Use the handy event callback\r\n\t\t\tdocument.addEventListener( \"DOMContentLoaded\", completed, false );\r\n\r\n\t\t\t// A fallback to window.onload, that will always work\r\n\t\t\twindow.addEventListener( \"load\", completed, false );\r\n\r\n\t\t// If IE event model is used\r\n\t\t} else {\r\n\t\t\t// Ensure firing before onload, maybe late but safe also for iframes\r\n\t\t\tdocument.attachEvent( \"onreadystatechange\", completed );\r\n\r\n\t\t\t// A fallback to window.onload, that will always work\r\n\t\t\twindow.attachEvent( \"onload\", completed );\r\n\r\n\t\t\t// If IE and not a frame\r\n\t\t\t// continually check to see if the document is ready\r\n\t\t\tvar top = false;\r\n\r\n\t\t\ttry {\r\n\t\t\t\ttop = window.frameElement == null && document.documentElement;\r\n\t\t\t} catch(e) {}\r\n\r\n\t\t\tif ( top && top.doScroll ) {\r\n\t\t\t\t(function doScrollCheck() {\r\n\t\t\t\t\tif ( !jQuery.isReady ) {\r\n\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t// Use the trick by Diego Perini\r\n\t\t\t\t\t\t\t// http://javascript.nwbox.com/IEContentLoaded/\r\n\t\t\t\t\t\t\ttop.doScroll(\"left\");\r\n\t\t\t\t\t\t} catch(e) {\r\n\t\t\t\t\t\t\treturn setTimeout( doScrollCheck, 50 );\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// detach all dom ready events\r\n\t\t\t\t\t\tdetach();\r\n\r\n\t\t\t\t\t\t// and execute any waiting functions\r\n\t\t\t\t\t\tjQuery.ready();\r\n\t\t\t\t\t}\r\n\t\t\t\t})();\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn readyList.promise( obj );\r\n};\r\n\r\n\r\nvar strundefined = typeof undefined;\r\n\r\n\r\n\r\n// Support: IE<9\r\n// Iteration over object's inherited properties before its own\r\nvar i;\r\nfor ( i in jQuery( support ) ) {\r\n\tbreak;\r\n}\r\nsupport.ownLast = i !== \"0\";\r\n\r\n// Note: most support tests are defined in their respective modules.\r\n// false until the test is run\r\nsupport.inlineBlockNeedsLayout = false;\r\n\r\njQuery(function() {\r\n\t// We need to execute this one support test ASAP because we need to know\r\n\t// if body.style.zoom needs to be set.\r\n\r\n\tvar container, div,\r\n\t\tbody = document.getElementsByTagName(\"body\")[0];\r\n\r\n\tif ( !body ) {\r\n\t\t// Return for frameset docs that don't have a body\r\n\t\treturn;\r\n\t}\r\n\r\n\t// Setup\r\n\tcontainer = document.createElement( \"div\" );\r\n\tcontainer.style.cssText = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px\";\r\n\r\n\tdiv = document.createElement( \"div\" );\r\n\tbody.appendChild( container ).appendChild( div );\r\n\r\n\tif ( typeof div.style.zoom !== strundefined ) {\r\n\t\t// Support: IE<8\r\n\t\t// Check if natively block-level elements act like inline-block\r\n\t\t// elements when setting their display to 'inline' and giving\r\n\t\t// them layout\r\n\t\tdiv.style.cssText = \"border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1\";\r\n\r\n\t\tif ( (support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 )) ) {\r\n\t\t\t// Prevent IE 6 from affecting layout for positioned elements #11048\r\n\t\t\t// Prevent IE from shrinking the body in IE 7 mode #12869\r\n\t\t\t// Support: IE<8\r\n\t\t\tbody.style.zoom = 1;\r\n\t\t}\r\n\t}\r\n\r\n\tbody.removeChild( container );\r\n\r\n\t// Null elements to avoid leaks in IE\r\n\tcontainer = div = null;\r\n});\r\n\r\n\r\n\r\n\r\n(function() {\r\n\tvar div = document.createElement( \"div\" );\r\n\r\n\t// Execute the test only if not already executed in another module.\r\n\tif (support.deleteExpando == null) {\r\n\t\t// Support: IE<9\r\n\t\tsupport.deleteExpando = true;\r\n\t\ttry {\r\n\t\t\tdelete div.test;\r\n\t\t} catch( e ) {\r\n\t\t\tsupport.deleteExpando = false;\r\n\t\t}\r\n\t}\r\n\r\n\t// Null elements to avoid leaks in IE.\r\n\tdiv = null;\r\n})();\r\n\r\n\r\n/**\r\n * Determines whether an object can have data\r\n */\r\njQuery.acceptData = function( elem ) {\r\n\tvar noData = jQuery.noData[ (elem.nodeName + \" \").toLowerCase() ],\r\n\t\tnodeType = +elem.nodeType || 1;\r\n\r\n\t// Do not set data on non-element DOM nodes because it will not be cleared (#8335).\r\n\treturn nodeType !== 1 && nodeType !== 9 ?\r\n\t\tfalse :\r\n\r\n\t\t// Nodes accept data unless otherwise specified; rejection can be conditional\r\n\t\t!noData || noData !== true && elem.getAttribute(\"classid\") === noData;\r\n};\r\n\r\n\r\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\r\n\trmultiDash = /([A-Z])/g;\r\n\r\nfunction dataAttr( elem, key, data ) {\r\n\t// If nothing was found internally, try to fetch any\r\n\t// data from the HTML5 data-* attribute\r\n\tif ( data === undefined && elem.nodeType === 1 ) {\r\n\r\n\t\tvar name = \"data-\" + key.replace( rmultiDash, \"-$1\" ).toLowerCase();\r\n\r\n\t\tdata = elem.getAttribute( name );\r\n\r\n\t\tif ( typeof data === \"string\" ) {\r\n\t\t\ttry {\r\n\t\t\t\tdata = data === \"true\" ? true :\r\n\t\t\t\t\tdata === \"false\" ? false :\r\n\t\t\t\t\tdata === \"null\" ? null :\r\n\t\t\t\t\t// Only convert to a number if it doesn't change the string\r\n\t\t\t\t\t+data + \"\" === data ? +data :\r\n\t\t\t\t\trbrace.test( data ) ? jQuery.parseJSON( data ) :\r\n\t\t\t\t\tdata;\r\n\t\t\t} catch( e ) {}\r\n\r\n\t\t\t// Make sure we set the data so it isn't changed later\r\n\t\t\tjQuery.data( elem, key, data );\r\n\r\n\t\t} else {\r\n\t\t\tdata = undefined;\r\n\t\t}\r\n\t}\r\n\r\n\treturn data;\r\n}\r\n\r\n// checks a cache object for emptiness\r\nfunction isEmptyDataObject( obj ) {\r\n\tvar name;\r\n\tfor ( name in obj ) {\r\n\r\n\t\t// if the public data object is empty, the private is still empty\r\n\t\tif ( name === \"data\" && jQuery.isEmptyObject( obj[name] ) ) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif ( name !== \"toJSON\" ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\r\n\treturn true;\r\n}\r\n\r\nfunction internalData( elem, name, data, pvt /* Internal Use Only */ ) {\r\n\tif ( !jQuery.acceptData( elem ) ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tvar ret, thisCache,\r\n\t\tinternalKey = jQuery.expando,\r\n\r\n\t\t// We have to handle DOM nodes and JS objects differently because IE6-7\r\n\t\t// can't GC object references properly across the DOM-JS boundary\r\n\t\tisNode = elem.nodeType,\r\n\r\n\t\t// Only DOM nodes need the global jQuery cache; JS object data is\r\n\t\t// attached directly to the object so GC can occur automatically\r\n\t\tcache = isNode ? jQuery.cache : elem,\r\n\r\n\t\t// Only defining an ID for JS objects if its cache already exists allows\r\n\t\t// the code to shortcut on the same path as a DOM node with no cache\r\n\t\tid = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;\r\n\r\n\t// Avoid doing any more work than we need to when trying to get data on an\r\n\t// object that has no data at all\r\n\tif ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === \"string\" ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif ( !id ) {\r\n\t\t// Only DOM nodes need a new unique ID for each element since their data\r\n\t\t// ends up in the global cache\r\n\t\tif ( isNode ) {\r\n\t\t\tid = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++;\r\n\t\t} else {\r\n\t\t\tid = internalKey;\r\n\t\t}\r\n\t}\r\n\r\n\tif ( !cache[ id ] ) {\r\n\t\t// Avoid exposing jQuery metadata on plain JS objects when the object\r\n\t\t// is serialized using JSON.stringify\r\n\t\tcache[ id ] = isNode ? {} : { toJSON: jQuery.noop };\r\n\t}\r\n\r\n\t// An object can be passed to jQuery.data instead of a key/value pair; this gets\r\n\t// shallow copied over onto the existing cache\r\n\tif ( typeof name === \"object\" || typeof name === \"function\" ) {\r\n\t\tif ( pvt ) {\r\n\t\t\tcache[ id ] = jQuery.extend( cache[ id ], name );\r\n\t\t} else {\r\n\t\t\tcache[ id ].data = jQuery.extend( cache[ id ].data, name );\r\n\t\t}\r\n\t}\r\n\r\n\tthisCache = cache[ id ];\r\n\r\n\t// jQuery data() is stored in a separate object inside the object's internal data\r\n\t// cache in order to avoid key collisions between internal data and user-defined\r\n\t// data.\r\n\tif ( !pvt ) {\r\n\t\tif ( !thisCache.data ) {\r\n\t\t\tthisCache.data = {};\r\n\t\t}\r\n\r\n\t\tthisCache = thisCache.data;\r\n\t}\r\n\r\n\tif ( data !== undefined ) {\r\n\t\tthisCache[ jQuery.camelCase( name ) ] = data;\r\n\t}\r\n\r\n\t// Check for both converted-to-camel and non-converted data property names\r\n\t// If a data property was specified\r\n\tif ( typeof name === \"string\" ) {\r\n\r\n\t\t// First Try to find as-is property data\r\n\t\tret = thisCache[ name ];\r\n\r\n\t\t// Test for null|undefined property data\r\n\t\tif ( ret == null ) {\r\n\r\n\t\t\t// Try to find the camelCased property\r\n\t\t\tret = thisCache[ jQuery.camelCase( name ) ];\r\n\t\t}\r\n\t} else {\r\n\t\tret = thisCache;\r\n\t}\r\n\r\n\treturn ret;\r\n}\r\n\r\nfunction internalRemoveData( elem, name, pvt ) {\r\n\tif ( !jQuery.acceptData( elem ) ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tvar thisCache, i,\r\n\t\tisNode = elem.nodeType,\r\n\r\n\t\t// See jQuery.data for more information\r\n\t\tcache = isNode ? jQuery.cache : elem,\r\n\t\tid = isNode ? elem[ jQuery.expando ] : jQuery.expando;\r\n\r\n\t// If there is already no cache entry for this object, there is no\r\n\t// purpose in continuing\r\n\tif ( !cache[ id ] ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif ( name ) {\r\n\r\n\t\tthisCache = pvt ? cache[ id ] : cache[ id ].data;\r\n\r\n\t\tif ( thisCache ) {\r\n\r\n\t\t\t// Support array or space separated string names for data keys\r\n\t\t\tif ( !jQuery.isArray( name ) ) {\r\n\r\n\t\t\t\t// try the string as a key before any manipulation\r\n\t\t\t\tif ( name in thisCache ) {\r\n\t\t\t\t\tname = [ name ];\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t// split the camel cased version by spaces unless a key with the spaces exists\r\n\t\t\t\t\tname = jQuery.camelCase( name );\r\n\t\t\t\t\tif ( name in thisCache ) {\r\n\t\t\t\t\t\tname = [ name ];\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tname = name.split(\" \");\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// If \"name\" is an array of keys...\r\n\t\t\t\t// When data is initially created, via (\"key\", \"val\") signature,\r\n\t\t\t\t// keys will be converted to camelCase.\r\n\t\t\t\t// Since there is no way to tell _how_ a key was added, remove\r\n\t\t\t\t// both plain key and camelCase key. #12786\r\n\t\t\t\t// This will only penalize the array argument path.\r\n\t\t\t\tname = name.concat( jQuery.map( name, jQuery.camelCase ) );\r\n\t\t\t}\r\n\r\n\t\t\ti = name.length;\r\n\t\t\twhile ( i-- ) {\r\n\t\t\t\tdelete thisCache[ name[i] ];\r\n\t\t\t}\r\n\r\n\t\t\t// If there is no data left in the cache, we want to continue\r\n\t\t\t// and let the cache object itself get destroyed\r\n\t\t\tif ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// See jQuery.data for more information\r\n\tif ( !pvt ) {\r\n\t\tdelete cache[ id ].data;\r\n\r\n\t\t// Don't destroy the parent cache unless the internal data object\r\n\t\t// had been the only thing left in it\r\n\t\tif ( !isEmptyDataObject( cache[ id ] ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\r\n\t// Destroy the cache\r\n\tif ( isNode ) {\r\n\t\tjQuery.cleanData( [ elem ], true );\r\n\r\n\t// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)\r\n\t/* jshint eqeqeq: false */\r\n\t} else if ( support.deleteExpando || cache != cache.window ) {\r\n\t\t/* jshint eqeqeq: true */\r\n\t\tdelete cache[ id ];\r\n\r\n\t// When all else fails, null\r\n\t} else {\r\n\t\tcache[ id ] = null;\r\n\t}\r\n}\r\n\r\njQuery.extend({\r\n\tcache: {},\r\n\r\n\t// The following elements (space-suffixed to avoid Object.prototype collisions)\r\n\t// throw uncatchable exceptions if you attempt to set expando properties\r\n\tnoData: {\r\n\t\t\"applet \": true,\r\n\t\t\"embed \": true,\r\n\t\t// ...but Flash objects (which have this classid) *can* handle expandos\r\n\t\t\"object \": \"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\"\r\n\t},\r\n\r\n\thasData: function( elem ) {\r\n\t\telem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];\r\n\t\treturn !!elem && !isEmptyDataObject( elem );\r\n\t},\r\n\r\n\tdata: function( elem, name, data ) {\r\n\t\treturn internalData( elem, name, data );\r\n\t},\r\n\r\n\tremoveData: function( elem, name ) {\r\n\t\treturn internalRemoveData( elem, name );\r\n\t},\r\n\r\n\t// For internal use only.\r\n\t_data: function( elem, name, data ) {\r\n\t\treturn internalData( elem, name, data, true );\r\n\t},\r\n\r\n\t_removeData: function( elem, name ) {\r\n\t\treturn internalRemoveData( elem, name, true );\r\n\t}\r\n});\r\n\r\njQuery.fn.extend({\r\n\tdata: function( key, value ) {\r\n\t\tvar i, name, data,\r\n\t\t\telem = this[0],\r\n\t\t\tattrs = elem && elem.attributes;\r\n\r\n\t\t// Special expections of .data basically thwart jQuery.access,\r\n\t\t// so implement the relevant behavior ourselves\r\n\r\n\t\t// Gets all values\r\n\t\tif ( key === undefined ) {\r\n\t\t\tif ( this.length ) {\r\n\t\t\t\tdata = jQuery.data( elem );\r\n\r\n\t\t\t\tif ( elem.nodeType === 1 && !jQuery._data( elem, \"parsedAttrs\" ) ) {\r\n\t\t\t\t\ti = attrs.length;\r\n\t\t\t\t\twhile ( i-- ) {\r\n\t\t\t\t\t\tname = attrs[i].name;\r\n\r\n\t\t\t\t\t\tif ( name.indexOf(\"data-\") === 0 ) {\r\n\t\t\t\t\t\t\tname = jQuery.camelCase( name.slice(5) );\r\n\r\n\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tjQuery._data( elem, \"parsedAttrs\", true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn data;\r\n\t\t}\r\n\r\n\t\t// Sets multiple values\r\n\t\tif ( typeof key === \"object\" ) {\r\n\t\t\treturn this.each(function() {\r\n\t\t\t\tjQuery.data( this, key );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn arguments.length > 1 ?\r\n\r\n\t\t\t// Sets one value\r\n\t\t\tthis.each(function() {\r\n\t\t\t\tjQuery.data( this, key, value );\r\n\t\t\t}) :\r\n\r\n\t\t\t// Gets one value\r\n\t\t\t// Try to fetch any internally stored data first\r\n\t\t\telem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined;\r\n\t},\r\n\r\n\tremoveData: function( key ) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.removeData( this, key );\r\n\t\t});\r\n\t}\r\n});\r\n\r\n\r\njQuery.extend({\r\n\tqueue: function( elem, type, data ) {\r\n\t\tvar queue;\r\n\r\n\t\tif ( elem ) {\r\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\r\n\t\t\tqueue = jQuery._data( elem, type );\r\n\r\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\r\n\t\t\tif ( data ) {\r\n\t\t\t\tif ( !queue || jQuery.isArray(data) ) {\r\n\t\t\t\t\tqueue = jQuery._data( elem, type, jQuery.makeArray(data) );\r\n\t\t\t\t} else {\r\n\t\t\t\t\tqueue.push( data );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn queue || [];\r\n\t\t}\r\n\t},\r\n\r\n\tdequeue: function( elem, type ) {\r\n\t\ttype = type || \"fx\";\r\n\r\n\t\tvar queue = jQuery.queue( elem, type ),\r\n\t\t\tstartLength = queue.length,\r\n\t\t\tfn = queue.shift(),\r\n\t\t\thooks = jQuery._queueHooks( elem, type ),\r\n\t\t\tnext = function() {\r\n\t\t\t\tjQuery.dequeue( elem, type );\r\n\t\t\t};\r\n\r\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\r\n\t\tif ( fn === \"inprogress\" ) {\r\n\t\t\tfn = queue.shift();\r\n\t\t\tstartLength--;\r\n\t\t}\r\n\r\n\t\tif ( fn ) {\r\n\r\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\r\n\t\t\t// automatically dequeued\r\n\t\t\tif ( type === \"fx\" ) {\r\n\t\t\t\tqueue.unshift( \"inprogress\" );\r\n\t\t\t}\r\n\r\n\t\t\t// clear up the last queue stop function\r\n\t\t\tdelete hooks.stop;\r\n\t\t\tfn.call( elem, next, hooks );\r\n\t\t}\r\n\r\n\t\tif ( !startLength && hooks ) {\r\n\t\t\thooks.empty.fire();\r\n\t\t}\r\n\t},\r\n\r\n\t// not intended for public consumption - generates a queueHooks object, or returns the current one\r\n\t_queueHooks: function( elem, type ) {\r\n\t\tvar key = type + \"queueHooks\";\r\n\t\treturn jQuery._data( elem, key ) || jQuery._data( elem, key, {\r\n\t\t\tempty: jQuery.Callbacks(\"once memory\").add(function() {\r\n\t\t\t\tjQuery._removeData( elem, type + \"queue\" );\r\n\t\t\t\tjQuery._removeData( elem, key );\r\n\t\t\t})\r\n\t\t});\r\n\t}\r\n});\r\n\r\njQuery.fn.extend({\r\n\tqueue: function( type, data ) {\r\n\t\tvar setter = 2;\r\n\r\n\t\tif ( typeof type !== \"string\" ) {\r\n\t\t\tdata = type;\r\n\t\t\ttype = \"fx\";\r\n\t\t\tsetter--;\r\n\t\t}\r\n\r\n\t\tif ( arguments.length < setter ) {\r\n\t\t\treturn jQuery.queue( this[0], type );\r\n\t\t}\r\n\r\n\t\treturn data === undefined ?\r\n\t\t\tthis :\r\n\t\t\tthis.each(function() {\r\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\r\n\r\n\t\t\t\t// ensure a hooks for this queue\r\n\t\t\t\tjQuery._queueHooks( this, type );\r\n\r\n\t\t\t\tif ( type === \"fx\" && queue[0] !== \"inprogress\" ) {\r\n\t\t\t\t\tjQuery.dequeue( this, type );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t},\r\n\tdequeue: function( type ) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.dequeue( this, type );\r\n\t\t});\r\n\t},\r\n\tclearQueue: function( type ) {\r\n\t\treturn this.queue( type || \"fx\", [] );\r\n\t},\r\n\t// Get a promise resolved when queues of a certain type\r\n\t// are emptied (fx is the type by default)\r\n\tpromise: function( type, obj ) {\r\n\t\tvar tmp,\r\n\t\t\tcount = 1,\r\n\t\t\tdefer = jQuery.Deferred(),\r\n\t\t\telements = this,\r\n\t\t\ti = this.length,\r\n\t\t\tresolve = function() {\r\n\t\t\t\tif ( !( --count ) ) {\r\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\tif ( typeof type !== \"string\" ) {\r\n\t\t\tobj = type;\r\n\t\t\ttype = undefined;\r\n\t\t}\r\n\t\ttype = type || \"fx\";\r\n\r\n\t\twhile ( i-- ) {\r\n\t\t\ttmp = jQuery._data( elements[ i ], type + \"queueHooks\" );\r\n\t\t\tif ( tmp && tmp.empty ) {\r\n\t\t\t\tcount++;\r\n\t\t\t\ttmp.empty.add( resolve );\r\n\t\t\t}\r\n\t\t}\r\n\t\tresolve();\r\n\t\treturn defer.promise( obj );\r\n\t}\r\n});\r\nvar pnum = (/[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/).source;\r\n\r\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\r\n\r\nvar isHidden = function( elem, el ) {\r\n\t\t// isHidden might be called from jQuery#filter function;\r\n\t\t// in that case, element will be second argument\r\n\t\telem = el || elem;\r\n\t\treturn jQuery.css( elem, \"display\" ) === \"none\" || !jQuery.contains( elem.ownerDocument, elem );\r\n\t};\r\n\r\n\r\n\r\n// Multifunctional method to get and set values of a collection\r\n// The value/s can optionally be executed if it's a function\r\nvar access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\r\n\tvar i = 0,\r\n\t\tlength = elems.length,\r\n\t\tbulk = key == null;\r\n\r\n\t// Sets many values\r\n\tif ( jQuery.type( key ) === \"object\" ) {\r\n\t\tchainable = true;\r\n\t\tfor ( i in key ) {\r\n\t\t\tjQuery.access( elems, fn, i, key[i], true, emptyGet, raw );\r\n\t\t}\r\n\r\n\t// Sets one value\r\n\t} else if ( value !== undefined ) {\r\n\t\tchainable = true;\r\n\r\n\t\tif ( !jQuery.isFunction( value ) ) {\r\n\t\t\traw = true;\r\n\t\t}\r\n\r\n\t\tif ( bulk ) {\r\n\t\t\t// Bulk operations run against the entire set\r\n\t\t\tif ( raw ) {\r\n\t\t\t\tfn.call( elems, value );\r\n\t\t\t\tfn = null;\r\n\r\n\t\t\t// ...except when executing function values\r\n\t\t\t} else {\r\n\t\t\t\tbulk = fn;\r\n\t\t\t\tfn = function( elem, key, value ) {\r\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( fn ) {\r\n\t\t\tfor ( ; i < length; i++ ) {\r\n\t\t\t\tfn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn chainable ?\r\n\t\telems :\r\n\r\n\t\t// Gets\r\n\t\tbulk ?\r\n\t\t\tfn.call( elems ) :\r\n\t\t\tlength ? fn( elems[0], key ) : emptyGet;\r\n};\r\nvar rcheckableType = (/^(?:checkbox|radio)$/i);\r\n\r\n\r\n\r\n(function() {\r\n\tvar fragment = document.createDocumentFragment(),\r\n\t\tdiv = document.createElement(\"div\"),\r\n\t\tinput = document.createElement(\"input\");\r\n\r\n\t// Setup\r\n\tdiv.setAttribute( \"className\", \"t\" );\r\n\tdiv.innerHTML = \" <link/><table></table><a href='/a'>a</a>\";\r\n\r\n\t// IE strips leading whitespace when .innerHTML is used\r\n\tsupport.leadingWhitespace = div.firstChild.nodeType === 3;\r\n\r\n\t// Make sure that tbody elements aren't automatically inserted\r\n\t// IE will insert them into empty tables\r\n\tsupport.tbody = !div.getElementsByTagName( \"tbody\" ).length;\r\n\r\n\t// Make sure that link elements get serialized correctly by innerHTML\r\n\t// This requires a wrapper element in IE\r\n\tsupport.htmlSerialize = !!div.getElementsByTagName( \"link\" ).length;\r\n\r\n\t// Makes sure cloning an html5 element does not cause problems\r\n\t// Where outerHTML is undefined, this still works\r\n\tsupport.html5Clone =\r\n\t\tdocument.createElement( \"nav\" ).cloneNode( true ).outerHTML !== \"<:nav></:nav>\";\r\n\r\n\t// Check if a disconnected checkbox will retain its checked\r\n\t// value of true after appended to the DOM (IE6/7)\r\n\tinput.type = \"checkbox\";\r\n\tinput.checked = true;\r\n\tfragment.appendChild( input );\r\n\tsupport.appendChecked = input.checked;\r\n\r\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\r\n\t// Support: IE6-IE11+\r\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\r\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\r\n\r\n\t// #11217 - WebKit loses check when the name is after the checked attribute\r\n\tfragment.appendChild( div );\r\n\tdiv.innerHTML = \"<input type='radio' checked='checked' name='t'/>\";\r\n\r\n\t// Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3\r\n\t// old WebKit doesn't clone checked state correctly in fragments\r\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\r\n\r\n\t// Support: IE<9\r\n\t// Opera does not clone events (and typeof div.attachEvent === undefined).\r\n\t// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()\r\n\tsupport.noCloneEvent = true;\r\n\tif ( div.attachEvent ) {\r\n\t\tdiv.attachEvent( \"onclick\", function() {\r\n\t\t\tsupport.noCloneEvent = false;\r\n\t\t});\r\n\r\n\t\tdiv.cloneNode( true ).click();\r\n\t}\r\n\r\n\t// Execute the test only if not already executed in another module.\r\n\tif (support.deleteExpando == null) {\r\n\t\t// Support: IE<9\r\n\t\tsupport.deleteExpando = true;\r\n\t\ttry {\r\n\t\t\tdelete div.test;\r\n\t\t} catch( e ) {\r\n\t\t\tsupport.deleteExpando = false;\r\n\t\t}\r\n\t}\r\n\r\n\t// Null elements to avoid leaks in IE.\r\n\tfragment = div = input = null;\r\n})();\r\n\r\n\r\n(function() {\r\n\tvar i, eventName,\r\n\t\tdiv = document.createElement( \"div\" );\r\n\r\n\t// Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event)\r\n\tfor ( i in { submit: true, change: true, focusin: true }) {\r\n\t\teventName = \"on\" + i;\r\n\r\n\t\tif ( !(support[ i + \"Bubbles\" ] = eventName in window) ) {\r\n\t\t\t// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP)\r\n\t\t\tdiv.setAttribute( eventName, \"t\" );\r\n\t\t\tsupport[ i + \"Bubbles\" ] = div.attributes[ eventName ].expando === false;\r\n\t\t}\r\n\t}\r\n\r\n\t// Null elements to avoid leaks in IE.\r\n\tdiv = null;\r\n})();\r\n\r\n\r\nvar rformElems = /^(?:input|select|textarea)$/i,\r\n\trkeyEvent = /^key/,\r\n\trmouseEvent = /^(?:mouse|contextmenu)|click/,\r\n\trfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\r\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)$/;\r\n\r\nfunction returnTrue() {\r\n\treturn true;\r\n}\r\n\r\nfunction returnFalse() {\r\n\treturn false;\r\n}\r\n\r\nfunction safeActiveElement() {\r\n\ttry {\r\n\t\treturn document.activeElement;\r\n\t} catch ( err ) { }\r\n}\r\n\r\n/*\r\n * Helper functions for managing events -- not part of the public interface.\r\n * Props to Dean Edwards' addEvent library for many of the ideas.\r\n */\r\njQuery.event = {\r\n\r\n\tglobal: {},\r\n\r\n\tadd: function( elem, types, handler, data, selector ) {\r\n\t\tvar tmp, events, t, handleObjIn,\r\n\t\t\tspecial, eventHandle, handleObj,\r\n\t\t\thandlers, type, namespaces, origType,\r\n\t\t\telemData = jQuery._data( elem );\r\n\r\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\r\n\t\tif ( !elemData ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Caller can pass in an object of custom data in lieu of the handler\r\n\t\tif ( handler.handler ) {\r\n\t\t\thandleObjIn = handler;\r\n\t\t\thandler = handleObjIn.handler;\r\n\t\t\tselector = handleObjIn.selector;\r\n\t\t}\r\n\r\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\r\n\t\tif ( !handler.guid ) {\r\n\t\t\thandler.guid = jQuery.guid++;\r\n\t\t}\r\n\r\n\t\t// Init the element's event structure and main handler, if this is the first\r\n\t\tif ( !(events = elemData.events) ) {\r\n\t\t\tevents = elemData.events = {};\r\n\t\t}\r\n\t\tif ( !(eventHandle = elemData.handle) ) {\r\n\t\t\teventHandle = elemData.handle = function( e ) {\r\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\r\n\t\t\t\t// when an event is called after a page has unloaded\r\n\t\t\t\treturn typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ?\r\n\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\r\n\t\t\t\t\tundefined;\r\n\t\t\t};\r\n\t\t\t// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events\r\n\t\t\teventHandle.elem = elem;\r\n\t\t}\r\n\r\n\t\t// Handle multiple events separated by a space\r\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\r\n\t\tt = types.length;\r\n\t\twhile ( t-- ) {\r\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\r\n\t\t\ttype = origType = tmp[1];\r\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\r\n\r\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\r\n\t\t\tif ( !type ) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// If event changes its type, use the special event handlers for the changed type\r\n\t\t\tspecial = jQuery.event.special[ type ] || {};\r\n\r\n\t\t\t// If selector defined, determine special event api type, otherwise given type\r\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\r\n\r\n\t\t\t// Update special based on newly reset type\r\n\t\t\tspecial = jQuery.event.special[ type ] || {};\r\n\r\n\t\t\t// handleObj is passed to all event handlers\r\n\t\t\thandleObj = jQuery.extend({\r\n\t\t\t\ttype: type,\r\n\t\t\t\torigType: origType,\r\n\t\t\t\tdata: data,\r\n\t\t\t\thandler: handler,\r\n\t\t\t\tguid: handler.guid,\r\n\t\t\t\tselector: selector,\r\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\r\n\t\t\t\tnamespace: namespaces.join(\".\")\r\n\t\t\t}, handleObjIn );\r\n\r\n\t\t\t// Init the event handler queue if we're the first\r\n\t\t\tif ( !(handlers = events[ type ]) ) {\r\n\t\t\t\thandlers = events[ type ] = [];\r\n\t\t\t\thandlers.delegateCount = 0;\r\n\r\n\t\t\t\t// Only use addEventListener/attachEvent if the special events handler returns false\r\n\t\t\t\tif ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {\r\n\t\t\t\t\t// Bind the global event handler to the element\r\n\t\t\t\t\tif ( elem.addEventListener ) {\r\n\t\t\t\t\t\telem.addEventListener( type, eventHandle, false );\r\n\r\n\t\t\t\t\t} else if ( elem.attachEvent ) {\r\n\t\t\t\t\t\telem.attachEvent( \"on\" + type, eventHandle );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( special.add ) {\r\n\t\t\t\tspecial.add.call( elem, handleObj );\r\n\r\n\t\t\t\tif ( !handleObj.handler.guid ) {\r\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Add to the element's handler list, delegates in front\r\n\t\t\tif ( selector ) {\r\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\r\n\t\t\t} else {\r\n\t\t\t\thandlers.push( handleObj );\r\n\t\t\t}\r\n\r\n\t\t\t// Keep track of which events have ever been used, for event optimization\r\n\t\t\tjQuery.event.global[ type ] = true;\r\n\t\t}\r\n\r\n\t\t// Nullify elem to prevent memory leaks in IE\r\n\t\telem = null;\r\n\t},\r\n\r\n\t// Detach an event or set of events from an element\r\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\r\n\t\tvar j, handleObj, tmp,\r\n\t\t\torigCount, t, events,\r\n\t\t\tspecial, handlers, type,\r\n\t\t\tnamespaces, origType,\r\n\t\t\telemData = jQuery.hasData( elem ) && jQuery._data( elem );\r\n\r\n\t\tif ( !elemData || !(events = elemData.events) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Once for each type.namespace in types; type may be omitted\r\n\t\ttypes = ( types || \"\" ).match( rnotwhite ) || [ \"\" ];\r\n\t\tt = types.length;\r\n\t\twhile ( t-- ) {\r\n\t\t\ttmp = rtypenamespace.exec( types[t] ) || [];\r\n\t\t\ttype = origType = tmp[1];\r\n\t\t\tnamespaces = ( tmp[2] || \"\" ).split( \".\" ).sort();\r\n\r\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\r\n\t\t\tif ( !type ) {\r\n\t\t\t\tfor ( type in events ) {\r\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\r\n\t\t\t\t}\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tspecial = jQuery.event.special[ type ] || {};\r\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\r\n\t\t\thandlers = events[ type ] || [];\r\n\t\t\ttmp = tmp[2] && new RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" );\r\n\r\n\t\t\t// Remove matching events\r\n\t\t\torigCount = j = handlers.length;\r\n\t\t\twhile ( j-- ) {\r\n\t\t\t\thandleObj = handlers[ j ];\r\n\r\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\r\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\r\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\r\n\t\t\t\t\t( !selector || selector === handleObj.selector || selector === \"**\" && handleObj.selector ) ) {\r\n\t\t\t\t\thandlers.splice( j, 1 );\r\n\r\n\t\t\t\t\tif ( handleObj.selector ) {\r\n\t\t\t\t\t\thandlers.delegateCount--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( special.remove ) {\r\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\r\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\r\n\t\t\tif ( origCount && !handlers.length ) {\r\n\t\t\t\tif ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {\r\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdelete events[ type ];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Remove the expando if it's no longer used\r\n\t\tif ( jQuery.isEmptyObject( events ) ) {\r\n\t\t\tdelete elemData.handle;\r\n\r\n\t\t\t// removeData also checks for emptiness and clears the expando if empty\r\n\t\t\t// so use it instead of delete\r\n\t\t\tjQuery._removeData( elem, \"events\" );\r\n\t\t}\r\n\t},\r\n\r\n\ttrigger: function( event, data, elem, onlyHandlers ) {\r\n\t\tvar handle, ontype, cur,\r\n\t\t\tbubbleType, special, tmp, i,\r\n\t\t\teventPath = [ elem || document ],\r\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\r\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split(\".\") : [];\r\n\r\n\t\tcur = tmp = elem = elem || document;\r\n\r\n\t\t// Don't do events on text and comment nodes\r\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\r\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( type.indexOf(\".\") >= 0 ) {\r\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\r\n\t\t\tnamespaces = type.split(\".\");\r\n\t\t\ttype = namespaces.shift();\r\n\t\t\tnamespaces.sort();\r\n\t\t}\r\n\t\tontype = type.indexOf(\":\") < 0 && \"on\" + type;\r\n\r\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\r\n\t\tevent = event[ jQuery.expando ] ?\r\n\t\t\tevent :\r\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\r\n\r\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\r\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\r\n\t\tevent.namespace = namespaces.join(\".\");\r\n\t\tevent.namespace_re = event.namespace ?\r\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join(\"\\\\.(?:.*\\\\.|)\") + \"(\\\\.|$)\" ) :\r\n\t\t\tnull;\r\n\r\n\t\t// Clean up the event in case it is being reused\r\n\t\tevent.result = undefined;\r\n\t\tif ( !event.target ) {\r\n\t\t\tevent.target = elem;\r\n\t\t}\r\n\r\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\r\n\t\tdata = data == null ?\r\n\t\t\t[ event ] :\r\n\t\t\tjQuery.makeArray( data, [ event ] );\r\n\r\n\t\t// Allow special events to draw outside the lines\r\n\t\tspecial = jQuery.event.special[ type ] || {};\r\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\r\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\r\n\t\tif ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {\r\n\r\n\t\t\tbubbleType = special.delegateType || type;\r\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\r\n\t\t\t\tcur = cur.parentNode;\r\n\t\t\t}\r\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\r\n\t\t\t\teventPath.push( cur );\r\n\t\t\t\ttmp = cur;\r\n\t\t\t}\r\n\r\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\r\n\t\t\tif ( tmp === (elem.ownerDocument || document) ) {\r\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Fire handlers on the event path\r\n\t\ti = 0;\r\n\t\twhile ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {\r\n\r\n\t\t\tevent.type = i > 1 ?\r\n\t\t\t\tbubbleType :\r\n\t\t\t\tspecial.bindType || type;\r\n\r\n\t\t\t// jQuery handler\r\n\t\t\thandle = ( jQuery._data( cur, \"events\" ) || {} )[ event.type ] && jQuery._data( cur, \"handle\" );\r\n\t\t\tif ( handle ) {\r\n\t\t\t\thandle.apply( cur, data );\r\n\t\t\t}\r\n\r\n\t\t\t// Native handler\r\n\t\t\thandle = ontype && cur[ ontype ];\r\n\t\t\tif ( handle && handle.apply && jQuery.acceptData( cur ) ) {\r\n\t\t\t\tevent.result = handle.apply( cur, data );\r\n\t\t\t\tif ( event.result === false ) {\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tevent.type = type;\r\n\r\n\t\t// If nobody prevented the default action, do it now\r\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\r\n\r\n\t\t\tif ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&\r\n\t\t\t\tjQuery.acceptData( elem ) ) {\r\n\r\n\t\t\t\t// Call a native DOM method on the target with the same name name as the event.\r\n\t\t\t\t// Can't use an .isFunction() check here because IE6/7 fails that test.\r\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\r\n\t\t\t\tif ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {\r\n\r\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\r\n\t\t\t\t\ttmp = elem[ ontype ];\r\n\r\n\t\t\t\t\tif ( tmp ) {\r\n\t\t\t\t\t\telem[ ontype ] = null;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\r\n\t\t\t\t\tjQuery.event.triggered = type;\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\telem[ type ]();\r\n\t\t\t\t\t} catch ( e ) {\r\n\t\t\t\t\t\t// IE<9 dies on focus/blur to hidden element (#1486,#12518)\r\n\t\t\t\t\t\t// only reproducible on winXP IE8 native, not IE9 in IE8 mode\r\n\t\t\t\t\t}\r\n\t\t\t\t\tjQuery.event.triggered = undefined;\r\n\r\n\t\t\t\t\tif ( tmp ) {\r\n\t\t\t\t\t\telem[ ontype ] = tmp;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn event.result;\r\n\t},\r\n\r\n\tdispatch: function( event ) {\r\n\r\n\t\t// Make a writable jQuery.Event from the native event object\r\n\t\tevent = jQuery.event.fix( event );\r\n\r\n\t\tvar i, ret, handleObj, matched, j,\r\n\t\t\thandlerQueue = [],\r\n\t\t\targs = slice.call( arguments ),\r\n\t\t\thandlers = ( jQuery._data( this, \"events\" ) || {} )[ event.type ] || [],\r\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\r\n\r\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\r\n\t\targs[0] = event;\r\n\t\tevent.delegateTarget = this;\r\n\r\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\r\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Determine handlers\r\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\r\n\r\n\t\t// Run delegates first; they may want to stop propagation beneath us\r\n\t\ti = 0;\r\n\t\twhile ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {\r\n\t\t\tevent.currentTarget = matched.elem;\r\n\r\n\t\t\tj = 0;\r\n\t\t\twhile ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {\r\n\r\n\t\t\t\t// Triggered event must either 1) have no namespace, or\r\n\t\t\t\t// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).\r\n\t\t\t\tif ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {\r\n\r\n\t\t\t\t\tevent.handleObj = handleObj;\r\n\t\t\t\t\tevent.data = handleObj.data;\r\n\r\n\t\t\t\t\tret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )\r\n\t\t\t\t\t\t\t.apply( matched.elem, args );\r\n\r\n\t\t\t\t\tif ( ret !== undefined ) {\r\n\t\t\t\t\t\tif ( (event.result = ret) === false ) {\r\n\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t\tevent.stopPropagation();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Call the postDispatch hook for the mapped type\r\n\t\tif ( special.postDispatch ) {\r\n\t\t\tspecial.postDispatch.call( this, event );\r\n\t\t}\r\n\r\n\t\treturn event.result;\r\n\t},\r\n\r\n\thandlers: function( event, handlers ) {\r\n\t\tvar sel, handleObj, matches, i,\r\n\t\t\thandlerQueue = [],\r\n\t\t\tdelegateCount = handlers.delegateCount,\r\n\t\t\tcur = event.target;\r\n\r\n\t\t// Find delegate handlers\r\n\t\t// Black-hole SVG <use> instance trees (#13180)\r\n\t\t// Avoid non-left-click bubbling in Firefox (#3861)\r\n\t\tif ( delegateCount && cur.nodeType && (!event.button || event.type !== \"click\") ) {\r\n\r\n\t\t\t/* jshint eqeqeq: false */\r\n\t\t\tfor ( ; cur != this; cur = cur.parentNode || this ) {\r\n\t\t\t\t/* jshint eqeqeq: true */\r\n\r\n\t\t\t\t// Don't check non-elements (#13208)\r\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\r\n\t\t\t\tif ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== \"click\") ) {\r\n\t\t\t\t\tmatches = [];\r\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\r\n\t\t\t\t\t\thandleObj = handlers[ i ];\r\n\r\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\r\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\r\n\r\n\t\t\t\t\t\tif ( matches[ sel ] === undefined ) {\r\n\t\t\t\t\t\t\tmatches[ sel ] = handleObj.needsContext ?\r\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) >= 0 :\r\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif ( matches[ sel ] ) {\r\n\t\t\t\t\t\t\tmatches.push( handleObj );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( matches.length ) {\r\n\t\t\t\t\t\thandlerQueue.push({ elem: cur, handlers: matches });\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Add the remaining (directly-bound) handlers\r\n\t\tif ( delegateCount < handlers.length ) {\r\n\t\t\thandlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });\r\n\t\t}\r\n\r\n\t\treturn handlerQueue;\r\n\t},\r\n\r\n\tfix: function( event ) {\r\n\t\tif ( event[ jQuery.expando ] ) {\r\n\t\t\treturn event;\r\n\t\t}\r\n\r\n\t\t// Create a writable copy of the event object and normalize some properties\r\n\t\tvar i, prop, copy,\r\n\t\t\ttype = event.type,\r\n\t\t\toriginalEvent = event,\r\n\t\t\tfixHook = this.fixHooks[ type ];\r\n\r\n\t\tif ( !fixHook ) {\r\n\t\t\tthis.fixHooks[ type ] = fixHook =\r\n\t\t\t\trmouseEvent.test( type ) ? this.mouseHooks :\r\n\t\t\t\trkeyEvent.test( type ) ? this.keyHooks :\r\n\t\t\t\t{};\r\n\t\t}\r\n\t\tcopy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;\r\n\r\n\t\tevent = new jQuery.Event( originalEvent );\r\n\r\n\t\ti = copy.length;\r\n\t\twhile ( i-- ) {\r\n\t\t\tprop = copy[ i ];\r\n\t\t\tevent[ prop ] = originalEvent[ prop ];\r\n\t\t}\r\n\r\n\t\t// Support: IE<9\r\n\t\t// Fix target property (#1925)\r\n\t\tif ( !event.target ) {\r\n\t\t\tevent.target = originalEvent.srcElement || document;\r\n\t\t}\r\n\r\n\t\t// Support: Chrome 23+, Safari?\r\n\t\t// Target should not be a text node (#504, #13143)\r\n\t\tif ( event.target.nodeType === 3 ) {\r\n\t\t\tevent.target = event.target.parentNode;\r\n\t\t}\r\n\r\n\t\t// Support: IE<9\r\n\t\t// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)\r\n\t\tevent.metaKey = !!event.metaKey;\r\n\r\n\t\treturn fixHook.filter ? fixHook.filter( event, originalEvent ) : event;\r\n\t},\r\n\r\n\t// Includes some event props shared by KeyEvent and MouseEvent\r\n\tprops: \"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which\".split(\" \"),\r\n\r\n\tfixHooks: {},\r\n\r\n\tkeyHooks: {\r\n\t\tprops: \"char charCode key keyCode\".split(\" \"),\r\n\t\tfilter: function( event, original ) {\r\n\r\n\t\t\t// Add which for key events\r\n\t\t\tif ( event.which == null ) {\r\n\t\t\t\tevent.which = original.charCode != null ? original.charCode : original.keyCode;\r\n\t\t\t}\r\n\r\n\t\t\treturn event;\r\n\t\t}\r\n\t},\r\n\r\n\tmouseHooks: {\r\n\t\tprops: \"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement\".split(\" \"),\r\n\t\tfilter: function( event, original ) {\r\n\t\t\tvar body, eventDoc, doc,\r\n\t\t\t\tbutton = original.button,\r\n\t\t\t\tfromElement = original.fromElement;\r\n\r\n\t\t\t// Calculate pageX/Y if missing and clientX/Y available\r\n\t\t\tif ( event.pageX == null && original.clientX != null ) {\r\n\t\t\t\teventDoc = event.target.ownerDocument || document;\r\n\t\t\t\tdoc = eventDoc.documentElement;\r\n\t\t\t\tbody = eventDoc.body;\r\n\r\n\t\t\t\tevent.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );\r\n\t\t\t\tevent.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );\r\n\t\t\t}\r\n\r\n\t\t\t// Add relatedTarget, if necessary\r\n\t\t\tif ( !event.relatedTarget && fromElement ) {\r\n\t\t\t\tevent.relatedTarget = fromElement === event.target ? original.toElement : fromElement;\r\n\t\t\t}\r\n\r\n\t\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\r\n\t\t\t// Note: button is not normalized, so don't use it\r\n\t\t\tif ( !event.which && button !== undefined ) {\r\n\t\t\t\tevent.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );\r\n\t\t\t}\r\n\r\n\t\t\treturn event;\r\n\t\t}\r\n\t},\r\n\r\n\tspecial: {\r\n\t\tload: {\r\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\r\n\t\t\tnoBubble: true\r\n\t\t},\r\n\t\tfocus: {\r\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\r\n\t\t\ttrigger: function() {\r\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tthis.focus();\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t} catch ( e ) {\r\n\t\t\t\t\t\t// Support: IE<9\r\n\t\t\t\t\t\t// If we error on focus to hidden element (#1486, #12518),\r\n\t\t\t\t\t\t// let .trigger() run the handlers\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tdelegateType: \"focusin\"\r\n\t\t},\r\n\t\tblur: {\r\n\t\t\ttrigger: function() {\r\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\r\n\t\t\t\t\tthis.blur();\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tdelegateType: \"focusout\"\r\n\t\t},\r\n\t\tclick: {\r\n\t\t\t// For checkbox, fire native event so checked state will be right\r\n\t\t\ttrigger: function() {\r\n\t\t\t\tif ( jQuery.nodeName( this, \"input\" ) && this.type === \"checkbox\" && this.click ) {\r\n\t\t\t\t\tthis.click();\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\r\n\t\t\t_default: function( event ) {\r\n\t\t\t\treturn jQuery.nodeName( event.target, \"a\" );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tbeforeunload: {\r\n\t\t\tpostDispatch: function( event ) {\r\n\r\n\t\t\t\t// Even when returnValue equals to undefined Firefox will still show alert\r\n\t\t\t\tif ( event.result !== undefined ) {\r\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tsimulate: function( type, elem, event, bubble ) {\r\n\t\t// Piggyback on a donor event to simulate a different one.\r\n\t\t// Fake originalEvent to avoid donor's stopPropagation, but if the\r\n\t\t// simulated event prevents default then we do the same on the donor.\r\n\t\tvar e = jQuery.extend(\r\n\t\t\tnew jQuery.Event(),\r\n\t\t\tevent,\r\n\t\t\t{\r\n\t\t\t\ttype: type,\r\n\t\t\t\tisSimulated: true,\r\n\t\t\t\toriginalEvent: {}\r\n\t\t\t}\r\n\t\t);\r\n\t\tif ( bubble ) {\r\n\t\t\tjQuery.event.trigger( e, null, elem );\r\n\t\t} else {\r\n\t\t\tjQuery.event.dispatch.call( elem, e );\r\n\t\t}\r\n\t\tif ( e.isDefaultPrevented() ) {\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t}\r\n};\r\n\r\njQuery.removeEvent = document.removeEventListener ?\r\n\tfunction( elem, type, handle ) {\r\n\t\tif ( elem.removeEventListener ) {\r\n\t\t\telem.removeEventListener( type, handle, false );\r\n\t\t}\r\n\t} :\r\n\tfunction( elem, type, handle ) {\r\n\t\tvar name = \"on\" + type;\r\n\r\n\t\tif ( elem.detachEvent ) {\r\n\r\n\t\t\t// #8545, #7054, preventing memory leaks for custom events in IE6-8\r\n\t\t\t// detachEvent needed property on element, by name of that event, to properly expose it to GC\r\n\t\t\tif ( typeof elem[ name ] === strundefined ) {\r\n\t\t\t\telem[ name ] = null;\r\n\t\t\t}\r\n\r\n\t\t\telem.detachEvent( name, handle );\r\n\t\t}\r\n\t};\r\n\r\njQuery.Event = function( src, props ) {\r\n\t// Allow instantiation without the 'new' keyword\r\n\tif ( !(this instanceof jQuery.Event) ) {\r\n\t\treturn new jQuery.Event( src, props );\r\n\t}\r\n\r\n\t// Event object\r\n\tif ( src && src.type ) {\r\n\t\tthis.originalEvent = src;\r\n\t\tthis.type = src.type;\r\n\r\n\t\t// Events bubbling up the document may have been marked as prevented\r\n\t\t// by a handler lower down the tree; reflect the correct value.\r\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\r\n\t\t\t\tsrc.defaultPrevented === undefined && (\r\n\t\t\t\t// Support: IE < 9\r\n\t\t\t\tsrc.returnValue === false ||\r\n\t\t\t\t// Support: Android < 4.0\r\n\t\t\t\tsrc.getPreventDefault && src.getPreventDefault() ) ?\r\n\t\t\treturnTrue :\r\n\t\t\treturnFalse;\r\n\r\n\t// Event type\r\n\t} else {\r\n\t\tthis.type = src;\r\n\t}\r\n\r\n\t// Put explicitly provided properties onto the event object\r\n\tif ( props ) {\r\n\t\tjQuery.extend( this, props );\r\n\t}\r\n\r\n\t// Create a timestamp if incoming event doesn't have one\r\n\tthis.timeStamp = src && src.timeStamp || jQuery.now();\r\n\r\n\t// Mark it as fixed\r\n\tthis[ jQuery.expando ] = true;\r\n};\r\n\r\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\r\n// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\r\njQuery.Event.prototype = {\r\n\tisDefaultPrevented: returnFalse,\r\n\tisPropagationStopped: returnFalse,\r\n\tisImmediatePropagationStopped: returnFalse,\r\n\r\n\tpreventDefault: function() {\r\n\t\tvar e = this.originalEvent;\r\n\r\n\t\tthis.isDefaultPrevented = returnTrue;\r\n\t\tif ( !e ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// If preventDefault exists, run it on the original event\r\n\t\tif ( e.preventDefault ) {\r\n\t\t\te.preventDefault();\r\n\r\n\t\t// Support: IE\r\n\t\t// Otherwise set the returnValue property of the original event to false\r\n\t\t} else {\r\n\t\t\te.returnValue = false;\r\n\t\t}\r\n\t},\r\n\tstopPropagation: function() {\r\n\t\tvar e = this.originalEvent;\r\n\r\n\t\tthis.isPropagationStopped = returnTrue;\r\n\t\tif ( !e ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// If stopPropagation exists, run it on the original event\r\n\t\tif ( e.stopPropagation ) {\r\n\t\t\te.stopPropagation();\r\n\t\t}\r\n\r\n\t\t// Support: IE\r\n\t\t// Set the cancelBubble property of the original event to true\r\n\t\te.cancelBubble = true;\r\n\t},\r\n\tstopImmediatePropagation: function() {\r\n\t\tthis.isImmediatePropagationStopped = returnTrue;\r\n\t\tthis.stopPropagation();\r\n\t}\r\n};\r\n\r\n// Create mouseenter/leave events using mouseover/out and event-time checks\r\njQuery.each({\r\n\tmouseenter: \"mouseover\",\r\n\tmouseleave: \"mouseout\"\r\n}, function( orig, fix ) {\r\n\tjQuery.event.special[ orig ] = {\r\n\t\tdelegateType: fix,\r\n\t\tbindType: fix,\r\n\r\n\t\thandle: function( event ) {\r\n\t\t\tvar ret,\r\n\t\t\t\ttarget = this,\r\n\t\t\t\trelated = event.relatedTarget,\r\n\t\t\t\thandleObj = event.handleObj;\r\n\r\n\t\t\t// For mousenter/leave call the handler if related is outside the target.\r\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\r\n\t\t\tif ( !related || (related !== target && !jQuery.contains( target, related )) ) {\r\n\t\t\t\tevent.type = handleObj.origType;\r\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\r\n\t\t\t\tevent.type = fix;\r\n\t\t\t}\r\n\t\t\treturn ret;\r\n\t\t}\r\n\t};\r\n});\r\n\r\n// IE submit delegation\r\nif ( !support.submitBubbles ) {\r\n\r\n\tjQuery.event.special.submit = {\r\n\t\tsetup: function() {\r\n\t\t\t// Only need this for delegated form submit events\r\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Lazy-add a submit handler when a descendant form may potentially be submitted\r\n\t\t\tjQuery.event.add( this, \"click._submit keypress._submit\", function( e ) {\r\n\t\t\t\t// Node name check avoids a VML-related crash in IE (#9807)\r\n\t\t\t\tvar elem = e.target,\r\n\t\t\t\t\tform = jQuery.nodeName( elem, \"input\" ) || jQuery.nodeName( elem, \"button\" ) ? elem.form : undefined;\r\n\t\t\t\tif ( form && !jQuery._data( form, \"submitBubbles\" ) ) {\r\n\t\t\t\t\tjQuery.event.add( form, \"submit._submit\", function( event ) {\r\n\t\t\t\t\t\tevent._submit_bubble = true;\r\n\t\t\t\t\t});\r\n\t\t\t\t\tjQuery._data( form, \"submitBubbles\", true );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t// return undefined since we don't need an event listener\r\n\t\t},\r\n\r\n\t\tpostDispatch: function( event ) {\r\n\t\t\t// If form was submitted by the user, bubble the event up the tree\r\n\t\t\tif ( event._submit_bubble ) {\r\n\t\t\t\tdelete event._submit_bubble;\r\n\t\t\t\tif ( this.parentNode && !event.isTrigger ) {\r\n\t\t\t\t\tjQuery.event.simulate( \"submit\", this.parentNode, event, true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tteardown: function() {\r\n\t\t\t// Only need this for delegated form submit events\r\n\t\t\tif ( jQuery.nodeName( this, \"form\" ) ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\t// Remove delegated handlers; cleanData eventually reaps submit handlers attached above\r\n\t\t\tjQuery.event.remove( this, \"._submit\" );\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// IE change delegation and checkbox/radio fix\r\nif ( !support.changeBubbles ) {\r\n\r\n\tjQuery.event.special.change = {\r\n\r\n\t\tsetup: function() {\r\n\r\n\t\t\tif ( rformElems.test( this.nodeName ) ) {\r\n\t\t\t\t// IE doesn't fire change on a check/radio until blur; trigger it on click\r\n\t\t\t\t// after a propertychange. Eat the blur-change in special.change.handle.\r\n\t\t\t\t// This still fires onchange a second time for check/radio after blur.\r\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\r\n\t\t\t\t\tjQuery.event.add( this, \"propertychange._change\", function( event ) {\r\n\t\t\t\t\t\tif ( event.originalEvent.propertyName === \"checked\" ) {\r\n\t\t\t\t\t\t\tthis._just_changed = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tjQuery.event.add( this, \"click._change\", function( event ) {\r\n\t\t\t\t\t\tif ( this._just_changed && !event.isTrigger ) {\r\n\t\t\t\t\t\t\tthis._just_changed = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// Allow triggered, simulated change events (#11500)\r\n\t\t\t\t\t\tjQuery.event.simulate( \"change\", this, event, true );\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\t// Delegated event; lazy-add a change handler on descendant inputs\r\n\t\t\tjQuery.event.add( this, \"beforeactivate._change\", function( e ) {\r\n\t\t\t\tvar elem = e.target;\r\n\r\n\t\t\t\tif ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, \"changeBubbles\" ) ) {\r\n\t\t\t\t\tjQuery.event.add( elem, \"change._change\", function( event ) {\r\n\t\t\t\t\t\tif ( this.parentNode && !event.isSimulated && !event.isTrigger ) {\r\n\t\t\t\t\t\t\tjQuery.event.simulate( \"change\", this.parentNode, event, true );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tjQuery._data( elem, \"changeBubbles\", true );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\thandle: function( event ) {\r\n\t\t\tvar elem = event.target;\r\n\r\n\t\t\t// Swallow native change events from checkbox/radio, we already triggered them above\r\n\t\t\tif ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== \"radio\" && elem.type !== \"checkbox\") ) {\r\n\t\t\t\treturn event.handleObj.handler.apply( this, arguments );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tteardown: function() {\r\n\t\t\tjQuery.event.remove( this, \"._change\" );\r\n\r\n\t\t\treturn !rformElems.test( this.nodeName );\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// Create \"bubbling\" focus and blur events\r\nif ( !support.focusinBubbles ) {\r\n\tjQuery.each({ focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\r\n\r\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\r\n\t\tvar handler = function( event ) {\r\n\t\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );\r\n\t\t\t};\r\n\r\n\t\tjQuery.event.special[ fix ] = {\r\n\t\t\tsetup: function() {\r\n\t\t\t\tvar doc = this.ownerDocument || this,\r\n\t\t\t\t\tattaches = jQuery._data( doc, fix );\r\n\r\n\t\t\t\tif ( !attaches ) {\r\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\r\n\t\t\t\t}\r\n\t\t\t\tjQuery._data( doc, fix, ( attaches || 0 ) + 1 );\r\n\t\t\t},\r\n\t\t\tteardown: function() {\r\n\t\t\t\tvar doc = this.ownerDocument || this,\r\n\t\t\t\t\tattaches = jQuery._data( doc, fix ) - 1;\r\n\r\n\t\t\t\tif ( !attaches ) {\r\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\r\n\t\t\t\t\tjQuery._removeData( doc, fix );\r\n\t\t\t\t} else {\r\n\t\t\t\t\tjQuery._data( doc, fix, attaches );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t});\r\n}\r\n\r\njQuery.fn.extend({\r\n\r\n\ton: function( types, selector, data, fn, /*INTERNAL*/ one ) {\r\n\t\tvar type, origFn;\r\n\r\n\t\t// Types can be a map of types/handlers\r\n\t\tif ( typeof types === \"object\" ) {\r\n\t\t\t// ( types-Object, selector, data )\r\n\t\t\tif ( typeof selector !== \"string\" ) {\r\n\t\t\t\t// ( types-Object, data )\r\n\t\t\t\tdata = data || selector;\r\n\t\t\t\tselector = undefined;\r\n\t\t\t}\r\n\t\t\tfor ( type in types ) {\r\n\t\t\t\tthis.on( type, selector, data, types[ type ], one );\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif ( data == null && fn == null ) {\r\n\t\t\t// ( types, fn )\r\n\t\t\tfn = selector;\r\n\t\t\tdata = selector = undefined;\r\n\t\t} else if ( fn == null ) {\r\n\t\t\tif ( typeof selector === \"string\" ) {\r\n\t\t\t\t// ( types, selector, fn )\r\n\t\t\t\tfn = data;\r\n\t\t\t\tdata = undefined;\r\n\t\t\t} else {\r\n\t\t\t\t// ( types, data, fn )\r\n\t\t\t\tfn = data;\r\n\t\t\t\tdata = selector;\r\n\t\t\t\tselector = undefined;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif ( fn === false ) {\r\n\t\t\tfn = returnFalse;\r\n\t\t} else if ( !fn ) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif ( one === 1 ) {\r\n\t\t\torigFn = fn;\r\n\t\t\tfn = function( event ) {\r\n\t\t\t\t// Can use an empty set, since event contains the info\r\n\t\t\t\tjQuery().off( event );\r\n\t\t\t\treturn origFn.apply( this, arguments );\r\n\t\t\t};\r\n\t\t\t// Use same guid so caller can remove using origFn\r\n\t\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\r\n\t\t}\r\n\t\treturn this.each( function() {\r\n\t\t\tjQuery.event.add( this, types, fn, data, selector );\r\n\t\t});\r\n\t},\r\n\tone: function( types, selector, data, fn ) {\r\n\t\treturn this.on( types, selector, data, fn, 1 );\r\n\t},\r\n\toff: function( types, selector, fn ) {\r\n\t\tvar handleObj, type;\r\n\t\tif ( types && types.preventDefault && types.handleObj ) {\r\n\t\t\t// ( event ) dispatched jQuery.Event\r\n\t\t\thandleObj = types.handleObj;\r\n\t\t\tjQuery( types.delegateTarget ).off(\r\n\t\t\t\thandleObj.namespace ? handleObj.origType + \".\" + handleObj.namespace : handleObj.origType,\r\n\t\t\t\thandleObj.selector,\r\n\t\t\t\thandleObj.handler\r\n\t\t\t);\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif ( typeof types === \"object\" ) {\r\n\t\t\t// ( types-object [, selector] )\r\n\t\t\tfor ( type in types ) {\r\n\t\t\t\tthis.off( type, selector, types[ type ] );\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif ( selector === false || typeof selector === \"function\" ) {\r\n\t\t\t// ( types [, fn] )\r\n\t\t\tfn = selector;\r\n\t\t\tselector = undefined;\r\n\t\t}\r\n\t\tif ( fn === false ) {\r\n\t\t\tfn = returnFalse;\r\n\t\t}\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.event.remove( this, types, fn, selector );\r\n\t\t});\r\n\t},\r\n\r\n\ttrigger: function( type, data ) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.event.trigger( type, data, this );\r\n\t\t});\r\n\t},\r\n\ttriggerHandler: function( type, data ) {\r\n\t\tvar elem = this[0];\r\n\t\tif ( elem ) {\r\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\r\n\t\t}\r\n\t}\r\n});\r\n\r\n\r\nfunction createSafeFragment( document ) {\r\n\tvar list = nodeNames.split( \"|\" ),\r\n\t\tsafeFrag = document.createDocumentFragment();\r\n\r\n\tif ( safeFrag.createElement ) {\r\n\t\twhile ( list.length ) {\r\n\t\t\tsafeFrag.createElement(\r\n\t\t\t\tlist.pop()\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\treturn safeFrag;\r\n}\r\n\r\nvar nodeNames = \"abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|\" +\r\n\t\t\"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video\",\r\n\trinlinejQuery = / jQuery\\d+=\"(?:null|\\d+)\"/g,\r\n\trnoshimcache = new RegExp(\"<(?:\" + nodeNames + \")[\\\\s/>]\", \"i\"),\r\n\trleadingWhitespace = /^\\s+/,\r\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi,\r\n\trtagName = /<([\\w:]+)/,\r\n\trtbody = /<tbody/i,\r\n\trhtml = /<|&#?\\w+;/,\r\n\trnoInnerhtml = /<(?:script|style|link)/i,\r\n\t// checked=\"checked\" or checked\r\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\r\n\trscriptType = /^$|\\/(?:java|ecma)script/i,\r\n\trscriptTypeMasked = /^true\\/(.*)/,\r\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g,\r\n\r\n\t// We have to close these tags to support XHTML (#13200)\r\n\twrapMap = {\r\n\t\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\r\n\t\tlegend: [ 1, \"<fieldset>\", \"</fieldset>\" ],\r\n\t\tarea: [ 1, \"<map>\", \"</map>\" ],\r\n\t\tparam: [ 1, \"<object>\", \"</object>\" ],\r\n\t\tthead: [ 1, \"<table>\", \"</table>\" ],\r\n\t\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\r\n\t\tcol: [ 2, \"<table><tbody></tbody><colgroup>\", \"</colgroup></table>\" ],\r\n\t\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\r\n\r\n\t\t// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,\r\n\t\t// unless wrapped in a div with non-breaking characters in front of it.\r\n\t\t_default: support.htmlSerialize ? [ 0, \"\", \"\" ] : [ 1, \"X<div>\", \"</div>\" ]\r\n\t},\r\n\tsafeFragment = createSafeFragment( document ),\r\n\tfragmentDiv = safeFragment.appendChild( document.createElement(\"div\") );\r\n\r\nwrapMap.optgroup = wrapMap.option;\r\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\r\nwrapMap.th = wrapMap.td;\r\n\r\nfunction getAll( context, tag ) {\r\n\tvar elems, elem,\r\n\t\ti = 0,\r\n\t\tfound = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || \"*\" ) :\r\n\t\t\ttypeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || \"*\" ) :\r\n\t\t\tundefined;\r\n\r\n\tif ( !found ) {\r\n\t\tfor ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {\r\n\t\t\tif ( !tag || jQuery.nodeName( elem, tag ) ) {\r\n\t\t\t\tfound.push( elem );\r\n\t\t\t} else {\r\n\t\t\t\tjQuery.merge( found, getAll( elem, tag ) );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn tag === undefined || tag && jQuery.nodeName( context, tag ) ?\r\n\t\tjQuery.merge( [ context ], found ) :\r\n\t\tfound;\r\n}\r\n\r\n// Used in buildFragment, fixes the defaultChecked property\r\nfunction fixDefaultChecked( elem ) {\r\n\tif ( rcheckableType.test( elem.type ) ) {\r\n\t\telem.defaultChecked = elem.checked;\r\n\t}\r\n}\r\n\r\n// Support: IE<8\r\n// Manipulating tables requires a tbody\r\nfunction manipulationTarget( elem, content ) {\r\n\treturn jQuery.nodeName( elem, \"table\" ) &&\r\n\t\tjQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ?\r\n\r\n\t\telem.getElementsByTagName(\"tbody\")[0] ||\r\n\t\t\telem.appendChild( elem.ownerDocument.createElement(\"tbody\") ) :\r\n\t\telem;\r\n}\r\n\r\n// Replace/restore the type attribute of script elements for safe DOM manipulation\r\nfunction disableScript( elem ) {\r\n\telem.type = (jQuery.find.attr( elem, \"type\" ) !== null) + \"/\" + elem.type;\r\n\treturn elem;\r\n}\r\nfunction restoreScript( elem ) {\r\n\tvar match = rscriptTypeMasked.exec( elem.type );\r\n\tif ( match ) {\r\n\t\telem.type = match[1];\r\n\t} else {\r\n\t\telem.removeAttribute(\"type\");\r\n\t}\r\n\treturn elem;\r\n}\r\n\r\n// Mark scripts as having already been evaluated\r\nfunction setGlobalEval( elems, refElements ) {\r\n\tvar elem,\r\n\t\ti = 0;\r\n\tfor ( ; (elem = elems[i]) != null; i++ ) {\r\n\t\tjQuery._data( elem, \"globalEval\", !refElements || jQuery._data( refElements[i], \"globalEval\" ) );\r\n\t}\r\n}\r\n\r\nfunction cloneCopyEvent( src, dest ) {\r\n\r\n\tif ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tvar type, i, l,\r\n\t\toldData = jQuery._data( src ),\r\n\t\tcurData = jQuery._data( dest, oldData ),\r\n\t\tevents = oldData.events;\r\n\r\n\tif ( events ) {\r\n\t\tdelete curData.handle;\r\n\t\tcurData.events = {};\r\n\r\n\t\tfor ( type in events ) {\r\n\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\r\n\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// make the cloned public data object a copy from the original\r\n\tif ( curData.data ) {\r\n\t\tcurData.data = jQuery.extend( {}, curData.data );\r\n\t}\r\n}\r\n\r\nfunction fixCloneNodeIssues( src, dest ) {\r\n\tvar nodeName, e, data;\r\n\r\n\t// We do not need to do anything for non-Elements\r\n\tif ( dest.nodeType !== 1 ) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tnodeName = dest.nodeName.toLowerCase();\r\n\r\n\t// IE6-8 copies events bound via attachEvent when using cloneNode.\r\n\tif ( !support.noCloneEvent && dest[ jQuery.expando ] ) {\r\n\t\tdata = jQuery._data( dest );\r\n\r\n\t\tfor ( e in data.events ) {\r\n\t\t\tjQuery.removeEvent( dest, e, data.handle );\r\n\t\t}\r\n\r\n\t\t// Event data gets referenced instead of copied if the expando gets copied too\r\n\t\tdest.removeAttribute( jQuery.expando );\r\n\t}\r\n\r\n\t// IE blanks contents when cloning scripts, and tries to evaluate newly-set text\r\n\tif ( nodeName === \"script\" && dest.text !== src.text ) {\r\n\t\tdisableScript( dest ).text = src.text;\r\n\t\trestoreScript( dest );\r\n\r\n\t// IE6-10 improperly clones children of object elements using classid.\r\n\t// IE10 throws NoModificationAllowedError if parent is null, #12132.\r\n\t} else if ( nodeName === \"object\" ) {\r\n\t\tif ( dest.parentNode ) {\r\n\t\t\tdest.outerHTML = src.outerHTML;\r\n\t\t}\r\n\r\n\t\t// This path appears unavoidable for IE9. When cloning an object\r\n\t\t// element in IE9, the outerHTML strategy above is not sufficient.\r\n\t\t// If the src has innerHTML and the destination does not,\r\n\t\t// copy the src.innerHTML into the dest.innerHTML. #10324\r\n\t\tif ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {\r\n\t\t\tdest.innerHTML = src.innerHTML;\r\n\t\t}\r\n\r\n\t} else if ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\r\n\t\t// IE6-8 fails to persist the checked state of a cloned checkbox\r\n\t\t// or radio button. Worse, IE6-7 fail to give the cloned element\r\n\t\t// a checked appearance if the defaultChecked value isn't also set\r\n\r\n\t\tdest.defaultChecked = dest.checked = src.checked;\r\n\r\n\t\t// IE6-7 get confused and end up setting the value of a cloned\r\n\t\t// checkbox/radio button to an empty string instead of \"on\"\r\n\t\tif ( dest.value !== src.value ) {\r\n\t\t\tdest.value = src.value;\r\n\t\t}\r\n\r\n\t// IE6-8 fails to return the selected option to the default selected\r\n\t// state when cloning options\r\n\t} else if ( nodeName === \"option\" ) {\r\n\t\tdest.defaultSelected = dest.selected = src.defaultSelected;\r\n\r\n\t// IE6-8 fails to set the defaultValue to the correct value when\r\n\t// cloning other types of input fields\r\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\r\n\t\tdest.defaultValue = src.defaultValue;\r\n\t}\r\n}\r\n\r\njQuery.extend({\r\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\r\n\t\tvar destElements, node, clone, i, srcElements,\r\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\r\n\r\n\t\tif ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( \"<\" + elem.nodeName + \">\" ) ) {\r\n\t\t\tclone = elem.cloneNode( true );\r\n\r\n\t\t// IE<=8 does not properly clone detached, unknown element nodes\r\n\t\t} else {\r\n\t\t\tfragmentDiv.innerHTML = elem.outerHTML;\r\n\t\t\tfragmentDiv.removeChild( clone = fragmentDiv.firstChild );\r\n\t\t}\r\n\r\n\t\tif ( (!support.noCloneEvent || !support.noCloneChecked) &&\r\n\t\t\t\t(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {\r\n\r\n\t\t\t// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2\r\n\t\t\tdestElements = getAll( clone );\r\n\t\t\tsrcElements = getAll( elem );\r\n\r\n\t\t\t// Fix all IE cloning issues\r\n\t\t\tfor ( i = 0; (node = srcElements[i]) != null; ++i ) {\r\n\t\t\t\t// Ensure that the destination node is not null; Fixes #9587\r\n\t\t\t\tif ( destElements[i] ) {\r\n\t\t\t\t\tfixCloneNodeIssues( node, destElements[i] );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Copy the events from the original to the clone\r\n\t\tif ( dataAndEvents ) {\r\n\t\t\tif ( deepDataAndEvents ) {\r\n\t\t\t\tsrcElements = srcElements || getAll( elem );\r\n\t\t\t\tdestElements = destElements || getAll( clone );\r\n\r\n\t\t\t\tfor ( i = 0; (node = srcElements[i]) != null; i++ ) {\r\n\t\t\t\t\tcloneCopyEvent( node, destElements[i] );\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tcloneCopyEvent( elem, clone );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Preserve script evaluation history\r\n\t\tdestElements = getAll( clone, \"script\" );\r\n\t\tif ( destElements.length > 0 ) {\r\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\r\n\t\t}\r\n\r\n\t\tdestElements = srcElements = node = null;\r\n\r\n\t\t// Return the cloned set\r\n\t\treturn clone;\r\n\t},\r\n\r\n\tbuildFragment: function( elems, context, scripts, selection ) {\r\n\t\tvar j, elem, contains,\r\n\t\t\ttmp, tag, tbody, wrap,\r\n\t\t\tl = elems.length,\r\n\r\n\t\t\t// Ensure a safe fragment\r\n\t\t\tsafe = createSafeFragment( context ),\r\n\r\n\t\t\tnodes = [],\r\n\t\t\ti = 0;\r\n\r\n\t\tfor ( ; i < l; i++ ) {\r\n\t\t\telem = elems[ i ];\r\n\r\n\t\t\tif ( elem || elem === 0 ) {\r\n\r\n\t\t\t\t// Add nodes directly\r\n\t\t\t\tif ( jQuery.type( elem ) === \"object\" ) {\r\n\t\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\r\n\r\n\t\t\t\t// Convert non-html into a text node\r\n\t\t\t\t} else if ( !rhtml.test( elem ) ) {\r\n\t\t\t\t\tnodes.push( context.createTextNode( elem ) );\r\n\r\n\t\t\t\t// Convert html into DOM nodes\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttmp = tmp || safe.appendChild( context.createElement(\"div\") );\r\n\r\n\t\t\t\t\t// Deserialize a standard representation\r\n\t\t\t\t\ttag = (rtagName.exec( elem ) || [ \"\", \"\" ])[ 1 ].toLowerCase();\r\n\t\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\r\n\r\n\t\t\t\t\ttmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, \"<$1></$2>\" ) + wrap[2];\r\n\r\n\t\t\t\t\t// Descend through wrappers to the right content\r\n\t\t\t\t\tj = wrap[0];\r\n\t\t\t\t\twhile ( j-- ) {\r\n\t\t\t\t\t\ttmp = tmp.lastChild;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Manually add leading whitespace removed by IE\r\n\t\t\t\t\tif ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {\r\n\t\t\t\t\t\tnodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Remove IE's autoinserted <tbody> from table fragments\r\n\t\t\t\t\tif ( !support.tbody ) {\r\n\r\n\t\t\t\t\t\t// String was a <table>, *may* have spurious <tbody>\r\n\t\t\t\t\t\telem = tag === \"table\" && !rtbody.test( elem ) ?\r\n\t\t\t\t\t\t\ttmp.firstChild :\r\n\r\n\t\t\t\t\t\t\t// String was a bare <thead> or <tfoot>\r\n\t\t\t\t\t\t\twrap[1] === \"<table>\" && !rtbody.test( elem ) ?\r\n\t\t\t\t\t\t\t\ttmp :\r\n\t\t\t\t\t\t\t\t0;\r\n\r\n\t\t\t\t\t\tj = elem && elem.childNodes.length;\r\n\t\t\t\t\t\twhile ( j-- ) {\r\n\t\t\t\t\t\t\tif ( jQuery.nodeName( (tbody = elem.childNodes[j]), \"tbody\" ) && !tbody.childNodes.length ) {\r\n\t\t\t\t\t\t\t\telem.removeChild( tbody );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\r\n\r\n\t\t\t\t\t// Fix #12392 for WebKit and IE > 9\r\n\t\t\t\t\ttmp.textContent = \"\";\r\n\r\n\t\t\t\t\t// Fix #12392 for oldIE\r\n\t\t\t\t\twhile ( tmp.firstChild ) {\r\n\t\t\t\t\t\ttmp.removeChild( tmp.firstChild );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Remember the top-level container for proper cleanup\r\n\t\t\t\t\ttmp = safe.lastChild;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Fix #11356: Clear elements from fragment\r\n\t\tif ( tmp ) {\r\n\t\t\tsafe.removeChild( tmp );\r\n\t\t}\r\n\r\n\t\t// Reset defaultChecked for any radios and checkboxes\r\n\t\t// about to be appended to the DOM in IE 6/7 (#8060)\r\n\t\tif ( !support.appendChecked ) {\r\n\t\t\tjQuery.grep( getAll( nodes, \"input\" ), fixDefaultChecked );\r\n\t\t}\r\n\r\n\t\ti = 0;\r\n\t\twhile ( (elem = nodes[ i++ ]) ) {\r\n\r\n\t\t\t// #4087 - If origin and destination elements are the same, and this is\r\n\t\t\t// that element, do not do anything\r\n\t\t\tif ( selection && jQuery.inArray( elem, selection ) !== -1 ) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\r\n\r\n\t\t\t// Append to fragment\r\n\t\t\ttmp = getAll( safe.appendChild( elem ), \"script\" );\r\n\r\n\t\t\t// Preserve script evaluation history\r\n\t\t\tif ( contains ) {\r\n\t\t\t\tsetGlobalEval( tmp );\r\n\t\t\t}\r\n\r\n\t\t\t// Capture executables\r\n\t\t\tif ( scripts ) {\r\n\t\t\t\tj = 0;\r\n\t\t\t\twhile ( (elem = tmp[ j++ ]) ) {\r\n\t\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\r\n\t\t\t\t\t\tscripts.push( elem );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\ttmp = null;\r\n\r\n\t\treturn safe;\r\n\t},\r\n\r\n\tcleanData: function( elems, /* internal */ acceptData ) {\r\n\t\tvar elem, type, id, data,\r\n\t\t\ti = 0,\r\n\t\t\tinternalKey = jQuery.expando,\r\n\t\t\tcache = jQuery.cache,\r\n\t\t\tdeleteExpando = support.deleteExpando,\r\n\t\t\tspecial = jQuery.event.special;\r\n\r\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\r\n\t\t\tif ( acceptData || jQuery.acceptData( elem ) ) {\r\n\r\n\t\t\t\tid = elem[ internalKey ];\r\n\t\t\t\tdata = id && cache[ id ];\r\n\r\n\t\t\t\tif ( data ) {\r\n\t\t\t\t\tif ( data.events ) {\r\n\t\t\t\t\t\tfor ( type in data.events ) {\r\n\t\t\t\t\t\t\tif ( special[ type ] ) {\r\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\r\n\r\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Remove cache only if it was not already removed by jQuery.event.remove\r\n\t\t\t\t\tif ( cache[ id ] ) {\r\n\r\n\t\t\t\t\t\tdelete cache[ id ];\r\n\r\n\t\t\t\t\t\t// IE does not allow us to delete expando properties from nodes,\r\n\t\t\t\t\t\t// nor does it have a removeAttribute function on Document nodes;\r\n\t\t\t\t\t\t// we must handle all of these cases\r\n\t\t\t\t\t\tif ( deleteExpando ) {\r\n\t\t\t\t\t\t\tdelete elem[ internalKey ];\r\n\r\n\t\t\t\t\t\t} else if ( typeof elem.removeAttribute !== strundefined ) {\r\n\t\t\t\t\t\t\telem.removeAttribute( internalKey );\r\n\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\telem[ internalKey ] = null;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tdeletedIds.push( id );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\njQuery.fn.extend({\r\n\ttext: function( value ) {\r\n\t\treturn access( this, function( value ) {\r\n\t\t\treturn value === undefined ?\r\n\t\t\t\tjQuery.text( this ) :\r\n\t\t\t\tthis.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );\r\n\t\t}, null, value, arguments.length );\r\n\t},\r\n\r\n\tappend: function() {\r\n\t\treturn this.domManip( arguments, function( elem ) {\r\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\r\n\t\t\t\tvar target = manipulationTarget( this, elem );\r\n\t\t\t\ttarget.appendChild( elem );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\tprepend: function() {\r\n\t\treturn this.domManip( arguments, function( elem ) {\r\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\r\n\t\t\t\tvar target = manipulationTarget( this, elem );\r\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\tbefore: function() {\r\n\t\treturn this.domManip( arguments, function( elem ) {\r\n\t\t\tif ( this.parentNode ) {\r\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\tafter: function() {\r\n\t\treturn this.domManip( arguments, function( elem ) {\r\n\t\t\tif ( this.parentNode ) {\r\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\tremove: function( selector, keepData /* Internal Use Only */ ) {\r\n\t\tvar elem,\r\n\t\t\telems = selector ? jQuery.filter( selector, this ) : this,\r\n\t\t\ti = 0;\r\n\r\n\t\tfor ( ; (elem = elems[i]) != null; i++ ) {\r\n\r\n\t\t\tif ( !keepData && elem.nodeType === 1 ) {\r\n\t\t\t\tjQuery.cleanData( getAll( elem ) );\r\n\t\t\t}\r\n\r\n\t\t\tif ( elem.parentNode ) {\r\n\t\t\t\tif ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {\r\n\t\t\t\t\tsetGlobalEval( getAll( elem, \"script\" ) );\r\n\t\t\t\t}\r\n\t\t\t\telem.parentNode.removeChild( elem );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tempty: function() {\r\n\t\tvar elem,\r\n\t\t\ti = 0;\r\n\r\n\t\tfor ( ; (elem = this[i]) != null; i++ ) {\r\n\t\t\t// Remove element nodes and prevent memory leaks\r\n\t\t\tif ( elem.nodeType === 1 ) {\r\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\r\n\t\t\t}\r\n\r\n\t\t\t// Remove any remaining nodes\r\n\t\t\twhile ( elem.firstChild ) {\r\n\t\t\t\telem.removeChild( elem.firstChild );\r\n\t\t\t}\r\n\r\n\t\t\t// If this is a select, ensure that it displays empty (#12336)\r\n\t\t\t// Support: IE<9\r\n\t\t\tif ( elem.options && jQuery.nodeName( elem, \"select\" ) ) {\r\n\t\t\t\telem.options.length = 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\r\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\r\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\r\n\r\n\t\treturn this.map(function() {\r\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\r\n\t\t});\r\n\t},\r\n\r\n\thtml: function( value ) {\r\n\t\treturn access( this, function( value ) {\r\n\t\t\tvar elem = this[ 0 ] || {},\r\n\t\t\t\ti = 0,\r\n\t\t\t\tl = this.length;\r\n\r\n\t\t\tif ( value === undefined ) {\r\n\t\t\t\treturn elem.nodeType === 1 ?\r\n\t\t\t\t\telem.innerHTML.replace( rinlinejQuery, \"\" ) :\r\n\t\t\t\t\tundefined;\r\n\t\t\t}\r\n\r\n\t\t\t// See if we can take a shortcut and just use innerHTML\r\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\r\n\t\t\t\t( support.htmlSerialize || !rnoshimcache.test( value ) ) &&\r\n\t\t\t\t( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&\r\n\t\t\t\t!wrapMap[ (rtagName.exec( value ) || [ \"\", \"\" ])[ 1 ].toLowerCase() ] ) {\r\n\r\n\t\t\t\tvalue = value.replace( rxhtmlTag, \"<$1></$2>\" );\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tfor (; i < l; i++ ) {\r\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\r\n\t\t\t\t\t\telem = this[i] || {};\r\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\r\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\r\n\t\t\t\t\t\t\telem.innerHTML = value;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\telem = 0;\r\n\r\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\r\n\t\t\t\t} catch(e) {}\r\n\t\t\t}\r\n\r\n\t\t\tif ( elem ) {\r\n\t\t\t\tthis.empty().append( value );\r\n\t\t\t}\r\n\t\t}, null, value, arguments.length );\r\n\t},\r\n\r\n\treplaceWith: function() {\r\n\t\tvar arg = arguments[ 0 ];\r\n\r\n\t\t// Make the changes, replacing each context element with the new content\r\n\t\tthis.domManip( arguments, function( elem ) {\r\n\t\t\targ = this.parentNode;\r\n\r\n\t\t\tjQuery.cleanData( getAll( this ) );\r\n\r\n\t\t\tif ( arg ) {\r\n\t\t\t\targ.replaceChild( elem, this );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Force removal if there was no new content (e.g., from empty arguments)\r\n\t\treturn arg && (arg.length || arg.nodeType) ? this : this.remove();\r\n\t},\r\n\r\n\tdetach: function( selector ) {\r\n\t\treturn this.remove( selector, true );\r\n\t},\r\n\r\n\tdomManip: function( args, callback ) {\r\n\r\n\t\t// Flatten any nested arrays\r\n\t\targs = concat.apply( [], args );\r\n\r\n\t\tvar first, node, hasScripts,\r\n\t\t\tscripts, doc, fragment,\r\n\t\t\ti = 0,\r\n\t\t\tl = this.length,\r\n\t\t\tset = this,\r\n\t\t\tiNoClone = l - 1,\r\n\t\t\tvalue = args[0],\r\n\t\t\tisFunction = jQuery.isFunction( value );\r\n\r\n\t\t// We can't cloneNode fragments that contain checked, in WebKit\r\n\t\tif ( isFunction ||\r\n\t\t\t\t( l > 1 && typeof value === \"string\" &&\r\n\t\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\r\n\t\t\treturn this.each(function( index ) {\r\n\t\t\t\tvar self = set.eq( index );\r\n\t\t\t\tif ( isFunction ) {\r\n\t\t\t\t\targs[0] = value.call( this, index, self.html() );\r\n\t\t\t\t}\r\n\t\t\t\tself.domManip( args, callback );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( l ) {\r\n\t\t\tfragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );\r\n\t\t\tfirst = fragment.firstChild;\r\n\r\n\t\t\tif ( fragment.childNodes.length === 1 ) {\r\n\t\t\t\tfragment = first;\r\n\t\t\t}\r\n\r\n\t\t\tif ( first ) {\r\n\t\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\r\n\t\t\t\thasScripts = scripts.length;\r\n\r\n\t\t\t\t// Use the original fragment for the last item instead of the first because it can end up\r\n\t\t\t\t// being emptied incorrectly in certain situations (#8070).\r\n\t\t\t\tfor ( ; i < l; i++ ) {\r\n\t\t\t\t\tnode = fragment;\r\n\r\n\t\t\t\t\tif ( i !== iNoClone ) {\r\n\t\t\t\t\t\tnode = jQuery.clone( node, true, true );\r\n\r\n\t\t\t\t\t\t// Keep references to cloned scripts for later restoration\r\n\t\t\t\t\t\tif ( hasScripts ) {\r\n\t\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tcallback.call( this[i], node, i );\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( hasScripts ) {\r\n\t\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\r\n\r\n\t\t\t\t\t// Reenable scripts\r\n\t\t\t\t\tjQuery.map( scripts, restoreScript );\r\n\r\n\t\t\t\t\t// Evaluate executable scripts on first document insertion\r\n\t\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\r\n\t\t\t\t\t\tnode = scripts[ i ];\r\n\t\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\r\n\t\t\t\t\t\t\t!jQuery._data( node, \"globalEval\" ) && jQuery.contains( doc, node ) ) {\r\n\r\n\t\t\t\t\t\t\tif ( node.src ) {\r\n\t\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\r\n\t\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\r\n\t\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tjQuery.globalEval( ( node.text || node.textContent || node.innerHTML || \"\" ).replace( rcleanScript, \"\" ) );\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Fix #11809: Avoid leaking memory\r\n\t\t\t\tfragment = first = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\njQuery.each({\r\n\tappendTo: \"append\",\r\n\tprependTo: \"prepend\",\r\n\tinsertBefore: \"before\",\r\n\tinsertAfter: \"after\",\r\n\treplaceAll: \"replaceWith\"\r\n}, function( name, original ) {\r\n\tjQuery.fn[ name ] = function( selector ) {\r\n\t\tvar elems,\r\n\t\t\ti = 0,\r\n\t\t\tret = [],\r\n\t\t\tinsert = jQuery( selector ),\r\n\t\t\tlast = insert.length - 1;\r\n\r\n\t\tfor ( ; i <= last; i++ ) {\r\n\t\t\telems = i === last ? this : this.clone(true);\r\n\t\t\tjQuery( insert[i] )[ original ]( elems );\r\n\r\n\t\t\t// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()\r\n\t\t\tpush.apply( ret, elems.get() );\r\n\t\t}\r\n\r\n\t\treturn this.pushStack( ret );\r\n\t};\r\n});\r\n\r\n\r\nvar iframe,\r\n\telemdisplay = {};\r\n\r\n/**\r\n * Retrieve the actual display of a element\r\n * @param {String} name nodeName of the element\r\n * @param {Object} doc Document object\r\n */\r\n// Called only from within defaultDisplay\r\nfunction actualDisplay( name, doc ) {\r\n\tvar elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),\r\n\r\n\t\t// getDefaultComputedStyle might be reliably used only on attached element\r\n\t\tdisplay = window.getDefaultComputedStyle ?\r\n\r\n\t\t\t// Use of this method is a temporary fix (more like optmization) until something better comes along,\r\n\t\t\t// since it was removed from specification and supported only in FF\r\n\t\t\twindow.getDefaultComputedStyle( elem[ 0 ] ).display : jQuery.css( elem[ 0 ], \"display\" );\r\n\r\n\t// We don't have any data stored on the element,\r\n\t// so use \"detach\" method as fast way to get rid of the element\r\n\telem.detach();\r\n\r\n\treturn display;\r\n}\r\n\r\n/**\r\n * Try to determine the default display value of an element\r\n * @param {String} nodeName\r\n */\r\nfunction defaultDisplay( nodeName ) {\r\n\tvar doc = document,\r\n\t\tdisplay = elemdisplay[ nodeName ];\r\n\r\n\tif ( !display ) {\r\n\t\tdisplay = actualDisplay( nodeName, doc );\r\n\r\n\t\t// If the simple way fails, read from inside an iframe\r\n\t\tif ( display === \"none\" || !display ) {\r\n\r\n\t\t\t// Use the already-created iframe if possible\r\n\t\t\tiframe = (iframe || jQuery( \"<iframe frameborder='0' width='0' height='0'/>\" )).appendTo( doc.documentElement );\r\n\r\n\t\t\t// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse\r\n\t\t\tdoc = ( iframe[ 0 ].contentWindow || iframe[ 0 ].contentDocument ).document;\r\n\r\n\t\t\t// Support: IE\r\n\t\t\tdoc.write();\r\n\t\t\tdoc.close();\r\n\r\n\t\t\tdisplay = actualDisplay( nodeName, doc );\r\n\t\t\tiframe.detach();\r\n\t\t}\r\n\r\n\t\t// Store the correct default display\r\n\t\telemdisplay[ nodeName ] = display;\r\n\t}\r\n\r\n\treturn display;\r\n}\r\n\r\n\r\n(function() {\r\n\tvar a, shrinkWrapBlocksVal,\r\n\t\tdiv = document.createElement( \"div\" ),\r\n\t\tdivReset =\r\n\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;\" +\r\n\t\t\t\"display:block;padding:0;margin:0;border:0\";\r\n\r\n\t// Setup\r\n\tdiv.innerHTML = \" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\r\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\r\n\r\n\ta.style.cssText = \"float:left;opacity:.5\";\r\n\r\n\t// Make sure that element opacity exists\r\n\t// (IE uses filter instead)\r\n\t// Use a regex to work around a WebKit issue. See #5145\r\n\tsupport.opacity = /^0.5/.test( a.style.opacity );\r\n\r\n\t// Verify style float existence\r\n\t// (IE uses styleFloat instead of cssFloat)\r\n\tsupport.cssFloat = !!a.style.cssFloat;\r\n\r\n\tdiv.style.backgroundClip = \"content-box\";\r\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\r\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\r\n\r\n\t// Null elements to avoid leaks in IE.\r\n\ta = div = null;\r\n\r\n\tsupport.shrinkWrapBlocks = function() {\r\n\t\tvar body, container, div, containerStyles;\r\n\r\n\t\tif ( shrinkWrapBlocksVal == null ) {\r\n\t\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\r\n\t\t\tif ( !body ) {\r\n\t\t\t\t// Test fired too early or in an unsupported environment, exit.\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tcontainerStyles = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px\";\r\n\t\t\tcontainer = document.createElement( \"div\" );\r\n\t\t\tdiv = document.createElement( \"div\" );\r\n\r\n\t\t\tbody.appendChild( container ).appendChild( div );\r\n\r\n\t\t\t// Will be changed later if needed.\r\n\t\t\tshrinkWrapBlocksVal = false;\r\n\r\n\t\t\tif ( typeof div.style.zoom !== strundefined ) {\r\n\t\t\t\t// Support: IE6\r\n\t\t\t\t// Check if elements with layout shrink-wrap their children\r\n\t\t\t\tdiv.style.cssText = divReset + \";width:1px;padding:1px;zoom:1\";\r\n\t\t\t\tdiv.innerHTML = \"<div></div>\";\r\n\t\t\t\tdiv.firstChild.style.width = \"5px\";\r\n\t\t\t\tshrinkWrapBlocksVal = div.offsetWidth !== 3;\r\n\t\t\t}\r\n\r\n\t\t\tbody.removeChild( container );\r\n\r\n\t\t\t// Null elements to avoid leaks in IE.\r\n\t\t\tbody = container = div = null;\r\n\t\t}\r\n\r\n\t\treturn shrinkWrapBlocksVal;\r\n\t};\r\n\r\n})();\r\nvar rmargin = (/^margin/);\r\n\r\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\r\n\r\n\r\n\r\nvar getStyles, curCSS,\r\n\trposition = /^(top|right|bottom|left)$/;\r\n\r\nif ( window.getComputedStyle ) {\r\n\tgetStyles = function( elem ) {\r\n\t\treturn elem.ownerDocument.defaultView.getComputedStyle( elem, null );\r\n\t};\r\n\r\n\tcurCSS = function( elem, name, computed ) {\r\n\t\tvar width, minWidth, maxWidth, ret,\r\n\t\t\tstyle = elem.style;\r\n\r\n\t\tcomputed = computed || getStyles( elem );\r\n\r\n\t\t// getPropertyValue is only needed for .css('filter') in IE9, see #12537\r\n\t\tret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;\r\n\r\n\t\tif ( computed ) {\r\n\r\n\t\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\r\n\t\t\t\tret = jQuery.style( elem, name );\r\n\t\t\t}\r\n\r\n\t\t\t// A tribute to the \"awesome hack by Dean Edwards\"\r\n\t\t\t// Chrome < 17 and Safari 5.0 uses \"computed value\" instead of \"used value\" for margin-right\r\n\t\t\t// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels\r\n\t\t\t// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values\r\n\t\t\tif ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {\r\n\r\n\t\t\t\t// Remember the original values\r\n\t\t\t\twidth = style.width;\r\n\t\t\t\tminWidth = style.minWidth;\r\n\t\t\t\tmaxWidth = style.maxWidth;\r\n\r\n\t\t\t\t// Put in the new values to get a computed value out\r\n\t\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\r\n\t\t\t\tret = computed.width;\r\n\r\n\t\t\t\t// Revert the changed values\r\n\t\t\t\tstyle.width = width;\r\n\t\t\t\tstyle.minWidth = minWidth;\r\n\t\t\t\tstyle.maxWidth = maxWidth;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Support: IE\r\n\t\t// IE returns zIndex value as an integer.\r\n\t\treturn ret === undefined ?\r\n\t\t\tret :\r\n\t\t\tret + \"\";\r\n\t};\r\n} else if ( document.documentElement.currentStyle ) {\r\n\tgetStyles = function( elem ) {\r\n\t\treturn elem.currentStyle;\r\n\t};\r\n\r\n\tcurCSS = function( elem, name, computed ) {\r\n\t\tvar left, rs, rsLeft, ret,\r\n\t\t\tstyle = elem.style;\r\n\r\n\t\tcomputed = computed || getStyles( elem );\r\n\t\tret = computed ? computed[ name ] : undefined;\r\n\r\n\t\t// Avoid setting ret to empty string here\r\n\t\t// so we don't default to auto\r\n\t\tif ( ret == null && style && style[ name ] ) {\r\n\t\t\tret = style[ name ];\r\n\t\t}\r\n\r\n\t\t// From the awesome hack by Dean Edwards\r\n\t\t// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291\r\n\r\n\t\t// If we're not dealing with a regular pixel number\r\n\t\t// but a number that has a weird ending, we need to convert it to pixels\r\n\t\t// but not position css attributes, as those are proportional to the parent element instead\r\n\t\t// and we can't measure the parent instead because it might trigger a \"stacking dolls\" problem\r\n\t\tif ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {\r\n\r\n\t\t\t// Remember the original values\r\n\t\t\tleft = style.left;\r\n\t\t\trs = elem.runtimeStyle;\r\n\t\t\trsLeft = rs && rs.left;\r\n\r\n\t\t\t// Put in the new values to get a computed value out\r\n\t\t\tif ( rsLeft ) {\r\n\t\t\t\trs.left = elem.currentStyle.left;\r\n\t\t\t}\r\n\t\t\tstyle.left = name === \"fontSize\" ? \"1em\" : ret;\r\n\t\t\tret = style.pixelLeft + \"px\";\r\n\r\n\t\t\t// Revert the changed values\r\n\t\t\tstyle.left = left;\r\n\t\t\tif ( rsLeft ) {\r\n\t\t\t\trs.left = rsLeft;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Support: IE\r\n\t\t// IE returns zIndex value as an integer.\r\n\t\treturn ret === undefined ?\r\n\t\t\tret :\r\n\t\t\tret + \"\" || \"auto\";\r\n\t};\r\n}\r\n\r\n\r\n\r\n\r\nfunction addGetHookIf( conditionFn, hookFn ) {\r\n\t// Define the hook, we'll check on the first run if it's really needed.\r\n\treturn {\r\n\t\tget: function() {\r\n\t\t\tvar condition = conditionFn();\r\n\r\n\t\t\tif ( condition == null ) {\r\n\t\t\t\t// The test was not ready at this point; screw the hook this time\r\n\t\t\t\t// but check again when needed next time.\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif ( condition ) {\r\n\t\t\t\t// Hook not needed (or it's not possible to use it due to missing dependency),\r\n\t\t\t\t// remove it.\r\n\t\t\t\t// Since there are no other hooks for marginRight, remove the whole object.\r\n\t\t\t\tdelete this.get;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\r\n\r\n\t\t\treturn (this.get = hookFn).apply( this, arguments );\r\n\t\t}\r\n\t};\r\n}\r\n\r\n\r\n(function() {\r\n\tvar a, reliableHiddenOffsetsVal, boxSizingVal, boxSizingReliableVal,\r\n\t\tpixelPositionVal, reliableMarginRightVal,\r\n\t\tdiv = document.createElement( \"div\" ),\r\n\t\tcontainerStyles = \"border:0;width:0;height:0;position:absolute;top:0;left:-9999px\",\r\n\t\tdivReset =\r\n\t\t\t\"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;\" +\r\n\t\t\t\"display:block;padding:0;margin:0;border:0\";\r\n\r\n\t// Setup\r\n\tdiv.innerHTML = \" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\r\n\ta = div.getElementsByTagName( \"a\" )[ 0 ];\r\n\r\n\ta.style.cssText = \"float:left;opacity:.5\";\r\n\r\n\t// Make sure that element opacity exists\r\n\t// (IE uses filter instead)\r\n\t// Use a regex to work around a WebKit issue. See #5145\r\n\tsupport.opacity = /^0.5/.test( a.style.opacity );\r\n\r\n\t// Verify style float existence\r\n\t// (IE uses styleFloat instead of cssFloat)\r\n\tsupport.cssFloat = !!a.style.cssFloat;\r\n\r\n\tdiv.style.backgroundClip = \"content-box\";\r\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\r\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\r\n\r\n\t// Null elements to avoid leaks in IE.\r\n\ta = div = null;\r\n\r\n\tjQuery.extend(support, {\r\n\t\treliableHiddenOffsets: function() {\r\n\t\t\tif ( reliableHiddenOffsetsVal != null ) {\r\n\t\t\t\treturn reliableHiddenOffsetsVal;\r\n\t\t\t}\r\n\r\n\t\t\tvar container, tds, isSupported,\r\n\t\t\t\tdiv = document.createElement( \"div\" ),\r\n\t\t\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\r\n\r\n\t\t\tif ( !body ) {\r\n\t\t\t\t// Return for frameset docs that don't have a body\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Setup\r\n\t\t\tdiv.setAttribute( \"className\", \"t\" );\r\n\t\t\tdiv.innerHTML = \" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\r\n\r\n\t\t\tcontainer = document.createElement( \"div\" );\r\n\t\t\tcontainer.style.cssText = containerStyles;\r\n\r\n\t\t\tbody.appendChild( container ).appendChild( div );\r\n\r\n\t\t\t// Support: IE8\r\n\t\t\t// Check if table cells still have offsetWidth/Height when they are set\r\n\t\t\t// to display:none and there are still other visible table cells in a\r\n\t\t\t// table row; if so, offsetWidth/Height are not reliable for use when\r\n\t\t\t// determining if an element has been hidden directly using\r\n\t\t\t// display:none (it is still safe to use offsets if a parent element is\r\n\t\t\t// hidden; don safety goggles and see bug #4512 for more information).\r\n\t\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\r\n\t\t\ttds = div.getElementsByTagName( \"td\" );\r\n\t\t\ttds[ 0 ].style.cssText = \"padding:0;margin:0;border:0;display:none\";\r\n\t\t\tisSupported = ( tds[ 0 ].offsetHeight === 0 );\r\n\r\n\t\t\ttds[ 0 ].style.display = \"\";\r\n\t\t\ttds[ 1 ].style.display = \"none\";\r\n\r\n\t\t\t// Support: IE8\r\n\t\t\t// Check if empty table cells still have offsetWidth/Height\r\n\t\t\treliableHiddenOffsetsVal = isSupported && ( tds[ 0 ].offsetHeight === 0 );\r\n\r\n\t\t\tbody.removeChild( container );\r\n\r\n\t\t\t// Null elements to avoid leaks in IE.\r\n\t\t\tdiv = body = null;\r\n\r\n\t\t\treturn reliableHiddenOffsetsVal;\r\n\t\t},\r\n\r\n\t\tboxSizing: function() {\r\n\t\t\tif ( boxSizingVal == null ) {\r\n\t\t\t\tcomputeStyleTests();\r\n\t\t\t}\r\n\t\t\treturn boxSizingVal;\r\n\t\t},\r\n\r\n\t\tboxSizingReliable: function() {\r\n\t\t\tif ( boxSizingReliableVal == null ) {\r\n\t\t\t\tcomputeStyleTests();\r\n\t\t\t}\r\n\t\t\treturn boxSizingReliableVal;\r\n\t\t},\r\n\r\n\t\tpixelPosition: function() {\r\n\t\t\tif ( pixelPositionVal == null ) {\r\n\t\t\t\tcomputeStyleTests();\r\n\t\t\t}\r\n\t\t\treturn pixelPositionVal;\r\n\t\t},\r\n\r\n\t\treliableMarginRight: function() {\r\n\t\t\tvar body, container, div, marginDiv;\r\n\r\n\t\t\t// Use window.getComputedStyle because jsdom on node.js will break without it.\r\n\t\t\tif ( reliableMarginRightVal == null && window.getComputedStyle ) {\r\n\t\t\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\r\n\t\t\t\tif ( !body ) {\r\n\t\t\t\t\t// Test fired too early or in an unsupported environment, exit.\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcontainer = document.createElement( \"div\" );\r\n\t\t\t\tdiv = document.createElement( \"div\" );\r\n\t\t\t\tcontainer.style.cssText = containerStyles;\r\n\r\n\t\t\t\tbody.appendChild( container ).appendChild( div );\r\n\r\n\t\t\t\t// Check if div with explicit width and no margin-right incorrectly\r\n\t\t\t\t// gets computed margin-right based on width of container. (#3333)\r\n\t\t\t\t// Fails in WebKit before Feb 2011 nightlies\r\n\t\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\r\n\t\t\t\tmarginDiv = div.appendChild( document.createElement( \"div\" ) );\r\n\t\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\r\n\t\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\r\n\t\t\t\tdiv.style.width = \"1px\";\r\n\r\n\t\t\t\treliableMarginRightVal =\r\n\t\t\t\t\t!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );\r\n\r\n\t\t\t\tbody.removeChild( container );\r\n\t\t\t}\r\n\r\n\t\t\treturn reliableMarginRightVal;\r\n\t\t}\r\n\t});\r\n\r\n\tfunction computeStyleTests() {\r\n\t\tvar container, div,\r\n\t\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ];\r\n\r\n\t\tif ( !body ) {\r\n\t\t\t// Test fired too early or in an unsupported environment, exit.\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tcontainer = document.createElement( \"div\" );\r\n\t\tdiv = document.createElement( \"div\" );\r\n\t\tcontainer.style.cssText = containerStyles;\r\n\r\n\t\tbody.appendChild( container ).appendChild( div );\r\n\r\n\t\tdiv.style.cssText =\r\n\t\t\t\"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;\" +\r\n\t\t\t\t\"position:absolute;display:block;padding:1px;border:1px;width:4px;\" +\r\n\t\t\t\t\"margin-top:1%;top:1%\";\r\n\r\n\t\t// Workaround failing boxSizing test due to offsetWidth returning wrong value\r\n\t\t// with some non-1 values of body zoom, ticket #13543\r\n\t\tjQuery.swap( body, body.style.zoom != null ? { zoom: 1 } : {}, function() {\r\n\t\t\tboxSizingVal = div.offsetWidth === 4;\r\n\t\t});\r\n\r\n\t\t// Will be changed later if needed.\r\n\t\tboxSizingReliableVal = true;\r\n\t\tpixelPositionVal = false;\r\n\t\treliableMarginRightVal = true;\r\n\r\n\t\t// Use window.getComputedStyle because jsdom on node.js will break without it.\r\n\t\tif ( window.getComputedStyle ) {\r\n\t\t\tpixelPositionVal = ( window.getComputedStyle( div, null ) || {} ).top !== \"1%\";\r\n\t\t\tboxSizingReliableVal =\r\n\t\t\t\t( window.getComputedStyle( div, null ) || { width: \"4px\" } ).width === \"4px\";\r\n\t\t}\r\n\r\n\t\tbody.removeChild( container );\r\n\r\n\t\t// Null elements to avoid leaks in IE.\r\n\t\tdiv = body = null;\r\n\t}\r\n\r\n})();\r\n\r\n\r\n// A method for quickly swapping in/out CSS properties to get correct calculations.\r\njQuery.swap = function( elem, options, callback, args ) {\r\n\tvar ret, name,\r\n\t\told = {};\r\n\r\n\t// Remember the old values, and insert the new ones\r\n\tfor ( name in options ) {\r\n\t\told[ name ] = elem.style[ name ];\r\n\t\telem.style[ name ] = options[ name ];\r\n\t}\r\n\r\n\tret = callback.apply( elem, args || [] );\r\n\r\n\t// Revert the old values\r\n\tfor ( name in options ) {\r\n\t\telem.style[ name ] = old[ name ];\r\n\t}\r\n\r\n\treturn ret;\r\n};\r\n\r\n\r\nvar\r\n\t\tralpha = /alpha\\([^)]*\\)/i,\r\n\tropacity = /opacity\\s*=\\s*([^)]*)/,\r\n\r\n\t// swappable if display is none or starts with table except \"table\", \"table-cell\", or \"table-caption\"\r\n\t// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\r\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\r\n\trnumsplit = new RegExp( \"^(\" + pnum + \")(.*)$\", \"i\" ),\r\n\trrelNum = new RegExp( \"^([+-])=(\" + pnum + \")\", \"i\" ),\r\n\r\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\r\n\tcssNormalTransform = {\r\n\t\tletterSpacing: 0,\r\n\t\tfontWeight: 400\r\n\t},\r\n\r\n\tcssPrefixes = [ \"Webkit\", \"O\", \"Moz\", \"ms\" ];\r\n\r\n\r\n// return a css property mapped to a potentially vendor prefixed property\r\nfunction vendorPropName( style, name ) {\r\n\r\n\t// shortcut for names that are not vendor prefixed\r\n\tif ( name in style ) {\r\n\t\treturn name;\r\n\t}\r\n\r\n\t// check for vendor prefixed names\r\n\tvar capName = name.charAt(0).toUpperCase() + name.slice(1),\r\n\t\torigName = name,\r\n\t\ti = cssPrefixes.length;\r\n\r\n\twhile ( i-- ) {\r\n\t\tname = cssPrefixes[ i ] + capName;\r\n\t\tif ( name in style ) {\r\n\t\t\treturn name;\r\n\t\t}\r\n\t}\r\n\r\n\treturn origName;\r\n}\r\n\r\nfunction showHide( elements, show ) {\r\n\tvar display, elem, hidden,\r\n\t\tvalues = [],\r\n\t\tindex = 0,\r\n\t\tlength = elements.length;\r\n\r\n\tfor ( ; index < length; index++ ) {\r\n\t\telem = elements[ index ];\r\n\t\tif ( !elem.style ) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\" );\r\n\t\tdisplay = elem.style.display;\r\n\t\tif ( show ) {\r\n\t\t\t// Reset the inline display of this element to learn if it is\r\n\t\t\t// being hidden by cascaded rules or not\r\n\t\t\tif ( !values[ index ] && display === \"none\" ) {\r\n\t\t\t\telem.style.display = \"\";\r\n\t\t\t}\r\n\r\n\t\t\t// Set elements which have been overridden with display: none\r\n\t\t\t// in a stylesheet to whatever the default browser style is\r\n\t\t\t// for such an element\r\n\t\t\tif ( elem.style.display === \"\" && isHidden( elem ) ) {\r\n\t\t\t\tvalues[ index ] = jQuery._data( elem, \"olddisplay\", defaultDisplay(elem.nodeName) );\r\n\t\t\t}\r\n\t\t} else {\r\n\r\n\t\t\tif ( !values[ index ] ) {\r\n\t\t\t\thidden = isHidden( elem );\r\n\r\n\t\t\t\tif ( display && display !== \"none\" || !hidden ) {\r\n\t\t\t\t\tjQuery._data( elem, \"olddisplay\", hidden ? display : jQuery.css( elem, \"display\" ) );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Set the display of most of the elements in a second loop\r\n\t// to avoid the constant reflow\r\n\tfor ( index = 0; index < length; index++ ) {\r\n\t\telem = elements[ index ];\r\n\t\tif ( !elem.style ) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif ( !show || elem.style.display === \"none\" || elem.style.display === \"\" ) {\r\n\t\t\telem.style.display = show ? values[ index ] || \"\" : \"none\";\r\n\t\t}\r\n\t}\r\n\r\n\treturn elements;\r\n}\r\n\r\nfunction setPositiveNumber( elem, value, subtract ) {\r\n\tvar matches = rnumsplit.exec( value );\r\n\treturn matches ?\r\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\r\n\t\tMath.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || \"px\" ) :\r\n\t\tvalue;\r\n}\r\n\r\nfunction augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {\r\n\tvar i = extra === ( isBorderBox ? \"border\" : \"content\" ) ?\r\n\t\t// If we already have the right measurement, avoid augmentation\r\n\t\t4 :\r\n\t\t// Otherwise initialize for horizontal or vertical properties\r\n\t\tname === \"width\" ? 1 : 0,\r\n\r\n\t\tval = 0;\r\n\r\n\tfor ( ; i < 4; i += 2 ) {\r\n\t\t// both box models exclude margin, so add it if we want it\r\n\t\tif ( extra === \"margin\" ) {\r\n\t\t\tval += jQuery.css( elem, extra + cssExpand[ i ], true, styles );\r\n\t\t}\r\n\r\n\t\tif ( isBorderBox ) {\r\n\t\t\t// border-box includes padding, so remove it if we want content\r\n\t\t\tif ( extra === \"content\" ) {\r\n\t\t\t\tval -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\r\n\t\t\t}\r\n\r\n\t\t\t// at this point, extra isn't border nor margin, so remove border\r\n\t\t\tif ( extra !== \"margin\" ) {\r\n\t\t\t\tval -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// at this point, extra isn't content, so add padding\r\n\t\t\tval += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\r\n\r\n\t\t\t// at this point, extra isn't content nor padding, so add border\r\n\t\t\tif ( extra !== \"padding\" ) {\r\n\t\t\t\tval += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn val;\r\n}\r\n\r\nfunction getWidthOrHeight( elem, name, extra ) {\r\n\r\n\t// Start with offset property, which is equivalent to the border-box value\r\n\tvar valueIsBorderBox = true,\r\n\t\tval = name === \"width\" ? elem.offsetWidth : elem.offsetHeight,\r\n\t\tstyles = getStyles( elem ),\r\n\t\tisBorderBox = support.boxSizing() && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\";\r\n\r\n\t// some non-html elements return undefined for offsetWidth, so check for null/undefined\r\n\t// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285\r\n\t// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668\r\n\tif ( val <= 0 || val == null ) {\r\n\t\t// Fall back to computed then uncomputed css if necessary\r\n\t\tval = curCSS( elem, name, styles );\r\n\t\tif ( val < 0 || val == null ) {\r\n\t\t\tval = elem.style[ name ];\r\n\t\t}\r\n\r\n\t\t// Computed unit is not pixels. Stop here and return.\r\n\t\tif ( rnumnonpx.test(val) ) {\r\n\t\t\treturn val;\r\n\t\t}\r\n\r\n\t\t// we need the check for style in case a browser which returns unreliable values\r\n\t\t// for getComputedStyle silently falls back to the reliable elem.style\r\n\t\tvalueIsBorderBox = isBorderBox && ( support.boxSizingReliable() || val === elem.style[ name ] );\r\n\r\n\t\t// Normalize \"\", auto, and prepare for extra\r\n\t\tval = parseFloat( val ) || 0;\r\n\t}\r\n\r\n\t// use the active box-sizing model to add/subtract irrelevant styles\r\n\treturn ( val +\r\n\t\taugmentWidthOrHeight(\r\n\t\t\telem,\r\n\t\t\tname,\r\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\r\n\t\t\tvalueIsBorderBox,\r\n\t\t\tstyles\r\n\t\t)\r\n\t) + \"px\";\r\n}\r\n\r\njQuery.extend({\r\n\t// Add in style property hooks for overriding the default\r\n\t// behavior of getting and setting a style property\r\n\tcssHooks: {\r\n\t\topacity: {\r\n\t\t\tget: function( elem, computed ) {\r\n\t\t\t\tif ( computed ) {\r\n\t\t\t\t\t// We should always get a number back from opacity\r\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\r\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// Don't automatically add \"px\" to these possibly-unitless properties\r\n\tcssNumber: {\r\n\t\t\"columnCount\": true,\r\n\t\t\"fillOpacity\": true,\r\n\t\t\"fontWeight\": true,\r\n\t\t\"lineHeight\": true,\r\n\t\t\"opacity\": true,\r\n\t\t\"order\": true,\r\n\t\t\"orphans\": true,\r\n\t\t\"widows\": true,\r\n\t\t\"zIndex\": true,\r\n\t\t\"zoom\": true\r\n\t},\r\n\r\n\t// Add in properties whose names you wish to fix before\r\n\t// setting or getting the value\r\n\tcssProps: {\r\n\t\t// normalize float css property\r\n\t\t\"float\": support.cssFloat ? \"cssFloat\" : \"styleFloat\"\r\n\t},\r\n\r\n\t// Get and set the style property on a DOM Node\r\n\tstyle: function( elem, name, value, extra ) {\r\n\t\t// Don't set styles on text and comment nodes\r\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Make sure that we're working with the right name\r\n\t\tvar ret, type, hooks,\r\n\t\t\torigName = jQuery.camelCase( name ),\r\n\t\t\tstyle = elem.style;\r\n\r\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );\r\n\r\n\t\t// gets hook for the prefixed version\r\n\t\t// followed by the unprefixed version\r\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\r\n\r\n\t\t// Check if we're setting a value\r\n\t\tif ( value !== undefined ) {\r\n\t\t\ttype = typeof value;\r\n\r\n\t\t\t// convert relative number strings (+= or -=) to relative numbers. #7345\r\n\t\t\tif ( type === \"string\" && (ret = rrelNum.exec( value )) ) {\r\n\t\t\t\tvalue = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );\r\n\t\t\t\t// Fixes bug #9237\r\n\t\t\t\ttype = \"number\";\r\n\t\t\t}\r\n\r\n\t\t\t// Make sure that null and NaN values aren't set. See: #7116\r\n\t\t\tif ( value == null || value !== value ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// If a number was passed in, add 'px' to the (except for certain CSS properties)\r\n\t\t\tif ( type === \"number\" && !jQuery.cssNumber[ origName ] ) {\r\n\t\t\t\tvalue += \"px\";\r\n\t\t\t}\r\n\r\n\t\t\t// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,\r\n\t\t\t// but it would mean to define eight (for every problematic property) identical functions\r\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf(\"background\") === 0 ) {\r\n\t\t\t\tstyle[ name ] = \"inherit\";\r\n\t\t\t}\r\n\r\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\r\n\t\t\tif ( !hooks || !(\"set\" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {\r\n\r\n\t\t\t\t// Support: IE\r\n\t\t\t\t// Swallow errors from 'invalid' CSS values (#5509)\r\n\t\t\t\ttry {\r\n\t\t\t\t\t// Support: Chrome, Safari\r\n\t\t\t\t\t// Setting style to blank string required to delete \"style: x !important;\"\r\n\t\t\t\t\tstyle[ name ] = \"\";\r\n\t\t\t\t\tstyle[ name ] = value;\r\n\t\t\t\t} catch(e) {}\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\t// If a hook was provided get the non-computed value from there\r\n\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {\r\n\t\t\t\treturn ret;\r\n\t\t\t}\r\n\r\n\t\t\t// Otherwise just get the value from the style object\r\n\t\t\treturn style[ name ];\r\n\t\t}\r\n\t},\r\n\r\n\tcss: function( elem, name, extra, styles ) {\r\n\t\tvar num, val, hooks,\r\n\t\t\torigName = jQuery.camelCase( name );\r\n\r\n\t\t// Make sure that we're working with the right name\r\n\t\tname = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );\r\n\r\n\t\t// gets hook for the prefixed version\r\n\t\t// followed by the unprefixed version\r\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\r\n\r\n\t\t// If a hook was provided get the computed value from there\r\n\t\tif ( hooks && \"get\" in hooks ) {\r\n\t\t\tval = hooks.get( elem, true, extra );\r\n\t\t}\r\n\r\n\t\t// Otherwise, if a way to get the computed value exists, use that\r\n\t\tif ( val === undefined ) {\r\n\t\t\tval = curCSS( elem, name, styles );\r\n\t\t}\r\n\r\n\t\t//convert \"normal\" to computed value\r\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\r\n\t\t\tval = cssNormalTransform[ name ];\r\n\t\t}\r\n\r\n\t\t// Return, converting to number if forced or a qualifier was provided and val looks numeric\r\n\t\tif ( extra === \"\" || extra ) {\r\n\t\t\tnum = parseFloat( val );\r\n\t\t\treturn extra === true || jQuery.isNumeric( num ) ? num || 0 : val;\r\n\t\t}\r\n\t\treturn val;\r\n\t}\r\n});\r\n\r\njQuery.each([ \"height\", \"width\" ], function( i, name ) {\r\n\tjQuery.cssHooks[ name ] = {\r\n\t\tget: function( elem, computed, extra ) {\r\n\t\t\tif ( computed ) {\r\n\t\t\t\t// certain elements can have dimension info if we invisibly show them\r\n\t\t\t\t// however, it must have a current display style that would benefit from this\r\n\t\t\t\treturn elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, \"display\" ) ) ?\r\n\t\t\t\t\tjQuery.swap( elem, cssShow, function() {\r\n\t\t\t\t\t\treturn getWidthOrHeight( elem, name, extra );\r\n\t\t\t\t\t}) :\r\n\t\t\t\t\tgetWidthOrHeight( elem, name, extra );\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tset: function( elem, value, extra ) {\r\n\t\t\tvar styles = extra && getStyles( elem );\r\n\t\t\treturn setPositiveNumber( elem, value, extra ?\r\n\t\t\t\taugmentWidthOrHeight(\r\n\t\t\t\t\telem,\r\n\t\t\t\t\tname,\r\n\t\t\t\t\textra,\r\n\t\t\t\t\tsupport.boxSizing() && jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\r\n\t\t\t\t\tstyles\r\n\t\t\t\t) : 0\r\n\t\t\t);\r\n\t\t}\r\n\t};\r\n});\r\n\r\nif ( !support.opacity ) {\r\n\tjQuery.cssHooks.opacity = {\r\n\t\tget: function( elem, computed ) {\r\n\t\t\t// IE uses filters for opacity\r\n\t\t\treturn ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || \"\" ) ?\r\n\t\t\t\t( 0.01 * parseFloat( RegExp.$1 ) ) + \"\" :\r\n\t\t\t\tcomputed ? \"1\" : \"\";\r\n\t\t},\r\n\r\n\t\tset: function( elem, value ) {\r\n\t\t\tvar style = elem.style,\r\n\t\t\t\tcurrentStyle = elem.currentStyle,\r\n\t\t\t\topacity = jQuery.isNumeric( value ) ? \"alpha(opacity=\" + value * 100 + \")\" : \"\",\r\n\t\t\t\tfilter = currentStyle && currentStyle.filter || style.filter || \"\";\r\n\r\n\t\t\t// IE has trouble with opacity if it does not have layout\r\n\t\t\t// Force it by setting the zoom level\r\n\t\t\tstyle.zoom = 1;\r\n\r\n\t\t\t// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652\r\n\t\t\t// if value === \"\", then remove inline opacity #12685\r\n\t\t\tif ( ( value >= 1 || value === \"\" ) &&\r\n\t\t\t\t\tjQuery.trim( filter.replace( ralpha, \"\" ) ) === \"\" &&\r\n\t\t\t\t\tstyle.removeAttribute ) {\r\n\r\n\t\t\t\t// Setting style.filter to null, \"\" & \" \" still leave \"filter:\" in the cssText\r\n\t\t\t\t// if \"filter:\" is present at all, clearType is disabled, we want to avoid this\r\n\t\t\t\t// style.removeAttribute is IE Only, but so apparently is this code path...\r\n\t\t\t\tstyle.removeAttribute( \"filter\" );\r\n\r\n\t\t\t\t// if there is no filter style applied in a css rule or unset inline opacity, we are done\r\n\t\t\t\tif ( value === \"\" || currentStyle && !currentStyle.filter ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// otherwise, set new filter values\r\n\t\t\tstyle.filter = ralpha.test( filter ) ?\r\n\t\t\t\tfilter.replace( ralpha, opacity ) :\r\n\t\t\t\tfilter + \" \" + opacity;\r\n\t\t}\r\n\t};\r\n}\r\n\r\njQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,\r\n\tfunction( elem, computed ) {\r\n\t\tif ( computed ) {\r\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\r\n\t\t\t// Work around by temporarily setting element display to inline-block\r\n\t\t\treturn jQuery.swap( elem, { \"display\": \"inline-block\" },\r\n\t\t\t\tcurCSS, [ elem, \"marginRight\" ] );\r\n\t\t}\r\n\t}\r\n);\r\n\r\n// These hooks are used by animate to expand properties\r\njQuery.each({\r\n\tmargin: \"\",\r\n\tpadding: \"\",\r\n\tborder: \"Width\"\r\n}, function( prefix, suffix ) {\r\n\tjQuery.cssHooks[ prefix + suffix ] = {\r\n\t\texpand: function( value ) {\r\n\t\t\tvar i = 0,\r\n\t\t\t\texpanded = {},\r\n\r\n\t\t\t\t// assumes a single number if not a string\r\n\t\t\t\tparts = typeof value === \"string\" ? value.split(\" \") : [ value ];\r\n\r\n\t\t\tfor ( ; i < 4; i++ ) {\r\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\r\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\r\n\t\t\t}\r\n\r\n\t\t\treturn expanded;\r\n\t\t}\r\n\t};\r\n\r\n\tif ( !rmargin.test( prefix ) ) {\r\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\r\n\t}\r\n});\r\n\r\njQuery.fn.extend({\r\n\tcss: function( name, value ) {\r\n\t\treturn access( this, function( elem, name, value ) {\r\n\t\t\tvar styles, len,\r\n\t\t\t\tmap = {},\r\n\t\t\t\ti = 0;\r\n\r\n\t\t\tif ( jQuery.isArray( name ) ) {\r\n\t\t\t\tstyles = getStyles( elem );\r\n\t\t\t\tlen = name.length;\r\n\r\n\t\t\t\tfor ( ; i < len; i++ ) {\r\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn map;\r\n\t\t\t}\r\n\r\n\t\t\treturn value !== undefined ?\r\n\t\t\t\tjQuery.style( elem, name, value ) :\r\n\t\t\t\tjQuery.css( elem, name );\r\n\t\t}, name, value, arguments.length > 1 );\r\n\t},\r\n\tshow: function() {\r\n\t\treturn showHide( this, true );\r\n\t},\r\n\thide: function() {\r\n\t\treturn showHide( this );\r\n\t},\r\n\ttoggle: function( state ) {\r\n\t\tif ( typeof state === \"boolean\" ) {\r\n\t\t\treturn state ? this.show() : this.hide();\r\n\t\t}\r\n\r\n\t\treturn this.each(function() {\r\n\t\t\tif ( isHidden( this ) ) {\r\n\t\t\t\tjQuery( this ).show();\r\n\t\t\t} else {\r\n\t\t\t\tjQuery( this ).hide();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n});\r\n\r\n\r\nfunction Tween( elem, options, prop, end, easing ) {\r\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\r\n}\r\njQuery.Tween = Tween;\r\n\r\nTween.prototype = {\r\n\tconstructor: Tween,\r\n\tinit: function( elem, options, prop, end, easing, unit ) {\r\n\t\tthis.elem = elem;\r\n\t\tthis.prop = prop;\r\n\t\tthis.easing = easing || \"swing\";\r\n\t\tthis.options = options;\r\n\t\tthis.start = this.now = this.cur();\r\n\t\tthis.end = end;\r\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\r\n\t},\r\n\tcur: function() {\r\n\t\tvar hooks = Tween.propHooks[ this.prop ];\r\n\r\n\t\treturn hooks && hooks.get ?\r\n\t\t\thooks.get( this ) :\r\n\t\t\tTween.propHooks._default.get( this );\r\n\t},\r\n\trun: function( percent ) {\r\n\t\tvar eased,\r\n\t\t\thooks = Tween.propHooks[ this.prop ];\r\n\r\n\t\tif ( this.options.duration ) {\r\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\r\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\tthis.pos = eased = percent;\r\n\t\t}\r\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\r\n\r\n\t\tif ( this.options.step ) {\r\n\t\t\tthis.options.step.call( this.elem, this.now, this );\r\n\t\t}\r\n\r\n\t\tif ( hooks && hooks.set ) {\r\n\t\t\thooks.set( this );\r\n\t\t} else {\r\n\t\t\tTween.propHooks._default.set( this );\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n};\r\n\r\nTween.prototype.init.prototype = Tween.prototype;\r\n\r\nTween.propHooks = {\r\n\t_default: {\r\n\t\tget: function( tween ) {\r\n\t\t\tvar result;\r\n\r\n\t\t\tif ( tween.elem[ tween.prop ] != null &&\r\n\t\t\t\t(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {\r\n\t\t\t\treturn tween.elem[ tween.prop ];\r\n\t\t\t}\r\n\r\n\t\t\t// passing an empty string as a 3rd parameter to .css will automatically\r\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails\r\n\t\t\t// so, simple values such as \"10px\" are parsed to Float.\r\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as is.\r\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\r\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\r\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\r\n\t\t},\r\n\t\tset: function( tween ) {\r\n\t\t\t// use step hook for back compat - use cssHook if its there - use .style if its\r\n\t\t\t// available and use plain properties where available\r\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\r\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\r\n\t\t\t} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {\r\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\r\n\t\t\t} else {\r\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// Support: IE <=9\r\n// Panic based approach to setting things on disconnected nodes\r\n\r\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\r\n\tset: function( tween ) {\r\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\r\n\t\t\ttween.elem[ tween.prop ] = tween.now;\r\n\t\t}\r\n\t}\r\n};\r\n\r\njQuery.easing = {\r\n\tlinear: function( p ) {\r\n\t\treturn p;\r\n\t},\r\n\tswing: function( p ) {\r\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\r\n\t}\r\n};\r\n\r\njQuery.fx = Tween.prototype.init;\r\n\r\n// Back Compat <1.8 extension point\r\njQuery.fx.step = {};\r\n\r\n\r\n\r\n\r\nvar\r\n\tfxNow, timerId,\r\n\trfxtypes = /^(?:toggle|show|hide)$/,\r\n\trfxnum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" ),\r\n\trrun = /queueHooks$/,\r\n\tanimationPrefilters = [ defaultPrefilter ],\r\n\ttweeners = {\r\n\t\t\"*\": [ function( prop, value ) {\r\n\t\t\tvar tween = this.createTween( prop, value ),\r\n\t\t\t\ttarget = tween.cur(),\r\n\t\t\t\tparts = rfxnum.exec( value ),\r\n\t\t\t\tunit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\r\n\r\n\t\t\t\t// Starting value computation is required for potential unit mismatches\r\n\t\t\t\tstart = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +target ) &&\r\n\t\t\t\t\trfxnum.exec( jQuery.css( tween.elem, prop ) ),\r\n\t\t\t\tscale = 1,\r\n\t\t\t\tmaxIterations = 20;\r\n\r\n\t\t\tif ( start && start[ 3 ] !== unit ) {\r\n\t\t\t\t// Trust units reported by jQuery.css\r\n\t\t\t\tunit = unit || start[ 3 ];\r\n\r\n\t\t\t\t// Make sure we update the tween properties later on\r\n\t\t\t\tparts = parts || [];\r\n\r\n\t\t\t\t// Iteratively approximate from a nonzero starting point\r\n\t\t\t\tstart = +target || 1;\r\n\r\n\t\t\t\tdo {\r\n\t\t\t\t\t// If previous iteration zeroed out, double until we get *something*\r\n\t\t\t\t\t// Use a string for doubling factor so we don't accidentally see scale as unchanged below\r\n\t\t\t\t\tscale = scale || \".5\";\r\n\r\n\t\t\t\t\t// Adjust and apply\r\n\t\t\t\t\tstart = start / scale;\r\n\t\t\t\t\tjQuery.style( tween.elem, prop, start + unit );\r\n\r\n\t\t\t\t// Update scale, tolerating zero or NaN from tween.cur()\r\n\t\t\t\t// And breaking the loop if scale is unchanged or perfect, or if we've just had enough\r\n\t\t\t\t} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );\r\n\t\t\t}\r\n\r\n\t\t\t// Update tween properties\r\n\t\t\tif ( parts ) {\r\n\t\t\t\tstart = tween.start = +start || +target || 0;\r\n\t\t\t\ttween.unit = unit;\r\n\t\t\t\t// If a +=/-= token was provided, we're doing a relative animation\r\n\t\t\t\ttween.end = parts[ 1 ] ?\r\n\t\t\t\t\tstart + ( parts[ 1 ] + 1 ) * parts[ 2 ] :\r\n\t\t\t\t\t+parts[ 2 ];\r\n\t\t\t}\r\n\r\n\t\t\treturn tween;\r\n\t\t} ]\r\n\t};\r\n\r\n// Animations created synchronously will run synchronously\r\nfunction createFxNow() {\r\n\tsetTimeout(function() {\r\n\t\tfxNow = undefined;\r\n\t});\r\n\treturn ( fxNow = jQuery.now() );\r\n}\r\n\r\n// Generate parameters to create a standard animation\r\nfunction genFx( type, includeWidth ) {\r\n\tvar which,\r\n\t\tattrs = { height: type },\r\n\t\ti = 0;\r\n\r\n\t// if we include width, step value is 1 to do all cssExpand values,\r\n\t// if we don't include width, step value is 2 to skip over Left and Right\r\n\tincludeWidth = includeWidth ? 1 : 0;\r\n\tfor ( ; i < 4 ; i += 2 - includeWidth ) {\r\n\t\twhich = cssExpand[ i ];\r\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\r\n\t}\r\n\r\n\tif ( includeWidth ) {\r\n\t\tattrs.opacity = attrs.width = type;\r\n\t}\r\n\r\n\treturn attrs;\r\n}\r\n\r\nfunction createTween( value, prop, animation ) {\r\n\tvar tween,\r\n\t\tcollection = ( tweeners[ prop ] || [] ).concat( tweeners[ \"*\" ] ),\r\n\t\tindex = 0,\r\n\t\tlength = collection.length;\r\n\tfor ( ; index < length; index++ ) {\r\n\t\tif ( (tween = collection[ index ].call( animation, prop, value )) ) {\r\n\r\n\t\t\t// we're done with this property\r\n\t\t\treturn tween;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction defaultPrefilter( elem, props, opts ) {\r\n\t/* jshint validthis: true */\r\n\tvar prop, value, toggle, tween, hooks, oldfire, display, dDisplay,\r\n\t\tanim = this,\r\n\t\torig = {},\r\n\t\tstyle = elem.style,\r\n\t\thidden = elem.nodeType && isHidden( elem ),\r\n\t\tdataShow = jQuery._data( elem, \"fxshow\" );\r\n\r\n\t// handle queue: false promises\r\n\tif ( !opts.queue ) {\r\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\r\n\t\tif ( hooks.unqueued == null ) {\r\n\t\t\thooks.unqueued = 0;\r\n\t\t\toldfire = hooks.empty.fire;\r\n\t\t\thooks.empty.fire = function() {\r\n\t\t\t\tif ( !hooks.unqueued ) {\r\n\t\t\t\t\toldfire();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\t\thooks.unqueued++;\r\n\r\n\t\tanim.always(function() {\r\n\t\t\t// doing this makes sure that the complete handler will be called\r\n\t\t\t// before this completes\r\n\t\t\tanim.always(function() {\r\n\t\t\t\thooks.unqueued--;\r\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\r\n\t\t\t\t\thooks.empty.fire();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t// height/width overflow pass\r\n\tif ( elem.nodeType === 1 && ( \"height\" in props || \"width\" in props ) ) {\r\n\t\t// Make sure that nothing sneaks out\r\n\t\t// Record all 3 overflow attributes because IE does not\r\n\t\t// change the overflow attribute when overflowX and\r\n\t\t// overflowY are set to the same value\r\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\r\n\r\n\t\t// Set display property to inline-block for height/width\r\n\t\t// animations on inline elements that are having width/height animated\r\n\t\tdisplay = jQuery.css( elem, \"display\" );\r\n\t\tdDisplay = defaultDisplay( elem.nodeName );\r\n\t\tif ( display === \"none\" ) {\r\n\t\t\tdisplay = dDisplay;\r\n\t\t}\r\n\t\tif ( display === \"inline\" &&\r\n\t\t\t\tjQuery.css( elem, \"float\" ) === \"none\" ) {\r\n\r\n\t\t\t// inline-level elements accept inline-block;\r\n\t\t\t// block-level elements need to be inline with layout\r\n\t\t\tif ( !support.inlineBlockNeedsLayout || dDisplay === \"inline\" ) {\r\n\t\t\t\tstyle.display = \"inline-block\";\r\n\t\t\t} else {\r\n\t\t\t\tstyle.zoom = 1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif ( opts.overflow ) {\r\n\t\tstyle.overflow = \"hidden\";\r\n\t\tif ( !support.shrinkWrapBlocks() ) {\r\n\t\t\tanim.always(function() {\r\n\t\t\t\tstyle.overflow = opts.overflow[ 0 ];\r\n\t\t\t\tstyle.overflowX = opts.overflow[ 1 ];\r\n\t\t\t\tstyle.overflowY = opts.overflow[ 2 ];\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// show/hide pass\r\n\tfor ( prop in props ) {\r\n\t\tvalue = props[ prop ];\r\n\t\tif ( rfxtypes.exec( value ) ) {\r\n\t\t\tdelete props[ prop ];\r\n\t\t\ttoggle = toggle || value === \"toggle\";\r\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\r\n\r\n\t\t\t\t// If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden\r\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\r\n\t\t\t\t\thidden = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\r\n\t\t}\r\n\t}\r\n\r\n\tif ( !jQuery.isEmptyObject( orig ) ) {\r\n\t\tif ( dataShow ) {\r\n\t\t\tif ( \"hidden\" in dataShow ) {\r\n\t\t\t\thidden = dataShow.hidden;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tdataShow = jQuery._data( elem, \"fxshow\", {} );\r\n\t\t}\r\n\r\n\t\t// store state if its toggle - enables .stop().toggle() to \"reverse\"\r\n\t\tif ( toggle ) {\r\n\t\t\tdataShow.hidden = !hidden;\r\n\t\t}\r\n\t\tif ( hidden ) {\r\n\t\t\tjQuery( elem ).show();\r\n\t\t} else {\r\n\t\t\tanim.done(function() {\r\n\t\t\t\tjQuery( elem ).hide();\r\n\t\t\t});\r\n\t\t}\r\n\t\tanim.done(function() {\r\n\t\t\tvar prop;\r\n\t\t\tjQuery._removeData( elem, \"fxshow\" );\r\n\t\t\tfor ( prop in orig ) {\r\n\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\r\n\t\t\t}\r\n\t\t});\r\n\t\tfor ( prop in orig ) {\r\n\t\t\ttween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\r\n\r\n\t\t\tif ( !( prop in dataShow ) ) {\r\n\t\t\t\tdataShow[ prop ] = tween.start;\r\n\t\t\t\tif ( hidden ) {\r\n\t\t\t\t\ttween.end = tween.start;\r\n\t\t\t\t\ttween.start = prop === \"width\" || prop === \"height\" ? 1 : 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction propFilter( props, specialEasing ) {\r\n\tvar index, name, easing, value, hooks;\r\n\r\n\t// camelCase, specialEasing and expand cssHook pass\r\n\tfor ( index in props ) {\r\n\t\tname = jQuery.camelCase( index );\r\n\t\teasing = specialEasing[ name ];\r\n\t\tvalue = props[ index ];\r\n\t\tif ( jQuery.isArray( value ) ) {\r\n\t\t\teasing = value[ 1 ];\r\n\t\t\tvalue = props[ index ] = value[ 0 ];\r\n\t\t}\r\n\r\n\t\tif ( index !== name ) {\r\n\t\t\tprops[ name ] = value;\r\n\t\t\tdelete props[ index ];\r\n\t\t}\r\n\r\n\t\thooks = jQuery.cssHooks[ name ];\r\n\t\tif ( hooks && \"expand\" in hooks ) {\r\n\t\t\tvalue = hooks.expand( value );\r\n\t\t\tdelete props[ name ];\r\n\r\n\t\t\t// not quite $.extend, this wont overwrite keys already present.\r\n\t\t\t// also - reusing 'index' from above because we have the correct \"name\"\r\n\t\t\tfor ( index in value ) {\r\n\t\t\t\tif ( !( index in props ) ) {\r\n\t\t\t\t\tprops[ index ] = value[ index ];\r\n\t\t\t\t\tspecialEasing[ index ] = easing;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tspecialEasing[ name ] = easing;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction Animation( elem, properties, options ) {\r\n\tvar result,\r\n\t\tstopped,\r\n\t\tindex = 0,\r\n\t\tlength = animationPrefilters.length,\r\n\t\tdeferred = jQuery.Deferred().always( function() {\r\n\t\t\t// don't match elem in the :animated selector\r\n\t\t\tdelete tick.elem;\r\n\t\t}),\r\n\t\ttick = function() {\r\n\t\t\tif ( stopped ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tvar currentTime = fxNow || createFxNow(),\r\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\r\n\t\t\t\t// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)\r\n\t\t\t\ttemp = remaining / animation.duration || 0,\r\n\t\t\t\tpercent = 1 - temp,\r\n\t\t\t\tindex = 0,\r\n\t\t\t\tlength = animation.tweens.length;\r\n\r\n\t\t\tfor ( ; index < length ; index++ ) {\r\n\t\t\t\tanimation.tweens[ index ].run( percent );\r\n\t\t\t}\r\n\r\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ]);\r\n\r\n\t\t\tif ( percent < 1 && length ) {\r\n\t\t\t\treturn remaining;\r\n\t\t\t} else {\r\n\t\t\t\tdeferred.resolveWith( elem, [ animation ] );\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t},\r\n\t\tanimation = deferred.promise({\r\n\t\t\telem: elem,\r\n\t\t\tprops: jQuery.extend( {}, properties ),\r\n\t\t\topts: jQuery.extend( true, { specialEasing: {} }, options ),\r\n\t\t\toriginalProperties: properties,\r\n\t\t\toriginalOptions: options,\r\n\t\t\tstartTime: fxNow || createFxNow(),\r\n\t\t\tduration: options.duration,\r\n\t\t\ttweens: [],\r\n\t\t\tcreateTween: function( prop, end ) {\r\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\r\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\r\n\t\t\t\tanimation.tweens.push( tween );\r\n\t\t\t\treturn tween;\r\n\t\t\t},\r\n\t\t\tstop: function( gotoEnd ) {\r\n\t\t\t\tvar index = 0,\r\n\t\t\t\t\t// if we are going to the end, we want to run all the tweens\r\n\t\t\t\t\t// otherwise we skip this part\r\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\r\n\t\t\t\tif ( stopped ) {\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t}\r\n\t\t\t\tstopped = true;\r\n\t\t\t\tfor ( ; index < length ; index++ ) {\r\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// resolve when we played the last frame\r\n\t\t\t\t// otherwise, reject\r\n\t\t\t\tif ( gotoEnd ) {\r\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\r\n\t\t\t\t}\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\t\t}),\r\n\t\tprops = animation.props;\r\n\r\n\tpropFilter( props, animation.opts.specialEasing );\r\n\r\n\tfor ( ; index < length ; index++ ) {\r\n\t\tresult = animationPrefilters[ index ].call( animation, elem, props, animation.opts );\r\n\t\tif ( result ) {\r\n\t\t\treturn result;\r\n\t\t}\r\n\t}\r\n\r\n\tjQuery.map( props, createTween, animation );\r\n\r\n\tif ( jQuery.isFunction( animation.opts.start ) ) {\r\n\t\tanimation.opts.start.call( elem, animation );\r\n\t}\r\n\r\n\tjQuery.fx.timer(\r\n\t\tjQuery.extend( tick, {\r\n\t\t\telem: elem,\r\n\t\t\tanim: animation,\r\n\t\t\tqueue: animation.opts.queue\r\n\t\t})\r\n\t);\r\n\r\n\t// attach callbacks from options\r\n\treturn animation.progress( animation.opts.progress )\r\n\t\t.done( animation.opts.done, animation.opts.complete )\r\n\t\t.fail( animation.opts.fail )\r\n\t\t.always( animation.opts.always );\r\n}\r\n\r\njQuery.Animation = jQuery.extend( Animation, {\r\n\ttweener: function( props, callback ) {\r\n\t\tif ( jQuery.isFunction( props ) ) {\r\n\t\t\tcallback = props;\r\n\t\t\tprops = [ \"*\" ];\r\n\t\t} else {\r\n\t\t\tprops = props.split(\" \");\r\n\t\t}\r\n\r\n\t\tvar prop,\r\n\t\t\tindex = 0,\r\n\t\t\tlength = props.length;\r\n\r\n\t\tfor ( ; index < length ; index++ ) {\r\n\t\t\tprop = props[ index ];\r\n\t\t\ttweeners[ prop ] = tweeners[ prop ] || [];\r\n\t\t\ttweeners[ prop ].unshift( callback );\r\n\t\t}\r\n\t},\r\n\r\n\tprefilter: function( callback, prepend ) {\r\n\t\tif ( prepend ) {\r\n\t\t\tanimationPrefilters.unshift( callback );\r\n\t\t} else {\r\n\t\t\tanimationPrefilters.push( callback );\r\n\t\t}\r\n\t}\r\n});\r\n\r\njQuery.speed = function( speed, easing, fn ) {\r\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\r\n\t\tcomplete: fn || !fn && easing ||\r\n\t\t\tjQuery.isFunction( speed ) && speed,\r\n\t\tduration: speed,\r\n\t\teasing: fn && easing || easing && !jQuery.isFunction( easing ) && easing\r\n\t};\r\n\r\n\topt.duration = jQuery.fx.off ? 0 : typeof opt.duration === \"number\" ? opt.duration :\r\n\t\topt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;\r\n\r\n\t// normalize opt.queue - true/undefined/null -> \"fx\"\r\n\tif ( opt.queue == null || opt.queue === true ) {\r\n\t\topt.queue = \"fx\";\r\n\t}\r\n\r\n\t// Queueing\r\n\topt.old = opt.complete;\r\n\r\n\topt.complete = function() {\r\n\t\tif ( jQuery.isFunction( opt.old ) ) {\r\n\t\t\topt.old.call( this );\r\n\t\t}\r\n\r\n\t\tif ( opt.queue ) {\r\n\t\t\tjQuery.dequeue( this, opt.queue );\r\n\t\t}\r\n\t};\r\n\r\n\treturn opt;\r\n};\r\n\r\njQuery.fn.extend({\r\n\tfadeTo: function( speed, to, easing, callback ) {\r\n\r\n\t\t// show any hidden elements after setting opacity to 0\r\n\t\treturn this.filter( isHidden ).css( \"opacity\", 0 ).show()\r\n\r\n\t\t\t// animate to the value specified\r\n\t\t\t.end().animate({ opacity: to }, speed, easing, callback );\r\n\t},\r\n\tanimate: function( prop, speed, easing, callback ) {\r\n\t\tvar empty = jQuery.isEmptyObject( prop ),\r\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\r\n\t\t\tdoAnimation = function() {\r\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\r\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\r\n\r\n\t\t\t\t// Empty animations, or finishing resolves immediately\r\n\t\t\t\tif ( empty || jQuery._data( this, \"finish\" ) ) {\r\n\t\t\t\t\tanim.stop( true );\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tdoAnimation.finish = doAnimation;\r\n\r\n\t\treturn empty || optall.queue === false ?\r\n\t\t\tthis.each( doAnimation ) :\r\n\t\t\tthis.queue( optall.queue, doAnimation );\r\n\t},\r\n\tstop: function( type, clearQueue, gotoEnd ) {\r\n\t\tvar stopQueue = function( hooks ) {\r\n\t\t\tvar stop = hooks.stop;\r\n\t\t\tdelete hooks.stop;\r\n\t\t\tstop( gotoEnd );\r\n\t\t};\r\n\r\n\t\tif ( typeof type !== \"string\" ) {\r\n\t\t\tgotoEnd = clearQueue;\r\n\t\t\tclearQueue = type;\r\n\t\t\ttype = undefined;\r\n\t\t}\r\n\t\tif ( clearQueue && type !== false ) {\r\n\t\t\tthis.queue( type || \"fx\", [] );\r\n\t\t}\r\n\r\n\t\treturn this.each(function() {\r\n\t\t\tvar dequeue = true,\r\n\t\t\t\tindex = type != null && type + \"queueHooks\",\r\n\t\t\t\ttimers = jQuery.timers,\r\n\t\t\t\tdata = jQuery._data( this );\r\n\r\n\t\t\tif ( index ) {\r\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\r\n\t\t\t\t\tstopQueue( data[ index ] );\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor ( index in data ) {\r\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\r\n\t\t\t\t\t\tstopQueue( data[ index ] );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfor ( index = timers.length; index--; ) {\r\n\t\t\t\tif ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {\r\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\r\n\t\t\t\t\tdequeue = false;\r\n\t\t\t\t\ttimers.splice( index, 1 );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// start the next in the queue if the last step wasn't forced\r\n\t\t\t// timers currently will call their complete callbacks, which will dequeue\r\n\t\t\t// but only if they were gotoEnd\r\n\t\t\tif ( dequeue || !gotoEnd ) {\r\n\t\t\t\tjQuery.dequeue( this, type );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\tfinish: function( type ) {\r\n\t\tif ( type !== false ) {\r\n\t\t\ttype = type || \"fx\";\r\n\t\t}\r\n\t\treturn this.each(function() {\r\n\t\t\tvar index,\r\n\t\t\t\tdata = jQuery._data( this ),\r\n\t\t\t\tqueue = data[ type + \"queue\" ],\r\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\r\n\t\t\t\ttimers = jQuery.timers,\r\n\t\t\t\tlength = queue ? queue.length : 0;\r\n\r\n\t\t\t// enable finishing flag on private data\r\n\t\t\tdata.finish = true;\r\n\r\n\t\t\t// empty the queue first\r\n\t\t\tjQuery.queue( this, type, [] );\r\n\r\n\t\t\tif ( hooks && hooks.stop ) {\r\n\t\t\t\thooks.stop.call( this, true );\r\n\t\t\t}\r\n\r\n\t\t\t// look for any active animations, and finish them\r\n\t\t\tfor ( index = timers.length; index--; ) {\r\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\r\n\t\t\t\t\ttimers[ index ].anim.stop( true );\r\n\t\t\t\t\ttimers.splice( index, 1 );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// look for any animations in the old queue and finish them\r\n\t\t\tfor ( index = 0; index < length; index++ ) {\r\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\r\n\t\t\t\t\tqueue[ index ].finish.call( this );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// turn off finishing flag\r\n\t\t\tdelete data.finish;\r\n\t\t});\r\n\t}\r\n});\r\n\r\njQuery.each([ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\r\n\tvar cssFn = jQuery.fn[ name ];\r\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\r\n\t\treturn speed == null || typeof speed === \"boolean\" ?\r\n\t\t\tcssFn.apply( this, arguments ) :\r\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\r\n\t};\r\n});\r\n\r\n// Generate shortcuts for custom animations\r\njQuery.each({\r\n\tslideDown: genFx(\"show\"),\r\n\tslideUp: genFx(\"hide\"),\r\n\tslideToggle: genFx(\"toggle\"),\r\n\tfadeIn: { opacity: \"show\" },\r\n\tfadeOut: { opacity: \"hide\" },\r\n\tfadeToggle: { opacity: \"toggle\" }\r\n}, function( name, props ) {\r\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\r\n\t\treturn this.animate( props, speed, easing, callback );\r\n\t};\r\n});\r\n\r\njQuery.timers = [];\r\njQuery.fx.tick = function() {\r\n\tvar timer,\r\n\t\ttimers = jQuery.timers,\r\n\t\ti = 0;\r\n\r\n\tfxNow = jQuery.now();\r\n\r\n\tfor ( ; i < timers.length; i++ ) {\r\n\t\ttimer = timers[ i ];\r\n\t\t// Checks the timer has not already been removed\r\n\t\tif ( !timer() && timers[ i ] === timer ) {\r\n\t\t\ttimers.splice( i--, 1 );\r\n\t\t}\r\n\t}\r\n\r\n\tif ( !timers.length ) {\r\n\t\tjQuery.fx.stop();\r\n\t}\r\n\tfxNow = undefined;\r\n};\r\n\r\njQuery.fx.timer = function( timer ) {\r\n\tjQuery.timers.push( timer );\r\n\tif ( timer() ) {\r\n\t\tjQuery.fx.start();\r\n\t} else {\r\n\t\tjQuery.timers.pop();\r\n\t}\r\n};\r\n\r\njQuery.fx.interval = 13;\r\n\r\njQuery.fx.start = function() {\r\n\tif ( !timerId ) {\r\n\t\ttimerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );\r\n\t}\r\n};\r\n\r\njQuery.fx.stop = function() {\r\n\tclearInterval( timerId );\r\n\ttimerId = null;\r\n};\r\n\r\njQuery.fx.speeds = {\r\n\tslow: 600,\r\n\tfast: 200,\r\n\t// Default speed\r\n\t_default: 400\r\n};\r\n\r\n\r\n// Based off of the plugin by Clint Helfers, with permission.\r\n// http://blindsignals.com/index.php/2009/07/jquery-delay/\r\njQuery.fn.delay = function( time, type ) {\r\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\r\n\ttype = type || \"fx\";\r\n\r\n\treturn this.queue( type, function( next, hooks ) {\r\n\t\tvar timeout = setTimeout( next, time );\r\n\t\thooks.stop = function() {\r\n\t\t\tclearTimeout( timeout );\r\n\t\t};\r\n\t});\r\n};\r\n\r\n\r\n(function() {\r\n\tvar a, input, select, opt,\r\n\t\tdiv = document.createElement(\"div\" );\r\n\r\n\t// Setup\r\n\tdiv.setAttribute( \"className\", \"t\" );\r\n\tdiv.innerHTML = \" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\r\n\ta = div.getElementsByTagName(\"a\")[ 0 ];\r\n\r\n\t// First batch of tests.\r\n\tselect = document.createElement(\"select\");\r\n\topt = select.appendChild( document.createElement(\"option\") );\r\n\tinput = div.getElementsByTagName(\"input\")[ 0 ];\r\n\r\n\ta.style.cssText = \"top:1px\";\r\n\r\n\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\r\n\tsupport.getSetAttribute = div.className !== \"t\";\r\n\r\n\t// Get the style information from getAttribute\r\n\t// (IE uses .cssText instead)\r\n\tsupport.style = /top/.test( a.getAttribute(\"style\") );\r\n\r\n\t// Make sure that URLs aren't manipulated\r\n\t// (IE normalizes it by default)\r\n\tsupport.hrefNormalized = a.getAttribute(\"href\") === \"/a\";\r\n\r\n\t// Check the default checkbox/radio value (\"\" on WebKit; \"on\" elsewhere)\r\n\tsupport.checkOn = !!input.value;\r\n\r\n\t// Make sure that a selected-by-default option has a working selected property.\r\n\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\r\n\tsupport.optSelected = opt.selected;\r\n\r\n\t// Tests for enctype support on a form (#6743)\r\n\tsupport.enctype = !!document.createElement(\"form\").enctype;\r\n\r\n\t// Make sure that the options inside disabled selects aren't marked as disabled\r\n\t// (WebKit marks them as disabled)\r\n\tselect.disabled = true;\r\n\tsupport.optDisabled = !opt.disabled;\r\n\r\n\t// Support: IE8 only\r\n\t// Check if we can trust getAttribute(\"value\")\r\n\tinput = document.createElement( \"input\" );\r\n\tinput.setAttribute( \"value\", \"\" );\r\n\tsupport.input = input.getAttribute( \"value\" ) === \"\";\r\n\r\n\t// Check if an input maintains its value after becoming a radio\r\n\tinput.value = \"t\";\r\n\tinput.setAttribute( \"type\", \"radio\" );\r\n\tsupport.radioValue = input.value === \"t\";\r\n\r\n\t// Null elements to avoid leaks in IE.\r\n\ta = input = select = opt = div = null;\r\n})();\r\n\r\n\r\nvar rreturn = /\\r/g;\r\n\r\njQuery.fn.extend({\r\n\tval: function( value ) {\r\n\t\tvar hooks, ret, isFunction,\r\n\t\t\telem = this[0];\r\n\r\n\t\tif ( !arguments.length ) {\r\n\t\t\tif ( elem ) {\r\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];\r\n\r\n\t\t\t\tif ( hooks && \"get\" in hooks && (ret = hooks.get( elem, \"value\" )) !== undefined ) {\r\n\t\t\t\t\treturn ret;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tret = elem.value;\r\n\r\n\t\t\t\treturn typeof ret === \"string\" ?\r\n\t\t\t\t\t// handle most common string cases\r\n\t\t\t\t\tret.replace(rreturn, \"\") :\r\n\t\t\t\t\t// handle cases where value is null/undef or number\r\n\t\t\t\t\tret == null ? \"\" : ret;\r\n\t\t\t}\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tisFunction = jQuery.isFunction( value );\r\n\r\n\t\treturn this.each(function( i ) {\r\n\t\t\tvar val;\r\n\r\n\t\t\tif ( this.nodeType !== 1 ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif ( isFunction ) {\r\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\r\n\t\t\t} else {\r\n\t\t\t\tval = value;\r\n\t\t\t}\r\n\r\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\r\n\t\t\tif ( val == null ) {\r\n\t\t\t\tval = \"\";\r\n\t\t\t} else if ( typeof val === \"number\" ) {\r\n\t\t\t\tval += \"\";\r\n\t\t\t} else if ( jQuery.isArray( val ) ) {\r\n\t\t\t\tval = jQuery.map( val, function( value ) {\r\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\r\n\r\n\t\t\t// If set returns undefined, fall back to normal setting\r\n\t\t\tif ( !hooks || !(\"set\" in hooks) || hooks.set( this, val, \"value\" ) === undefined ) {\r\n\t\t\t\tthis.value = val;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n});\r\n\r\njQuery.extend({\r\n\tvalHooks: {\r\n\t\toption: {\r\n\t\t\tget: function( elem ) {\r\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\r\n\t\t\t\treturn val != null ?\r\n\t\t\t\t\tval :\r\n\t\t\t\t\tjQuery.text( elem );\r\n\t\t\t}\r\n\t\t},\r\n\t\tselect: {\r\n\t\t\tget: function( elem ) {\r\n\t\t\t\tvar value, option,\r\n\t\t\t\t\toptions = elem.options,\r\n\t\t\t\t\tindex = elem.selectedIndex,\r\n\t\t\t\t\tone = elem.type === \"select-one\" || index < 0,\r\n\t\t\t\t\tvalues = one ? null : [],\r\n\t\t\t\t\tmax = one ? index + 1 : options.length,\r\n\t\t\t\t\ti = index < 0 ?\r\n\t\t\t\t\t\tmax :\r\n\t\t\t\t\t\tone ? index : 0;\r\n\r\n\t\t\t\t// Loop through all the selected options\r\n\t\t\t\tfor ( ; i < max; i++ ) {\r\n\t\t\t\t\toption = options[ i ];\r\n\r\n\t\t\t\t\t// oldIE doesn't update selected after form reset (#2551)\r\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\r\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\r\n\t\t\t\t\t\t\t( support.optDisabled ? !option.disabled : option.getAttribute(\"disabled\") === null ) &&\r\n\t\t\t\t\t\t\t( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, \"optgroup\" ) ) ) {\r\n\r\n\t\t\t\t\t\t// Get the specific value for the option\r\n\t\t\t\t\t\tvalue = jQuery( option ).val();\r\n\r\n\t\t\t\t\t\t// We don't need an array for one selects\r\n\t\t\t\t\t\tif ( one ) {\r\n\t\t\t\t\t\t\treturn value;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Multi-Selects return an array\r\n\t\t\t\t\t\tvalues.push( value );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn values;\r\n\t\t\t},\r\n\r\n\t\t\tset: function( elem, value ) {\r\n\t\t\t\tvar optionSet, option,\r\n\t\t\t\t\toptions = elem.options,\r\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\r\n\t\t\t\t\ti = options.length;\r\n\r\n\t\t\t\twhile ( i-- ) {\r\n\t\t\t\t\toption = options[ i ];\r\n\r\n\t\t\t\t\tif ( jQuery.inArray( jQuery.valHooks.option.get( option ), values ) >= 0 ) {\r\n\r\n\t\t\t\t\t\t// Support: IE6\r\n\t\t\t\t\t\t// When new option element is added to select box we need to\r\n\t\t\t\t\t\t// force reflow of newly added node in order to workaround delay\r\n\t\t\t\t\t\t// of initialization properties\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\toption.selected = optionSet = true;\r\n\r\n\t\t\t\t\t\t} catch ( _ ) {\r\n\r\n\t\t\t\t\t\t\t// Will be executed only in IE6\r\n\t\t\t\t\t\t\toption.scrollHeight;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\toption.selected = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\r\n\t\t\t\tif ( !optionSet ) {\r\n\t\t\t\t\telem.selectedIndex = -1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn options;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// Radios and checkboxes getter/setter\r\njQuery.each([ \"radio\", \"checkbox\" ], function() {\r\n\tjQuery.valHooks[ this ] = {\r\n\t\tset: function( elem, value ) {\r\n\t\t\tif ( jQuery.isArray( value ) ) {\r\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\tif ( !support.checkOn ) {\r\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\r\n\t\t\t// Support: Webkit\r\n\t\t\t// \"\" is returned instead of \"on\" if a value isn't specified\r\n\t\t\treturn elem.getAttribute(\"value\") === null ? \"on\" : elem.value;\r\n\t\t};\r\n\t}\r\n});\r\n\r\n\r\n\r\n\r\nvar nodeHook, boolHook,\r\n\tattrHandle = jQuery.expr.attrHandle,\r\n\truseDefault = /^(?:checked|selected)$/i,\r\n\tgetSetAttribute = support.getSetAttribute,\r\n\tgetSetInput = support.input;\r\n\r\njQuery.fn.extend({\r\n\tattr: function( name, value ) {\r\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\r\n\t},\r\n\r\n\tremoveAttr: function( name ) {\r\n\t\treturn this.each(function() {\r\n\t\t\tjQuery.removeAttr( this, name );\r\n\t\t});\r\n\t}\r\n});\r\n\r\njQuery.extend({\r\n\tattr: function( elem, name, value ) {\r\n\t\tvar hooks, ret,\r\n\t\t\tnType = elem.nodeType;\r\n\r\n\t\t// don't get/set attributes on text, comment and attribute nodes\r\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Fallback to prop when attributes are not supported\r\n\t\tif ( typeof elem.getAttribute === strundefined ) {\r\n\t\t\treturn jQuery.prop( elem, name, value );\r\n\t\t}\r\n\r\n\t\t// All attributes are lowercase\r\n\t\t// Grab necessary hook if one is defined\r\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\r\n\t\t\tname = name.toLowerCase();\r\n\t\t\thooks = jQuery.attrHooks[ name ] ||\r\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );\r\n\t\t}\r\n\r\n\t\tif ( value !== undefined ) {\r\n\r\n\t\t\tif ( value === null ) {\r\n\t\t\t\tjQuery.removeAttr( elem, name );\r\n\r\n\t\t\t} else if ( hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {\r\n\t\t\t\treturn ret;\r\n\r\n\t\t\t} else {\r\n\t\t\t\telem.setAttribute( name, value + \"\" );\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\r\n\t\t} else if ( hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ) {\r\n\t\t\treturn ret;\r\n\r\n\t\t} else {\r\n\t\t\tret = jQuery.find.attr( elem, name );\r\n\r\n\t\t\t// Non-existent attributes return null, we normalize to undefined\r\n\t\t\treturn ret == null ?\r\n\t\t\t\tundefined :\r\n\t\t\t\tret;\r\n\t\t}\r\n\t},\r\n\r\n\tremoveAttr: function( elem, value ) {\r\n\t\tvar name, propName,\r\n\t\t\ti = 0,\r\n\t\t\tattrNames = value && value.match( rnotwhite );\r\n\r\n\t\tif ( attrNames && elem.nodeType === 1 ) {\r\n\t\t\twhile ( (name = attrNames[i++]) ) {\r\n\t\t\t\tpropName = jQuery.propFix[ name ] || name;\r\n\r\n\t\t\t\t// Boolean attributes get special treatment (#10870)\r\n\t\t\t\tif ( jQuery.expr.match.bool.test( name ) ) {\r\n\t\t\t\t\t// Set corresponding property to false\r\n\t\t\t\t\tif ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\r\n\t\t\t\t\t\telem[ propName ] = false;\r\n\t\t\t\t\t// Support: IE<9\r\n\t\t\t\t\t// Also clear defaultChecked/defaultSelected (if appropriate)\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] =\r\n\t\t\t\t\t\t\telem[ propName ] = false;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t// See #9699 for explanation of this approach (setting first, then removal)\r\n\t\t\t\t} else {\r\n\t\t\t\t\tjQuery.attr( elem, name, \"\" );\r\n\t\t\t\t}\r\n\r\n\t\t\t\telem.removeAttribute( getSetAttribute ? name : propName );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tattrHooks: {\r\n\t\ttype: {\r\n\t\t\tset: function( elem, value ) {\r\n\t\t\t\tif ( !support.radioValue && value === \"radio\" && jQuery.nodeName(elem, \"input\") ) {\r\n\t\t\t\t\t// Setting the type on a radio button after the value resets the value in IE6-9\r\n\t\t\t\t\t// Reset value to default in case type is set after value during creation\r\n\t\t\t\t\tvar val = elem.value;\r\n\t\t\t\t\telem.setAttribute( \"type\", value );\r\n\t\t\t\t\tif ( val ) {\r\n\t\t\t\t\t\telem.value = val;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// Hook for boolean attributes\r\nboolHook = {\r\n\tset: function( elem, value, name ) {\r\n\t\tif ( value === false ) {\r\n\t\t\t// Remove boolean attributes when set to false\r\n\t\t\tjQuery.removeAttr( elem, name );\r\n\t\t} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {\r\n\t\t\t// IE<8 needs the *property* name\r\n\t\t\telem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );\r\n\r\n\t\t// Use defaultChecked and defaultSelected for oldIE\r\n\t\t} else {\r\n\t\t\telem[ jQuery.camelCase( \"default-\" + name ) ] = elem[ name ] = true;\r\n\t\t}\r\n\r\n\t\treturn name;\r\n\t}\r\n};\r\n\r\n// Retrieve booleans specially\r\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\r\n\r\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\r\n\r\n\tattrHandle[ name ] = getSetInput && getSetAttribute || !ruseDefault.test( name ) ?\r\n\t\tfunction( elem, name, isXML ) {\r\n\t\t\tvar ret, handle;\r\n\t\t\tif ( !isXML ) {\r\n\t\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\r\n\t\t\t\thandle = attrHandle[ name ];\r\n\t\t\t\tattrHandle[ name ] = ret;\r\n\t\t\t\tret = getter( elem, name, isXML ) != null ?\r\n\t\t\t\t\tname.toLowerCase() :\r\n\t\t\t\t\tnull;\r\n\t\t\t\tattrHandle[ name ] = handle;\r\n\t\t\t}\r\n\t\t\treturn ret;\r\n\t\t} :\r\n\t\tfunction( elem, name, isXML ) {\r\n\t\t\tif ( !isXML ) {\r\n\t\t\t\treturn elem[ jQuery.camelCase( \"default-\" + name ) ] ?\r\n\t\t\t\t\tname.toLowerCase() :\r\n\t\t\t\t\tnull;\r\n\t\t\t}\r\n\t\t};\r\n});\r\n\r\n// fix oldIE attroperties\r\nif ( !getSetInput || !getSetAttribute ) {\r\n\tjQuery.attrHooks.value = {\r\n\t\tset: function( elem, value, name ) {\r\n\t\t\tif ( jQuery.nodeName( elem, \"input\" ) ) {\r\n\t\t\t\t// Does not return so that setAttribute is also used\r\n\t\t\t\telem.defaultValue = value;\r\n\t\t\t} else {\r\n\t\t\t\t// Use nodeHook if defined (#1954); otherwise setAttribute is fine\r\n\t\t\t\treturn nodeHook && nodeHook.set( elem, value, name );\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// IE6/7 do not support getting/setting some attributes with get/setAttribute\r\nif ( !getSetAttribute ) {\r\n\r\n\t// Use this for any attribute in IE6/7\r\n\t// This fixes almost every IE6/7 issue\r\n\tnodeHook = {\r\n\t\tset: function( elem, value, name ) {\r\n\t\t\t// Set the existing or create a new attribute node\r\n\t\t\tvar ret = elem.getAttributeNode( name );\r\n\t\t\tif ( !ret ) {\r\n\t\t\t\telem.setAttributeNode(\r\n\t\t\t\t\t(ret = elem.ownerDocument.createAttribute( name ))\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\tret.value = value += \"\";\r\n\r\n\t\t\t// Break association with cloned elements by also using setAttribute (#9646)\r\n\t\t\tif ( name === \"value\" || value === elem.getAttribute( name ) ) {\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t// Some attributes are constructed with empty-string values when not defined\r\n\tattrHandle.id = attrHandle.name = attrHandle.coords =\r\n\t\tfunction( elem, name, isXML ) {\r\n\t\t\tvar ret;\r\n\t\t\tif ( !isXML ) {\r\n\t\t\t\treturn (ret = elem.getAttributeNode( name )) && ret.value !== \"\" ?\r\n\t\t\t\t\tret.value :\r\n\t\t\t\t\tnull;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t// Fixing value retrieval on a button requires this module\r\n\tjQuery.valHooks.button = {\r\n\t\tget: function( elem, name ) {\r\n\t\t\tvar ret = elem.getAttributeNode( name );\r\n\t\t\tif ( ret && ret.specified ) {\r\n\t\t\t\treturn ret.value;\r\n\t\t\t}\r\n\t\t},\r\n\t\tset: nodeHook.set\r\n\t};\r\n\r\n\t// Set contenteditable to false on removals(#10429)\r\n\t// Setting to empty string throws an error as an invalid value\r\n\tjQuery.attrHooks.contenteditable = {\r\n\t\tset: function( elem, value, name ) {\r\n\t\t\tnodeHook.set( elem, value === \"\" ? false : value, name );\r\n\t\t}\r\n\t};\r\n\r\n\t// Set width and height to auto instead of 0 on empty string( Bug #8150 )\r\n\t// This is for removals\r\n\tjQuery.each([ \"width\", \"height\" ], function( i, name ) {\r\n\t\tjQuery.attrHooks[ name ] = {\r\n\t\t\tset: function( elem, value ) {\r\n\t\t\t\tif ( value === \"\" ) {\r\n\t\t\t\t\telem.setAttribute( name, \"auto\" );\r\n\t\t\t\t\treturn value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t});\r\n}\r\n\r\nif ( !support.style ) {\r\n\tjQuery.attrHooks.style = {\r\n\t\tget: function( elem ) {\r\n\t\t\t// Return undefined in the case of empty string\r\n\t\t\t// Note: IE uppercases css property names, but if we were to .toLowerCase()\r\n\t\t\t// .cssText, that would destroy case senstitivity in URL's, like in \"background\"\r\n\t\t\treturn elem.style.cssText || undefined;\r\n\t\t},\r\n\t\tset: function( elem, value ) {\r\n\t\t\treturn ( elem.style.cssText = value + \"\" );\r\n\t\t}\r\n\t};\r\n}\r\n\r\n\r\n\r\n\r\nvar rfocusable = /^(?:input|select|textarea|button|object)$/i,\r\n\trclickable = /^(?:a|area)$/i;\r\n\r\njQuery.fn.extend({\r\n\tprop: function( name, value ) {\r\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\r\n\t},\r\n\r\n\tremoveProp: function( name ) {\r\n\t\tname = jQuery.propFix[ name ] || name;\r\n\t\treturn this.each(function() {\r\n\t\t\t// try/catch handles cases where IE balks (such as removing a property on window)\r\n\t\t\ttry {\r\n\t\t\t\tthis[ name ] = undefined;\r\n\t\t\t\tdelete this[ name ];\r\n\t\t\t} catch( e ) {}\r\n\t\t});\r\n\t}\r\n});\r\n\r\njQuery.extend({\r\n\tpropFix: {\r\n\t\t\"for\": \"htmlFor\",\r\n\t\t\"class\": \"className\"\r\n\t},\r\n\r\n\tprop: function( elem, name, value ) {\r\n\t\tvar ret, hooks, notxml,\r\n\t\t\tnType = elem.nodeType;\r\n\r\n\t\t// don't get/set properties on text, comment and attribute nodes\r\n\t\tif ( !elem || nType === 3 || nType === 8 || nType === 2 ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tnotxml = nType !== 1 || !jQuery.isXMLDoc( elem );\r\n\r\n\t\tif ( notxml ) {\r\n\t\t\t// Fix name and attach hooks\r\n\t\t\tname = jQuery.propFix[ name ] || name;\r\n\t\t\thooks = jQuery.propHooks[ name ];\r\n\t\t}\r\n\r\n\t\tif ( value !== undefined ) {\r\n\t\t\treturn hooks && \"set\" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?\r\n\t\t\t\tret :\r\n\t\t\t\t( elem[ name ] = value );\r\n\r\n\t\t} else {\r\n\t\t\treturn hooks && \"get\" in hooks && (ret = hooks.get( elem, name )) !== null ?\r\n\t\t\t\tret :\r\n\t\t\t\telem[ name ];\r\n\t\t}\r\n\t},\r\n\r\n\tpropHooks: {\r\n\t\ttabIndex: {\r\n\t\t\tget: function( elem ) {\r\n\t\t\t\t// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set\r\n\t\t\t\t// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\r\n\t\t\t\t// Use proper attribute retrieval(#12072)\r\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\r\n\r\n\t\t\t\treturn tabindex ?\r\n\t\t\t\t\tparseInt( tabindex, 10 ) :\r\n\t\t\t\t\trfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?\r\n\t\t\t\t\t\t0 :\r\n\t\t\t\t\t\t-1;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// Some attributes require a special call on IE\r\n// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\r\nif ( !support.hrefNormalized ) {\r\n\t// href/src property should get the full normalized URL (#10299/#12915)\r\n\tjQuery.each([ \"href\", \"src\" ], function( i, name ) {\r\n\t\tjQuery.propHooks[ name ] = {\r\n\t\t\tget: function( elem ) {\r\n\t\t\t\treturn elem.getAttribute( name, 4 );\r\n\t\t\t}\r\n\t\t};\r\n\t});\r\n}\r\n\r\n// Support: Safari, IE9+\r\n// mis-reports the default selected property of an option\r\n// Accessing the parent's selectedIndex property fixes it\r\nif ( !support.optSelected ) {\r\n\tjQuery.propHooks.selected = {\r\n\t\tget: function( elem ) {\r\n\t\t\tvar parent = elem.parentNode;\r\n\r\n\t\t\tif ( parent ) {\r\n\t\t\t\tparent.selectedIndex;\r\n\r\n\t\t\t\t// Make sure that it also works with optgroups, see #5701\r\n\t\t\t\tif ( parent.parentNode ) {\r\n\t\t\t\t\tparent.parentNode.selectedIndex;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\t};\r\n}\r\n\r\njQuery.each([\r\n\t\"tabIndex\",\r\n\t\"readOnly\",\r\n\t\"maxLength\",\r\n\t\"cellSpacing\",\r\n\t\"cellPadding\",\r\n\t\"rowSpan\",\r\n\t\"colSpan\",\r\n\t\"useMap\",\r\n\t\"frameBorder\",\r\n\t\"contentEditable\"\r\n], function() {\r\n\tjQuery.propFix[ this.toLowerCase() ] = this;\r\n});\r\n\r\n// IE6/7 call enctype encoding\r\nif ( !support.enctype ) {\r\n\tjQuery.propFix.enctype = \"encoding\";\r\n}\r\n\r\n\r\n\r\n\r\nvar rclass = /[\\t\\r\\n\\f]/g;\r\n\r\njQuery.fn.extend({\r\n\taddClass: function( value ) {\r\n\t\tvar classes, elem, cur, clazz, j, finalValue,\r\n\t\t\ti = 0,\r\n\t\t\tlen = this.length,\r\n\t\t\tproceed = typeof value === \"string\" && value;\r\n\r\n\t\tif ( jQuery.isFunction( value ) ) {\r\n\t\t\treturn this.each(function( j ) {\r\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, this.className ) );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( proceed ) {\r\n\t\t\t// The disjunction here is for better compressibility (see removeClass)\r\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\r\n\r\n\t\t\tfor ( ; i < len; i++ ) {\r\n\t\t\t\telem = this[ i ];\r\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\r\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\r\n\t\t\t\t\t\" \"\r\n\t\t\t\t);\r\n\r\n\t\t\t\tif ( cur ) {\r\n\t\t\t\t\tj = 0;\r\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\r\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\r\n\t\t\t\t\t\t\tcur += clazz + \" \";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// only assign if different to avoid unneeded rendering.\r\n\t\t\t\t\tfinalValue = jQuery.trim( cur );\r\n\t\t\t\t\tif ( elem.className !== finalValue ) {\r\n\t\t\t\t\t\telem.className = finalValue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tremoveClass: function( value ) {\r\n\t\tvar classes, elem, cur, clazz, j, finalValue,\r\n\t\t\ti = 0,\r\n\t\t\tlen = this.length,\r\n\t\t\tproceed = arguments.length === 0 || typeof value === \"string\" && value;\r\n\r\n\t\tif ( jQuery.isFunction( value ) ) {\r\n\t\t\treturn this.each(function( j ) {\r\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, this.className ) );\r\n\t\t\t});\r\n\t\t}\r\n\t\tif ( proceed ) {\r\n\t\t\tclasses = ( value || \"\" ).match( rnotwhite ) || [];\r\n\r\n\t\t\tfor ( ; i < len; i++ ) {\r\n\t\t\t\telem = this[ i ];\r\n\t\t\t\t// This expression is here for better compressibility (see addClass)\r\n\t\t\t\tcur = elem.nodeType === 1 && ( elem.className ?\r\n\t\t\t\t\t( \" \" + elem.className + \" \" ).replace( rclass, \" \" ) :\r\n\t\t\t\t\t\"\"\r\n\t\t\t\t);\r\n\r\n\t\t\t\tif ( cur ) {\r\n\t\t\t\t\tj = 0;\r\n\t\t\t\t\twhile ( (clazz = classes[j++]) ) {\r\n\t\t\t\t\t\t// Remove *all* instances\r\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) >= 0 ) {\r\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// only assign if different to avoid unneeded rendering.\r\n\t\t\t\t\tfinalValue = value ? jQuery.trim( cur ) : \"\";\r\n\t\t\t\t\tif ( elem.className !== finalValue ) {\r\n\t\t\t\t\t\telem.className = finalValue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\ttoggleClass: function( value, stateVal ) {\r\n\t\tvar type = typeof value;\r\n\r\n\t\tif ( typeof stateVal === \"boolean\" && type === \"string\" ) {\r\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\r\n\t\t}\r\n\r\n\t\tif ( jQuery.isFunction( value ) ) {\r\n\t\t\treturn this.each(function( i ) {\r\n\t\t\t\tjQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn this.each(function() {\r\n\t\t\tif ( type === \"string\" ) {\r\n\t\t\t\t// toggle individual class names\r\n\t\t\t\tvar className,\r\n\t\t\t\t\ti = 0,\r\n\t\t\t\t\tself = jQuery( this ),\r\n\t\t\t\t\tclassNames = value.match( rnotwhite ) || [];\r\n\r\n\t\t\t\twhile ( (className = classNames[ i++ ]) ) {\r\n\t\t\t\t\t// check each className given, space separated list\r\n\t\t\t\t\tif ( self.hasClass( className ) ) {\r\n\t\t\t\t\t\tself.removeClass( className );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tself.addClass( className );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t// Toggle whole class name\r\n\t\t\t} else if ( type === strundefined || type === \"boolean\" ) {\r\n\t\t\t\tif ( this.className ) {\r\n\t\t\t\t\t// store className if set\r\n\t\t\t\t\tjQuery._data( this, \"__className__\", this.className );\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// If the element has a class name or if we're passed \"false\",\r\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\r\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\r\n\t\t\t\t// falling back to the empty string if nothing was stored.\r\n\t\t\t\tthis.className = this.className || value === false ? \"\" : jQuery._data( this, \"__className__\" ) || \"\";\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\thasClass: function( selector ) {\r\n\t\tvar className = \" \" + selector + \" \",\r\n\t\t\ti = 0,\r\n\t\t\tl = this.length;\r\n\t\tfor ( ; i < l; i++ ) {\r\n\t\t\tif ( this[i].nodeType === 1 && (\" \" + this[i].className + \" \").replace(rclass, \" \").indexOf( className ) >= 0 ) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n});\r\n\r\n\r\n\r\n\r\n// Return jQuery for attributes-only inclusion\r\n\r\n\r\njQuery.each( (\"blur focus focusin focusout load resize scroll unload click dblclick \" +\r\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\r\n\t\"change select submit keydown keypress keyup error contextmenu\").split(\" \"), function( i, name ) {\r\n\r\n\t// Handle event binding\r\n\tjQuery.fn[ name ] = function( data, fn ) {\r\n\t\treturn arguments.length > 0 ?\r\n\t\t\tthis.on( name, null, data, fn ) :\r\n\t\t\tthis.trigger( name );\r\n\t};\r\n});\r\n\r\njQuery.fn.extend({\r\n\thover: function( fnOver, fnOut ) {\r\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\r\n\t},\r\n\r\n\tbind: function( types, data, fn ) {\r\n\t\treturn this.on( types, null, data, fn );\r\n\t},\r\n\tunbind: function( types, fn ) {\r\n\t\treturn this.off( types, null, fn );\r\n\t},\r\n\r\n\tdelegate: function( selector, types, data, fn ) {\r\n\t\treturn this.on( types, selector, data, fn );\r\n\t},\r\n\tundelegate: function( selector, types, fn ) {\r\n\t\t// ( namespace ) or ( selector, types [, fn] )\r\n\t\treturn arguments.length === 1 ? this.off( selector, \"**\" ) : this.off( types, selector || \"**\", fn );\r\n\t}\r\n});\r\n\r\n\r\nvar nonce = jQuery.now();\r\n\r\nvar rquery = (/\\?/);\r\n\r\n\r\n\r\nvar rvalidtokens = /(,)|(\\[|{)|(}|])|\"(?:[^\"\\\\\\r\\n]|\\\\[\"\\\\\\/bfnrt]|\\\\u[\\da-fA-F]{4})*\"\\s*:?|true|false|null|-?(?!0\\d)\\d+(?:\\.\\d+|)(?:[eE][+-]?\\d+|)/g;\r\n\r\njQuery.parseJSON = function( data ) {\r\n\t// Attempt to parse using the native JSON parser first\r\n\tif ( window.JSON && window.JSON.parse ) {\r\n\t\t// Support: Android 2.3\r\n\t\t// Workaround failure to string-cast null input\r\n\t\treturn window.JSON.parse( data + \"\" );\r\n\t}\r\n\r\n\tvar requireNonComma,\r\n\t\tdepth = null,\r\n\t\tstr = jQuery.trim( data + \"\" );\r\n\r\n\t// Guard against invalid (and possibly dangerous) input by ensuring that nothing remains\r\n\t// after removing valid tokens\r\n\treturn str && !jQuery.trim( str.replace( rvalidtokens, function( token, comma, open, close ) {\r\n\r\n\t\t// Force termination if we see a misplaced comma\r\n\t\tif ( requireNonComma && comma ) {\r\n\t\t\tdepth = 0;\r\n\t\t}\r\n\r\n\t\t// Perform no more replacements after returning to outermost depth\r\n\t\tif ( depth === 0 ) {\r\n\t\t\treturn token;\r\n\t\t}\r\n\r\n\t\t// Commas must not follow \"[\", \"{\", or \",\"\r\n\t\trequireNonComma = open || comma;\r\n\r\n\t\t// Determine new depth\r\n\t\t// array/object open (\"[\" or \"{\"): depth += true - false (increment)\r\n\t\t// array/object close (\"]\" or \"}\"): depth += false - true (decrement)\r\n\t\t// other cases (\",\" or primitive): depth += true - true (numeric cast)\r\n\t\tdepth += !close - !open;\r\n\r\n\t\t// Remove this token\r\n\t\treturn \"\";\r\n\t}) ) ?\r\n\t\t( Function( \"return \" + str ) )() :\r\n\t\tjQuery.error( \"Invalid JSON: \" + data );\r\n};\r\n\r\n\r\n// Cross-browser xml parsing\r\njQuery.parseXML = function( data ) {\r\n\tvar xml, tmp;\r\n\tif ( !data || typeof data !== \"string\" ) {\r\n\t\treturn null;\r\n\t}\r\n\ttry {\r\n\t\tif ( window.DOMParser ) { // Standard\r\n\t\t\ttmp = new DOMParser();\r\n\t\t\txml = tmp.parseFromString( data, \"text/xml\" );\r\n\t\t} else { // IE\r\n\t\t\txml = new ActiveXObject( \"Microsoft.XMLDOM\" );\r\n\t\t\txml.async = \"false\";\r\n\t\t\txml.loadXML( data );\r\n\t\t}\r\n\t} catch( e ) {\r\n\t\txml = undefined;\r\n\t}\r\n\tif ( !xml || !xml.documentElement || xml.getElementsByTagName( \"parsererror\" ).length ) {\r\n\t\tjQuery.error( \"Invalid XML: \" + data );\r\n\t}\r\n\treturn xml;\r\n};\r\n\r\n\r\nvar\r\n\t// Document location\r\n\tajaxLocParts,\r\n\tajaxLocation,\r\n\r\n\trhash = /#.*$/,\r\n\trts = /([?&])_=[^&]*/,\r\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)\\r?$/mg, // IE leaves an \\r character at EOL\r\n\t// #7653, #8125, #8152: local protocol detection\r\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\r\n\trnoContent = /^(?:GET|HEAD)$/,\r\n\trprotocol = /^\\/\\//,\r\n\trurl = /^([\\w.+-]+:)(?:\\/\\/(?:[^\\/?#]*@|)([^\\/?#:]*)(?::(\\d+)|)|)/,\r\n\r\n\t/* Prefilters\r\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\r\n\t * 2) These are called:\r\n\t * - BEFORE asking for a transport\r\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\r\n\t * 3) key is the dataType\r\n\t * 4) the catchall symbol \"*\" can be used\r\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\r\n\t */\r\n\tprefilters = {},\r\n\r\n\t/* Transports bindings\r\n\t * 1) key is the dataType\r\n\t * 2) the catchall symbol \"*\" can be used\r\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\r\n\t */\r\n\ttransports = {},\r\n\r\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\r\n\tallTypes = \"*/\".concat(\"*\");\r\n\r\n// #8138, IE may throw an exception when accessing\r\n// a field from window.location if document.domain has been set\r\ntry {\r\n\tajaxLocation = location.href;\r\n} catch( e ) {\r\n\t// Use the href attribute of an A element\r\n\t// since IE will modify it given document.location\r\n\tajaxLocation = document.createElement( \"a\" );\r\n\tajaxLocation.href = \"\";\r\n\tajaxLocation = ajaxLocation.href;\r\n}\r\n\r\n// Segment location into parts\r\najaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];\r\n\r\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\r\nfunction addToPrefiltersOrTransports( structure ) {\r\n\r\n\t// dataTypeExpression is optional and defaults to \"*\"\r\n\treturn function( dataTypeExpression, func ) {\r\n\r\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\r\n\t\t\tfunc = dataTypeExpression;\r\n\t\t\tdataTypeExpression = \"*\";\r\n\t\t}\r\n\r\n\t\tvar dataType,\r\n\t\t\ti = 0,\r\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];\r\n\r\n\t\tif ( jQuery.isFunction( func ) ) {\r\n\t\t\t// For each dataType in the dataTypeExpression\r\n\t\t\twhile ( (dataType = dataTypes[i++]) ) {\r\n\t\t\t\t// Prepend if requested\r\n\t\t\t\tif ( dataType.charAt( 0 ) === \"+\" ) {\r\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\r\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).unshift( func );\r\n\r\n\t\t\t\t// Otherwise append\r\n\t\t\t\t} else {\r\n\t\t\t\t\t(structure[ dataType ] = structure[ dataType ] || []).push( func );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n}\r\n\r\n// Base inspection function for prefilters and transports\r\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\r\n\r\n\tvar inspected = {},\r\n\t\tseekingTransport = ( structure === transports );\r\n\r\n\tfunction inspect( dataType ) {\r\n\t\tvar selected;\r\n\t\tinspected[ dataType ] = true;\r\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\r\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\r\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {\r\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\r\n\t\t\t\tinspect( dataTypeOrTransport );\r\n\t\t\t\treturn false;\r\n\t\t\t} else if ( seekingTransport ) {\r\n\t\t\t\treturn !( selected = dataTypeOrTransport );\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn selected;\r\n\t}\r\n\r\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\r\n}\r\n\r\n// A special extend for ajax options\r\n// that takes \"flat\" options (not to be deep extended)\r\n// Fixes #9887\r\nfunction ajaxExtend( target, src ) {\r\n\tvar deep, key,\r\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\r\n\r\n\tfor ( key in src ) {\r\n\t\tif ( src[ key ] !== undefined ) {\r\n\t\t\t( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];\r\n\t\t}\r\n\t}\r\n\tif ( deep ) {\r\n\t\tjQuery.extend( true, target, deep );\r\n\t}\r\n\r\n\treturn target;\r\n}\r\n\r\n/* Handles responses to an ajax request:\r\n * - finds the right dataType (mediates between content-type and expected dataType)\r\n * - returns the corresponding response\r\n */\r\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\r\n\tvar firstDataType, ct, finalDataType, type,\r\n\t\tcontents = s.contents,\r\n\t\tdataTypes = s.dataTypes;\r\n\r\n\t// Remove auto dataType and get content-type in the process\r\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\r\n\t\tdataTypes.shift();\r\n\t\tif ( ct === undefined ) {\r\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader(\"Content-Type\");\r\n\t\t}\r\n\t}\r\n\r\n\t// Check if we're dealing with a known content-type\r\n\tif ( ct ) {\r\n\t\tfor ( type in contents ) {\r\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\r\n\t\t\t\tdataTypes.unshift( type );\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Check to see if we have a response for the expected dataType\r\n\tif ( dataTypes[ 0 ] in responses ) {\r\n\t\tfinalDataType = dataTypes[ 0 ];\r\n\t} else {\r\n\t\t// Try convertible dataTypes\r\n\t\tfor ( type in responses ) {\r\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[0] ] ) {\r\n\t\t\t\tfinalDataType = type;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif ( !firstDataType ) {\r\n\t\t\t\tfirstDataType = type;\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Or just use first one\r\n\t\tfinalDataType = finalDataType || firstDataType;\r\n\t}\r\n\r\n\t// If we found a dataType\r\n\t// We add the dataType to the list if needed\r\n\t// and return the corresponding response\r\n\tif ( finalDataType ) {\r\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\r\n\t\t\tdataTypes.unshift( finalDataType );\r\n\t\t}\r\n\t\treturn responses[ finalDataType ];\r\n\t}\r\n}\r\n\r\n/* Chain conversions given the request and the original response\r\n * Also sets the responseXXX fields on the jqXHR instance\r\n */\r\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\r\n\tvar conv2, current, conv, tmp, prev,\r\n\t\tconverters = {},\r\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\r\n\t\tdataTypes = s.dataTypes.slice();\r\n\r\n\t// Create converters map with lowercased keys\r\n\tif ( dataTypes[ 1 ] ) {\r\n\t\tfor ( conv in s.converters ) {\r\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\r\n\t\t}\r\n\t}\r\n\r\n\tcurrent = dataTypes.shift();\r\n\r\n\t// Convert to each sequential dataType\r\n\twhile ( current ) {\r\n\r\n\t\tif ( s.responseFields[ current ] ) {\r\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\r\n\t\t}\r\n\r\n\t\t// Apply the dataFilter if provided\r\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\r\n\t\t\tresponse = s.dataFilter( response, s.dataType );\r\n\t\t}\r\n\r\n\t\tprev = current;\r\n\t\tcurrent = dataTypes.shift();\r\n\r\n\t\tif ( current ) {\r\n\r\n\t\t\t// There's only work to do if current dataType is non-auto\r\n\t\t\tif ( current === \"*\" ) {\r\n\r\n\t\t\t\tcurrent = prev;\r\n\r\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\r\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\r\n\r\n\t\t\t\t// Seek a direct converter\r\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\r\n\r\n\t\t\t\t// If none found, seek a pair\r\n\t\t\t\tif ( !conv ) {\r\n\t\t\t\t\tfor ( conv2 in converters ) {\r\n\r\n\t\t\t\t\t\t// If conv2 outputs current\r\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\r\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\r\n\r\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\r\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\r\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\r\n\t\t\t\t\t\t\tif ( conv ) {\r\n\t\t\t\t\t\t\t\t// Condense equivalence converters\r\n\t\t\t\t\t\t\t\tif ( conv === true ) {\r\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\r\n\r\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\r\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\r\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\r\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Apply converter (if not an equivalence)\r\n\t\t\t\tif ( conv !== true ) {\r\n\r\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\r\n\t\t\t\t\tif ( conv && s[ \"throws\" ] ) {\r\n\t\t\t\t\t\tresponse = conv( response );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tresponse = conv( response );\r\n\t\t\t\t\t\t} catch ( e ) {\r\n\t\t\t\t\t\t\treturn { state: \"parsererror\", error: conv ? e : \"No conversion from \" + prev + \" to \" + current };\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn { state: \"success\", data: response };\r\n}\r\n\r\njQuery.extend({\r\n\r\n\t// Counter for holding the number of active queries\r\n\tactive: 0,\r\n\r\n\t// Last-Modified header cache for next request\r\n\tlastModified: {},\r\n\tetag: {},\r\n\r\n\tajaxSettings: {\r\n\t\turl: ajaxLocation,\r\n\t\ttype: \"GET\",\r\n\t\tisLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),\r\n\t\tglobal: true,\r\n\t\tprocessData: true,\r\n\t\tasync: true,\r\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\r\n\t\t/*\r\n\t\ttimeout: 0,\r\n\t\tdata: null,\r\n\t\tdataType: null,\r\n\t\tusername: null,\r\n\t\tpassword: null,\r\n\t\tcache: null,\r\n\t\tthrows: false,\r\n\t\ttraditional: false,\r\n\t\theaders: {},\r\n\t\t*/\r\n\r\n\t\taccepts: {\r\n\t\t\t\"*\": allTypes,\r\n\t\t\ttext: \"text/plain\",\r\n\t\t\thtml: \"text/html\",\r\n\t\t\txml: \"application/xml, text/xml\",\r\n\t\t\tjson: \"application/json, text/javascript\"\r\n\t\t},\r\n\r\n\t\tcontents: {\r\n\t\t\txml: /xml/,\r\n\t\t\thtml: /html/,\r\n\t\t\tjson: /json/\r\n\t\t},\r\n\r\n\t\tresponseFields: {\r\n\t\t\txml: \"responseXML\",\r\n\t\t\ttext: \"responseText\",\r\n\t\t\tjson: \"responseJSON\"\r\n\t\t},\r\n\r\n\t\t// Data converters\r\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\r\n\t\tconverters: {\r\n\r\n\t\t\t// Convert anything to text\r\n\t\t\t\"* text\": String,\r\n\r\n\t\t\t// Text to html (true = no transformation)\r\n\t\t\t\"text html\": true,\r\n\r\n\t\t\t// Evaluate text as a json expression\r\n\t\t\t\"text json\": jQuery.parseJSON,\r\n\r\n\t\t\t// Parse text as xml\r\n\t\t\t\"text xml\": jQuery.parseXML\r\n\t\t},\r\n\r\n\t\t// For options that shouldn't be deep extended:\r\n\t\t// you can add your own custom options here if\r\n\t\t// and when you create one that shouldn't be\r\n\t\t// deep extended (see ajaxExtend)\r\n\t\tflatOptions: {\r\n\t\t\turl: true,\r\n\t\t\tcontext: true\r\n\t\t}\r\n\t},\r\n\r\n\t// Creates a full fledged settings object into target\r\n\t// with both ajaxSettings and settings fields.\r\n\t// If target is omitted, writes into ajaxSettings.\r\n\tajaxSetup: function( target, settings ) {\r\n\t\treturn settings ?\r\n\r\n\t\t\t// Building a settings object\r\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\r\n\r\n\t\t\t// Extending ajaxSettings\r\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\r\n\t},\r\n\r\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\r\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\r\n\r\n\t// Main method\r\n\tajax: function( url, options ) {\r\n\r\n\t\t// If url is an object, simulate pre-1.5 signature\r\n\t\tif ( typeof url === \"object\" ) {\r\n\t\t\toptions = url;\r\n\t\t\turl = undefined;\r\n\t\t}\r\n\r\n\t\t// Force options to be an object\r\n\t\toptions = options || {};\r\n\r\n\t\tvar // Cross-domain detection vars\r\n\t\t\tparts,\r\n\t\t\t// Loop variable\r\n\t\t\ti,\r\n\t\t\t// URL without anti-cache param\r\n\t\t\tcacheURL,\r\n\t\t\t// Response headers as string\r\n\t\t\tresponseHeadersString,\r\n\t\t\t// timeout handle\r\n\t\t\ttimeoutTimer,\r\n\r\n\t\t\t// To know if global events are to be dispatched\r\n\t\t\tfireGlobals,\r\n\r\n\t\t\ttransport,\r\n\t\t\t// Response headers\r\n\t\t\tresponseHeaders,\r\n\t\t\t// Create the final options object\r\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\r\n\t\t\t// Callbacks context\r\n\t\t\tcallbackContext = s.context || s,\r\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\r\n\t\t\tglobalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?\r\n\t\t\t\tjQuery( callbackContext ) :\r\n\t\t\t\tjQuery.event,\r\n\t\t\t// Deferreds\r\n\t\t\tdeferred = jQuery.Deferred(),\r\n\t\t\tcompleteDeferred = jQuery.Callbacks(\"once memory\"),\r\n\t\t\t// Status-dependent callbacks\r\n\t\t\tstatusCode = s.statusCode || {},\r\n\t\t\t// Headers (they are sent all at once)\r\n\t\t\trequestHeaders = {},\r\n\t\t\trequestHeadersNames = {},\r\n\t\t\t// The jqXHR state\r\n\t\t\tstate = 0,\r\n\t\t\t// Default abort message\r\n\t\t\tstrAbort = \"canceled\",\r\n\t\t\t// Fake xhr\r\n\t\t\tjqXHR = {\r\n\t\t\t\treadyState: 0,\r\n\r\n\t\t\t\t// Builds headers hashtable if needed\r\n\t\t\t\tgetResponseHeader: function( key ) {\r\n\t\t\t\t\tvar match;\r\n\t\t\t\t\tif ( state === 2 ) {\r\n\t\t\t\t\t\tif ( !responseHeaders ) {\r\n\t\t\t\t\t\t\tresponseHeaders = {};\r\n\t\t\t\t\t\t\twhile ( (match = rheaders.exec( responseHeadersString )) ) {\r\n\t\t\t\t\t\t\t\tresponseHeaders[ match[1].toLowerCase() ] = match[ 2 ];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn match == null ? null : match;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Raw string\r\n\t\t\t\tgetAllResponseHeaders: function() {\r\n\t\t\t\t\treturn state === 2 ? responseHeadersString : null;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Caches the header\r\n\t\t\t\tsetRequestHeader: function( name, value ) {\r\n\t\t\t\t\tvar lname = name.toLowerCase();\r\n\t\t\t\t\tif ( !state ) {\r\n\t\t\t\t\t\tname = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;\r\n\t\t\t\t\t\trequestHeaders[ name ] = value;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Overrides response content-type header\r\n\t\t\t\toverrideMimeType: function( type ) {\r\n\t\t\t\t\tif ( !state ) {\r\n\t\t\t\t\t\ts.mimeType = type;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Status-dependent callbacks\r\n\t\t\t\tstatusCode: function( map ) {\r\n\t\t\t\t\tvar code;\r\n\t\t\t\t\tif ( map ) {\r\n\t\t\t\t\t\tif ( state < 2 ) {\r\n\t\t\t\t\t\t\tfor ( code in map ) {\r\n\t\t\t\t\t\t\t\t// Lazy-add the new callback in a way that preserves old ones\r\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\r\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t},\r\n\r\n\t\t\t\t// Cancel the request\r\n\t\t\t\tabort: function( statusText ) {\r\n\t\t\t\t\tvar finalText = statusText || strAbort;\r\n\t\t\t\t\tif ( transport ) {\r\n\t\t\t\t\t\ttransport.abort( finalText );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdone( 0, finalText );\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t// Attach deferreds\r\n\t\tdeferred.promise( jqXHR ).complete = completeDeferred.add;\r\n\t\tjqXHR.success = jqXHR.done;\r\n\t\tjqXHR.error = jqXHR.fail;\r\n\r\n\t\t// Remove hash character (#7531: and string promotion)\r\n\t\t// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)\r\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\r\n\t\t// We also use the url parameter if available\r\n\t\ts.url = ( ( url || s.url || ajaxLocation ) + \"\" ).replace( rhash, \"\" ).replace( rprotocol, ajaxLocParts[ 1 ] + \"//\" );\r\n\r\n\t\t// Alias method option to type as per ticket #12004\r\n\t\ts.type = options.method || options.type || s.method || s.type;\r\n\r\n\t\t// Extract dataTypes list\r\n\t\ts.dataTypes = jQuery.trim( s.dataType || \"*\" ).toLowerCase().match( rnotwhite ) || [ \"\" ];\r\n\r\n\t\t// A cross-domain request is in order when we have a protocol:host:port mismatch\r\n\t\tif ( s.crossDomain == null ) {\r\n\t\t\tparts = rurl.exec( s.url.toLowerCase() );\r\n\t\t\ts.crossDomain = !!( parts &&\r\n\t\t\t\t( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||\r\n\t\t\t\t\t( parts[ 3 ] || ( parts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) !==\r\n\t\t\t\t\t\t( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === \"http:\" ? \"80\" : \"443\" ) ) )\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\t// Convert data if not already a string\r\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\r\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\r\n\t\t}\r\n\r\n\t\t// Apply prefilters\r\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\r\n\r\n\t\t// If request was aborted inside a prefilter, stop there\r\n\t\tif ( state === 2 ) {\r\n\t\t\treturn jqXHR;\r\n\t\t}\r\n\r\n\t\t// We can fire global events as of now if asked to\r\n\t\tfireGlobals = s.global;\r\n\r\n\t\t// Watch for a new set of requests\r\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\r\n\t\t\tjQuery.event.trigger(\"ajaxStart\");\r\n\t\t}\r\n\r\n\t\t// Uppercase the type\r\n\t\ts.type = s.type.toUpperCase();\r\n\r\n\t\t// Determine if request has content\r\n\t\ts.hasContent = !rnoContent.test( s.type );\r\n\r\n\t\t// Save the URL in case we're toying with the If-Modified-Since\r\n\t\t// and/or If-None-Match header later on\r\n\t\tcacheURL = s.url;\r\n\r\n\t\t// More options handling for requests with no content\r\n\t\tif ( !s.hasContent ) {\r\n\r\n\t\t\t// If data is available, append data to url\r\n\t\t\tif ( s.data ) {\r\n\t\t\t\tcacheURL = ( s.url += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data );\r\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\r\n\t\t\t\tdelete s.data;\r\n\t\t\t}\r\n\r\n\t\t\t// Add anti-cache in url if needed\r\n\t\t\tif ( s.cache === false ) {\r\n\t\t\t\ts.url = rts.test( cacheURL ) ?\r\n\r\n\t\t\t\t\t// If there is already a '_' parameter, set its value\r\n\t\t\t\t\tcacheURL.replace( rts, \"$1_=\" + nonce++ ) :\r\n\r\n\t\t\t\t\t// Otherwise add one to the end\r\n\t\t\t\t\tcacheURL + ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + nonce++;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\r\n\t\tif ( s.ifModified ) {\r\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\r\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\r\n\t\t\t}\r\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\r\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Set the correct header, if data is being sent\r\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\r\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\r\n\t\t}\r\n\r\n\t\t// Set the Accepts header for the server, depending on the dataType\r\n\t\tjqXHR.setRequestHeader(\r\n\t\t\t\"Accept\",\r\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?\r\n\t\t\t\ts.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\r\n\t\t\t\ts.accepts[ \"*\" ]\r\n\t\t);\r\n\r\n\t\t// Check for headers option\r\n\t\tfor ( i in s.headers ) {\r\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\r\n\t\t}\r\n\r\n\t\t// Allow custom headers/mimetypes and early abort\r\n\t\tif ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {\r\n\t\t\t// Abort if not done already and return\r\n\t\t\treturn jqXHR.abort();\r\n\t\t}\r\n\r\n\t\t// aborting is no longer a cancellation\r\n\t\tstrAbort = \"abort\";\r\n\r\n\t\t// Install callbacks on deferreds\r\n\t\tfor ( i in { success: 1, error: 1, complete: 1 } ) {\r\n\t\t\tjqXHR[ i ]( s[ i ] );\r\n\t\t}\r\n\r\n\t\t// Get transport\r\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\r\n\r\n\t\t// If no transport, we auto-abort\r\n\t\tif ( !transport ) {\r\n\t\t\tdone( -1, \"No Transport\" );\r\n\t\t} else {\r\n\t\t\tjqXHR.readyState = 1;\r\n\r\n\t\t\t// Send global event\r\n\t\t\tif ( fireGlobals ) {\r\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\r\n\t\t\t}\r\n\t\t\t// Timeout\r\n\t\t\tif ( s.async && s.timeout > 0 ) {\r\n\t\t\t\ttimeoutTimer = setTimeout(function() {\r\n\t\t\t\t\tjqXHR.abort(\"timeout\");\r\n\t\t\t\t}, s.timeout );\r\n\t\t\t}\r\n\r\n\t\t\ttry {\r\n\t\t\t\tstate = 1;\r\n\t\t\t\ttransport.send( requestHeaders, done );\r\n\t\t\t} catch ( e ) {\r\n\t\t\t\t// Propagate exception as error if not done\r\n\t\t\t\tif ( state < 2 ) {\r\n\t\t\t\t\tdone( -1, e );\r\n\t\t\t\t// Simply rethrow otherwise\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthrow e;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Callback for when everything is done\r\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\r\n\t\t\tvar isSuccess, success, error, response, modified,\r\n\t\t\t\tstatusText = nativeStatusText;\r\n\r\n\t\t\t// Called once\r\n\t\t\tif ( state === 2 ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// State is \"done\" now\r\n\t\t\tstate = 2;\r\n\r\n\t\t\t// Clear timeout if it exists\r\n\t\t\tif ( timeoutTimer ) {\r\n\t\t\t\tclearTimeout( timeoutTimer );\r\n\t\t\t}\r\n\r\n\t\t\t// Dereference transport for early garbage collection\r\n\t\t\t// (no matter how long the jqXHR object will be used)\r\n\t\t\ttransport = undefined;\r\n\r\n\t\t\t// Cache response headers\r\n\t\t\tresponseHeadersString = headers || \"\";\r\n\r\n\t\t\t// Set readyState\r\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\r\n\r\n\t\t\t// Determine if successful\r\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\r\n\r\n\t\t\t// Get response data\r\n\t\t\tif ( responses ) {\r\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\r\n\t\t\t}\r\n\r\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\r\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\r\n\r\n\t\t\t// If successful, handle type chaining\r\n\t\t\tif ( isSuccess ) {\r\n\r\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\r\n\t\t\t\tif ( s.ifModified ) {\r\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"Last-Modified\");\r\n\t\t\t\t\tif ( modified ) {\r\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tmodified = jqXHR.getResponseHeader(\"etag\");\r\n\t\t\t\t\tif ( modified ) {\r\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// if no content\r\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\r\n\t\t\t\t\tstatusText = \"nocontent\";\r\n\r\n\t\t\t\t// if not modified\r\n\t\t\t\t} else if ( status === 304 ) {\r\n\t\t\t\t\tstatusText = \"notmodified\";\r\n\r\n\t\t\t\t// If we have data, let's convert it\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstatusText = response.state;\r\n\t\t\t\t\tsuccess = response.data;\r\n\t\t\t\t\terror = response.error;\r\n\t\t\t\t\tisSuccess = !error;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// We extract error from statusText\r\n\t\t\t\t// then normalize statusText and status for non-aborts\r\n\t\t\t\terror = statusText;\r\n\t\t\t\tif ( status || !statusText ) {\r\n\t\t\t\t\tstatusText = \"error\";\r\n\t\t\t\t\tif ( status < 0 ) {\r\n\t\t\t\t\t\tstatus = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Set data for the fake xhr object\r\n\t\t\tjqXHR.status = status;\r\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\r\n\r\n\t\t\t// Success/Error\r\n\t\t\tif ( isSuccess ) {\r\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\r\n\t\t\t} else {\r\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\r\n\t\t\t}\r\n\r\n\t\t\t// Status-dependent callbacks\r\n\t\t\tjqXHR.statusCode( statusCode );\r\n\t\t\tstatusCode = undefined;\r\n\r\n\t\t\tif ( fireGlobals ) {\r\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\r\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\r\n\t\t\t}\r\n\r\n\t\t\t// Complete\r\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\r\n\r\n\t\t\tif ( fireGlobals ) {\r\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\r\n\t\t\t\t// Handle the global AJAX counter\r\n\t\t\t\tif ( !( --jQuery.active ) ) {\r\n\t\t\t\t\tjQuery.event.trigger(\"ajaxStop\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn jqXHR;\r\n\t},\r\n\r\n\tgetJSON: function( url, data, callback ) {\r\n\t\treturn jQuery.get( url, data, callback, \"json\" );\r\n\t},\r\n\r\n\tgetScript: function( url, callback ) {\r\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\r\n\t}\r\n});\r\n\r\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\r\n\tjQuery[ method ] = function( url, data, callback, type ) {\r\n\t\t// shift arguments if data argument was omitted\r\n\t\tif ( jQuery.isFunction( data ) ) {\r\n\t\t\ttype = type || callback;\r\n\t\t\tcallback = data;\r\n\t\t\tdata = undefined;\r\n\t\t}\r\n\r\n\t\treturn jQuery.ajax({\r\n\t\t\turl: url,\r\n\t\t\ttype: method,\r\n\t\t\tdataType: type,\r\n\t\t\tdata: data,\r\n\t\t\tsuccess: callback\r\n\t\t});\r\n\t};\r\n});\r\n\r\n// Attach a bunch of functions for handling common AJAX events\r\njQuery.each( [ \"ajaxStart\", \"ajaxStop\", \"ajaxComplete\", \"ajaxError\", \"ajaxSuccess\", \"ajaxSend\" ], function( i, type ) {\r\n\tjQuery.fn[ type ] = function( fn ) {\r\n\t\treturn this.on( type, fn );\r\n\t};\r\n});\r\n\r\n\r\njQuery._evalUrl = function( url ) {\r\n\treturn jQuery.ajax({\r\n\t\turl: url,\r\n\t\ttype: \"GET\",\r\n\t\tdataType: \"script\",\r\n\t\tasync: false,\r\n\t\tglobal: false,\r\n\t\t\"throws\": true\r\n\t});\r\n};\r\n\r\n\r\njQuery.fn.extend({\r\n\twrapAll: function( html ) {\r\n\t\tif ( jQuery.isFunction( html ) ) {\r\n\t\t\treturn this.each(function(i) {\r\n\t\t\t\tjQuery(this).wrapAll( html.call(this, i) );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( this[0] ) {\r\n\t\t\t// The elements to wrap the target around\r\n\t\t\tvar wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);\r\n\r\n\t\t\tif ( this[0].parentNode ) {\r\n\t\t\t\twrap.insertBefore( this[0] );\r\n\t\t\t}\r\n\r\n\t\t\twrap.map(function() {\r\n\t\t\t\tvar elem = this;\r\n\r\n\t\t\t\twhile ( elem.firstChild && elem.firstChild.nodeType === 1 ) {\r\n\t\t\t\t\telem = elem.firstChild;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn elem;\r\n\t\t\t}).append( this );\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\twrapInner: function( html ) {\r\n\t\tif ( jQuery.isFunction( html ) ) {\r\n\t\t\treturn this.each(function(i) {\r\n\t\t\t\tjQuery(this).wrapInner( html.call(this, i) );\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn this.each(function() {\r\n\t\t\tvar self = jQuery( this ),\r\n\t\t\t\tcontents = self.contents();\r\n\r\n\t\t\tif ( contents.length ) {\r\n\t\t\t\tcontents.wrapAll( html );\r\n\r\n\t\t\t} else {\r\n\t\t\t\tself.append( html );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\twrap: function( html ) {\r\n\t\tvar isFunction = jQuery.isFunction( html );\r\n\r\n\t\treturn this.each(function(i) {\r\n\t\t\tjQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );\r\n\t\t});\r\n\t},\r\n\r\n\tunwrap: function() {\r\n\t\treturn this.parent().each(function() {\r\n\t\t\tif ( !jQuery.nodeName( this, \"body\" ) ) {\r\n\t\t\t\tjQuery( this ).replaceWith( this.childNodes );\r\n\t\t\t}\r\n\t\t}).end();\r\n\t}\r\n});\r\n\r\n\r\njQuery.expr.filters.hidden = function( elem ) {\r\n\t// Support: Opera <= 12.12\r\n\t// Opera reports offsetWidths and offsetHeights less than zero on some elements\r\n\treturn elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||\r\n\t\t(!support.reliableHiddenOffsets() &&\r\n\t\t\t((elem.style && elem.style.display) || jQuery.css( elem, \"display\" )) === \"none\");\r\n};\r\n\r\njQuery.expr.filters.visible = function( elem ) {\r\n\treturn !jQuery.expr.filters.hidden( elem );\r\n};\r\n\r\n\r\n\r\n\r\nvar r20 = /%20/g,\r\n\trbracket = /\\[\\]$/,\r\n\trCRLF = /\\r?\\n/g,\r\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\r\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\r\n\r\nfunction buildParams( prefix, obj, traditional, add ) {\r\n\tvar name;\r\n\r\n\tif ( jQuery.isArray( obj ) ) {\r\n\t\t// Serialize array item.\r\n\t\tjQuery.each( obj, function( i, v ) {\r\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\r\n\t\t\t\t// Treat each array item as a scalar.\r\n\t\t\t\tadd( prefix, v );\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\r\n\t\t\t\tbuildParams( prefix + \"[\" + ( typeof v === \"object\" ? i : \"\" ) + \"]\", v, traditional, add );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t} else if ( !traditional && jQuery.type( obj ) === \"object\" ) {\r\n\t\t// Serialize object item.\r\n\t\tfor ( name in obj ) {\r\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\r\n\t\t}\r\n\r\n\t} else {\r\n\t\t// Serialize scalar item.\r\n\t\tadd( prefix, obj );\r\n\t}\r\n}\r\n\r\n// Serialize an array of form elements or a set of\r\n// key/values into a query string\r\njQuery.param = function( a, traditional ) {\r\n\tvar prefix,\r\n\t\ts = [],\r\n\t\tadd = function( key, value ) {\r\n\t\t\t// If value is a function, invoke it and return its value\r\n\t\t\tvalue = jQuery.isFunction( value ) ? value() : ( value == null ? \"\" : value );\r\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" + encodeURIComponent( value );\r\n\t\t};\r\n\r\n\t// Set traditional to true for jQuery <= 1.3.2 behavior.\r\n\tif ( traditional === undefined ) {\r\n\t\ttraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;\r\n\t}\r\n\r\n\t// If an array was passed in, assume that it is an array of form elements.\r\n\tif ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\r\n\t\t// Serialize the form elements\r\n\t\tjQuery.each( a, function() {\r\n\t\t\tadd( this.name, this.value );\r\n\t\t});\r\n\r\n\t} else {\r\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\r\n\t\t// did it), otherwise encode params recursively.\r\n\t\tfor ( prefix in a ) {\r\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\r\n\t\t}\r\n\t}\r\n\r\n\t// Return the resulting serialization\r\n\treturn s.join( \"&\" ).replace( r20, \"+\" );\r\n};\r\n\r\njQuery.fn.extend({\r\n\tserialize: function() {\r\n\t\treturn jQuery.param( this.serializeArray() );\r\n\t},\r\n\tserializeArray: function() {\r\n\t\treturn this.map(function() {\r\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\r\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\r\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\r\n\t\t})\r\n\t\t.filter(function() {\r\n\t\t\tvar type = this.type;\r\n\t\t\t// Use .is(\":disabled\") so that fieldset[disabled] works\r\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\r\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\r\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\r\n\t\t})\r\n\t\t.map(function( i, elem ) {\r\n\t\t\tvar val = jQuery( this ).val();\r\n\r\n\t\t\treturn val == null ?\r\n\t\t\t\tnull :\r\n\t\t\t\tjQuery.isArray( val ) ?\r\n\t\t\t\t\tjQuery.map( val, function( val ) {\r\n\t\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\r\n\t\t\t\t\t}) :\r\n\t\t\t\t\t{ name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\r\n\t\t}).get();\r\n\t}\r\n});\r\n\r\n\r\n// Create the request object\r\n// (This is still attached to ajaxSettings for backward compatibility)\r\njQuery.ajaxSettings.xhr = window.ActiveXObject !== undefined ?\r\n\t// Support: IE6+\r\n\tfunction() {\r\n\r\n\t\t// XHR cannot access local files, always use ActiveX for that case\r\n\t\treturn !this.isLocal &&\r\n\r\n\t\t\t// Support: IE7-8\r\n\t\t\t// oldIE XHR does not support non-RFC2616 methods (#13240)\r\n\t\t\t// See http://msdn.microsoft.com/en-us/library/ie/ms536648(v=vs.85).aspx\r\n\t\t\t// and http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9\r\n\t\t\t// Although this check for six methods instead of eight\r\n\t\t\t// since IE also does not support \"trace\" and \"connect\"\r\n\t\t\t/^(get|post|head|put|delete|options)$/i.test( this.type ) &&\r\n\r\n\t\t\tcreateStandardXHR() || createActiveXHR();\r\n\t} :\r\n\t// For all other browsers, use the standard XMLHttpRequest object\r\n\tcreateStandardXHR;\r\n\r\nvar xhrId = 0,\r\n\txhrCallbacks = {},\r\n\txhrSupported = jQuery.ajaxSettings.xhr();\r\n\r\n// Support: IE<10\r\n// Open requests must be manually aborted on unload (#5280)\r\nif ( window.ActiveXObject ) {\r\n\tjQuery( window ).on( \"unload\", function() {\r\n\t\tfor ( var key in xhrCallbacks ) {\r\n\t\t\txhrCallbacks[ key ]( undefined, true );\r\n\t\t}\r\n\t});\r\n}\r\n\r\n// Determine support properties\r\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\r\nxhrSupported = support.ajax = !!xhrSupported;\r\n\r\n// Create transport if the browser can provide an xhr\r\nif ( xhrSupported ) {\r\n\r\n\tjQuery.ajaxTransport(function( options ) {\r\n\t\t// Cross domain only allowed if supported through XMLHttpRequest\r\n\t\tif ( !options.crossDomain || support.cors ) {\r\n\r\n\t\t\tvar callback;\r\n\r\n\t\t\treturn {\r\n\t\t\t\tsend: function( headers, complete ) {\r\n\t\t\t\t\tvar i,\r\n\t\t\t\t\t\txhr = options.xhr(),\r\n\t\t\t\t\t\tid = ++xhrId;\r\n\r\n\t\t\t\t\t// Open the socket\r\n\t\t\t\t\txhr.open( options.type, options.url, options.async, options.username, options.password );\r\n\r\n\t\t\t\t\t// Apply custom fields if provided\r\n\t\t\t\t\tif ( options.xhrFields ) {\r\n\t\t\t\t\t\tfor ( i in options.xhrFields ) {\r\n\t\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Override mime type if needed\r\n\t\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\r\n\t\t\t\t\t\txhr.overrideMimeType( options.mimeType );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// X-Requested-With header\r\n\t\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\r\n\t\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\r\n\t\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\r\n\t\t\t\t\t// For same-domain requests, won't change header if already provided.\r\n\t\t\t\t\tif ( !options.crossDomain && !headers[\"X-Requested-With\"] ) {\r\n\t\t\t\t\t\theaders[\"X-Requested-With\"] = \"XMLHttpRequest\";\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Set headers\r\n\t\t\t\t\tfor ( i in headers ) {\r\n\t\t\t\t\t\t// Support: IE<9\r\n\t\t\t\t\t\t// IE's ActiveXObject throws a 'Type Mismatch' exception when setting\r\n\t\t\t\t\t\t// request header to a null-value.\r\n\t\t\t\t\t\t//\r\n\t\t\t\t\t\t// To keep consistent with other XHR implementations, cast the value\r\n\t\t\t\t\t\t// to string and ignore `undefined`.\r\n\t\t\t\t\t\tif ( headers[ i ] !== undefined ) {\r\n\t\t\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] + \"\" );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Do send the request\r\n\t\t\t\t\t// This may raise an exception which is actually\r\n\t\t\t\t\t// handled in jQuery.ajax (so no try/catch here)\r\n\t\t\t\t\txhr.send( ( options.hasContent && options.data ) || null );\r\n\r\n\t\t\t\t\t// Listener\r\n\t\t\t\t\tcallback = function( _, isAbort ) {\r\n\t\t\t\t\t\tvar status, statusText, responses;\r\n\r\n\t\t\t\t\t\t// Was never called and is aborted or complete\r\n\t\t\t\t\t\tif ( callback && ( isAbort || xhr.readyState === 4 ) ) {\r\n\t\t\t\t\t\t\t// Clean up\r\n\t\t\t\t\t\t\tdelete xhrCallbacks[ id ];\r\n\t\t\t\t\t\t\tcallback = undefined;\r\n\t\t\t\t\t\t\txhr.onreadystatechange = jQuery.noop;\r\n\r\n\t\t\t\t\t\t\t// Abort manually if needed\r\n\t\t\t\t\t\t\tif ( isAbort ) {\r\n\t\t\t\t\t\t\t\tif ( xhr.readyState !== 4 ) {\r\n\t\t\t\t\t\t\t\t\txhr.abort();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tresponses = {};\r\n\t\t\t\t\t\t\t\tstatus = xhr.status;\r\n\r\n\t\t\t\t\t\t\t\t// Support: IE<10\r\n\t\t\t\t\t\t\t\t// Accessing binary-data responseText throws an exception\r\n\t\t\t\t\t\t\t\t// (#11426)\r\n\t\t\t\t\t\t\t\tif ( typeof xhr.responseText === \"string\" ) {\r\n\t\t\t\t\t\t\t\t\tresponses.text = xhr.responseText;\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t// Firefox throws an exception when accessing\r\n\t\t\t\t\t\t\t\t// statusText for faulty cross-domain requests\r\n\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\tstatusText = xhr.statusText;\r\n\t\t\t\t\t\t\t\t} catch( e ) {\r\n\t\t\t\t\t\t\t\t\t// We normalize with Webkit giving an empty statusText\r\n\t\t\t\t\t\t\t\t\tstatusText = \"\";\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t// Filter status for non standard behaviors\r\n\r\n\t\t\t\t\t\t\t\t// If the request is local and we have data: assume a success\r\n\t\t\t\t\t\t\t\t// (success with no data won't get notified, that's the best we\r\n\t\t\t\t\t\t\t\t// can do given current implementations)\r\n\t\t\t\t\t\t\t\tif ( !status && options.isLocal && !options.crossDomain ) {\r\n\t\t\t\t\t\t\t\t\tstatus = responses.text ? 200 : 404;\r\n\t\t\t\t\t\t\t\t// IE - #1450: sometimes returns 1223 when it should be 204\r\n\t\t\t\t\t\t\t\t} else if ( status === 1223 ) {\r\n\t\t\t\t\t\t\t\t\tstatus = 204;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Call complete if needed\r\n\t\t\t\t\t\tif ( responses ) {\r\n\t\t\t\t\t\t\tcomplete( status, statusText, responses, xhr.getAllResponseHeaders() );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tif ( !options.async ) {\r\n\t\t\t\t\t\t// if we're in sync mode we fire the callback\r\n\t\t\t\t\t\tcallback();\r\n\t\t\t\t\t} else if ( xhr.readyState === 4 ) {\r\n\t\t\t\t\t\t// (IE6 & IE7) if it's in cache and has been\r\n\t\t\t\t\t\t// retrieved directly we need to fire the callback\r\n\t\t\t\t\t\tsetTimeout( callback );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// Add to the list of active xhr callbacks\r\n\t\t\t\t\t\txhr.onreadystatechange = xhrCallbacks[ id ] = callback;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\t\t\t\tabort: function() {\r\n\t\t\t\t\tif ( callback ) {\r\n\t\t\t\t\t\tcallback( undefined, true );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\t});\r\n}\r\n\r\n// Functions to create xhrs\r\nfunction createStandardXHR() {\r\n\ttry {\r\n\t\treturn new window.XMLHttpRequest();\r\n\t} catch( e ) {}\r\n}\r\n\r\nfunction createActiveXHR() {\r\n\ttry {\r\n\t\treturn new window.ActiveXObject( \"Microsoft.XMLHTTP\" );\r\n\t} catch( e ) {}\r\n}\r\n\r\n\r\n\r\n\r\n// Install script dataType\r\njQuery.ajaxSetup({\r\n\taccepts: {\r\n\t\tscript: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\r\n\t},\r\n\tcontents: {\r\n\t\tscript: /(?:java|ecma)script/\r\n\t},\r\n\tconverters: {\r\n\t\t\"text script\": function( text ) {\r\n\t\t\tjQuery.globalEval( text );\r\n\t\t\treturn text;\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// Handle cache's special case and global\r\njQuery.ajaxPrefilter( \"script\", function( s ) {\r\n\tif ( s.cache === undefined ) {\r\n\t\ts.cache = false;\r\n\t}\r\n\tif ( s.crossDomain ) {\r\n\t\ts.type = \"GET\";\r\n\t\ts.global = false;\r\n\t}\r\n});\r\n\r\n// Bind script tag hack transport\r\njQuery.ajaxTransport( \"script\", function(s) {\r\n\r\n\t// This transport only deals with cross domain requests\r\n\tif ( s.crossDomain ) {\r\n\r\n\t\tvar script,\r\n\t\t\thead = document.head || jQuery(\"head\")[0] || document.documentElement;\r\n\r\n\t\treturn {\r\n\r\n\t\t\tsend: function( _, callback ) {\r\n\r\n\t\t\t\tscript = document.createElement(\"script\");\r\n\r\n\t\t\t\tscript.async = true;\r\n\r\n\t\t\t\tif ( s.scriptCharset ) {\r\n\t\t\t\t\tscript.charset = s.scriptCharset;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tscript.src = s.url;\r\n\r\n\t\t\t\t// Attach handlers for all browsers\r\n\t\t\t\tscript.onload = script.onreadystatechange = function( _, isAbort ) {\r\n\r\n\t\t\t\t\tif ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {\r\n\r\n\t\t\t\t\t\t// Handle memory leak in IE\r\n\t\t\t\t\t\tscript.onload = script.onreadystatechange = null;\r\n\r\n\t\t\t\t\t\t// Remove the script\r\n\t\t\t\t\t\tif ( script.parentNode ) {\r\n\t\t\t\t\t\t\tscript.parentNode.removeChild( script );\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Dereference the script\r\n\t\t\t\t\t\tscript = null;\r\n\r\n\t\t\t\t\t\t// Callback if not abort\r\n\t\t\t\t\t\tif ( !isAbort ) {\r\n\t\t\t\t\t\t\tcallback( 200, \"success\" );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending\r\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\r\n\t\t\t\thead.insertBefore( script, head.firstChild );\r\n\t\t\t},\r\n\r\n\t\t\tabort: function() {\r\n\t\t\t\tif ( script ) {\r\n\t\t\t\t\tscript.onload( undefined, true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n});\r\n\r\n\r\n\r\n\r\nvar oldCallbacks = [],\r\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\r\n\r\n// Default jsonp settings\r\njQuery.ajaxSetup({\r\n\tjsonp: \"callback\",\r\n\tjsonpCallback: function() {\r\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\r\n\t\tthis[ callback ] = true;\r\n\t\treturn callback;\r\n\t}\r\n});\r\n\r\n// Detect, normalize options and install callbacks for jsonp requests\r\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\r\n\r\n\tvar callbackName, overwritten, responseContainer,\r\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\r\n\t\t\t\"url\" :\r\n\t\t\ttypeof s.data === \"string\" && !( s.contentType || \"\" ).indexOf(\"application/x-www-form-urlencoded\") && rjsonp.test( s.data ) && \"data\"\r\n\t\t);\r\n\r\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\r\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\r\n\r\n\t\t// Get callback name, remembering preexisting value associated with it\r\n\t\tcallbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?\r\n\t\t\ts.jsonpCallback() :\r\n\t\t\ts.jsonpCallback;\r\n\r\n\t\t// Insert callback into url or form data\r\n\t\tif ( jsonProp ) {\r\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\r\n\t\t} else if ( s.jsonp !== false ) {\r\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\r\n\t\t}\r\n\r\n\t\t// Use data converter to retrieve json after script execution\r\n\t\ts.converters[\"script json\"] = function() {\r\n\t\t\tif ( !responseContainer ) {\r\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\r\n\t\t\t}\r\n\t\t\treturn responseContainer[ 0 ];\r\n\t\t};\r\n\r\n\t\t// force json dataType\r\n\t\ts.dataTypes[ 0 ] = \"json\";\r\n\r\n\t\t// Install callback\r\n\t\toverwritten = window[ callbackName ];\r\n\t\twindow[ callbackName ] = function() {\r\n\t\t\tresponseContainer = arguments;\r\n\t\t};\r\n\r\n\t\t// Clean-up function (fires after converters)\r\n\t\tjqXHR.always(function() {\r\n\t\t\t// Restore preexisting value\r\n\t\t\twindow[ callbackName ] = overwritten;\r\n\r\n\t\t\t// Save back as free\r\n\t\t\tif ( s[ callbackName ] ) {\r\n\t\t\t\t// make sure that re-using the options doesn't screw things around\r\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\r\n\r\n\t\t\t\t// save the callback name for future use\r\n\t\t\t\toldCallbacks.push( callbackName );\r\n\t\t\t}\r\n\r\n\t\t\t// Call if it was a function and we have a response\r\n\t\t\tif ( responseContainer && jQuery.isFunction( overwritten ) ) {\r\n\t\t\t\toverwritten( responseContainer[ 0 ] );\r\n\t\t\t}\r\n\r\n\t\t\tresponseContainer = overwritten = undefined;\r\n\t\t});\r\n\r\n\t\t// Delegate to script\r\n\t\treturn \"script\";\r\n\t}\r\n});\r\n\r\n\r\n\r\n\r\n// data: string of html\r\n// context (optional): If specified, the fragment will be created in this context, defaults to document\r\n// keepScripts (optional): If true, will include scripts passed in the html string\r\njQuery.parseHTML = function( data, context, keepScripts ) {\r\n\tif ( !data || typeof data !== \"string\" ) {\r\n\t\treturn null;\r\n\t}\r\n\tif ( typeof context === \"boolean\" ) {\r\n\t\tkeepScripts = context;\r\n\t\tcontext = false;\r\n\t}\r\n\tcontext = context || document;\r\n\r\n\tvar parsed = rsingleTag.exec( data ),\r\n\t\tscripts = !keepScripts && [];\r\n\r\n\t// Single tag\r\n\tif ( parsed ) {\r\n\t\treturn [ context.createElement( parsed[1] ) ];\r\n\t}\r\n\r\n\tparsed = jQuery.buildFragment( [ data ], context, scripts );\r\n\r\n\tif ( scripts && scripts.length ) {\r\n\t\tjQuery( scripts ).remove();\r\n\t}\r\n\r\n\treturn jQuery.merge( [], parsed.childNodes );\r\n};\r\n\r\n\r\n// Keep a copy of the old load method\r\nvar _load = jQuery.fn.load;\r\n\r\n/**\r\n * Load a url into a page\r\n */\r\njQuery.fn.load = function( url, params, callback ) {\r\n\tif ( typeof url !== \"string\" && _load ) {\r\n\t\treturn _load.apply( this, arguments );\r\n\t}\r\n\r\n\tvar selector, response, type,\r\n\t\tself = this,\r\n\t\toff = url.indexOf(\" \");\r\n\r\n\tif ( off >= 0 ) {\r\n\t\tselector = url.slice( off, url.length );\r\n\t\turl = url.slice( 0, off );\r\n\t}\r\n\r\n\t// If it's a function\r\n\tif ( jQuery.isFunction( params ) ) {\r\n\r\n\t\t// We assume that it's the callback\r\n\t\tcallback = params;\r\n\t\tparams = undefined;\r\n\r\n\t// Otherwise, build a param string\r\n\t} else if ( params && typeof params === \"object\" ) {\r\n\t\ttype = \"POST\";\r\n\t}\r\n\r\n\t// If we have elements to modify, make the request\r\n\tif ( self.length > 0 ) {\r\n\t\tjQuery.ajax({\r\n\t\t\turl: url,\r\n\r\n\t\t\t// if \"type\" variable is undefined, then \"GET\" method will be used\r\n\t\t\ttype: type,\r\n\t\t\tdataType: \"html\",\r\n\t\t\tdata: params\r\n\t\t}).done(function( responseText ) {\r\n\r\n\t\t\t// Save response for use in complete callback\r\n\t\t\tresponse = arguments;\r\n\r\n\t\t\tself.html( selector ?\r\n\r\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\r\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\r\n\t\t\t\tjQuery(\"<div>\").append( jQuery.parseHTML( responseText ) ).find( selector ) :\r\n\r\n\t\t\t\t// Otherwise use the full result\r\n\t\t\t\tresponseText );\r\n\r\n\t\t}).complete( callback && function( jqXHR, status ) {\r\n\t\t\tself.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );\r\n\t\t});\r\n\t}\r\n\r\n\treturn this;\r\n};\r\n\r\n\r\n\r\n\r\njQuery.expr.filters.animated = function( elem ) {\r\n\treturn jQuery.grep(jQuery.timers, function( fn ) {\r\n\t\treturn elem === fn.elem;\r\n\t}).length;\r\n};\r\n\r\n\r\n\r\n\r\n\r\nvar docElem = window.document.documentElement;\r\n\r\n/**\r\n * Gets a window from an element\r\n */\r\nfunction getWindow( elem ) {\r\n\treturn jQuery.isWindow( elem ) ?\r\n\t\telem :\r\n\t\telem.nodeType === 9 ?\r\n\t\t\telem.defaultView || elem.parentWindow :\r\n\t\t\tfalse;\r\n}\r\n\r\njQuery.offset = {\r\n\tsetOffset: function( elem, options, i ) {\r\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\r\n\t\t\tposition = jQuery.css( elem, \"position\" ),\r\n\t\t\tcurElem = jQuery( elem ),\r\n\t\t\tprops = {};\r\n\r\n\t\t// set position first, in-case top/left are set even on static elem\r\n\t\tif ( position === \"static\" ) {\r\n\t\t\telem.style.position = \"relative\";\r\n\t\t}\r\n\r\n\t\tcurOffset = curElem.offset();\r\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\r\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\r\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\r\n\t\t\tjQuery.inArray(\"auto\", [ curCSSTop, curCSSLeft ] ) > -1;\r\n\r\n\t\t// need to be able to calculate position if either top or left is auto and position is either absolute or fixed\r\n\t\tif ( calculatePosition ) {\r\n\t\t\tcurPosition = curElem.position();\r\n\t\t\tcurTop = curPosition.top;\r\n\t\t\tcurLeft = curPosition.left;\r\n\t\t} else {\r\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\r\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\r\n\t\t}\r\n\r\n\t\tif ( jQuery.isFunction( options ) ) {\r\n\t\t\toptions = options.call( elem, i, curOffset );\r\n\t\t}\r\n\r\n\t\tif ( options.top != null ) {\r\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\r\n\t\t}\r\n\t\tif ( options.left != null ) {\r\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\r\n\t\t}\r\n\r\n\t\tif ( \"using\" in options ) {\r\n\t\t\toptions.using.call( elem, props );\r\n\t\t} else {\r\n\t\t\tcurElem.css( props );\r\n\t\t}\r\n\t}\r\n};\r\n\r\njQuery.fn.extend({\r\n\toffset: function( options ) {\r\n\t\tif ( arguments.length ) {\r\n\t\t\treturn options === undefined ?\r\n\t\t\t\tthis :\r\n\t\t\t\tthis.each(function( i ) {\r\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t\tvar docElem, win,\r\n\t\t\tbox = { top: 0, left: 0 },\r\n\t\t\telem = this[ 0 ],\r\n\t\t\tdoc = elem && elem.ownerDocument;\r\n\r\n\t\tif ( !doc ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdocElem = doc.documentElement;\r\n\r\n\t\t// Make sure it's not a disconnected DOM node\r\n\t\tif ( !jQuery.contains( docElem, elem ) ) {\r\n\t\t\treturn box;\r\n\t\t}\r\n\r\n\t\t// If we don't have gBCR, just use 0,0 rather than error\r\n\t\t// BlackBerry 5, iOS 3 (original iPhone)\r\n\t\tif ( typeof elem.getBoundingClientRect !== strundefined ) {\r\n\t\t\tbox = elem.getBoundingClientRect();\r\n\t\t}\r\n\t\twin = getWindow( doc );\r\n\t\treturn {\r\n\t\t\ttop: box.top + ( win.pageYOffset || docElem.scrollTop ) - ( docElem.clientTop || 0 ),\r\n\t\t\tleft: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )\r\n\t\t};\r\n\t},\r\n\r\n\tposition: function() {\r\n\t\tif ( !this[ 0 ] ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar offsetParent, offset,\r\n\t\t\tparentOffset = { top: 0, left: 0 },\r\n\t\t\telem = this[ 0 ];\r\n\r\n\t\t// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent\r\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\r\n\t\t\t// we assume that getBoundingClientRect is available when computed position is fixed\r\n\t\t\toffset = elem.getBoundingClientRect();\r\n\t\t} else {\r\n\t\t\t// Get *real* offsetParent\r\n\t\t\toffsetParent = this.offsetParent();\r\n\r\n\t\t\t// Get correct offsets\r\n\t\t\toffset = this.offset();\r\n\t\t\tif ( !jQuery.nodeName( offsetParent[ 0 ], \"html\" ) ) {\r\n\t\t\t\tparentOffset = offsetParent.offset();\r\n\t\t\t}\r\n\r\n\t\t\t// Add offsetParent borders\r\n\t\t\tparentOffset.top += jQuery.css( offsetParent[ 0 ], \"borderTopWidth\", true );\r\n\t\t\tparentOffset.left += jQuery.css( offsetParent[ 0 ], \"borderLeftWidth\", true );\r\n\t\t}\r\n\r\n\t\t// Subtract parent offsets and element margins\r\n\t\t// note: when an element has margin: auto the offsetLeft and marginLeft\r\n\t\t// are the same in Safari causing offset.left to incorrectly be 0\r\n\t\treturn {\r\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\r\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true)\r\n\t\t};\r\n\t},\r\n\r\n\toffsetParent: function() {\r\n\t\treturn this.map(function() {\r\n\t\t\tvar offsetParent = this.offsetParent || docElem;\r\n\r\n\t\t\twhile ( offsetParent && ( !jQuery.nodeName( offsetParent, \"html\" ) && jQuery.css( offsetParent, \"position\" ) === \"static\" ) ) {\r\n\t\t\t\toffsetParent = offsetParent.offsetParent;\r\n\t\t\t}\r\n\t\t\treturn offsetParent || docElem;\r\n\t\t});\r\n\t}\r\n});\r\n\r\n// Create scrollLeft and scrollTop methods\r\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\r\n\tvar top = /Y/.test( prop );\r\n\r\n\tjQuery.fn[ method ] = function( val ) {\r\n\t\treturn access( this, function( elem, method, val ) {\r\n\t\t\tvar win = getWindow( elem );\r\n\r\n\t\t\tif ( val === undefined ) {\r\n\t\t\t\treturn win ? (prop in win) ? win[ prop ] :\r\n\t\t\t\t\twin.document.documentElement[ method ] :\r\n\t\t\t\t\telem[ method ];\r\n\t\t\t}\r\n\r\n\t\t\tif ( win ) {\r\n\t\t\t\twin.scrollTo(\r\n\t\t\t\t\t!top ? val : jQuery( win ).scrollLeft(),\r\n\t\t\t\t\ttop ? val : jQuery( win ).scrollTop()\r\n\t\t\t\t);\r\n\r\n\t\t\t} else {\r\n\t\t\t\telem[ method ] = val;\r\n\t\t\t}\r\n\t\t}, method, val, arguments.length, null );\r\n\t};\r\n});\r\n\r\n// Add the top/left cssHooks using jQuery.fn.position\r\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\r\n// getComputedStyle returns percent when specified for top/left/bottom/right\r\n// rather than make the css module depend on the offset module, we just check for it here\r\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\r\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\r\n\t\tfunction( elem, computed ) {\r\n\t\t\tif ( computed ) {\r\n\t\t\t\tcomputed = curCSS( elem, prop );\r\n\t\t\t\t// if curCSS returns percentage, fallback to offset\r\n\t\t\t\treturn rnumnonpx.test( computed ) ?\r\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\r\n\t\t\t\t\tcomputed;\r\n\t\t\t}\r\n\t\t}\r\n\t);\r\n});\r\n\r\n\r\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\r\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\r\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name }, function( defaultExtra, funcName ) {\r\n\t\t// margin is only for outerHeight, outerWidth\r\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\r\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\r\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\r\n\r\n\t\t\treturn access( this, function( elem, type, value ) {\r\n\t\t\t\tvar doc;\r\n\r\n\t\t\t\tif ( jQuery.isWindow( elem ) ) {\r\n\t\t\t\t\t// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there\r\n\t\t\t\t\t// isn't a whole lot we can do. See pull request at this URL for discussion:\r\n\t\t\t\t\t// https://github.com/jquery/jquery/pull/764\r\n\t\t\t\t\treturn elem.document.documentElement[ \"client\" + name ];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Get document width or height\r\n\t\t\t\tif ( elem.nodeType === 9 ) {\r\n\t\t\t\t\tdoc = elem.documentElement;\r\n\r\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest\r\n\t\t\t\t\t// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.\r\n\t\t\t\t\treturn Math.max(\r\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\r\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\r\n\t\t\t\t\t\tdoc[ \"client\" + name ]\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn value === undefined ?\r\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\r\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\r\n\r\n\t\t\t\t\t// Set width or height on the element\r\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\r\n\t\t\t}, type, chainable ? margin : undefined, chainable, null );\r\n\t\t};\r\n\t});\r\n});\r\n\r\n\r\n// The number of elements contained in the matched element set\r\njQuery.fn.size = function() {\r\n\treturn this.length;\r\n};\r\n\r\njQuery.fn.andSelf = jQuery.fn.addBack;\r\n\r\n\r\n\r\n\r\n// Register as a named AMD module, since jQuery can be concatenated with other\r\n// files that may use define, but not via a proper concatenation script that\r\n// understands anonymous AMD modules. A named AMD is safest and most robust\r\n// way to register. Lowercase jquery is used because AMD module names are\r\n// derived from file names, and jQuery is normally delivered in a lowercase\r\n// file name. Do this after creating the global so that if an AMD module wants\r\n// to call noConflict to hide this version of jQuery, it will work.\r\nif ( typeof define === \"function\" && define.amd ) {\r\n\tdefine( \"jquery\", [], function() {\r\n\t\treturn jQuery;\r\n\t});\r\n}\r\n\r\n\r\n\r\n\r\nvar\r\n\t// Map over jQuery in case of overwrite\r\n\t_jQuery = window.jQuery,\r\n\r\n\t// Map over the $ in case of overwrite\r\n\t_$ = window.$;\r\n\r\njQuery.noConflict = function( deep ) {\r\n\tif ( window.$ === jQuery ) {\r\n\t\twindow.$ = _$;\r\n\t}\r\n\r\n\tif ( deep && window.jQuery === jQuery ) {\r\n\t\twindow.jQuery = _jQuery;\r\n\t}\r\n\r\n\treturn jQuery;\r\n};\r\n\r\n// Expose jQuery and $ identifiers, even in\r\n// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\r\n// and CommonJS for browser emulators (#13566)\r\nif ( typeof noGlobal === strundefined ) {\r\n\twindow.jQuery = window.$ = jQuery;\r\n}\r\n\r\n\r\n\r\n\r\nreturn jQuery;\r\n\r\n}));\r\n","/*\r\n * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/\r\n *\r\n * Uses the built in easing capabilities added In jQuery 1.1\r\n * to offer multiple easing options\r\n *\r\n * TERMS OF USE - jQuery Easing\r\n * \r\n * Open source under the BSD License. \r\n * \r\n * Copyright © 2008 George McGinley Smith\r\n * All rights reserved.\r\n * \r\n * Redistribution and use in source and binary forms, with or without modification, \r\n * are permitted provided that the following conditions are met:\r\n * \r\n * Redistributions of source code must retain the above copyright notice, this list of \r\n * conditions and the following disclaimer.\r\n * Redistributions in binary form must reproduce the above copyright notice, this list \r\n * of conditions and the following disclaimer in the documentation and/or other materials \r\n * provided with the distribution.\r\n * \r\n * Neither the name of the author nor the names of contributors may be used to endorse \r\n * or promote products derived from this software without specific prior written permission.\r\n * \r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY \r\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\r\n * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\r\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED \r\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n * OF THE POSSIBILITY OF SUCH DAMAGE. \r\n *\r\n*/\r\n\r\n// t: current time, b: begInnIng value, c: change In value, d: duration\r\njQuery.easing['jswing'] = jQuery.easing['swing'];\r\n\r\njQuery.extend( jQuery.easing,\r\n{\r\n\tdef: 'easeOutQuad',\r\n\tswing: function (x, t, b, c, d) {\r\n\t\t//alert(jQuery.easing.default);\r\n\t\treturn jQuery.easing[jQuery.easing.def](x, t, b, c, d);\r\n\t},\r\n\teaseInQuad: function (x, t, b, c, d) {\r\n\t\treturn c*(t/=d)*t + b;\r\n\t},\r\n\teaseOutQuad: function (x, t, b, c, d) {\r\n\t\treturn -c *(t/=d)*(t-2) + b;\r\n\t},\r\n\teaseInOutQuad: function (x, t, b, c, d) {\r\n\t\tif ((t/=d/2) < 1) return c/2*t*t + b;\r\n\t\treturn -c/2 * ((--t)*(t-2) - 1) + b;\r\n\t},\r\n\teaseInCubic: function (x, t, b, c, d) {\r\n\t\treturn c*(t/=d)*t*t + b;\r\n\t},\r\n\teaseOutCubic: function (x, t, b, c, d) {\r\n\t\treturn c*((t=t/d-1)*t*t + 1) + b;\r\n\t},\r\n\teaseInOutCubic: function (x, t, b, c, d) {\r\n\t\tif ((t/=d/2) < 1) return c/2*t*t*t + b;\r\n\t\treturn c/2*((t-=2)*t*t + 2) + b;\r\n\t},\r\n\teaseInQuart: function (x, t, b, c, d) {\r\n\t\treturn c*(t/=d)*t*t*t + b;\r\n\t},\r\n\teaseOutQuart: function (x, t, b, c, d) {\r\n\t\treturn -c * ((t=t/d-1)*t*t*t - 1) + b;\r\n\t},\r\n\teaseInOutQuart: function (x, t, b, c, d) {\r\n\t\tif ((t/=d/2) < 1) return c/2*t*t*t*t + b;\r\n\t\treturn -c/2 * ((t-=2)*t*t*t - 2) + b;\r\n\t},\r\n\teaseInQuint: function (x, t, b, c, d) {\r\n\t\treturn c*(t/=d)*t*t*t*t + b;\r\n\t},\r\n\teaseOutQuint: function (x, t, b, c, d) {\r\n\t\treturn c*((t=t/d-1)*t*t*t*t + 1) + b;\r\n\t},\r\n\teaseInOutQuint: function (x, t, b, c, d) {\r\n\t\tif ((t/=d/2) < 1) return c/2*t*t*t*t*t + b;\r\n\t\treturn c/2*((t-=2)*t*t*t*t + 2) + b;\r\n\t},\r\n\teaseInSine: function (x, t, b, c, d) {\r\n\t\treturn -c * Math.cos(t/d * (Math.PI/2)) + c + b;\r\n\t},\r\n\teaseOutSine: function (x, t, b, c, d) {\r\n\t\treturn c * Math.sin(t/d * (Math.PI/2)) + b;\r\n\t},\r\n\teaseInOutSine: function (x, t, b, c, d) {\r\n\t\treturn -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;\r\n\t},\r\n\teaseInExpo: function (x, t, b, c, d) {\r\n\t\treturn (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;\r\n\t},\r\n\teaseOutExpo: function (x, t, b, c, d) {\r\n\t\treturn (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;\r\n\t},\r\n\teaseInOutExpo: function (x, t, b, c, d) {\r\n\t\tif (t==0) return b;\r\n\t\tif (t==d) return b+c;\r\n\t\tif ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;\r\n\t\treturn c/2 * (-Math.pow(2, -10 * --t) + 2) + b;\r\n\t},\r\n\teaseInCirc: function (x, t, b, c, d) {\r\n\t\treturn -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;\r\n\t},\r\n\teaseOutCirc: function (x, t, b, c, d) {\r\n\t\treturn c * Math.sqrt(1 - (t=t/d-1)*t) + b;\r\n\t},\r\n\teaseInOutCirc: function (x, t, b, c, d) {\r\n\t\tif ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;\r\n\t\treturn c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;\r\n\t},\r\n\teaseInElastic: function (x, t, b, c, d) {\r\n\t\tvar s=1.70158;var p=0;var a=c;\r\n\t\tif (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;\r\n\t\tif (a < Math.abs(c)) { a=c; var s=p/4; }\r\n\t\telse var s = p/(2*Math.PI) * Math.asin (c/a);\r\n\t\treturn -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;\r\n\t},\r\n\teaseOutElastic: function (x, t, b, c, d) {\r\n\t\tvar s=1.70158;var p=0;var a=c;\r\n\t\tif (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;\r\n\t\tif (a < Math.abs(c)) { a=c; var s=p/4; }\r\n\t\telse var s = p/(2*Math.PI) * Math.asin (c/a);\r\n\t\treturn a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;\r\n\t},\r\n\teaseInOutElastic: function (x, t, b, c, d) {\r\n\t\tvar s=1.70158;var p=0;var a=c;\r\n\t\tif (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);\r\n\t\tif (a < Math.abs(c)) { a=c; var s=p/4; }\r\n\t\telse var s = p/(2*Math.PI) * Math.asin (c/a);\r\n\t\tif (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;\r\n\t\treturn a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;\r\n\t},\r\n\teaseInBack: function (x, t, b, c, d, s) {\r\n\t\tif (s == undefined) s = 1.70158;\r\n\t\treturn c*(t/=d)*t*((s+1)*t - s) + b;\r\n\t},\r\n\teaseOutBack: function (x, t, b, c, d, s) {\r\n\t\tif (s == undefined) s = 1.70158;\r\n\t\treturn c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;\r\n\t},\r\n\teaseInOutBack: function (x, t, b, c, d, s) {\r\n\t\tif (s == undefined) s = 1.70158; \r\n\t\tif ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;\r\n\t\treturn c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;\r\n\t},\r\n\teaseInBounce: function (x, t, b, c, d) {\r\n\t\treturn c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;\r\n\t},\r\n\teaseOutBounce: function (x, t, b, c, d) {\r\n\t\tif ((t/=d) < (1/2.75)) {\r\n\t\t\treturn c*(7.5625*t*t) + b;\r\n\t\t} else if (t < (2/2.75)) {\r\n\t\t\treturn c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;\r\n\t\t} else if (t < (2.5/2.75)) {\r\n\t\t\treturn c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;\r\n\t\t} else {\r\n\t\t\treturn c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;\r\n\t\t}\r\n\t},\r\n\teaseInOutBounce: function (x, t, b, c, d) {\r\n\t\tif (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;\r\n\t\treturn jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;\r\n\t}\r\n});\r\n\r\n/*\r\n *\r\n * TERMS OF USE - EASING EQUATIONS\r\n * \r\n * Open source under the BSD License. \r\n * \r\n * Copyright © 2001 Robert Penner\r\n * All rights reserved.\r\n * \r\n * Redistribution and use in source and binary forms, with or without modification, \r\n * are permitted provided that the following conditions are met:\r\n * \r\n * Redistributions of source code must retain the above copyright notice, this list of \r\n * conditions and the following disclaimer.\r\n * Redistributions in binary form must reproduce the above copyright notice, this list \r\n * of conditions and the following disclaimer in the documentation and/or other materials \r\n * provided with the distribution.\r\n * \r\n * Neither the name of the author nor the names of contributors may be used to endorse \r\n * or promote products derived from this software without specific prior written permission.\r\n * \r\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY \r\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\r\n * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\r\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED \r\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED \r\n * OF THE POSSIBILITY OF SUCH DAMAGE. \r\n *\r\n */","/*! jQuery UI - v1.11.4 - 2016-02-14\r\n* http://jqueryui.com\r\n* Includes: core.js, widget.js, mouse.js, position.js, draggable.js, droppable.js, resizable.js, selectable.js, sortable.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, menu.js, progressbar.js, selectmenu.js, slider.js, spinner.js, tabs.js, tooltip.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js\r\n* Copyright jQuery Foundation and other contributors; Licensed MIT */\r\n\r\n(function( factory ) {\r\n\tif ( typeof define === \"function\" && define.amd ) {\r\n\r\n\t\t// AMD. Register as an anonymous module.\r\n\t\tdefine([ \"jquery\" ], factory );\r\n\t} else {\r\n\r\n\t\t// Browser globals\r\n\t\tfactory( jQuery );\r\n\t}\r\n}(function( $ ) {\r\n/*!\r\n * jQuery UI Core 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/category/ui-core/\r\n */\r\n\r\n\r\n// $.ui might exist from components with no dependencies, e.g., $.ui.position\r\n$.ui = $.ui || {};\r\n\r\n$.extend( $.ui, {\r\n\tversion: \"1.11.4\",\r\n\r\n\tkeyCode: {\r\n\t\tBACKSPACE: 8,\r\n\t\tCOMMA: 188,\r\n\t\tDELETE: 46,\r\n\t\tDOWN: 40,\r\n\t\tEND: 35,\r\n\t\tENTER: 13,\r\n\t\tESCAPE: 27,\r\n\t\tHOME: 36,\r\n\t\tLEFT: 37,\r\n\t\tPAGE_DOWN: 34,\r\n\t\tPAGE_UP: 33,\r\n\t\tPERIOD: 190,\r\n\t\tRIGHT: 39,\r\n\t\tSPACE: 32,\r\n\t\tTAB: 9,\r\n\t\tUP: 38\r\n\t}\r\n});\r\n\r\n// plugins\r\n$.fn.extend({\r\n\tscrollParent: function( includeHidden ) {\r\n\t\tvar position = this.css( \"position\" ),\r\n\t\t\texcludeStaticParent = position === \"absolute\",\r\n\t\t\toverflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,\r\n\t\t\tscrollParent = this.parents().filter( function() {\r\n\t\t\t\tvar parent = $( this );\r\n\t\t\t\tif ( excludeStaticParent && parent.css( \"position\" ) === \"static\" ) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\treturn overflowRegex.test( parent.css( \"overflow\" ) + parent.css( \"overflow-y\" ) + parent.css( \"overflow-x\" ) );\r\n\t\t\t}).eq( 0 );\r\n\r\n\t\treturn position === \"fixed\" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;\r\n\t},\r\n\r\n\tuniqueId: (function() {\r\n\t\tvar uuid = 0;\r\n\r\n\t\treturn function() {\r\n\t\t\treturn this.each(function() {\r\n\t\t\t\tif ( !this.id ) {\r\n\t\t\t\t\tthis.id = \"ui-id-\" + ( ++uuid );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\t})(),\r\n\r\n\tremoveUniqueId: function() {\r\n\t\treturn this.each(function() {\r\n\t\t\tif ( /^ui-id-\\d+$/.test( this.id ) ) {\r\n\t\t\t\t$( this ).removeAttr( \"id\" );\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n});\r\n\r\n// selectors\r\nfunction focusable( element, isTabIndexNotNaN ) {\r\n\tvar map, mapName, img,\r\n\t\tnodeName = element.nodeName.toLowerCase();\r\n\tif ( \"area\" === nodeName ) {\r\n\t\tmap = element.parentNode;\r\n\t\tmapName = map.name;\r\n\t\tif ( !element.href || !mapName || map.nodeName.toLowerCase() !== \"map\" ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\timg = $( \"img[usemap='#\" + mapName + \"']\" )[ 0 ];\r\n\t\treturn !!img && visible( img );\r\n\t}\r\n\treturn ( /^(input|select|textarea|button|object)$/.test( nodeName ) ?\r\n\t\t!element.disabled :\r\n\t\t\"a\" === nodeName ?\r\n\t\t\telement.href || isTabIndexNotNaN :\r\n\t\t\tisTabIndexNotNaN) &&\r\n\t\t// the element and all of its ancestors must be visible\r\n\t\tvisible( element );\r\n}\r\n\r\nfunction visible( element ) {\r\n\treturn $.expr.filters.visible( element ) &&\r\n\t\t!$( element ).parents().addBack().filter(function() {\r\n\t\t\treturn $.css( this, \"visibility\" ) === \"hidden\";\r\n\t\t}).length;\r\n}\r\n\r\n$.extend( $.expr[ \":\" ], {\r\n\tdata: $.expr.createPseudo ?\r\n\t\t$.expr.createPseudo(function( dataName ) {\r\n\t\t\treturn function( elem ) {\r\n\t\t\t\treturn !!$.data( elem, dataName );\r\n\t\t\t};\r\n\t\t}) :\r\n\t\t// support: jQuery <1.8\r\n\t\tfunction( elem, i, match ) {\r\n\t\t\treturn !!$.data( elem, match[ 3 ] );\r\n\t\t},\r\n\r\n\tfocusable: function( element ) {\r\n\t\treturn focusable( element, !isNaN( $.attr( element, \"tabindex\" ) ) );\r\n\t},\r\n\r\n\ttabbable: function( element ) {\r\n\t\tvar tabIndex = $.attr( element, \"tabindex\" ),\r\n\t\t\tisTabIndexNaN = isNaN( tabIndex );\r\n\t\treturn ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );\r\n\t}\r\n});\r\n\r\n// support: jQuery <1.8\r\nif ( !$( \"<a>\" ).outerWidth( 1 ).jquery ) {\r\n\t$.each( [ \"Width\", \"Height\" ], function( i, name ) {\r\n\t\tvar side = name === \"Width\" ? [ \"Left\", \"Right\" ] : [ \"Top\", \"Bottom\" ],\r\n\t\t\ttype = name.toLowerCase(),\r\n\t\t\torig = {\r\n\t\t\t\tinnerWidth: $.fn.innerWidth,\r\n\t\t\t\tinnerHeight: $.fn.innerHeight,\r\n\t\t\t\touterWidth: $.fn.outerWidth,\r\n\t\t\t\touterHeight: $.fn.outerHeight\r\n\t\t\t};\r\n\r\n\t\tfunction reduce( elem, size, border, margin ) {\r\n\t\t\t$.each( side, function() {\r\n\t\t\t\tsize -= parseFloat( $.css( elem, \"padding\" + this ) ) || 0;\r\n\t\t\t\tif ( border ) {\r\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"border\" + this + \"Width\" ) ) || 0;\r\n\t\t\t\t}\r\n\t\t\t\tif ( margin ) {\r\n\t\t\t\t\tsize -= parseFloat( $.css( elem, \"margin\" + this ) ) || 0;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\treturn size;\r\n\t\t}\r\n\r\n\t\t$.fn[ \"inner\" + name ] = function( size ) {\r\n\t\t\tif ( size === undefined ) {\r\n\t\t\t\treturn orig[ \"inner\" + name ].call( this );\r\n\t\t\t}\r\n\r\n\t\t\treturn this.each(function() {\r\n\t\t\t\t$( this ).css( type, reduce( this, size ) + \"px\" );\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t$.fn[ \"outer\" + name] = function( size, margin ) {\r\n\t\t\tif ( typeof size !== \"number\" ) {\r\n\t\t\t\treturn orig[ \"outer\" + name ].call( this, size );\r\n\t\t\t}\r\n\r\n\t\t\treturn this.each(function() {\r\n\t\t\t\t$( this).css( type, reduce( this, size, true, margin ) + \"px\" );\r\n\t\t\t});\r\n\t\t};\r\n\t});\r\n}\r\n\r\n// support: jQuery <1.8\r\nif ( !$.fn.addBack ) {\r\n\t$.fn.addBack = function( selector ) {\r\n\t\treturn this.add( selector == null ?\r\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\r\n\t\t);\r\n\t};\r\n}\r\n\r\n// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)\r\nif ( $( \"<a>\" ).data( \"a-b\", \"a\" ).removeData( \"a-b\" ).data( \"a-b\" ) ) {\r\n\t$.fn.removeData = (function( removeData ) {\r\n\t\treturn function( key ) {\r\n\t\t\tif ( arguments.length ) {\r\n\t\t\t\treturn removeData.call( this, $.camelCase( key ) );\r\n\t\t\t} else {\r\n\t\t\t\treturn removeData.call( this );\r\n\t\t\t}\r\n\t\t};\r\n\t})( $.fn.removeData );\r\n}\r\n\r\n// deprecated\r\n$.ui.ie = !!/msie [\\w.]+/.exec( navigator.userAgent.toLowerCase() );\r\n\r\n$.fn.extend({\r\n\tfocus: (function( orig ) {\r\n\t\treturn function( delay, fn ) {\r\n\t\t\treturn typeof delay === \"number\" ?\r\n\t\t\t\tthis.each(function() {\r\n\t\t\t\t\tvar elem = this;\r\n\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t$( elem ).focus();\r\n\t\t\t\t\t\tif ( fn ) {\r\n\t\t\t\t\t\t\tfn.call( elem );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, delay );\r\n\t\t\t\t}) :\r\n\t\t\t\torig.apply( this, arguments );\r\n\t\t};\r\n\t})( $.fn.focus ),\r\n\r\n\tdisableSelection: (function() {\r\n\t\tvar eventType = \"onselectstart\" in document.createElement( \"div\" ) ?\r\n\t\t\t\"selectstart\" :\r\n\t\t\t\"mousedown\";\r\n\r\n\t\treturn function() {\r\n\t\t\treturn this.bind( eventType + \".ui-disableSelection\", function( event ) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t});\r\n\t\t};\r\n\t})(),\r\n\r\n\tenableSelection: function() {\r\n\t\treturn this.unbind( \".ui-disableSelection\" );\r\n\t},\r\n\r\n\tzIndex: function( zIndex ) {\r\n\t\tif ( zIndex !== undefined ) {\r\n\t\t\treturn this.css( \"zIndex\", zIndex );\r\n\t\t}\r\n\r\n\t\tif ( this.length ) {\r\n\t\t\tvar elem = $( this[ 0 ] ), position, value;\r\n\t\t\twhile ( elem.length && elem[ 0 ] !== document ) {\r\n\t\t\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\r\n\t\t\t\t// This makes behavior of this function consistent across browsers\r\n\t\t\t\t// WebKit always returns auto if the element is positioned\r\n\t\t\t\tposition = elem.css( \"position\" );\r\n\t\t\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\r\n\t\t\t\t\t// IE returns 0 when zIndex is not specified\r\n\t\t\t\t\t// other browsers return a string\r\n\t\t\t\t\t// we ignore the case of nested elements with an explicit value of 0\r\n\t\t\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\r\n\t\t\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\r\n\t\t\t\t\tif ( !isNaN( value ) && value !== 0 ) {\r\n\t\t\t\t\t\treturn value;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telem = elem.parent();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn 0;\r\n\t}\r\n});\r\n\r\n// $.ui.plugin is deprecated. Use $.widget() extensions instead.\r\n$.ui.plugin = {\r\n\tadd: function( module, option, set ) {\r\n\t\tvar i,\r\n\t\t\tproto = $.ui[ module ].prototype;\r\n\t\tfor ( i in set ) {\r\n\t\t\tproto.plugins[ i ] = proto.plugins[ i ] || [];\r\n\t\t\tproto.plugins[ i ].push( [ option, set[ i ] ] );\r\n\t\t}\r\n\t},\r\n\tcall: function( instance, name, args, allowDisconnected ) {\r\n\t\tvar i,\r\n\t\t\tset = instance.plugins[ name ];\r\n\r\n\t\tif ( !set ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor ( i = 0; i < set.length; i++ ) {\r\n\t\t\tif ( instance.options[ set[ i ][ 0 ] ] ) {\r\n\t\t\t\tset[ i ][ 1 ].apply( instance.element, args );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Widget 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/jQuery.widget/\r\n */\r\n\r\n\r\nvar widget_uuid = 0,\r\n\twidget_slice = Array.prototype.slice;\r\n\r\n$.cleanData = (function( orig ) {\r\n\treturn function( elems ) {\r\n\t\tvar events, elem, i;\r\n\t\tfor ( i = 0; (elem = elems[i]) != null; i++ ) {\r\n\t\t\ttry {\r\n\r\n\t\t\t\t// Only trigger remove when necessary to save time\r\n\t\t\t\tevents = $._data( elem, \"events\" );\r\n\t\t\t\tif ( events && events.remove ) {\r\n\t\t\t\t\t$( elem ).triggerHandler( \"remove\" );\r\n\t\t\t\t}\r\n\r\n\t\t\t// http://bugs.jquery.com/ticket/8235\r\n\t\t\t} catch ( e ) {}\r\n\t\t}\r\n\t\torig( elems );\r\n\t};\r\n})( $.cleanData );\r\n\r\n$.widget = function( name, base, prototype ) {\r\n\tvar fullName, existingConstructor, constructor, basePrototype,\r\n\t\t// proxiedPrototype allows the provided prototype to remain unmodified\r\n\t\t// so that it can be used as a mixin for multiple widgets (#8876)\r\n\t\tproxiedPrototype = {},\r\n\t\tnamespace = name.split( \".\" )[ 0 ];\r\n\r\n\tname = name.split( \".\" )[ 1 ];\r\n\tfullName = namespace + \"-\" + name;\r\n\r\n\tif ( !prototype ) {\r\n\t\tprototype = base;\r\n\t\tbase = $.Widget;\r\n\t}\r\n\r\n\t// create selector for plugin\r\n\t$.expr[ \":\" ][ fullName.toLowerCase() ] = function( elem ) {\r\n\t\treturn !!$.data( elem, fullName );\r\n\t};\r\n\r\n\t$[ namespace ] = $[ namespace ] || {};\r\n\texistingConstructor = $[ namespace ][ name ];\r\n\tconstructor = $[ namespace ][ name ] = function( options, element ) {\r\n\t\t// allow instantiation without \"new\" keyword\r\n\t\tif ( !this._createWidget ) {\r\n\t\t\treturn new constructor( options, element );\r\n\t\t}\r\n\r\n\t\t// allow instantiation without initializing for simple inheritance\r\n\t\t// must use \"new\" keyword (the code above always passes args)\r\n\t\tif ( arguments.length ) {\r\n\t\t\tthis._createWidget( options, element );\r\n\t\t}\r\n\t};\r\n\t// extend with the existing constructor to carry over any static properties\r\n\t$.extend( constructor, existingConstructor, {\r\n\t\tversion: prototype.version,\r\n\t\t// copy the object used to create the prototype in case we need to\r\n\t\t// redefine the widget later\r\n\t\t_proto: $.extend( {}, prototype ),\r\n\t\t// track widgets that inherit from this widget in case this widget is\r\n\t\t// redefined after a widget inherits from it\r\n\t\t_childConstructors: []\r\n\t});\r\n\r\n\tbasePrototype = new base();\r\n\t// we need to make the options hash a property directly on the new instance\r\n\t// otherwise we'll modify the options hash on the prototype that we're\r\n\t// inheriting from\r\n\tbasePrototype.options = $.widget.extend( {}, basePrototype.options );\r\n\t$.each( prototype, function( prop, value ) {\r\n\t\tif ( !$.isFunction( value ) ) {\r\n\t\t\tproxiedPrototype[ prop ] = value;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tproxiedPrototype[ prop ] = (function() {\r\n\t\t\tvar _super = function() {\r\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, arguments );\r\n\t\t\t\t},\r\n\t\t\t\t_superApply = function( args ) {\r\n\t\t\t\t\treturn base.prototype[ prop ].apply( this, args );\r\n\t\t\t\t};\r\n\t\t\treturn function() {\r\n\t\t\t\tvar __super = this._super,\r\n\t\t\t\t\t__superApply = this._superApply,\r\n\t\t\t\t\treturnValue;\r\n\r\n\t\t\t\tthis._super = _super;\r\n\t\t\t\tthis._superApply = _superApply;\r\n\r\n\t\t\t\treturnValue = value.apply( this, arguments );\r\n\r\n\t\t\t\tthis._super = __super;\r\n\t\t\t\tthis._superApply = __superApply;\r\n\r\n\t\t\t\treturn returnValue;\r\n\t\t\t};\r\n\t\t})();\r\n\t});\r\n\tconstructor.prototype = $.widget.extend( basePrototype, {\r\n\t\t// TODO: remove support for widgetEventPrefix\r\n\t\t// always use the name + a colon as the prefix, e.g., draggable:start\r\n\t\t// don't prefix for widgets that aren't DOM-based\r\n\t\twidgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name\r\n\t}, proxiedPrototype, {\r\n\t\tconstructor: constructor,\r\n\t\tnamespace: namespace,\r\n\t\twidgetName: name,\r\n\t\twidgetFullName: fullName\r\n\t});\r\n\r\n\t// If this widget is being redefined then we need to find all widgets that\r\n\t// are inheriting from it and redefine all of them so that they inherit from\r\n\t// the new version of this widget. We're essentially trying to replace one\r\n\t// level in the prototype chain.\r\n\tif ( existingConstructor ) {\r\n\t\t$.each( existingConstructor._childConstructors, function( i, child ) {\r\n\t\t\tvar childPrototype = child.prototype;\r\n\r\n\t\t\t// redefine the child widget using the same prototype that was\r\n\t\t\t// originally used, but inherit from the new version of the base\r\n\t\t\t$.widget( childPrototype.namespace + \".\" + childPrototype.widgetName, constructor, child._proto );\r\n\t\t});\r\n\t\t// remove the list of existing child constructors from the old constructor\r\n\t\t// so the old child constructors can be garbage collected\r\n\t\tdelete existingConstructor._childConstructors;\r\n\t} else {\r\n\t\tbase._childConstructors.push( constructor );\r\n\t}\r\n\r\n\t$.widget.bridge( name, constructor );\r\n\r\n\treturn constructor;\r\n};\r\n\r\n$.widget.extend = function( target ) {\r\n\tvar input = widget_slice.call( arguments, 1 ),\r\n\t\tinputIndex = 0,\r\n\t\tinputLength = input.length,\r\n\t\tkey,\r\n\t\tvalue;\r\n\tfor ( ; inputIndex < inputLength; inputIndex++ ) {\r\n\t\tfor ( key in input[ inputIndex ] ) {\r\n\t\t\tvalue = input[ inputIndex ][ key ];\r\n\t\t\tif ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {\r\n\t\t\t\t// Clone objects\r\n\t\t\t\tif ( $.isPlainObject( value ) ) {\r\n\t\t\t\t\ttarget[ key ] = $.isPlainObject( target[ key ] ) ?\r\n\t\t\t\t\t\t$.widget.extend( {}, target[ key ], value ) :\r\n\t\t\t\t\t\t// Don't extend strings, arrays, etc. with objects\r\n\t\t\t\t\t\t$.widget.extend( {}, value );\r\n\t\t\t\t// Copy everything else by reference\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttarget[ key ] = value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn target;\r\n};\r\n\r\n$.widget.bridge = function( name, object ) {\r\n\tvar fullName = object.prototype.widgetFullName || name;\r\n\t$.fn[ name ] = function( options ) {\r\n\t\tvar isMethodCall = typeof options === \"string\",\r\n\t\t\targs = widget_slice.call( arguments, 1 ),\r\n\t\t\treturnValue = this;\r\n\r\n\t\tif ( isMethodCall ) {\r\n\t\t\tthis.each(function() {\r\n\t\t\t\tvar methodValue,\r\n\t\t\t\t\tinstance = $.data( this, fullName );\r\n\t\t\t\tif ( options === \"instance\" ) {\r\n\t\t\t\t\treturnValue = instance;\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\tif ( !instance ) {\r\n\t\t\t\t\treturn $.error( \"cannot call methods on \" + name + \" prior to initialization; \" +\r\n\t\t\t\t\t\t\"attempted to call method '\" + options + \"'\" );\r\n\t\t\t\t}\r\n\t\t\t\tif ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === \"_\" ) {\r\n\t\t\t\t\treturn $.error( \"no such method '\" + options + \"' for \" + name + \" widget instance\" );\r\n\t\t\t\t}\r\n\t\t\t\tmethodValue = instance[ options ].apply( instance, args );\r\n\t\t\t\tif ( methodValue !== instance && methodValue !== undefined ) {\r\n\t\t\t\t\treturnValue = methodValue && methodValue.jquery ?\r\n\t\t\t\t\t\treturnValue.pushStack( methodValue.get() ) :\r\n\t\t\t\t\t\tmethodValue;\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else {\r\n\r\n\t\t\t// Allow multiple hashes to be passed on init\r\n\t\t\tif ( args.length ) {\r\n\t\t\t\toptions = $.widget.extend.apply( null, [ options ].concat(args) );\r\n\t\t\t}\r\n\r\n\t\t\tthis.each(function() {\r\n\t\t\t\tvar instance = $.data( this, fullName );\r\n\t\t\t\tif ( instance ) {\r\n\t\t\t\t\tinstance.option( options || {} );\r\n\t\t\t\t\tif ( instance._init ) {\r\n\t\t\t\t\t\tinstance._init();\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$.data( this, fullName, new object( options, this ) );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn returnValue;\r\n\t};\r\n};\r\n\r\n$.Widget = function( /* options, element */ ) {};\r\n$.Widget._childConstructors = [];\r\n\r\n$.Widget.prototype = {\r\n\twidgetName: \"widget\",\r\n\twidgetEventPrefix: \"\",\r\n\tdefaultElement: \"<div>\",\r\n\toptions: {\r\n\t\tdisabled: false,\r\n\r\n\t\t// callbacks\r\n\t\tcreate: null\r\n\t},\r\n\t_createWidget: function( options, element ) {\r\n\t\telement = $( element || this.defaultElement || this )[ 0 ];\r\n\t\tthis.element = $( element );\r\n\t\tthis.uuid = widget_uuid++;\r\n\t\tthis.eventNamespace = \".\" + this.widgetName + this.uuid;\r\n\r\n\t\tthis.bindings = $();\r\n\t\tthis.hoverable = $();\r\n\t\tthis.focusable = $();\r\n\r\n\t\tif ( element !== this ) {\r\n\t\t\t$.data( element, this.widgetFullName, this );\r\n\t\t\tthis._on( true, this.element, {\r\n\t\t\t\tremove: function( event ) {\r\n\t\t\t\t\tif ( event.target === element ) {\r\n\t\t\t\t\t\tthis.destroy();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tthis.document = $( element.style ?\r\n\t\t\t\t// element within the document\r\n\t\t\t\telement.ownerDocument :\r\n\t\t\t\t// element is window or document\r\n\t\t\t\telement.document || element );\r\n\t\t\tthis.window = $( this.document[0].defaultView || this.document[0].parentWindow );\r\n\t\t}\r\n\r\n\t\tthis.options = $.widget.extend( {},\r\n\t\t\tthis.options,\r\n\t\t\tthis._getCreateOptions(),\r\n\t\t\toptions );\r\n\r\n\t\tthis._create();\r\n\t\tthis._trigger( \"create\", null, this._getCreateEventData() );\r\n\t\tthis._init();\r\n\t},\r\n\t_getCreateOptions: $.noop,\r\n\t_getCreateEventData: $.noop,\r\n\t_create: $.noop,\r\n\t_init: $.noop,\r\n\r\n\tdestroy: function() {\r\n\t\tthis._destroy();\r\n\t\t// we can probably remove the unbind calls in 2.0\r\n\t\t// all event bindings should go through this._on()\r\n\t\tthis.element\r\n\t\t\t.unbind( this.eventNamespace )\r\n\t\t\t.removeData( this.widgetFullName )\r\n\t\t\t// support: jquery <1.6.3\r\n\t\t\t// http://bugs.jquery.com/ticket/9413\r\n\t\t\t.removeData( $.camelCase( this.widgetFullName ) );\r\n\t\tthis.widget()\r\n\t\t\t.unbind( this.eventNamespace )\r\n\t\t\t.removeAttr( \"aria-disabled\" )\r\n\t\t\t.removeClass(\r\n\t\t\t\tthis.widgetFullName + \"-disabled \" +\r\n\t\t\t\t\"ui-state-disabled\" );\r\n\r\n\t\t// clean up events and states\r\n\t\tthis.bindings.unbind( this.eventNamespace );\r\n\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\r\n\t\tthis.focusable.removeClass( \"ui-state-focus\" );\r\n\t},\r\n\t_destroy: $.noop,\r\n\r\n\twidget: function() {\r\n\t\treturn this.element;\r\n\t},\r\n\r\n\toption: function( key, value ) {\r\n\t\tvar options = key,\r\n\t\t\tparts,\r\n\t\t\tcurOption,\r\n\t\t\ti;\r\n\r\n\t\tif ( arguments.length === 0 ) {\r\n\t\t\t// don't return a reference to the internal hash\r\n\t\t\treturn $.widget.extend( {}, this.options );\r\n\t\t}\r\n\r\n\t\tif ( typeof key === \"string\" ) {\r\n\t\t\t// handle nested keys, e.g., \"foo.bar\" => { foo: { bar: ___ } }\r\n\t\t\toptions = {};\r\n\t\t\tparts = key.split( \".\" );\r\n\t\t\tkey = parts.shift();\r\n\t\t\tif ( parts.length ) {\r\n\t\t\t\tcurOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );\r\n\t\t\t\tfor ( i = 0; i < parts.length - 1; i++ ) {\r\n\t\t\t\t\tcurOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};\r\n\t\t\t\t\tcurOption = curOption[ parts[ i ] ];\r\n\t\t\t\t}\r\n\t\t\t\tkey = parts.pop();\r\n\t\t\t\tif ( arguments.length === 1 ) {\r\n\t\t\t\t\treturn curOption[ key ] === undefined ? null : curOption[ key ];\r\n\t\t\t\t}\r\n\t\t\t\tcurOption[ key ] = value;\r\n\t\t\t} else {\r\n\t\t\t\tif ( arguments.length === 1 ) {\r\n\t\t\t\t\treturn this.options[ key ] === undefined ? null : this.options[ key ];\r\n\t\t\t\t}\r\n\t\t\t\toptions[ key ] = value;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._setOptions( options );\r\n\r\n\t\treturn this;\r\n\t},\r\n\t_setOptions: function( options ) {\r\n\t\tvar key;\r\n\r\n\t\tfor ( key in options ) {\r\n\t\t\tthis._setOption( key, options[ key ] );\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\t_setOption: function( key, value ) {\r\n\t\tthis.options[ key ] = value;\r\n\r\n\t\tif ( key === \"disabled\" ) {\r\n\t\t\tthis.widget()\r\n\t\t\t\t.toggleClass( this.widgetFullName + \"-disabled\", !!value );\r\n\r\n\t\t\t// If the widget is becoming disabled, then nothing is interactive\r\n\t\t\tif ( value ) {\r\n\t\t\t\tthis.hoverable.removeClass( \"ui-state-hover\" );\r\n\t\t\t\tthis.focusable.removeClass( \"ui-state-focus\" );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\tenable: function() {\r\n\t\treturn this._setOptions({ disabled: false });\r\n\t},\r\n\tdisable: function() {\r\n\t\treturn this._setOptions({ disabled: true });\r\n\t},\r\n\r\n\t_on: function( suppressDisabledCheck, element, handlers ) {\r\n\t\tvar delegateElement,\r\n\t\t\tinstance = this;\r\n\r\n\t\t// no suppressDisabledCheck flag, shuffle arguments\r\n\t\tif ( typeof suppressDisabledCheck !== \"boolean\" ) {\r\n\t\t\thandlers = element;\r\n\t\t\telement = suppressDisabledCheck;\r\n\t\t\tsuppressDisabledCheck = false;\r\n\t\t}\r\n\r\n\t\t// no element argument, shuffle and use this.element\r\n\t\tif ( !handlers ) {\r\n\t\t\thandlers = element;\r\n\t\t\telement = this.element;\r\n\t\t\tdelegateElement = this.widget();\r\n\t\t} else {\r\n\t\t\telement = delegateElement = $( element );\r\n\t\t\tthis.bindings = this.bindings.add( element );\r\n\t\t}\r\n\r\n\t\t$.each( handlers, function( event, handler ) {\r\n\t\t\tfunction handlerProxy() {\r\n\t\t\t\t// allow widgets to customize the disabled handling\r\n\t\t\t\t// - disabled as an array instead of boolean\r\n\t\t\t\t// - disabled class as method for disabling individual parts\r\n\t\t\t\tif ( !suppressDisabledCheck &&\r\n\t\t\t\t\t\t( instance.options.disabled === true ||\r\n\t\t\t\t\t\t\t$( this ).hasClass( \"ui-state-disabled\" ) ) ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\r\n\t\t\t\t\t.apply( instance, arguments );\r\n\t\t\t}\r\n\r\n\t\t\t// copy the guid so direct unbinding works\r\n\t\t\tif ( typeof handler !== \"string\" ) {\r\n\t\t\t\thandlerProxy.guid = handler.guid =\r\n\t\t\t\t\thandler.guid || handlerProxy.guid || $.guid++;\r\n\t\t\t}\r\n\r\n\t\t\tvar match = event.match( /^([\\w:-]*)\\s*(.*)$/ ),\r\n\t\t\t\teventName = match[1] + instance.eventNamespace,\r\n\t\t\t\tselector = match[2];\r\n\t\t\tif ( selector ) {\r\n\t\t\t\tdelegateElement.delegate( selector, eventName, handlerProxy );\r\n\t\t\t} else {\r\n\t\t\t\telement.bind( eventName, handlerProxy );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t_off: function( element, eventName ) {\r\n\t\teventName = (eventName || \"\").split( \" \" ).join( this.eventNamespace + \" \" ) +\r\n\t\t\tthis.eventNamespace;\r\n\t\telement.unbind( eventName ).undelegate( eventName );\r\n\r\n\t\t// Clear the stack to avoid memory leaks (#10056)\r\n\t\tthis.bindings = $( this.bindings.not( element ).get() );\r\n\t\tthis.focusable = $( this.focusable.not( element ).get() );\r\n\t\tthis.hoverable = $( this.hoverable.not( element ).get() );\r\n\t},\r\n\r\n\t_delay: function( handler, delay ) {\r\n\t\tfunction handlerProxy() {\r\n\t\t\treturn ( typeof handler === \"string\" ? instance[ handler ] : handler )\r\n\t\t\t\t.apply( instance, arguments );\r\n\t\t}\r\n\t\tvar instance = this;\r\n\t\treturn setTimeout( handlerProxy, delay || 0 );\r\n\t},\r\n\r\n\t_hoverable: function( element ) {\r\n\t\tthis.hoverable = this.hoverable.add( element );\r\n\t\tthis._on( element, {\r\n\t\t\tmouseenter: function( event ) {\r\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-hover\" );\r\n\t\t\t},\r\n\t\t\tmouseleave: function( event ) {\r\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-hover\" );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t_focusable: function( element ) {\r\n\t\tthis.focusable = this.focusable.add( element );\r\n\t\tthis._on( element, {\r\n\t\t\tfocusin: function( event ) {\r\n\t\t\t\t$( event.currentTarget ).addClass( \"ui-state-focus\" );\r\n\t\t\t},\r\n\t\t\tfocusout: function( event ) {\r\n\t\t\t\t$( event.currentTarget ).removeClass( \"ui-state-focus\" );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t_trigger: function( type, event, data ) {\r\n\t\tvar prop, orig,\r\n\t\t\tcallback = this.options[ type ];\r\n\r\n\t\tdata = data || {};\r\n\t\tevent = $.Event( event );\r\n\t\tevent.type = ( type === this.widgetEventPrefix ?\r\n\t\t\ttype :\r\n\t\t\tthis.widgetEventPrefix + type ).toLowerCase();\r\n\t\t// the original event may come from any element\r\n\t\t// so we need to reset the target on the new event\r\n\t\tevent.target = this.element[ 0 ];\r\n\r\n\t\t// copy original event properties over to the new event\r\n\t\torig = event.originalEvent;\r\n\t\tif ( orig ) {\r\n\t\t\tfor ( prop in orig ) {\r\n\t\t\t\tif ( !( prop in event ) ) {\r\n\t\t\t\t\tevent[ prop ] = orig[ prop ];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.element.trigger( event, data );\r\n\t\treturn !( $.isFunction( callback ) &&\r\n\t\t\tcallback.apply( this.element[0], [ event ].concat( data ) ) === false ||\r\n\t\t\tevent.isDefaultPrevented() );\r\n\t}\r\n};\r\n\r\n$.each( { show: \"fadeIn\", hide: \"fadeOut\" }, function( method, defaultEffect ) {\r\n\t$.Widget.prototype[ \"_\" + method ] = function( element, options, callback ) {\r\n\t\tif ( typeof options === \"string\" ) {\r\n\t\t\toptions = { effect: options };\r\n\t\t}\r\n\t\tvar hasOptions,\r\n\t\t\teffectName = !options ?\r\n\t\t\t\tmethod :\r\n\t\t\t\toptions === true || typeof options === \"number\" ?\r\n\t\t\t\t\tdefaultEffect :\r\n\t\t\t\t\toptions.effect || defaultEffect;\r\n\t\toptions = options || {};\r\n\t\tif ( typeof options === \"number\" ) {\r\n\t\t\toptions = { duration: options };\r\n\t\t}\r\n\t\thasOptions = !$.isEmptyObject( options );\r\n\t\toptions.complete = callback;\r\n\t\tif ( options.delay ) {\r\n\t\t\telement.delay( options.delay );\r\n\t\t}\r\n\t\tif ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {\r\n\t\t\telement[ method ]( options );\r\n\t\t} else if ( effectName !== method && element[ effectName ] ) {\r\n\t\t\telement[ effectName ]( options.duration, options.easing, callback );\r\n\t\t} else {\r\n\t\t\telement.queue(function( next ) {\r\n\t\t\t\t$( this )[ method ]();\r\n\t\t\t\tif ( callback ) {\r\n\t\t\t\t\tcallback.call( element[ 0 ] );\r\n\t\t\t\t}\r\n\t\t\t\tnext();\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n});\r\n\r\nvar widget = $.widget;\r\n\r\n\r\n/*!\r\n * jQuery UI Mouse 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/mouse/\r\n */\r\n\r\n\r\nvar mouseHandled = false;\r\n$( document ).mouseup( function() {\r\n\tmouseHandled = false;\r\n});\r\n\r\nvar mouse = $.widget(\"ui.mouse\", {\r\n\tversion: \"1.11.4\",\r\n\toptions: {\r\n\t\tcancel: \"input,textarea,button,select,option\",\r\n\t\tdistance: 1,\r\n\t\tdelay: 0\r\n\t},\r\n\t_mouseInit: function() {\r\n\t\tvar that = this;\r\n\r\n\t\tthis.element\r\n\t\t\t.bind(\"mousedown.\" + this.widgetName, function(event) {\r\n\t\t\t\treturn that._mouseDown(event);\r\n\t\t\t})\r\n\t\t\t.bind(\"click.\" + this.widgetName, function(event) {\r\n\t\t\t\tif (true === $.data(event.target, that.widgetName + \".preventClickEvent\")) {\r\n\t\t\t\t\t$.removeData(event.target, that.widgetName + \".preventClickEvent\");\r\n\t\t\t\t\tevent.stopImmediatePropagation();\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\tthis.started = false;\r\n\t},\r\n\r\n\t// TODO: make sure destroying one instance of mouse doesn't mess with\r\n\t// other instances of mouse\r\n\t_mouseDestroy: function() {\r\n\t\tthis.element.unbind(\".\" + this.widgetName);\r\n\t\tif ( this._mouseMoveDelegate ) {\r\n\t\t\tthis.document\r\n\t\t\t\t.unbind(\"mousemove.\" + this.widgetName, this._mouseMoveDelegate)\r\n\t\t\t\t.unbind(\"mouseup.\" + this.widgetName, this._mouseUpDelegate);\r\n\t\t}\r\n\t},\r\n\r\n\t_mouseDown: function(event) {\r\n\t\t// don't let more than one widget handle mouseStart\r\n\t\tif ( mouseHandled ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._mouseMoved = false;\r\n\r\n\t\t// we may have missed mouseup (out of window)\r\n\t\t(this._mouseStarted && this._mouseUp(event));\r\n\r\n\t\tthis._mouseDownEvent = event;\r\n\r\n\t\tvar that = this,\r\n\t\t\tbtnIsLeft = (event.which === 1),\r\n\t\t\t// event.target.nodeName works around a bug in IE 8 with\r\n\t\t\t// disabled inputs (#7620)\r\n\t\t\telIsCancel = (typeof this.options.cancel === \"string\" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);\r\n\t\tif (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tthis.mouseDelayMet = !this.options.delay;\r\n\t\tif (!this.mouseDelayMet) {\r\n\t\t\tthis._mouseDelayTimer = setTimeout(function() {\r\n\t\t\t\tthat.mouseDelayMet = true;\r\n\t\t\t}, this.options.delay);\r\n\t\t}\r\n\r\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\r\n\t\t\tthis._mouseStarted = (this._mouseStart(event) !== false);\r\n\t\t\tif (!this._mouseStarted) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Click event may never have fired (Gecko & Opera)\r\n\t\tif (true === $.data(event.target, this.widgetName + \".preventClickEvent\")) {\r\n\t\t\t$.removeData(event.target, this.widgetName + \".preventClickEvent\");\r\n\t\t}\r\n\r\n\t\t// these delegates are required to keep context\r\n\t\tthis._mouseMoveDelegate = function(event) {\r\n\t\t\treturn that._mouseMove(event);\r\n\t\t};\r\n\t\tthis._mouseUpDelegate = function(event) {\r\n\t\t\treturn that._mouseUp(event);\r\n\t\t};\r\n\r\n\t\tthis.document\r\n\t\t\t.bind( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\r\n\t\t\t.bind( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\r\n\r\n\t\tevent.preventDefault();\r\n\r\n\t\tmouseHandled = true;\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_mouseMove: function(event) {\r\n\t\t// Only check for mouseups outside the document if you've moved inside the document\r\n\t\t// at least once. This prevents the firing of mouseup in the case of IE<9, which will\r\n\t\t// fire a mousemove event if content is placed under the cursor. See #7778\r\n\t\t// Support: IE <9\r\n\t\tif ( this._mouseMoved ) {\r\n\t\t\t// IE mouseup check - mouseup happened when mouse was out of window\r\n\t\t\tif ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {\r\n\t\t\t\treturn this._mouseUp(event);\r\n\r\n\t\t\t// Iframe mouseup check - mouseup occurred in another document\r\n\t\t\t} else if ( !event.which ) {\r\n\t\t\t\treturn this._mouseUp( event );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( event.which || event.button ) {\r\n\t\t\tthis._mouseMoved = true;\r\n\t\t}\r\n\r\n\t\tif (this._mouseStarted) {\r\n\t\t\tthis._mouseDrag(event);\r\n\t\t\treturn event.preventDefault();\r\n\t\t}\r\n\r\n\t\tif (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {\r\n\t\t\tthis._mouseStarted =\r\n\t\t\t\t(this._mouseStart(this._mouseDownEvent, event) !== false);\r\n\t\t\t(this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));\r\n\t\t}\r\n\r\n\t\treturn !this._mouseStarted;\r\n\t},\r\n\r\n\t_mouseUp: function(event) {\r\n\t\tthis.document\r\n\t\t\t.unbind( \"mousemove.\" + this.widgetName, this._mouseMoveDelegate )\r\n\t\t\t.unbind( \"mouseup.\" + this.widgetName, this._mouseUpDelegate );\r\n\r\n\t\tif (this._mouseStarted) {\r\n\t\t\tthis._mouseStarted = false;\r\n\r\n\t\t\tif (event.target === this._mouseDownEvent.target) {\r\n\t\t\t\t$.data(event.target, this.widgetName + \".preventClickEvent\", true);\r\n\t\t\t}\r\n\r\n\t\t\tthis._mouseStop(event);\r\n\t\t}\r\n\r\n\t\tmouseHandled = false;\r\n\t\treturn false;\r\n\t},\r\n\r\n\t_mouseDistanceMet: function(event) {\r\n\t\treturn (Math.max(\r\n\t\t\t\tMath.abs(this._mouseDownEvent.pageX - event.pageX),\r\n\t\t\t\tMath.abs(this._mouseDownEvent.pageY - event.pageY)\r\n\t\t\t) >= this.options.distance\r\n\t\t);\r\n\t},\r\n\r\n\t_mouseDelayMet: function(/* event */) {\r\n\t\treturn this.mouseDelayMet;\r\n\t},\r\n\r\n\t// These are placeholder methods, to be overriden by extending plugin\r\n\t_mouseStart: function(/* event */) {},\r\n\t_mouseDrag: function(/* event */) {},\r\n\t_mouseStop: function(/* event */) {},\r\n\t_mouseCapture: function(/* event */) { return true; }\r\n});\r\n\r\n\r\n/*!\r\n * jQuery UI Position 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/position/\r\n */\r\n\r\n(function() {\r\n\r\n$.ui = $.ui || {};\r\n\r\nvar cachedScrollbarWidth, supportsOffsetFractions,\r\n\tmax = Math.max,\r\n\tabs = Math.abs,\r\n\tround = Math.round,\r\n\trhorizontal = /left|center|right/,\r\n\trvertical = /top|center|bottom/,\r\n\troffset = /[\\+\\-]\\d+(\\.[\\d]+)?%?/,\r\n\trposition = /^\\w+/,\r\n\trpercent = /%$/,\r\n\t_position = $.fn.position;\r\n\r\nfunction getOffsets( offsets, width, height ) {\r\n\treturn [\r\n\t\tparseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ),\r\n\t\tparseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 )\r\n\t];\r\n}\r\n\r\nfunction parseCss( element, property ) {\r\n\treturn parseInt( $.css( element, property ), 10 ) || 0;\r\n}\r\n\r\nfunction getDimensions( elem ) {\r\n\tvar raw = elem[0];\r\n\tif ( raw.nodeType === 9 ) {\r\n\t\treturn {\r\n\t\t\twidth: elem.width(),\r\n\t\t\theight: elem.height(),\r\n\t\t\toffset: { top: 0, left: 0 }\r\n\t\t};\r\n\t}\r\n\tif ( $.isWindow( raw ) ) {\r\n\t\treturn {\r\n\t\t\twidth: elem.width(),\r\n\t\t\theight: elem.height(),\r\n\t\t\toffset: { top: elem.scrollTop(), left: elem.scrollLeft() }\r\n\t\t};\r\n\t}\r\n\tif ( raw.preventDefault ) {\r\n\t\treturn {\r\n\t\t\twidth: 0,\r\n\t\t\theight: 0,\r\n\t\t\toffset: { top: raw.pageY, left: raw.pageX }\r\n\t\t};\r\n\t}\r\n\treturn {\r\n\t\twidth: elem.outerWidth(),\r\n\t\theight: elem.outerHeight(),\r\n\t\toffset: elem.offset()\r\n\t};\r\n}\r\n\r\n$.position = {\r\n\tscrollbarWidth: function() {\r\n\t\tif ( cachedScrollbarWidth !== undefined ) {\r\n\t\t\treturn cachedScrollbarWidth;\r\n\t\t}\r\n\t\tvar w1, w2,\r\n\t\t\tdiv = $( \"<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>\" ),\r\n\t\t\tinnerDiv = div.children()[0];\r\n\r\n\t\t$( \"body\" ).append( div );\r\n\t\tw1 = innerDiv.offsetWidth;\r\n\t\tdiv.css( \"overflow\", \"scroll\" );\r\n\r\n\t\tw2 = innerDiv.offsetWidth;\r\n\r\n\t\tif ( w1 === w2 ) {\r\n\t\t\tw2 = div[0].clientWidth;\r\n\t\t}\r\n\r\n\t\tdiv.remove();\r\n\r\n\t\treturn (cachedScrollbarWidth = w1 - w2);\r\n\t},\r\n\tgetScrollInfo: function( within ) {\r\n\t\tvar overflowX = within.isWindow || within.isDocument ? \"\" :\r\n\t\t\t\twithin.element.css( \"overflow-x\" ),\r\n\t\t\toverflowY = within.isWindow || within.isDocument ? \"\" :\r\n\t\t\t\twithin.element.css( \"overflow-y\" ),\r\n\t\t\thasOverflowX = overflowX === \"scroll\" ||\r\n\t\t\t\t( overflowX === \"auto\" && within.width < within.element[0].scrollWidth ),\r\n\t\t\thasOverflowY = overflowY === \"scroll\" ||\r\n\t\t\t\t( overflowY === \"auto\" && within.height < within.element[0].scrollHeight );\r\n\t\treturn {\r\n\t\t\twidth: hasOverflowY ? $.position.scrollbarWidth() : 0,\r\n\t\t\theight: hasOverflowX ? $.position.scrollbarWidth() : 0\r\n\t\t};\r\n\t},\r\n\tgetWithinInfo: function( element ) {\r\n\t\tvar withinElement = $( element || window ),\r\n\t\t\tisWindow = $.isWindow( withinElement[0] ),\r\n\t\t\tisDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9;\r\n\t\treturn {\r\n\t\t\telement: withinElement,\r\n\t\t\tisWindow: isWindow,\r\n\t\t\tisDocument: isDocument,\r\n\t\t\toffset: withinElement.offset() || { left: 0, top: 0 },\r\n\t\t\tscrollLeft: withinElement.scrollLeft(),\r\n\t\t\tscrollTop: withinElement.scrollTop(),\r\n\r\n\t\t\t// support: jQuery 1.6.x\r\n\t\t\t// jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows\r\n\t\t\twidth: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(),\r\n\t\t\theight: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight()\r\n\t\t};\r\n\t}\r\n};\r\n\r\n$.fn.position = function( options ) {\r\n\tif ( !options || !options.of ) {\r\n\t\treturn _position.apply( this, arguments );\r\n\t}\r\n\r\n\t// make a copy, we don't want to modify arguments\r\n\toptions = $.extend( {}, options );\r\n\r\n\tvar atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions,\r\n\t\ttarget = $( options.of ),\r\n\t\twithin = $.position.getWithinInfo( options.within ),\r\n\t\tscrollInfo = $.position.getScrollInfo( within ),\r\n\t\tcollision = ( options.collision || \"flip\" ).split( \" \" ),\r\n\t\toffsets = {};\r\n\r\n\tdimensions = getDimensions( target );\r\n\tif ( target[0].preventDefault ) {\r\n\t\t// force left top to allow flipping\r\n\t\toptions.at = \"left top\";\r\n\t}\r\n\ttargetWidth = dimensions.width;\r\n\ttargetHeight = dimensions.height;\r\n\ttargetOffset = dimensions.offset;\r\n\t// clone to reuse original targetOffset later\r\n\tbasePosition = $.extend( {}, targetOffset );\r\n\r\n\t// force my and at to have valid horizontal and vertical positions\r\n\t// if a value is missing or invalid, it will be converted to center\r\n\t$.each( [ \"my\", \"at\" ], function() {\r\n\t\tvar pos = ( options[ this ] || \"\" ).split( \" \" ),\r\n\t\t\thorizontalOffset,\r\n\t\t\tverticalOffset;\r\n\r\n\t\tif ( pos.length === 1) {\r\n\t\t\tpos = rhorizontal.test( pos[ 0 ] ) ?\r\n\t\t\t\tpos.concat( [ \"center\" ] ) :\r\n\t\t\t\trvertical.test( pos[ 0 ] ) ?\r\n\t\t\t\t\t[ \"center\" ].concat( pos ) :\r\n\t\t\t\t\t[ \"center\", \"center\" ];\r\n\t\t}\r\n\t\tpos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : \"center\";\r\n\t\tpos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : \"center\";\r\n\r\n\t\t// calculate offsets\r\n\t\thorizontalOffset = roffset.exec( pos[ 0 ] );\r\n\t\tverticalOffset = roffset.exec( pos[ 1 ] );\r\n\t\toffsets[ this ] = [\r\n\t\t\thorizontalOffset ? horizontalOffset[ 0 ] : 0,\r\n\t\t\tverticalOffset ? verticalOffset[ 0 ] : 0\r\n\t\t];\r\n\r\n\t\t// reduce to just the positions without the offsets\r\n\t\toptions[ this ] = [\r\n\t\t\trposition.exec( pos[ 0 ] )[ 0 ],\r\n\t\t\trposition.exec( pos[ 1 ] )[ 0 ]\r\n\t\t];\r\n\t});\r\n\r\n\t// normalize collision option\r\n\tif ( collision.length === 1 ) {\r\n\t\tcollision[ 1 ] = collision[ 0 ];\r\n\t}\r\n\r\n\tif ( options.at[ 0 ] === \"right\" ) {\r\n\t\tbasePosition.left += targetWidth;\r\n\t} else if ( options.at[ 0 ] === \"center\" ) {\r\n\t\tbasePosition.left += targetWidth / 2;\r\n\t}\r\n\r\n\tif ( options.at[ 1 ] === \"bottom\" ) {\r\n\t\tbasePosition.top += targetHeight;\r\n\t} else if ( options.at[ 1 ] === \"center\" ) {\r\n\t\tbasePosition.top += targetHeight / 2;\r\n\t}\r\n\r\n\tatOffset = getOffsets( offsets.at, targetWidth, targetHeight );\r\n\tbasePosition.left += atOffset[ 0 ];\r\n\tbasePosition.top += atOffset[ 1 ];\r\n\r\n\treturn this.each(function() {\r\n\t\tvar collisionPosition, using,\r\n\t\t\telem = $( this ),\r\n\t\t\telemWidth = elem.outerWidth(),\r\n\t\t\telemHeight = elem.outerHeight(),\r\n\t\t\tmarginLeft = parseCss( this, \"marginLeft\" ),\r\n\t\t\tmarginTop = parseCss( this, \"marginTop\" ),\r\n\t\t\tcollisionWidth = elemWidth + marginLeft + parseCss( this, \"marginRight\" ) + scrollInfo.width,\r\n\t\t\tcollisionHeight = elemHeight + marginTop + parseCss( this, \"marginBottom\" ) + scrollInfo.height,\r\n\t\t\tposition = $.extend( {}, basePosition ),\r\n\t\t\tmyOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() );\r\n\r\n\t\tif ( options.my[ 0 ] === \"right\" ) {\r\n\t\t\tposition.left -= elemWidth;\r\n\t\t} else if ( options.my[ 0 ] === \"center\" ) {\r\n\t\t\tposition.left -= elemWidth / 2;\r\n\t\t}\r\n\r\n\t\tif ( options.my[ 1 ] === \"bottom\" ) {\r\n\t\t\tposition.top -= elemHeight;\r\n\t\t} else if ( options.my[ 1 ] === \"center\" ) {\r\n\t\t\tposition.top -= elemHeight / 2;\r\n\t\t}\r\n\r\n\t\tposition.left += myOffset[ 0 ];\r\n\t\tposition.top += myOffset[ 1 ];\r\n\r\n\t\t// if the browser doesn't support fractions, then round for consistent results\r\n\t\tif ( !supportsOffsetFractions ) {\r\n\t\t\tposition.left = round( position.left );\r\n\t\t\tposition.top = round( position.top );\r\n\t\t}\r\n\r\n\t\tcollisionPosition = {\r\n\t\t\tmarginLeft: marginLeft,\r\n\t\t\tmarginTop: marginTop\r\n\t\t};\r\n\r\n\t\t$.each( [ \"left\", \"top\" ], function( i, dir ) {\r\n\t\t\tif ( $.ui.position[ collision[ i ] ] ) {\r\n\t\t\t\t$.ui.position[ collision[ i ] ][ dir ]( position, {\r\n\t\t\t\t\ttargetWidth: targetWidth,\r\n\t\t\t\t\ttargetHeight: targetHeight,\r\n\t\t\t\t\telemWidth: elemWidth,\r\n\t\t\t\t\telemHeight: elemHeight,\r\n\t\t\t\t\tcollisionPosition: collisionPosition,\r\n\t\t\t\t\tcollisionWidth: collisionWidth,\r\n\t\t\t\t\tcollisionHeight: collisionHeight,\r\n\t\t\t\t\toffset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ],\r\n\t\t\t\t\tmy: options.my,\r\n\t\t\t\t\tat: options.at,\r\n\t\t\t\t\twithin: within,\r\n\t\t\t\t\telem: elem\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif ( options.using ) {\r\n\t\t\t// adds feedback as second argument to using callback, if present\r\n\t\t\tusing = function( props ) {\r\n\t\t\t\tvar left = targetOffset.left - position.left,\r\n\t\t\t\t\tright = left + targetWidth - elemWidth,\r\n\t\t\t\t\ttop = targetOffset.top - position.top,\r\n\t\t\t\t\tbottom = top + targetHeight - elemHeight,\r\n\t\t\t\t\tfeedback = {\r\n\t\t\t\t\t\ttarget: {\r\n\t\t\t\t\t\t\telement: target,\r\n\t\t\t\t\t\t\tleft: targetOffset.left,\r\n\t\t\t\t\t\t\ttop: targetOffset.top,\r\n\t\t\t\t\t\t\twidth: targetWidth,\r\n\t\t\t\t\t\t\theight: targetHeight\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\telement: {\r\n\t\t\t\t\t\t\telement: elem,\r\n\t\t\t\t\t\t\tleft: position.left,\r\n\t\t\t\t\t\t\ttop: position.top,\r\n\t\t\t\t\t\t\twidth: elemWidth,\r\n\t\t\t\t\t\t\theight: elemHeight\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\thorizontal: right < 0 ? \"left\" : left > 0 ? \"right\" : \"center\",\r\n\t\t\t\t\t\tvertical: bottom < 0 ? \"top\" : top > 0 ? \"bottom\" : \"middle\"\r\n\t\t\t\t\t};\r\n\t\t\t\tif ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) {\r\n\t\t\t\t\tfeedback.horizontal = \"center\";\r\n\t\t\t\t}\r\n\t\t\t\tif ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) {\r\n\t\t\t\t\tfeedback.vertical = \"middle\";\r\n\t\t\t\t}\r\n\t\t\t\tif ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) {\r\n\t\t\t\t\tfeedback.important = \"horizontal\";\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfeedback.important = \"vertical\";\r\n\t\t\t\t}\r\n\t\t\t\toptions.using.call( this, props, feedback );\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\telem.offset( $.extend( position, { using: using } ) );\r\n\t});\r\n};\r\n\r\n$.ui.position = {\r\n\tfit: {\r\n\t\tleft: function( position, data ) {\r\n\t\t\tvar within = data.within,\r\n\t\t\t\twithinOffset = within.isWindow ? within.scrollLeft : within.offset.left,\r\n\t\t\t\touterWidth = within.width,\r\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\r\n\t\t\t\toverLeft = withinOffset - collisionPosLeft,\r\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset,\r\n\t\t\t\tnewOverRight;\r\n\r\n\t\t\t// element is wider than within\r\n\t\t\tif ( data.collisionWidth > outerWidth ) {\r\n\t\t\t\t// element is initially over the left side of within\r\n\t\t\t\tif ( overLeft > 0 && overRight <= 0 ) {\r\n\t\t\t\t\tnewOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset;\r\n\t\t\t\t\tposition.left += overLeft - newOverRight;\r\n\t\t\t\t// element is initially over right side of within\r\n\t\t\t\t} else if ( overRight > 0 && overLeft <= 0 ) {\r\n\t\t\t\t\tposition.left = withinOffset;\r\n\t\t\t\t// element is initially over both left and right sides of within\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif ( overLeft > overRight ) {\r\n\t\t\t\t\t\tposition.left = withinOffset + outerWidth - data.collisionWidth;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tposition.left = withinOffset;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t// too far left -> align with left edge\r\n\t\t\t} else if ( overLeft > 0 ) {\r\n\t\t\t\tposition.left += overLeft;\r\n\t\t\t// too far right -> align with right edge\r\n\t\t\t} else if ( overRight > 0 ) {\r\n\t\t\t\tposition.left -= overRight;\r\n\t\t\t// adjust based on position and margin\r\n\t\t\t} else {\r\n\t\t\t\tposition.left = max( position.left - collisionPosLeft, position.left );\r\n\t\t\t}\r\n\t\t},\r\n\t\ttop: function( position, data ) {\r\n\t\t\tvar within = data.within,\r\n\t\t\t\twithinOffset = within.isWindow ? within.scrollTop : within.offset.top,\r\n\t\t\t\touterHeight = data.within.height,\r\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\r\n\t\t\t\toverTop = withinOffset - collisionPosTop,\r\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset,\r\n\t\t\t\tnewOverBottom;\r\n\r\n\t\t\t// element is taller than within\r\n\t\t\tif ( data.collisionHeight > outerHeight ) {\r\n\t\t\t\t// element is initially over the top of within\r\n\t\t\t\tif ( overTop > 0 && overBottom <= 0 ) {\r\n\t\t\t\t\tnewOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset;\r\n\t\t\t\t\tposition.top += overTop - newOverBottom;\r\n\t\t\t\t// element is initially over bottom of within\r\n\t\t\t\t} else if ( overBottom > 0 && overTop <= 0 ) {\r\n\t\t\t\t\tposition.top = withinOffset;\r\n\t\t\t\t// element is initially over both top and bottom of within\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif ( overTop > overBottom ) {\r\n\t\t\t\t\t\tposition.top = withinOffset + outerHeight - data.collisionHeight;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tposition.top = withinOffset;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t// too far up -> align with top\r\n\t\t\t} else if ( overTop > 0 ) {\r\n\t\t\t\tposition.top += overTop;\r\n\t\t\t// too far down -> align with bottom edge\r\n\t\t\t} else if ( overBottom > 0 ) {\r\n\t\t\t\tposition.top -= overBottom;\r\n\t\t\t// adjust based on position and margin\r\n\t\t\t} else {\r\n\t\t\t\tposition.top = max( position.top - collisionPosTop, position.top );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tflip: {\r\n\t\tleft: function( position, data ) {\r\n\t\t\tvar within = data.within,\r\n\t\t\t\twithinOffset = within.offset.left + within.scrollLeft,\r\n\t\t\t\touterWidth = within.width,\r\n\t\t\t\toffsetLeft = within.isWindow ? within.scrollLeft : within.offset.left,\r\n\t\t\t\tcollisionPosLeft = position.left - data.collisionPosition.marginLeft,\r\n\t\t\t\toverLeft = collisionPosLeft - offsetLeft,\r\n\t\t\t\toverRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft,\r\n\t\t\t\tmyOffset = data.my[ 0 ] === \"left\" ?\r\n\t\t\t\t\t-data.elemWidth :\r\n\t\t\t\t\tdata.my[ 0 ] === \"right\" ?\r\n\t\t\t\t\t\tdata.elemWidth :\r\n\t\t\t\t\t\t0,\r\n\t\t\t\tatOffset = data.at[ 0 ] === \"left\" ?\r\n\t\t\t\t\tdata.targetWidth :\r\n\t\t\t\t\tdata.at[ 0 ] === \"right\" ?\r\n\t\t\t\t\t\t-data.targetWidth :\r\n\t\t\t\t\t\t0,\r\n\t\t\t\toffset = -2 * data.offset[ 0 ],\r\n\t\t\t\tnewOverRight,\r\n\t\t\t\tnewOverLeft;\r\n\r\n\t\t\tif ( overLeft < 0 ) {\r\n\t\t\t\tnewOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset;\r\n\t\t\t\tif ( newOverRight < 0 || newOverRight < abs( overLeft ) ) {\r\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\r\n\t\t\t\t}\r\n\t\t\t} else if ( overRight > 0 ) {\r\n\t\t\t\tnewOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft;\r\n\t\t\t\tif ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) {\r\n\t\t\t\t\tposition.left += myOffset + atOffset + offset;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\ttop: function( position, data ) {\r\n\t\t\tvar within = data.within,\r\n\t\t\t\twithinOffset = within.offset.top + within.scrollTop,\r\n\t\t\t\touterHeight = within.height,\r\n\t\t\t\toffsetTop = within.isWindow ? within.scrollTop : within.offset.top,\r\n\t\t\t\tcollisionPosTop = position.top - data.collisionPosition.marginTop,\r\n\t\t\t\toverTop = collisionPosTop - offsetTop,\r\n\t\t\t\toverBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop,\r\n\t\t\t\ttop = data.my[ 1 ] === \"top\",\r\n\t\t\t\tmyOffset = top ?\r\n\t\t\t\t\t-data.elemHeight :\r\n\t\t\t\t\tdata.my[ 1 ] === \"bottom\" ?\r\n\t\t\t\t\t\tdata.elemHeight :\r\n\t\t\t\t\t\t0,\r\n\t\t\t\tatOffset = data.at[ 1 ] === \"top\" ?\r\n\t\t\t\t\tdata.targetHeight :\r\n\t\t\t\t\tdata.at[ 1 ] === \"bottom\" ?\r\n\t\t\t\t\t\t-data.targetHeight :\r\n\t\t\t\t\t\t0,\r\n\t\t\t\toffset = -2 * data.offset[ 1 ],\r\n\t\t\t\tnewOverTop,\r\n\t\t\t\tnewOverBottom;\r\n\t\t\tif ( overTop < 0 ) {\r\n\t\t\t\tnewOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset;\r\n\t\t\t\tif ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) {\r\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\r\n\t\t\t\t}\r\n\t\t\t} else if ( overBottom > 0 ) {\r\n\t\t\t\tnewOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop;\r\n\t\t\t\tif ( newOverTop > 0 || abs( newOverTop ) < overBottom ) {\r\n\t\t\t\t\tposition.top += myOffset + atOffset + offset;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tflipfit: {\r\n\t\tleft: function() {\r\n\t\t\t$.ui.position.flip.left.apply( this, arguments );\r\n\t\t\t$.ui.position.fit.left.apply( this, arguments );\r\n\t\t},\r\n\t\ttop: function() {\r\n\t\t\t$.ui.position.flip.top.apply( this, arguments );\r\n\t\t\t$.ui.position.fit.top.apply( this, arguments );\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// fraction support test\r\n(function() {\r\n\tvar testElement, testElementParent, testElementStyle, offsetLeft, i,\r\n\t\tbody = document.getElementsByTagName( \"body\" )[ 0 ],\r\n\t\tdiv = document.createElement( \"div\" );\r\n\r\n\t//Create a \"fake body\" for testing based on method used in jQuery.support\r\n\ttestElement = document.createElement( body ? \"div\" : \"body\" );\r\n\ttestElementStyle = {\r\n\t\tvisibility: \"hidden\",\r\n\t\twidth: 0,\r\n\t\theight: 0,\r\n\t\tborder: 0,\r\n\t\tmargin: 0,\r\n\t\tbackground: \"none\"\r\n\t};\r\n\tif ( body ) {\r\n\t\t$.extend( testElementStyle, {\r\n\t\t\tposition: \"absolute\",\r\n\t\t\tleft: \"-1000px\",\r\n\t\t\ttop: \"-1000px\"\r\n\t\t});\r\n\t}\r\n\tfor ( i in testElementStyle ) {\r\n\t\ttestElement.style[ i ] = testElementStyle[ i ];\r\n\t}\r\n\ttestElement.appendChild( div );\r\n\ttestElementParent = body || document.documentElement;\r\n\ttestElementParent.insertBefore( testElement, testElementParent.firstChild );\r\n\r\n\tdiv.style.cssText = \"position: absolute; left: 10.7432222px;\";\r\n\r\n\toffsetLeft = $( div ).offset().left;\r\n\tsupportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11;\r\n\r\n\ttestElement.innerHTML = \"\";\r\n\ttestElementParent.removeChild( testElement );\r\n})();\r\n\r\n})();\r\n\r\nvar position = $.ui.position;\r\n\r\n\r\n/*!\r\n * jQuery UI Draggable 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/draggable/\r\n */\r\n\r\n\r\n$.widget(\"ui.draggable\", $.ui.mouse, {\r\n\tversion: \"1.11.4\",\r\n\twidgetEventPrefix: \"drag\",\r\n\toptions: {\r\n\t\taddClasses: true,\r\n\t\tappendTo: \"parent\",\r\n\t\taxis: false,\r\n\t\tconnectToSortable: false,\r\n\t\tcontainment: false,\r\n\t\tcursor: \"auto\",\r\n\t\tcursorAt: false,\r\n\t\tgrid: false,\r\n\t\thandle: false,\r\n\t\thelper: \"original\",\r\n\t\tiframeFix: false,\r\n\t\topacity: false,\r\n\t\trefreshPositions: false,\r\n\t\trevert: false,\r\n\t\trevertDuration: 500,\r\n\t\tscope: \"default\",\r\n\t\tscroll: true,\r\n\t\tscrollSensitivity: 20,\r\n\t\tscrollSpeed: 20,\r\n\t\tsnap: false,\r\n\t\tsnapMode: \"both\",\r\n\t\tsnapTolerance: 20,\r\n\t\tstack: false,\r\n\t\tzIndex: false,\r\n\r\n\t\t// callbacks\r\n\t\tdrag: null,\r\n\t\tstart: null,\r\n\t\tstop: null\r\n\t},\r\n\t_create: function() {\r\n\r\n\t\tif ( this.options.helper === \"original\" ) {\r\n\t\t\tthis._setPositionRelative();\r\n\t\t}\r\n\t\tif (this.options.addClasses){\r\n\t\t\tthis.element.addClass(\"ui-draggable\");\r\n\t\t}\r\n\t\tif (this.options.disabled){\r\n\t\t\tthis.element.addClass(\"ui-draggable-disabled\");\r\n\t\t}\r\n\t\tthis._setHandleClassName();\r\n\r\n\t\tthis._mouseInit();\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tthis._super( key, value );\r\n\t\tif ( key === \"handle\" ) {\r\n\t\t\tthis._removeHandleClassName();\r\n\t\t\tthis._setHandleClassName();\r\n\t\t}\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tif ( ( this.helper || this.element ).is( \".ui-draggable-dragging\" ) ) {\r\n\t\t\tthis.destroyOnClear = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.element.removeClass( \"ui-draggable ui-draggable-dragging ui-draggable-disabled\" );\r\n\t\tthis._removeHandleClassName();\r\n\t\tthis._mouseDestroy();\r\n\t},\r\n\r\n\t_mouseCapture: function(event) {\r\n\t\tvar o = this.options;\r\n\r\n\t\tthis._blurActiveElement( event );\r\n\r\n\t\t// among others, prevent a drag on a resizable-handle\r\n\t\tif (this.helper || o.disabled || $(event.target).closest(\".ui-resizable-handle\").length > 0) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t//Quit if we're not on a valid handle\r\n\t\tthis.handle = this._getHandle(event);\r\n\t\tif (!this.handle) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis._blockFrames( o.iframeFix === true ? \"iframe\" : o.iframeFix );\r\n\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\t_blockFrames: function( selector ) {\r\n\t\tthis.iframeBlocks = this.document.find( selector ).map(function() {\r\n\t\t\tvar iframe = $( this );\r\n\r\n\t\t\treturn $( \"<div>\" )\r\n\t\t\t\t.css( \"position\", \"absolute\" )\r\n\t\t\t\t.appendTo( iframe.parent() )\r\n\t\t\t\t.outerWidth( iframe.outerWidth() )\r\n\t\t\t\t.outerHeight( iframe.outerHeight() )\r\n\t\t\t\t.offset( iframe.offset() )[ 0 ];\r\n\t\t});\r\n\t},\r\n\r\n\t_unblockFrames: function() {\r\n\t\tif ( this.iframeBlocks ) {\r\n\t\t\tthis.iframeBlocks.remove();\r\n\t\t\tdelete this.iframeBlocks;\r\n\t\t}\r\n\t},\r\n\r\n\t_blurActiveElement: function( event ) {\r\n\t\tvar document = this.document[ 0 ];\r\n\r\n\t\t// Only need to blur if the event occurred on the draggable itself, see #10527\r\n\t\tif ( !this.handleElement.is( event.target ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// support: IE9\r\n\t\t// IE9 throws an \"Unspecified error\" accessing document.activeElement from an <iframe>\r\n\t\ttry {\r\n\r\n\t\t\t// Support: IE9, IE10\r\n\t\t\t// If the <body> is blurred, IE will switch windows, see #9520\r\n\t\t\tif ( document.activeElement && document.activeElement.nodeName.toLowerCase() !== \"body\" ) {\r\n\r\n\t\t\t\t// Blur any element that currently has focus, see #4261\r\n\t\t\t\t$( document.activeElement ).blur();\r\n\t\t\t}\r\n\t\t} catch ( error ) {}\r\n\t},\r\n\r\n\t_mouseStart: function(event) {\r\n\r\n\t\tvar o = this.options;\r\n\r\n\t\t//Create and append the visible helper\r\n\t\tthis.helper = this._createHelper(event);\r\n\r\n\t\tthis.helper.addClass(\"ui-draggable-dragging\");\r\n\r\n\t\t//Cache the helper size\r\n\t\tthis._cacheHelperProportions();\r\n\r\n\t\t//If ddmanager is used for droppables, set the global draggable\r\n\t\tif ($.ui.ddmanager) {\r\n\t\t\t$.ui.ddmanager.current = this;\r\n\t\t}\r\n\r\n\t\t/*\r\n\t\t * - Position generation -\r\n\t\t * This block generates everything position related - it's the core of draggables.\r\n\t\t */\r\n\r\n\t\t//Cache the margins of the original element\r\n\t\tthis._cacheMargins();\r\n\r\n\t\t//Store the helper's css position\r\n\t\tthis.cssPosition = this.helper.css( \"position\" );\r\n\t\tthis.scrollParent = this.helper.scrollParent( true );\r\n\t\tthis.offsetParent = this.helper.offsetParent();\r\n\t\tthis.hasFixedAncestor = this.helper.parents().filter(function() {\r\n\t\t\t\treturn $( this ).css( \"position\" ) === \"fixed\";\r\n\t\t\t}).length > 0;\r\n\r\n\t\t//The element's absolute position on the page minus margins\r\n\t\tthis.positionAbs = this.element.offset();\r\n\t\tthis._refreshOffsets( event );\r\n\r\n\t\t//Generate the original position\r\n\t\tthis.originalPosition = this.position = this._generatePosition( event, false );\r\n\t\tthis.originalPageX = event.pageX;\r\n\t\tthis.originalPageY = event.pageY;\r\n\r\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\r\n\t\t(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));\r\n\r\n\t\t//Set a containment if given in the options\r\n\t\tthis._setContainment();\r\n\r\n\t\t//Trigger event + callbacks\r\n\t\tif (this._trigger(\"start\", event) === false) {\r\n\t\t\tthis._clear();\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t//Recache the helper size\r\n\t\tthis._cacheHelperProportions();\r\n\r\n\t\t//Prepare the droppable offsets\r\n\t\tif ($.ui.ddmanager && !o.dropBehaviour) {\r\n\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\r\n\t\t}\r\n\r\n\t\t// Reset helper's right/bottom css if they're set and set explicit width/height instead\r\n\t\t// as this prevents resizing of elements with right/bottom set (see #7772)\r\n\t\tthis._normalizeRightBottom();\r\n\r\n\t\tthis._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position\r\n\r\n\t\t//If the ddmanager is used for droppables, inform the manager that dragging has started (see #5003)\r\n\t\tif ( $.ui.ddmanager ) {\r\n\t\t\t$.ui.ddmanager.dragStart(this, event);\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_refreshOffsets: function( event ) {\r\n\t\tthis.offset = {\r\n\t\t\ttop: this.positionAbs.top - this.margins.top,\r\n\t\t\tleft: this.positionAbs.left - this.margins.left,\r\n\t\t\tscroll: false,\r\n\t\t\tparent: this._getParentOffset(),\r\n\t\t\trelative: this._getRelativeOffset()\r\n\t\t};\r\n\r\n\t\tthis.offset.click = {\r\n\t\t\tleft: event.pageX - this.offset.left,\r\n\t\t\ttop: event.pageY - this.offset.top\r\n\t\t};\r\n\t},\r\n\r\n\t_mouseDrag: function(event, noPropagation) {\r\n\t\t// reset any necessary cached properties (see #5009)\r\n\t\tif ( this.hasFixedAncestor ) {\r\n\t\t\tthis.offset.parent = this._getParentOffset();\r\n\t\t}\r\n\r\n\t\t//Compute the helpers position\r\n\t\tthis.position = this._generatePosition( event, true );\r\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\r\n\r\n\t\t//Call plugins and callbacks and use the resulting position if something is returned\r\n\t\tif (!noPropagation) {\r\n\t\t\tvar ui = this._uiHash();\r\n\t\t\tif (this._trigger(\"drag\", event, ui) === false) {\r\n\t\t\t\tthis._mouseUp({});\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tthis.position = ui.position;\r\n\t\t}\r\n\r\n\t\tthis.helper[ 0 ].style.left = this.position.left + \"px\";\r\n\t\tthis.helper[ 0 ].style.top = this.position.top + \"px\";\r\n\r\n\t\tif ($.ui.ddmanager) {\r\n\t\t\t$.ui.ddmanager.drag(this, event);\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\t_mouseStop: function(event) {\r\n\r\n\t\t//If we are using droppables, inform the manager about the drop\r\n\t\tvar that = this,\r\n\t\t\tdropped = false;\r\n\t\tif ($.ui.ddmanager && !this.options.dropBehaviour) {\r\n\t\t\tdropped = $.ui.ddmanager.drop(this, event);\r\n\t\t}\r\n\r\n\t\t//if a drop comes from outside (a sortable)\r\n\t\tif (this.dropped) {\r\n\t\t\tdropped = this.dropped;\r\n\t\t\tthis.dropped = false;\r\n\t\t}\r\n\r\n\t\tif ((this.options.revert === \"invalid\" && !dropped) || (this.options.revert === \"valid\" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {\r\n\t\t\t$(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {\r\n\t\t\t\tif (that._trigger(\"stop\", event) !== false) {\r\n\t\t\t\t\tthat._clear();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tif (this._trigger(\"stop\", event) !== false) {\r\n\t\t\t\tthis._clear();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\t_mouseUp: function( event ) {\r\n\t\tthis._unblockFrames();\r\n\r\n\t\t//If the ddmanager is used for droppables, inform the manager that dragging has stopped (see #5003)\r\n\t\tif ( $.ui.ddmanager ) {\r\n\t\t\t$.ui.ddmanager.dragStop(this, event);\r\n\t\t}\r\n\r\n\t\t// Only need to focus if the event occurred on the draggable itself, see #10527\r\n\t\tif ( this.handleElement.is( event.target ) ) {\r\n\t\t\t// The interaction is over; whether or not the click resulted in a drag, focus the element\r\n\t\t\tthis.element.focus();\r\n\t\t}\r\n\r\n\t\treturn $.ui.mouse.prototype._mouseUp.call(this, event);\r\n\t},\r\n\r\n\tcancel: function() {\r\n\r\n\t\tif (this.helper.is(\".ui-draggable-dragging\")) {\r\n\t\t\tthis._mouseUp({});\r\n\t\t} else {\r\n\t\t\tthis._clear();\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\t_getHandle: function(event) {\r\n\t\treturn this.options.handle ?\r\n\t\t\t!!$( event.target ).closest( this.element.find( this.options.handle ) ).length :\r\n\t\t\ttrue;\r\n\t},\r\n\r\n\t_setHandleClassName: function() {\r\n\t\tthis.handleElement = this.options.handle ?\r\n\t\t\tthis.element.find( this.options.handle ) : this.element;\r\n\t\tthis.handleElement.addClass( \"ui-draggable-handle\" );\r\n\t},\r\n\r\n\t_removeHandleClassName: function() {\r\n\t\tthis.handleElement.removeClass( \"ui-draggable-handle\" );\r\n\t},\r\n\r\n\t_createHelper: function(event) {\r\n\r\n\t\tvar o = this.options,\r\n\t\t\thelperIsFunction = $.isFunction( o.helper ),\r\n\t\t\thelper = helperIsFunction ?\r\n\t\t\t\t$( o.helper.apply( this.element[ 0 ], [ event ] ) ) :\r\n\t\t\t\t( o.helper === \"clone\" ?\r\n\t\t\t\t\tthis.element.clone().removeAttr( \"id\" ) :\r\n\t\t\t\t\tthis.element );\r\n\r\n\t\tif (!helper.parents(\"body\").length) {\r\n\t\t\thelper.appendTo((o.appendTo === \"parent\" ? this.element[0].parentNode : o.appendTo));\r\n\t\t}\r\n\r\n\t\t// http://bugs.jqueryui.com/ticket/9446\r\n\t\t// a helper function can return the original element\r\n\t\t// which wouldn't have been set to relative in _create\r\n\t\tif ( helperIsFunction && helper[ 0 ] === this.element[ 0 ] ) {\r\n\t\t\tthis._setPositionRelative();\r\n\t\t}\r\n\r\n\t\tif (helper[0] !== this.element[0] && !(/(fixed|absolute)/).test(helper.css(\"position\"))) {\r\n\t\t\thelper.css(\"position\", \"absolute\");\r\n\t\t}\r\n\r\n\t\treturn helper;\r\n\r\n\t},\r\n\r\n\t_setPositionRelative: function() {\r\n\t\tif ( !( /^(?:r|a|f)/ ).test( this.element.css( \"position\" ) ) ) {\r\n\t\t\tthis.element[ 0 ].style.position = \"relative\";\r\n\t\t}\r\n\t},\r\n\r\n\t_adjustOffsetFromHelper: function(obj) {\r\n\t\tif (typeof obj === \"string\") {\r\n\t\t\tobj = obj.split(\" \");\r\n\t\t}\r\n\t\tif ($.isArray(obj)) {\r\n\t\t\tobj = { left: +obj[0], top: +obj[1] || 0 };\r\n\t\t}\r\n\t\tif (\"left\" in obj) {\r\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\r\n\t\t}\r\n\t\tif (\"right\" in obj) {\r\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\r\n\t\t}\r\n\t\tif (\"top\" in obj) {\r\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\r\n\t\t}\r\n\t\tif (\"bottom\" in obj) {\r\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\r\n\t\t}\r\n\t},\r\n\r\n\t_isRootNode: function( element ) {\r\n\t\treturn ( /(html|body)/i ).test( element.tagName ) || element === this.document[ 0 ];\r\n\t},\r\n\r\n\t_getParentOffset: function() {\r\n\r\n\t\t//Get the offsetParent and cache its position\r\n\t\tvar po = this.offsetParent.offset(),\r\n\t\t\tdocument = this.document[ 0 ];\r\n\r\n\t\t// This is a special case where we need to modify a offset calculated on start, since the following happened:\r\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent\r\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that\r\n\t\t// the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag\r\n\t\tif (this.cssPosition === \"absolute\" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {\r\n\t\t\tpo.left += this.scrollParent.scrollLeft();\r\n\t\t\tpo.top += this.scrollParent.scrollTop();\r\n\t\t}\r\n\r\n\t\tif ( this._isRootNode( this.offsetParent[ 0 ] ) ) {\r\n\t\t\tpo = { top: 0, left: 0 };\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttop: po.top + (parseInt(this.offsetParent.css(\"borderTopWidth\"), 10) || 0),\r\n\t\t\tleft: po.left + (parseInt(this.offsetParent.css(\"borderLeftWidth\"), 10) || 0)\r\n\t\t};\r\n\r\n\t},\r\n\r\n\t_getRelativeOffset: function() {\r\n\t\tif ( this.cssPosition !== \"relative\" ) {\r\n\t\t\treturn { top: 0, left: 0 };\r\n\t\t}\r\n\r\n\t\tvar p = this.element.position(),\r\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );\r\n\r\n\t\treturn {\r\n\t\t\ttop: p.top - ( parseInt(this.helper.css( \"top\" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollTop() : 0 ),\r\n\t\t\tleft: p.left - ( parseInt(this.helper.css( \"left\" ), 10) || 0 ) + ( !scrollIsRootNode ? this.scrollParent.scrollLeft() : 0 )\r\n\t\t};\r\n\r\n\t},\r\n\r\n\t_cacheMargins: function() {\r\n\t\tthis.margins = {\r\n\t\t\tleft: (parseInt(this.element.css(\"marginLeft\"), 10) || 0),\r\n\t\t\ttop: (parseInt(this.element.css(\"marginTop\"), 10) || 0),\r\n\t\t\tright: (parseInt(this.element.css(\"marginRight\"), 10) || 0),\r\n\t\t\tbottom: (parseInt(this.element.css(\"marginBottom\"), 10) || 0)\r\n\t\t};\r\n\t},\r\n\r\n\t_cacheHelperProportions: function() {\r\n\t\tthis.helperProportions = {\r\n\t\t\twidth: this.helper.outerWidth(),\r\n\t\t\theight: this.helper.outerHeight()\r\n\t\t};\r\n\t},\r\n\r\n\t_setContainment: function() {\r\n\r\n\t\tvar isUserScrollable, c, ce,\r\n\t\t\to = this.options,\r\n\t\t\tdocument = this.document[ 0 ];\r\n\r\n\t\tthis.relativeContainer = null;\r\n\r\n\t\tif ( !o.containment ) {\r\n\t\t\tthis.containment = null;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( o.containment === \"window\" ) {\r\n\t\t\tthis.containment = [\r\n\t\t\t\t$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,\r\n\t\t\t\t$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,\r\n\t\t\t\t$( window ).scrollLeft() + $( window ).width() - this.helperProportions.width - this.margins.left,\r\n\t\t\t\t$( window ).scrollTop() + ( $( window ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top\r\n\t\t\t];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( o.containment === \"document\") {\r\n\t\t\tthis.containment = [\r\n\t\t\t\t0,\r\n\t\t\t\t0,\r\n\t\t\t\t$( document ).width() - this.helperProportions.width - this.margins.left,\r\n\t\t\t\t( $( document ).height() || document.body.parentNode.scrollHeight ) - this.helperProportions.height - this.margins.top\r\n\t\t\t];\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( o.containment.constructor === Array ) {\r\n\t\t\tthis.containment = o.containment;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( o.containment === \"parent\" ) {\r\n\t\t\to.containment = this.helper[ 0 ].parentNode;\r\n\t\t}\r\n\r\n\t\tc = $( o.containment );\r\n\t\tce = c[ 0 ];\r\n\r\n\t\tif ( !ce ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tisUserScrollable = /(scroll|auto)/.test( c.css( \"overflow\" ) );\r\n\r\n\t\tthis.containment = [\r\n\t\t\t( parseInt( c.css( \"borderLeftWidth\" ), 10 ) || 0 ) + ( parseInt( c.css( \"paddingLeft\" ), 10 ) || 0 ),\r\n\t\t\t( parseInt( c.css( \"borderTopWidth\" ), 10 ) || 0 ) + ( parseInt( c.css( \"paddingTop\" ), 10 ) || 0 ),\r\n\t\t\t( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -\r\n\t\t\t\t( parseInt( c.css( \"borderRightWidth\" ), 10 ) || 0 ) -\r\n\t\t\t\t( parseInt( c.css( \"paddingRight\" ), 10 ) || 0 ) -\r\n\t\t\t\tthis.helperProportions.width -\r\n\t\t\t\tthis.margins.left -\r\n\t\t\t\tthis.margins.right,\r\n\t\t\t( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -\r\n\t\t\t\t( parseInt( c.css( \"borderBottomWidth\" ), 10 ) || 0 ) -\r\n\t\t\t\t( parseInt( c.css( \"paddingBottom\" ), 10 ) || 0 ) -\r\n\t\t\t\tthis.helperProportions.height -\r\n\t\t\t\tthis.margins.top -\r\n\t\t\t\tthis.margins.bottom\r\n\t\t];\r\n\t\tthis.relativeContainer = c;\r\n\t},\r\n\r\n\t_convertPositionTo: function(d, pos) {\r\n\r\n\t\tif (!pos) {\r\n\t\t\tpos = this.position;\r\n\t\t}\r\n\r\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\r\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] );\r\n\r\n\t\treturn {\r\n\t\t\ttop: (\r\n\t\t\t\tpos.top\t+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\r\n\t\t\t\tthis.offset.relative.top * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\r\n\t\t\t\tthis.offset.parent.top * mod -\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\r\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) ) * mod)\r\n\t\t\t),\r\n\t\t\tleft: (\r\n\t\t\t\tpos.left +\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\r\n\t\t\t\tthis.offset.relative.left * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\r\n\t\t\t\tthis.offset.parent.left * mod\t-\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\r\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) ) * mod)\r\n\t\t\t)\r\n\t\t};\r\n\r\n\t},\r\n\r\n\t_generatePosition: function( event, constrainPosition ) {\r\n\r\n\t\tvar containment, co, top, left,\r\n\t\t\to = this.options,\r\n\t\t\tscrollIsRootNode = this._isRootNode( this.scrollParent[ 0 ] ),\r\n\t\t\tpageX = event.pageX,\r\n\t\t\tpageY = event.pageY;\r\n\r\n\t\t// Cache the scroll\r\n\t\tif ( !scrollIsRootNode || !this.offset.scroll ) {\r\n\t\t\tthis.offset.scroll = {\r\n\t\t\t\ttop: this.scrollParent.scrollTop(),\r\n\t\t\t\tleft: this.scrollParent.scrollLeft()\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t/*\r\n\t\t * - Position constraining -\r\n\t\t * Constrain the position to a mix of grid, containment.\r\n\t\t */\r\n\r\n\t\t// If we are not dragging yet, we won't check for options\r\n\t\tif ( constrainPosition ) {\r\n\t\t\tif ( this.containment ) {\r\n\t\t\t\tif ( this.relativeContainer ){\r\n\t\t\t\t\tco = this.relativeContainer.offset();\r\n\t\t\t\t\tcontainment = [\r\n\t\t\t\t\t\tthis.containment[ 0 ] + co.left,\r\n\t\t\t\t\t\tthis.containment[ 1 ] + co.top,\r\n\t\t\t\t\t\tthis.containment[ 2 ] + co.left,\r\n\t\t\t\t\t\tthis.containment[ 3 ] + co.top\r\n\t\t\t\t\t];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcontainment = this.containment;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (event.pageX - this.offset.click.left < containment[0]) {\r\n\t\t\t\t\tpageX = containment[0] + this.offset.click.left;\r\n\t\t\t\t}\r\n\t\t\t\tif (event.pageY - this.offset.click.top < containment[1]) {\r\n\t\t\t\t\tpageY = containment[1] + this.offset.click.top;\r\n\t\t\t\t}\r\n\t\t\t\tif (event.pageX - this.offset.click.left > containment[2]) {\r\n\t\t\t\t\tpageX = containment[2] + this.offset.click.left;\r\n\t\t\t\t}\r\n\t\t\t\tif (event.pageY - this.offset.click.top > containment[3]) {\r\n\t\t\t\t\tpageY = containment[3] + this.offset.click.top;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (o.grid) {\r\n\t\t\t\t//Check for grid elements set to 0 to prevent divide by 0 error causing invalid argument errors in IE (see ticket #6950)\r\n\t\t\t\ttop = o.grid[1] ? this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1] : this.originalPageY;\r\n\t\t\t\tpageY = containment ? ((top - this.offset.click.top >= containment[1] || top - this.offset.click.top > containment[3]) ? top : ((top - this.offset.click.top >= containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;\r\n\r\n\t\t\t\tleft = o.grid[0] ? this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0] : this.originalPageX;\r\n\t\t\t\tpageX = containment ? ((left - this.offset.click.left >= containment[0] || left - this.offset.click.left > containment[2]) ? left : ((left - this.offset.click.left >= containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;\r\n\t\t\t}\r\n\r\n\t\t\tif ( o.axis === \"y\" ) {\r\n\t\t\t\tpageX = this.originalPageX;\r\n\t\t\t}\r\n\r\n\t\t\tif ( o.axis === \"x\" ) {\r\n\t\t\t\tpageY = this.originalPageY;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttop: (\r\n\t\t\t\tpageY -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\r\n\t\t\t\tthis.offset.click.top\t-\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\r\n\t\t\t\tthis.offset.relative.top -\t\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\r\n\t\t\t\tthis.offset.parent.top +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\r\n\t\t\t\t( this.cssPosition === \"fixed\" ? -this.offset.scroll.top : ( scrollIsRootNode ? 0 : this.offset.scroll.top ) )\r\n\t\t\t),\r\n\t\t\tleft: (\r\n\t\t\t\tpageX -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\r\n\t\t\t\tthis.offset.click.left -\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\r\n\t\t\t\tthis.offset.relative.left -\t\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\r\n\t\t\t\tthis.offset.parent.left +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\r\n\t\t\t\t( this.cssPosition === \"fixed\" ? -this.offset.scroll.left : ( scrollIsRootNode ? 0 : this.offset.scroll.left ) )\r\n\t\t\t)\r\n\t\t};\r\n\r\n\t},\r\n\r\n\t_clear: function() {\r\n\t\tthis.helper.removeClass(\"ui-draggable-dragging\");\r\n\t\tif (this.helper[0] !== this.element[0] && !this.cancelHelperRemoval) {\r\n\t\t\tthis.helper.remove();\r\n\t\t}\r\n\t\tthis.helper = null;\r\n\t\tthis.cancelHelperRemoval = false;\r\n\t\tif ( this.destroyOnClear ) {\r\n\t\t\tthis.destroy();\r\n\t\t}\r\n\t},\r\n\r\n\t_normalizeRightBottom: function() {\r\n\t\tif ( this.options.axis !== \"y\" && this.helper.css( \"right\" ) !== \"auto\" ) {\r\n\t\t\tthis.helper.width( this.helper.width() );\r\n\t\t\tthis.helper.css( \"right\", \"auto\" );\r\n\t\t}\r\n\t\tif ( this.options.axis !== \"x\" && this.helper.css( \"bottom\" ) !== \"auto\" ) {\r\n\t\t\tthis.helper.height( this.helper.height() );\r\n\t\t\tthis.helper.css( \"bottom\", \"auto\" );\r\n\t\t}\r\n\t},\r\n\r\n\t// From now on bulk stuff - mainly helpers\r\n\r\n\t_trigger: function( type, event, ui ) {\r\n\t\tui = ui || this._uiHash();\r\n\t\t$.ui.plugin.call( this, type, [ event, ui, this ], true );\r\n\r\n\t\t// Absolute position and offset (see #6884 ) have to be recalculated after plugins\r\n\t\tif ( /^(drag|start|stop)/.test( type ) ) {\r\n\t\t\tthis.positionAbs = this._convertPositionTo( \"absolute\" );\r\n\t\t\tui.offset = this.positionAbs;\r\n\t\t}\r\n\t\treturn $.Widget.prototype._trigger.call( this, type, event, ui );\r\n\t},\r\n\r\n\tplugins: {},\r\n\r\n\t_uiHash: function() {\r\n\t\treturn {\r\n\t\t\thelper: this.helper,\r\n\t\t\tposition: this.position,\r\n\t\t\toriginalPosition: this.originalPosition,\r\n\t\t\toffset: this.positionAbs\r\n\t\t};\r\n\t}\r\n\r\n});\r\n\r\n$.ui.plugin.add( \"draggable\", \"connectToSortable\", {\r\n\tstart: function( event, ui, draggable ) {\r\n\t\tvar uiSortable = $.extend( {}, ui, {\r\n\t\t\titem: draggable.element\r\n\t\t});\r\n\r\n\t\tdraggable.sortables = [];\r\n\t\t$( draggable.options.connectToSortable ).each(function() {\r\n\t\t\tvar sortable = $( this ).sortable( \"instance\" );\r\n\r\n\t\t\tif ( sortable && !sortable.options.disabled ) {\r\n\t\t\t\tdraggable.sortables.push( sortable );\r\n\r\n\t\t\t\t// refreshPositions is called at drag start to refresh the containerCache\r\n\t\t\t\t// which is used in drag. This ensures it's initialized and synchronized\r\n\t\t\t\t// with any changes that might have happened on the page since initialization.\r\n\t\t\t\tsortable.refreshPositions();\r\n\t\t\t\tsortable._trigger(\"activate\", event, uiSortable);\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\tstop: function( event, ui, draggable ) {\r\n\t\tvar uiSortable = $.extend( {}, ui, {\r\n\t\t\titem: draggable.element\r\n\t\t});\r\n\r\n\t\tdraggable.cancelHelperRemoval = false;\r\n\r\n\t\t$.each( draggable.sortables, function() {\r\n\t\t\tvar sortable = this;\r\n\r\n\t\t\tif ( sortable.isOver ) {\r\n\t\t\t\tsortable.isOver = 0;\r\n\r\n\t\t\t\t// Allow this sortable to handle removing the helper\r\n\t\t\t\tdraggable.cancelHelperRemoval = true;\r\n\t\t\t\tsortable.cancelHelperRemoval = false;\r\n\r\n\t\t\t\t// Use _storedCSS To restore properties in the sortable,\r\n\t\t\t\t// as this also handles revert (#9675) since the draggable\r\n\t\t\t\t// may have modified them in unexpected ways (#8809)\r\n\t\t\t\tsortable._storedCSS = {\r\n\t\t\t\t\tposition: sortable.placeholder.css( \"position\" ),\r\n\t\t\t\t\ttop: sortable.placeholder.css( \"top\" ),\r\n\t\t\t\t\tleft: sortable.placeholder.css( \"left\" )\r\n\t\t\t\t};\r\n\r\n\t\t\t\tsortable._mouseStop(event);\r\n\r\n\t\t\t\t// Once drag has ended, the sortable should return to using\r\n\t\t\t\t// its original helper, not the shared helper from draggable\r\n\t\t\t\tsortable.options.helper = sortable.options._helper;\r\n\t\t\t} else {\r\n\t\t\t\t// Prevent this Sortable from removing the helper.\r\n\t\t\t\t// However, don't set the draggable to remove the helper\r\n\t\t\t\t// either as another connected Sortable may yet handle the removal.\r\n\t\t\t\tsortable.cancelHelperRemoval = true;\r\n\r\n\t\t\t\tsortable._trigger( \"deactivate\", event, uiSortable );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\tdrag: function( event, ui, draggable ) {\r\n\t\t$.each( draggable.sortables, function() {\r\n\t\t\tvar innermostIntersecting = false,\r\n\t\t\t\tsortable = this;\r\n\r\n\t\t\t// Copy over variables that sortable's _intersectsWith uses\r\n\t\t\tsortable.positionAbs = draggable.positionAbs;\r\n\t\t\tsortable.helperProportions = draggable.helperProportions;\r\n\t\t\tsortable.offset.click = draggable.offset.click;\r\n\r\n\t\t\tif ( sortable._intersectsWith( sortable.containerCache ) ) {\r\n\t\t\t\tinnermostIntersecting = true;\r\n\r\n\t\t\t\t$.each( draggable.sortables, function() {\r\n\t\t\t\t\t// Copy over variables that sortable's _intersectsWith uses\r\n\t\t\t\t\tthis.positionAbs = draggable.positionAbs;\r\n\t\t\t\t\tthis.helperProportions = draggable.helperProportions;\r\n\t\t\t\t\tthis.offset.click = draggable.offset.click;\r\n\r\n\t\t\t\t\tif ( this !== sortable &&\r\n\t\t\t\t\t\t\tthis._intersectsWith( this.containerCache ) &&\r\n\t\t\t\t\t\t\t$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {\r\n\t\t\t\t\t\tinnermostIntersecting = false;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn innermostIntersecting;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tif ( innermostIntersecting ) {\r\n\t\t\t\t// If it intersects, we use a little isOver variable and set it once,\r\n\t\t\t\t// so that the move-in stuff gets fired only once.\r\n\t\t\t\tif ( !sortable.isOver ) {\r\n\t\t\t\t\tsortable.isOver = 1;\r\n\r\n\t\t\t\t\t// Store draggable's parent in case we need to reappend to it later.\r\n\t\t\t\t\tdraggable._parent = ui.helper.parent();\r\n\r\n\t\t\t\t\tsortable.currentItem = ui.helper\r\n\t\t\t\t\t\t.appendTo( sortable.element )\r\n\t\t\t\t\t\t.data( \"ui-sortable-item\", true );\r\n\r\n\t\t\t\t\t// Store helper option to later restore it\r\n\t\t\t\t\tsortable.options._helper = sortable.options.helper;\r\n\r\n\t\t\t\t\tsortable.options.helper = function() {\r\n\t\t\t\t\t\treturn ui.helper[ 0 ];\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// Fire the start events of the sortable with our passed browser event,\r\n\t\t\t\t\t// and our own helper (so it doesn't create a new one)\r\n\t\t\t\t\tevent.target = sortable.currentItem[ 0 ];\r\n\t\t\t\t\tsortable._mouseCapture( event, true );\r\n\t\t\t\t\tsortable._mouseStart( event, true, true );\r\n\r\n\t\t\t\t\t// Because the browser event is way off the new appended portlet,\r\n\t\t\t\t\t// modify necessary variables to reflect the changes\r\n\t\t\t\t\tsortable.offset.click.top = draggable.offset.click.top;\r\n\t\t\t\t\tsortable.offset.click.left = draggable.offset.click.left;\r\n\t\t\t\t\tsortable.offset.parent.left -= draggable.offset.parent.left -\r\n\t\t\t\t\t\tsortable.offset.parent.left;\r\n\t\t\t\t\tsortable.offset.parent.top -= draggable.offset.parent.top -\r\n\t\t\t\t\t\tsortable.offset.parent.top;\r\n\r\n\t\t\t\t\tdraggable._trigger( \"toSortable\", event );\r\n\r\n\t\t\t\t\t// Inform draggable that the helper is in a valid drop zone,\r\n\t\t\t\t\t// used solely in the revert option to handle \"valid/invalid\".\r\n\t\t\t\t\tdraggable.dropped = sortable.element;\r\n\r\n\t\t\t\t\t// Need to refreshPositions of all sortables in the case that\r\n\t\t\t\t\t// adding to one sortable changes the location of the other sortables (#9675)\r\n\t\t\t\t\t$.each( draggable.sortables, function() {\r\n\t\t\t\t\t\tthis.refreshPositions();\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t// hack so receive/update callbacks work (mostly)\r\n\t\t\t\t\tdraggable.currentItem = draggable.element;\r\n\t\t\t\t\tsortable.fromOutside = draggable;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( sortable.currentItem ) {\r\n\t\t\t\t\tsortable._mouseDrag( event );\r\n\t\t\t\t\t// Copy the sortable's position because the draggable's can potentially reflect\r\n\t\t\t\t\t// a relative position, while sortable is always absolute, which the dragged\r\n\t\t\t\t\t// element has now become. (#8809)\r\n\t\t\t\t\tui.position = sortable.position;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// If it doesn't intersect with the sortable, and it intersected before,\r\n\t\t\t\t// we fake the drag stop of the sortable, but make sure it doesn't remove\r\n\t\t\t\t// the helper by using cancelHelperRemoval.\r\n\t\t\t\tif ( sortable.isOver ) {\r\n\r\n\t\t\t\t\tsortable.isOver = 0;\r\n\t\t\t\t\tsortable.cancelHelperRemoval = true;\r\n\r\n\t\t\t\t\t// Calling sortable's mouseStop would trigger a revert,\r\n\t\t\t\t\t// so revert must be temporarily false until after mouseStop is called.\r\n\t\t\t\t\tsortable.options._revert = sortable.options.revert;\r\n\t\t\t\t\tsortable.options.revert = false;\r\n\r\n\t\t\t\t\tsortable._trigger( \"out\", event, sortable._uiHash( sortable ) );\r\n\t\t\t\t\tsortable._mouseStop( event, true );\r\n\r\n\t\t\t\t\t// restore sortable behaviors that were modfied\r\n\t\t\t\t\t// when the draggable entered the sortable area (#9481)\r\n\t\t\t\t\tsortable.options.revert = sortable.options._revert;\r\n\t\t\t\t\tsortable.options.helper = sortable.options._helper;\r\n\r\n\t\t\t\t\tif ( sortable.placeholder ) {\r\n\t\t\t\t\t\tsortable.placeholder.remove();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Restore and recalculate the draggable's offset considering the sortable\r\n\t\t\t\t\t// may have modified them in unexpected ways. (#8809, #10669)\r\n\t\t\t\t\tui.helper.appendTo( draggable._parent );\r\n\t\t\t\t\tdraggable._refreshOffsets( event );\r\n\t\t\t\t\tui.position = draggable._generatePosition( event, true );\r\n\r\n\t\t\t\t\tdraggable._trigger( \"fromSortable\", event );\r\n\r\n\t\t\t\t\t// Inform draggable that the helper is no longer in a valid drop zone\r\n\t\t\t\t\tdraggable.dropped = false;\r\n\r\n\t\t\t\t\t// Need to refreshPositions of all sortables just in case removing\r\n\t\t\t\t\t// from one sortable changes the location of other sortables (#9675)\r\n\t\t\t\t\t$.each( draggable.sortables, function() {\r\n\t\t\t\t\t\tthis.refreshPositions();\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n});\r\n\r\n$.ui.plugin.add(\"draggable\", \"cursor\", {\r\n\tstart: function( event, ui, instance ) {\r\n\t\tvar t = $( \"body\" ),\r\n\t\t\to = instance.options;\r\n\r\n\t\tif (t.css(\"cursor\")) {\r\n\t\t\to._cursor = t.css(\"cursor\");\r\n\t\t}\r\n\t\tt.css(\"cursor\", o.cursor);\r\n\t},\r\n\tstop: function( event, ui, instance ) {\r\n\t\tvar o = instance.options;\r\n\t\tif (o._cursor) {\r\n\t\t\t$(\"body\").css(\"cursor\", o._cursor);\r\n\t\t}\r\n\t}\r\n});\r\n\r\n$.ui.plugin.add(\"draggable\", \"opacity\", {\r\n\tstart: function( event, ui, instance ) {\r\n\t\tvar t = $( ui.helper ),\r\n\t\t\to = instance.options;\r\n\t\tif (t.css(\"opacity\")) {\r\n\t\t\to._opacity = t.css(\"opacity\");\r\n\t\t}\r\n\t\tt.css(\"opacity\", o.opacity);\r\n\t},\r\n\tstop: function( event, ui, instance ) {\r\n\t\tvar o = instance.options;\r\n\t\tif (o._opacity) {\r\n\t\t\t$(ui.helper).css(\"opacity\", o._opacity);\r\n\t\t}\r\n\t}\r\n});\r\n\r\n$.ui.plugin.add(\"draggable\", \"scroll\", {\r\n\tstart: function( event, ui, i ) {\r\n\t\tif ( !i.scrollParentNotHidden ) {\r\n\t\t\ti.scrollParentNotHidden = i.helper.scrollParent( false );\r\n\t\t}\r\n\r\n\t\tif ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] && i.scrollParentNotHidden[ 0 ].tagName !== \"HTML\" ) {\r\n\t\t\ti.overflowOffset = i.scrollParentNotHidden.offset();\r\n\t\t}\r\n\t},\r\n\tdrag: function( event, ui, i ) {\r\n\r\n\t\tvar o = i.options,\r\n\t\t\tscrolled = false,\r\n\t\t\tscrollParent = i.scrollParentNotHidden[ 0 ],\r\n\t\t\tdocument = i.document[ 0 ];\r\n\r\n\t\tif ( scrollParent !== document && scrollParent.tagName !== \"HTML\" ) {\r\n\t\t\tif ( !o.axis || o.axis !== \"x\" ) {\r\n\t\t\t\tif ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY < o.scrollSensitivity ) {\r\n\t\t\t\t\tscrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;\r\n\t\t\t\t} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {\r\n\t\t\t\t\tscrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( !o.axis || o.axis !== \"y\" ) {\r\n\t\t\t\tif ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX < o.scrollSensitivity ) {\r\n\t\t\t\t\tscrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;\r\n\t\t\t\t} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {\r\n\t\t\t\t\tscrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\r\n\t\t\tif (!o.axis || o.axis !== \"x\") {\r\n\t\t\t\tif (event.pageY - $(document).scrollTop() < o.scrollSensitivity) {\r\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);\r\n\t\t\t\t} else if ($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {\r\n\t\t\t\t\tscrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (!o.axis || o.axis !== \"y\") {\r\n\t\t\t\tif (event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {\r\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);\r\n\t\t\t\t} else if ($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {\r\n\t\t\t\t\tscrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif (scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {\r\n\t\t\t$.ui.ddmanager.prepareOffsets(i, event);\r\n\t\t}\r\n\r\n\t}\r\n});\r\n\r\n$.ui.plugin.add(\"draggable\", \"snap\", {\r\n\tstart: function( event, ui, i ) {\r\n\r\n\t\tvar o = i.options;\r\n\r\n\t\ti.snapElements = [];\r\n\r\n\t\t$(o.snap.constructor !== String ? ( o.snap.items || \":data(ui-draggable)\" ) : o.snap).each(function() {\r\n\t\t\tvar $t = $(this),\r\n\t\t\t\t$o = $t.offset();\r\n\t\t\tif (this !== i.element[0]) {\r\n\t\t\t\ti.snapElements.push({\r\n\t\t\t\t\titem: this,\r\n\t\t\t\t\twidth: $t.outerWidth(), height: $t.outerHeight(),\r\n\t\t\t\t\ttop: $o.top, left: $o.left\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t},\r\n\tdrag: function( event, ui, inst ) {\r\n\r\n\t\tvar ts, bs, ls, rs, l, r, t, b, i, first,\r\n\t\t\to = inst.options,\r\n\t\t\td = o.snapTolerance,\r\n\t\t\tx1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,\r\n\t\t\ty1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;\r\n\r\n\t\tfor (i = inst.snapElements.length - 1; i >= 0; i--){\r\n\r\n\t\t\tl = inst.snapElements[i].left - inst.margins.left;\r\n\t\t\tr = l + inst.snapElements[i].width;\r\n\t\t\tt = inst.snapElements[i].top - inst.margins.top;\r\n\t\t\tb = t + inst.snapElements[i].height;\r\n\r\n\t\t\tif ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d || !$.contains( inst.snapElements[ i ].item.ownerDocument, inst.snapElements[ i ].item ) ) {\r\n\t\t\t\tif (inst.snapElements[i].snapping) {\r\n\t\t\t\t\t(inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));\r\n\t\t\t\t}\r\n\t\t\t\tinst.snapElements[i].snapping = false;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif (o.snapMode !== \"inner\") {\r\n\t\t\t\tts = Math.abs(t - y2) <= d;\r\n\t\t\t\tbs = Math.abs(b - y1) <= d;\r\n\t\t\t\tls = Math.abs(l - x2) <= d;\r\n\t\t\t\trs = Math.abs(r - x1) <= d;\r\n\t\t\t\tif (ts) {\r\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: t - inst.helperProportions.height, left: 0 }).top;\r\n\t\t\t\t}\r\n\t\t\t\tif (bs) {\r\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: b, left: 0 }).top;\r\n\t\t\t\t}\r\n\t\t\t\tif (ls) {\r\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: l - inst.helperProportions.width }).left;\r\n\t\t\t\t}\r\n\t\t\t\tif (rs) {\r\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: r }).left;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfirst = (ts || bs || ls || rs);\r\n\r\n\t\t\tif (o.snapMode !== \"outer\") {\r\n\t\t\t\tts = Math.abs(t - y1) <= d;\r\n\t\t\t\tbs = Math.abs(b - y2) <= d;\r\n\t\t\t\tls = Math.abs(l - x1) <= d;\r\n\t\t\t\trs = Math.abs(r - x2) <= d;\r\n\t\t\t\tif (ts) {\r\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: t, left: 0 }).top;\r\n\t\t\t\t}\r\n\t\t\t\tif (bs) {\r\n\t\t\t\t\tui.position.top = inst._convertPositionTo(\"relative\", { top: b - inst.helperProportions.height, left: 0 }).top;\r\n\t\t\t\t}\r\n\t\t\t\tif (ls) {\r\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: l }).left;\r\n\t\t\t\t}\r\n\t\t\t\tif (rs) {\r\n\t\t\t\t\tui.position.left = inst._convertPositionTo(\"relative\", { top: 0, left: r - inst.helperProportions.width }).left;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (!inst.snapElements[i].snapping && (ts || bs || ls || rs || first)) {\r\n\t\t\t\t(inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));\r\n\t\t\t}\r\n\t\t\tinst.snapElements[i].snapping = (ts || bs || ls || rs || first);\r\n\r\n\t\t}\r\n\r\n\t}\r\n});\r\n\r\n$.ui.plugin.add(\"draggable\", \"stack\", {\r\n\tstart: function( event, ui, instance ) {\r\n\t\tvar min,\r\n\t\t\to = instance.options,\r\n\t\t\tgroup = $.makeArray($(o.stack)).sort(function(a, b) {\r\n\t\t\t\treturn (parseInt($(a).css(\"zIndex\"), 10) || 0) - (parseInt($(b).css(\"zIndex\"), 10) || 0);\r\n\t\t\t});\r\n\r\n\t\tif (!group.length) { return; }\r\n\r\n\t\tmin = parseInt($(group[0]).css(\"zIndex\"), 10) || 0;\r\n\t\t$(group).each(function(i) {\r\n\t\t\t$(this).css(\"zIndex\", min + i);\r\n\t\t});\r\n\t\tthis.css(\"zIndex\", (min + group.length));\r\n\t}\r\n});\r\n\r\n$.ui.plugin.add(\"draggable\", \"zIndex\", {\r\n\tstart: function( event, ui, instance ) {\r\n\t\tvar t = $( ui.helper ),\r\n\t\t\to = instance.options;\r\n\r\n\t\tif (t.css(\"zIndex\")) {\r\n\t\t\to._zIndex = t.css(\"zIndex\");\r\n\t\t}\r\n\t\tt.css(\"zIndex\", o.zIndex);\r\n\t},\r\n\tstop: function( event, ui, instance ) {\r\n\t\tvar o = instance.options;\r\n\r\n\t\tif (o._zIndex) {\r\n\t\t\t$(ui.helper).css(\"zIndex\", o._zIndex);\r\n\t\t}\r\n\t}\r\n});\r\n\r\nvar draggable = $.ui.draggable;\r\n\r\n\r\n/*!\r\n * jQuery UI Droppable 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/droppable/\r\n */\r\n\r\n\r\n$.widget( \"ui.droppable\", {\r\n\tversion: \"1.11.4\",\r\n\twidgetEventPrefix: \"drop\",\r\n\toptions: {\r\n\t\taccept: \"*\",\r\n\t\tactiveClass: false,\r\n\t\taddClasses: true,\r\n\t\tgreedy: false,\r\n\t\thoverClass: false,\r\n\t\tscope: \"default\",\r\n\t\ttolerance: \"intersect\",\r\n\r\n\t\t// callbacks\r\n\t\tactivate: null,\r\n\t\tdeactivate: null,\r\n\t\tdrop: null,\r\n\t\tout: null,\r\n\t\tover: null\r\n\t},\r\n\t_create: function() {\r\n\r\n\t\tvar proportions,\r\n\t\t\to = this.options,\r\n\t\t\taccept = o.accept;\r\n\r\n\t\tthis.isover = false;\r\n\t\tthis.isout = true;\r\n\r\n\t\tthis.accept = $.isFunction( accept ) ? accept : function( d ) {\r\n\t\t\treturn d.is( accept );\r\n\t\t};\r\n\r\n\t\tthis.proportions = function( /* valueToWrite */ ) {\r\n\t\t\tif ( arguments.length ) {\r\n\t\t\t\t// Store the droppable's proportions\r\n\t\t\t\tproportions = arguments[ 0 ];\r\n\t\t\t} else {\r\n\t\t\t\t// Retrieve or derive the droppable's proportions\r\n\t\t\t\treturn proportions ?\r\n\t\t\t\t\tproportions :\r\n\t\t\t\t\tproportions = {\r\n\t\t\t\t\t\twidth: this.element[ 0 ].offsetWidth,\r\n\t\t\t\t\t\theight: this.element[ 0 ].offsetHeight\r\n\t\t\t\t\t};\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis._addToManager( o.scope );\r\n\r\n\t\to.addClasses && this.element.addClass( \"ui-droppable\" );\r\n\r\n\t},\r\n\r\n\t_addToManager: function( scope ) {\r\n\t\t// Add the reference and positions to the manager\r\n\t\t$.ui.ddmanager.droppables[ scope ] = $.ui.ddmanager.droppables[ scope ] || [];\r\n\t\t$.ui.ddmanager.droppables[ scope ].push( this );\r\n\t},\r\n\r\n\t_splice: function( drop ) {\r\n\t\tvar i = 0;\r\n\t\tfor ( ; i < drop.length; i++ ) {\r\n\t\t\tif ( drop[ i ] === this ) {\r\n\t\t\t\tdrop.splice( i, 1 );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tvar drop = $.ui.ddmanager.droppables[ this.options.scope ];\r\n\r\n\t\tthis._splice( drop );\r\n\r\n\t\tthis.element.removeClass( \"ui-droppable ui-droppable-disabled\" );\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\r\n\t\tif ( key === \"accept\" ) {\r\n\t\t\tthis.accept = $.isFunction( value ) ? value : function( d ) {\r\n\t\t\t\treturn d.is( value );\r\n\t\t\t};\r\n\t\t} else if ( key === \"scope\" ) {\r\n\t\t\tvar drop = $.ui.ddmanager.droppables[ this.options.scope ];\r\n\r\n\t\t\tthis._splice( drop );\r\n\t\t\tthis._addToManager( value );\r\n\t\t}\r\n\r\n\t\tthis._super( key, value );\r\n\t},\r\n\r\n\t_activate: function( event ) {\r\n\t\tvar draggable = $.ui.ddmanager.current;\r\n\t\tif ( this.options.activeClass ) {\r\n\t\t\tthis.element.addClass( this.options.activeClass );\r\n\t\t}\r\n\t\tif ( draggable ){\r\n\t\t\tthis._trigger( \"activate\", event, this.ui( draggable ) );\r\n\t\t}\r\n\t},\r\n\r\n\t_deactivate: function( event ) {\r\n\t\tvar draggable = $.ui.ddmanager.current;\r\n\t\tif ( this.options.activeClass ) {\r\n\t\t\tthis.element.removeClass( this.options.activeClass );\r\n\t\t}\r\n\t\tif ( draggable ){\r\n\t\t\tthis._trigger( \"deactivate\", event, this.ui( draggable ) );\r\n\t\t}\r\n\t},\r\n\r\n\t_over: function( event ) {\r\n\r\n\t\tvar draggable = $.ui.ddmanager.current;\r\n\r\n\t\t// Bail if draggable and droppable are same element\r\n\t\tif ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {\r\n\t\t\tif ( this.options.hoverClass ) {\r\n\t\t\t\tthis.element.addClass( this.options.hoverClass );\r\n\t\t\t}\r\n\t\t\tthis._trigger( \"over\", event, this.ui( draggable ) );\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_out: function( event ) {\r\n\r\n\t\tvar draggable = $.ui.ddmanager.current;\r\n\r\n\t\t// Bail if draggable and droppable are same element\r\n\t\tif ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {\r\n\t\t\tif ( this.options.hoverClass ) {\r\n\t\t\t\tthis.element.removeClass( this.options.hoverClass );\r\n\t\t\t}\r\n\t\t\tthis._trigger( \"out\", event, this.ui( draggable ) );\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_drop: function( event, custom ) {\r\n\r\n\t\tvar draggable = custom || $.ui.ddmanager.current,\r\n\t\t\tchildrenIntersection = false;\r\n\r\n\t\t// Bail if draggable and droppable are same element\r\n\t\tif ( !draggable || ( draggable.currentItem || draggable.element )[ 0 ] === this.element[ 0 ] ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.element.find( \":data(ui-droppable)\" ).not( \".ui-draggable-dragging\" ).each(function() {\r\n\t\t\tvar inst = $( this ).droppable( \"instance\" );\r\n\t\t\tif (\r\n\t\t\t\tinst.options.greedy &&\r\n\t\t\t\t!inst.options.disabled &&\r\n\t\t\t\tinst.options.scope === draggable.options.scope &&\r\n\t\t\t\tinst.accept.call( inst.element[ 0 ], ( draggable.currentItem || draggable.element ) ) &&\r\n\t\t\t\t$.ui.intersect( draggable, $.extend( inst, { offset: inst.element.offset() } ), inst.options.tolerance, event )\r\n\t\t\t) { childrenIntersection = true; return false; }\r\n\t\t});\r\n\t\tif ( childrenIntersection ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif ( this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {\r\n\t\t\tif ( this.options.activeClass ) {\r\n\t\t\t\tthis.element.removeClass( this.options.activeClass );\r\n\t\t\t}\r\n\t\t\tif ( this.options.hoverClass ) {\r\n\t\t\t\tthis.element.removeClass( this.options.hoverClass );\r\n\t\t\t}\r\n\t\t\tthis._trigger( \"drop\", event, this.ui( draggable ) );\r\n\t\t\treturn this.element;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\tui: function( c ) {\r\n\t\treturn {\r\n\t\t\tdraggable: ( c.currentItem || c.element ),\r\n\t\t\thelper: c.helper,\r\n\t\t\tposition: c.position,\r\n\t\t\toffset: c.positionAbs\r\n\t\t};\r\n\t}\r\n\r\n});\r\n\r\n$.ui.intersect = (function() {\r\n\tfunction isOverAxis( x, reference, size ) {\r\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\r\n\t}\r\n\r\n\treturn function( draggable, droppable, toleranceMode, event ) {\r\n\r\n\t\tif ( !droppable.offset ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tvar x1 = ( draggable.positionAbs || draggable.position.absolute ).left + draggable.margins.left,\r\n\t\t\ty1 = ( draggable.positionAbs || draggable.position.absolute ).top + draggable.margins.top,\r\n\t\t\tx2 = x1 + draggable.helperProportions.width,\r\n\t\t\ty2 = y1 + draggable.helperProportions.height,\r\n\t\t\tl = droppable.offset.left,\r\n\t\t\tt = droppable.offset.top,\r\n\t\t\tr = l + droppable.proportions().width,\r\n\t\t\tb = t + droppable.proportions().height;\r\n\r\n\t\tswitch ( toleranceMode ) {\r\n\t\tcase \"fit\":\r\n\t\t\treturn ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );\r\n\t\tcase \"intersect\":\r\n\t\t\treturn ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half\r\n\t\t\t\tx2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half\r\n\t\t\t\tt < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half\r\n\t\t\t\ty2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half\r\n\t\tcase \"pointer\":\r\n\t\t\treturn isOverAxis( event.pageY, t, droppable.proportions().height ) && isOverAxis( event.pageX, l, droppable.proportions().width );\r\n\t\tcase \"touch\":\r\n\t\t\treturn (\r\n\t\t\t\t( y1 >= t && y1 <= b ) || // Top edge touching\r\n\t\t\t\t( y2 >= t && y2 <= b ) || // Bottom edge touching\r\n\t\t\t\t( y1 < t && y2 > b ) // Surrounded vertically\r\n\t\t\t) && (\r\n\t\t\t\t( x1 >= l && x1 <= r ) || // Left edge touching\r\n\t\t\t\t( x2 >= l && x2 <= r ) || // Right edge touching\r\n\t\t\t\t( x1 < l && x2 > r ) // Surrounded horizontally\r\n\t\t\t);\r\n\t\tdefault:\r\n\t\t\treturn false;\r\n\t\t}\r\n\t};\r\n})();\r\n\r\n/*\r\n\tThis manager tracks offsets of draggables and droppables\r\n*/\r\n$.ui.ddmanager = {\r\n\tcurrent: null,\r\n\tdroppables: { \"default\": [] },\r\n\tprepareOffsets: function( t, event ) {\r\n\r\n\t\tvar i, j,\r\n\t\t\tm = $.ui.ddmanager.droppables[ t.options.scope ] || [],\r\n\t\t\ttype = event ? event.type : null, // workaround for #2317\r\n\t\t\tlist = ( t.currentItem || t.element ).find( \":data(ui-droppable)\" ).addBack();\r\n\r\n\t\tdroppablesLoop: for ( i = 0; i < m.length; i++ ) {\r\n\r\n\t\t\t// No disabled and non-accepted\r\n\t\t\tif ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ], ( t.currentItem || t.element ) ) ) ) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// Filter out elements in the current dragged item\r\n\t\t\tfor ( j = 0; j < list.length; j++ ) {\r\n\t\t\t\tif ( list[ j ] === m[ i ].element[ 0 ] ) {\r\n\t\t\t\t\tm[ i ].proportions().height = 0;\r\n\t\t\t\t\tcontinue droppablesLoop;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tm[ i ].visible = m[ i ].element.css( \"display\" ) !== \"none\";\r\n\t\t\tif ( !m[ i ].visible ) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// Activate the droppable if used directly from draggables\r\n\t\t\tif ( type === \"mousedown\" ) {\r\n\t\t\t\tm[ i ]._activate.call( m[ i ], event );\r\n\t\t\t}\r\n\r\n\t\t\tm[ i ].offset = m[ i ].element.offset();\r\n\t\t\tm[ i ].proportions({ width: m[ i ].element[ 0 ].offsetWidth, height: m[ i ].element[ 0 ].offsetHeight });\r\n\r\n\t\t}\r\n\r\n\t},\r\n\tdrop: function( draggable, event ) {\r\n\r\n\t\tvar dropped = false;\r\n\t\t// Create a copy of the droppables in case the list changes during the drop (#9116)\r\n\t\t$.each( ( $.ui.ddmanager.droppables[ draggable.options.scope ] || [] ).slice(), function() {\r\n\r\n\t\t\tif ( !this.options ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif ( !this.options.disabled && this.visible && $.ui.intersect( draggable, this, this.options.tolerance, event ) ) {\r\n\t\t\t\tdropped = this._drop.call( this, event ) || dropped;\r\n\t\t\t}\r\n\r\n\t\t\tif ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ], ( draggable.currentItem || draggable.element ) ) ) {\r\n\t\t\t\tthis.isout = true;\r\n\t\t\t\tthis.isover = false;\r\n\t\t\t\tthis._deactivate.call( this, event );\r\n\t\t\t}\r\n\r\n\t\t});\r\n\t\treturn dropped;\r\n\r\n\t},\r\n\tdragStart: function( draggable, event ) {\r\n\t\t// Listen for scrolling so that if the dragging causes scrolling the position of the droppables can be recalculated (see #5003)\r\n\t\tdraggable.element.parentsUntil( \"body\" ).bind( \"scroll.droppable\", function() {\r\n\t\t\tif ( !draggable.options.refreshPositions ) {\r\n\t\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\tdrag: function( draggable, event ) {\r\n\r\n\t\t// If you have a highly dynamic page, you might try this option. It renders positions every time you move the mouse.\r\n\t\tif ( draggable.options.refreshPositions ) {\r\n\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\r\n\t\t}\r\n\r\n\t\t// Run through all droppables and check their positions based on specific tolerance options\r\n\t\t$.each( $.ui.ddmanager.droppables[ draggable.options.scope ] || [], function() {\r\n\r\n\t\t\tif ( this.options.disabled || this.greedyChild || !this.visible ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar parentInstance, scope, parent,\r\n\t\t\t\tintersects = $.ui.intersect( draggable, this, this.options.tolerance, event ),\r\n\t\t\t\tc = !intersects && this.isover ? \"isout\" : ( intersects && !this.isover ? \"isover\" : null );\r\n\t\t\tif ( !c ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif ( this.options.greedy ) {\r\n\t\t\t\t// find droppable parents with same scope\r\n\t\t\t\tscope = this.options.scope;\r\n\t\t\t\tparent = this.element.parents( \":data(ui-droppable)\" ).filter(function() {\r\n\t\t\t\t\treturn $( this ).droppable( \"instance\" ).options.scope === scope;\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif ( parent.length ) {\r\n\t\t\t\t\tparentInstance = $( parent[ 0 ] ).droppable( \"instance\" );\r\n\t\t\t\t\tparentInstance.greedyChild = ( c === \"isover\" );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// we just moved into a greedy child\r\n\t\t\tif ( parentInstance && c === \"isover\" ) {\r\n\t\t\t\tparentInstance.isover = false;\r\n\t\t\t\tparentInstance.isout = true;\r\n\t\t\t\tparentInstance._out.call( parentInstance, event );\r\n\t\t\t}\r\n\r\n\t\t\tthis[ c ] = true;\r\n\t\t\tthis[c === \"isout\" ? \"isover\" : \"isout\"] = false;\r\n\t\t\tthis[c === \"isover\" ? \"_over\" : \"_out\"].call( this, event );\r\n\r\n\t\t\t// we just moved out of a greedy child\r\n\t\t\tif ( parentInstance && c === \"isout\" ) {\r\n\t\t\t\tparentInstance.isout = false;\r\n\t\t\t\tparentInstance.isover = true;\r\n\t\t\t\tparentInstance._over.call( parentInstance, event );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t},\r\n\tdragStop: function( draggable, event ) {\r\n\t\tdraggable.element.parentsUntil( \"body\" ).unbind( \"scroll.droppable\" );\r\n\t\t// Call prepareOffsets one final time since IE does not fire return scroll events when overflow was caused by drag (see #5003)\r\n\t\tif ( !draggable.options.refreshPositions ) {\r\n\t\t\t$.ui.ddmanager.prepareOffsets( draggable, event );\r\n\t\t}\r\n\t}\r\n};\r\n\r\nvar droppable = $.ui.droppable;\r\n\r\n\r\n/*!\r\n * jQuery UI Resizable 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/resizable/\r\n */\r\n\r\n\r\n$.widget(\"ui.resizable\", $.ui.mouse, {\r\n\tversion: \"1.11.4\",\r\n\twidgetEventPrefix: \"resize\",\r\n\toptions: {\r\n\t\talsoResize: false,\r\n\t\tanimate: false,\r\n\t\tanimateDuration: \"slow\",\r\n\t\tanimateEasing: \"swing\",\r\n\t\taspectRatio: false,\r\n\t\tautoHide: false,\r\n\t\tcontainment: false,\r\n\t\tghost: false,\r\n\t\tgrid: false,\r\n\t\thandles: \"e,s,se\",\r\n\t\thelper: false,\r\n\t\tmaxHeight: null,\r\n\t\tmaxWidth: null,\r\n\t\tminHeight: 10,\r\n\t\tminWidth: 10,\r\n\t\t// See #7960\r\n\t\tzIndex: 90,\r\n\r\n\t\t// callbacks\r\n\t\tresize: null,\r\n\t\tstart: null,\r\n\t\tstop: null\r\n\t},\r\n\r\n\t_num: function( value ) {\r\n\t\treturn parseInt( value, 10 ) || 0;\r\n\t},\r\n\r\n\t_isNumber: function( value ) {\r\n\t\treturn !isNaN( parseInt( value, 10 ) );\r\n\t},\r\n\r\n\t_hasScroll: function( el, a ) {\r\n\r\n\t\tif ( $( el ).css( \"overflow\" ) === \"hidden\") {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tvar scroll = ( a && a === \"left\" ) ? \"scrollLeft\" : \"scrollTop\",\r\n\t\t\thas = false;\r\n\r\n\t\tif ( el[ scroll ] > 0 ) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// TODO: determine which cases actually cause this to happen\r\n\t\t// if the element doesn't have the scroll set, see if it's possible to\r\n\t\t// set the scroll\r\n\t\tel[ scroll ] = 1;\r\n\t\thas = ( el[ scroll ] > 0 );\r\n\t\tel[ scroll ] = 0;\r\n\t\treturn has;\r\n\t},\r\n\r\n\t_create: function() {\r\n\r\n\t\tvar n, i, handle, axis, hname,\r\n\t\t\tthat = this,\r\n\t\t\to = this.options;\r\n\t\tthis.element.addClass(\"ui-resizable\");\r\n\r\n\t\t$.extend(this, {\r\n\t\t\t_aspectRatio: !!(o.aspectRatio),\r\n\t\t\taspectRatio: o.aspectRatio,\r\n\t\t\toriginalElement: this.element,\r\n\t\t\t_proportionallyResizeElements: [],\r\n\t\t\t_helper: o.helper || o.ghost || o.animate ? o.helper || \"ui-resizable-helper\" : null\r\n\t\t});\r\n\r\n\t\t// Wrap the element if it cannot hold child nodes\r\n\t\tif (this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)) {\r\n\r\n\t\t\tthis.element.wrap(\r\n\t\t\t\t$(\"<div class='ui-wrapper' style='overflow: hidden;'></div>\").css({\r\n\t\t\t\t\tposition: this.element.css(\"position\"),\r\n\t\t\t\t\twidth: this.element.outerWidth(),\r\n\t\t\t\t\theight: this.element.outerHeight(),\r\n\t\t\t\t\ttop: this.element.css(\"top\"),\r\n\t\t\t\t\tleft: this.element.css(\"left\")\r\n\t\t\t\t})\r\n\t\t\t);\r\n\r\n\t\t\tthis.element = this.element.parent().data(\r\n\t\t\t\t\"ui-resizable\", this.element.resizable( \"instance\" )\r\n\t\t\t);\r\n\r\n\t\t\tthis.elementIsWrapper = true;\r\n\r\n\t\t\tthis.element.css({\r\n\t\t\t\tmarginLeft: this.originalElement.css(\"marginLeft\"),\r\n\t\t\t\tmarginTop: this.originalElement.css(\"marginTop\"),\r\n\t\t\t\tmarginRight: this.originalElement.css(\"marginRight\"),\r\n\t\t\t\tmarginBottom: this.originalElement.css(\"marginBottom\")\r\n\t\t\t});\r\n\t\t\tthis.originalElement.css({\r\n\t\t\t\tmarginLeft: 0,\r\n\t\t\t\tmarginTop: 0,\r\n\t\t\t\tmarginRight: 0,\r\n\t\t\t\tmarginBottom: 0\r\n\t\t\t});\r\n\t\t\t// support: Safari\r\n\t\t\t// Prevent Safari textarea resize\r\n\t\t\tthis.originalResizeStyle = this.originalElement.css(\"resize\");\r\n\t\t\tthis.originalElement.css(\"resize\", \"none\");\r\n\r\n\t\t\tthis._proportionallyResizeElements.push( this.originalElement.css({\r\n\t\t\t\tposition: \"static\",\r\n\t\t\t\tzoom: 1,\r\n\t\t\t\tdisplay: \"block\"\r\n\t\t\t}) );\r\n\r\n\t\t\t// support: IE9\r\n\t\t\t// avoid IE jump (hard set the margin)\r\n\t\t\tthis.originalElement.css({ margin: this.originalElement.css(\"margin\") });\r\n\r\n\t\t\tthis._proportionallyResize();\r\n\t\t}\r\n\r\n\t\tthis.handles = o.handles ||\r\n\t\t\t( !$(\".ui-resizable-handle\", this.element).length ?\r\n\t\t\t\t\"e,s,se\" : {\r\n\t\t\t\t\tn: \".ui-resizable-n\",\r\n\t\t\t\t\te: \".ui-resizable-e\",\r\n\t\t\t\t\ts: \".ui-resizable-s\",\r\n\t\t\t\t\tw: \".ui-resizable-w\",\r\n\t\t\t\t\tse: \".ui-resizable-se\",\r\n\t\t\t\t\tsw: \".ui-resizable-sw\",\r\n\t\t\t\t\tne: \".ui-resizable-ne\",\r\n\t\t\t\t\tnw: \".ui-resizable-nw\"\r\n\t\t\t\t} );\r\n\r\n\t\tthis._handles = $();\r\n\t\tif ( this.handles.constructor === String ) {\r\n\r\n\t\t\tif ( this.handles === \"all\") {\r\n\t\t\t\tthis.handles = \"n,e,s,w,se,sw,ne,nw\";\r\n\t\t\t}\r\n\r\n\t\t\tn = this.handles.split(\",\");\r\n\t\t\tthis.handles = {};\r\n\r\n\t\t\tfor (i = 0; i < n.length; i++) {\r\n\r\n\t\t\t\thandle = $.trim(n[i]);\r\n\t\t\t\thname = \"ui-resizable-\" + handle;\r\n\t\t\t\taxis = $(\"<div class='ui-resizable-handle \" + hname + \"'></div>\");\r\n\r\n\t\t\t\taxis.css({ zIndex: o.zIndex });\r\n\r\n\t\t\t\t// TODO : What's going on here?\r\n\t\t\t\tif (\"se\" === handle) {\r\n\t\t\t\t\taxis.addClass(\"ui-icon ui-icon-gripsmall-diagonal-se\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.handles[handle] = \".ui-resizable-\" + handle;\r\n\t\t\t\tthis.element.append(axis);\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tthis._renderAxis = function(target) {\r\n\r\n\t\t\tvar i, axis, padPos, padWrapper;\r\n\r\n\t\t\ttarget = target || this.element;\r\n\r\n\t\t\tfor (i in this.handles) {\r\n\r\n\t\t\t\tif (this.handles[i].constructor === String) {\r\n\t\t\t\t\tthis.handles[i] = this.element.children( this.handles[ i ] ).first().show();\r\n\t\t\t\t} else if ( this.handles[ i ].jquery || this.handles[ i ].nodeType ) {\r\n\t\t\t\t\tthis.handles[ i ] = $( this.handles[ i ] );\r\n\t\t\t\t\tthis._on( this.handles[ i ], { \"mousedown\": that._mouseDown });\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (this.elementIsWrapper && this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)) {\r\n\r\n\t\t\t\t\taxis = $(this.handles[i], this.element);\r\n\r\n\t\t\t\t\tpadWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();\r\n\r\n\t\t\t\t\tpadPos = [ \"padding\",\r\n\t\t\t\t\t\t/ne|nw|n/.test(i) ? \"Top\" :\r\n\t\t\t\t\t\t/se|sw|s/.test(i) ? \"Bottom\" :\r\n\t\t\t\t\t\t/^e$/.test(i) ? \"Right\" : \"Left\" ].join(\"\");\r\n\r\n\t\t\t\t\ttarget.css(padPos, padWrapper);\r\n\r\n\t\t\t\t\tthis._proportionallyResize();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._handles = this._handles.add( this.handles[ i ] );\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// TODO: make renderAxis a prototype function\r\n\t\tthis._renderAxis(this.element);\r\n\r\n\t\tthis._handles = this._handles.add( this.element.find( \".ui-resizable-handle\" ) );\r\n\t\tthis._handles.disableSelection();\r\n\r\n\t\tthis._handles.mouseover(function() {\r\n\t\t\tif (!that.resizing) {\r\n\t\t\t\tif (this.className) {\r\n\t\t\t\t\taxis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);\r\n\t\t\t\t}\r\n\t\t\t\tthat.axis = axis && axis[1] ? axis[1] : \"se\";\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (o.autoHide) {\r\n\t\t\tthis._handles.hide();\r\n\t\t\t$(this.element)\r\n\t\t\t\t.addClass(\"ui-resizable-autohide\")\r\n\t\t\t\t.mouseenter(function() {\r\n\t\t\t\t\tif (o.disabled) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$(this).removeClass(\"ui-resizable-autohide\");\r\n\t\t\t\t\tthat._handles.show();\r\n\t\t\t\t})\r\n\t\t\t\t.mouseleave(function() {\r\n\t\t\t\t\tif (o.disabled) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!that.resizing) {\r\n\t\t\t\t\t\t$(this).addClass(\"ui-resizable-autohide\");\r\n\t\t\t\t\t\tthat._handles.hide();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._mouseInit();\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\r\n\t\tthis._mouseDestroy();\r\n\r\n\t\tvar wrapper,\r\n\t\t\t_destroy = function(exp) {\r\n\t\t\t\t$(exp)\r\n\t\t\t\t\t.removeClass(\"ui-resizable ui-resizable-disabled ui-resizable-resizing\")\r\n\t\t\t\t\t.removeData(\"resizable\")\r\n\t\t\t\t\t.removeData(\"ui-resizable\")\r\n\t\t\t\t\t.unbind(\".resizable\")\r\n\t\t\t\t\t.find(\".ui-resizable-handle\")\r\n\t\t\t\t\t\t.remove();\r\n\t\t\t};\r\n\r\n\t\t// TODO: Unwrap at same DOM position\r\n\t\tif (this.elementIsWrapper) {\r\n\t\t\t_destroy(this.element);\r\n\t\t\twrapper = this.element;\r\n\t\t\tthis.originalElement.css({\r\n\t\t\t\tposition: wrapper.css(\"position\"),\r\n\t\t\t\twidth: wrapper.outerWidth(),\r\n\t\t\t\theight: wrapper.outerHeight(),\r\n\t\t\t\ttop: wrapper.css(\"top\"),\r\n\t\t\t\tleft: wrapper.css(\"left\")\r\n\t\t\t}).insertAfter( wrapper );\r\n\t\t\twrapper.remove();\r\n\t\t}\r\n\r\n\t\tthis.originalElement.css(\"resize\", this.originalResizeStyle);\r\n\t\t_destroy(this.originalElement);\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_mouseCapture: function(event) {\r\n\t\tvar i, handle,\r\n\t\t\tcapture = false;\r\n\r\n\t\tfor (i in this.handles) {\r\n\t\t\thandle = $(this.handles[i])[0];\r\n\t\t\tif (handle === event.target || $.contains(handle, event.target)) {\r\n\t\t\t\tcapture = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn !this.options.disabled && capture;\r\n\t},\r\n\r\n\t_mouseStart: function(event) {\r\n\r\n\t\tvar curleft, curtop, cursor,\r\n\t\t\to = this.options,\r\n\t\t\tel = this.element;\r\n\r\n\t\tthis.resizing = true;\r\n\r\n\t\tthis._renderProxy();\r\n\r\n\t\tcurleft = this._num(this.helper.css(\"left\"));\r\n\t\tcurtop = this._num(this.helper.css(\"top\"));\r\n\r\n\t\tif (o.containment) {\r\n\t\t\tcurleft += $(o.containment).scrollLeft() || 0;\r\n\t\t\tcurtop += $(o.containment).scrollTop() || 0;\r\n\t\t}\r\n\r\n\t\tthis.offset = this.helper.offset();\r\n\t\tthis.position = { left: curleft, top: curtop };\r\n\r\n\t\tthis.size = this._helper ? {\r\n\t\t\t\twidth: this.helper.width(),\r\n\t\t\t\theight: this.helper.height()\r\n\t\t\t} : {\r\n\t\t\t\twidth: el.width(),\r\n\t\t\t\theight: el.height()\r\n\t\t\t};\r\n\r\n\t\tthis.originalSize = this._helper ? {\r\n\t\t\t\twidth: el.outerWidth(),\r\n\t\t\t\theight: el.outerHeight()\r\n\t\t\t} : {\r\n\t\t\t\twidth: el.width(),\r\n\t\t\t\theight: el.height()\r\n\t\t\t};\r\n\r\n\t\tthis.sizeDiff = {\r\n\t\t\twidth: el.outerWidth() - el.width(),\r\n\t\t\theight: el.outerHeight() - el.height()\r\n\t\t};\r\n\r\n\t\tthis.originalPosition = { left: curleft, top: curtop };\r\n\t\tthis.originalMousePosition = { left: event.pageX, top: event.pageY };\r\n\r\n\t\tthis.aspectRatio = (typeof o.aspectRatio === \"number\") ?\r\n\t\t\to.aspectRatio :\r\n\t\t\t((this.originalSize.width / this.originalSize.height) || 1);\r\n\r\n\t\tcursor = $(\".ui-resizable-\" + this.axis).css(\"cursor\");\r\n\t\t$(\"body\").css(\"cursor\", cursor === \"auto\" ? this.axis + \"-resize\" : cursor);\r\n\r\n\t\tel.addClass(\"ui-resizable-resizing\");\r\n\t\tthis._propagate(\"start\", event);\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_mouseDrag: function(event) {\r\n\r\n\t\tvar data, props,\r\n\t\t\tsmp = this.originalMousePosition,\r\n\t\t\ta = this.axis,\r\n\t\t\tdx = (event.pageX - smp.left) || 0,\r\n\t\t\tdy = (event.pageY - smp.top) || 0,\r\n\t\t\ttrigger = this._change[a];\r\n\r\n\t\tthis._updatePrevProperties();\r\n\r\n\t\tif (!trigger) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tdata = trigger.apply(this, [ event, dx, dy ]);\r\n\r\n\t\tthis._updateVirtualBoundaries(event.shiftKey);\r\n\t\tif (this._aspectRatio || event.shiftKey) {\r\n\t\t\tdata = this._updateRatio(data, event);\r\n\t\t}\r\n\r\n\t\tdata = this._respectSize(data, event);\r\n\r\n\t\tthis._updateCache(data);\r\n\r\n\t\tthis._propagate(\"resize\", event);\r\n\r\n\t\tprops = this._applyChanges();\r\n\r\n\t\tif ( !this._helper && this._proportionallyResizeElements.length ) {\r\n\t\t\tthis._proportionallyResize();\r\n\t\t}\r\n\r\n\t\tif ( !$.isEmptyObject( props ) ) {\r\n\t\t\tthis._updatePrevProperties();\r\n\t\t\tthis._trigger( \"resize\", event, this.ui() );\r\n\t\t\tthis._applyChanges();\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\t_mouseStop: function(event) {\r\n\r\n\t\tthis.resizing = false;\r\n\t\tvar pr, ista, soffseth, soffsetw, s, left, top,\r\n\t\t\to = this.options, that = this;\r\n\r\n\t\tif (this._helper) {\r\n\r\n\t\t\tpr = this._proportionallyResizeElements;\r\n\t\t\tista = pr.length && (/textarea/i).test(pr[0].nodeName);\r\n\t\t\tsoffseth = ista && this._hasScroll(pr[0], \"left\") ? 0 : that.sizeDiff.height;\r\n\t\t\tsoffsetw = ista ? 0 : that.sizeDiff.width;\r\n\r\n\t\t\ts = {\r\n\t\t\t\twidth: (that.helper.width() - soffsetw),\r\n\t\t\t\theight: (that.helper.height() - soffseth)\r\n\t\t\t};\r\n\t\t\tleft = (parseInt(that.element.css(\"left\"), 10) +\r\n\t\t\t\t(that.position.left - that.originalPosition.left)) || null;\r\n\t\t\ttop = (parseInt(that.element.css(\"top\"), 10) +\r\n\t\t\t\t(that.position.top - that.originalPosition.top)) || null;\r\n\r\n\t\t\tif (!o.animate) {\r\n\t\t\t\tthis.element.css($.extend(s, { top: top, left: left }));\r\n\t\t\t}\r\n\r\n\t\t\tthat.helper.height(that.size.height);\r\n\t\t\tthat.helper.width(that.size.width);\r\n\r\n\t\t\tif (this._helper && !o.animate) {\r\n\t\t\t\tthis._proportionallyResize();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t$(\"body\").css(\"cursor\", \"auto\");\r\n\r\n\t\tthis.element.removeClass(\"ui-resizable-resizing\");\r\n\r\n\t\tthis._propagate(\"stop\", event);\r\n\r\n\t\tif (this._helper) {\r\n\t\t\tthis.helper.remove();\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\t_updatePrevProperties: function() {\r\n\t\tthis.prevPosition = {\r\n\t\t\ttop: this.position.top,\r\n\t\t\tleft: this.position.left\r\n\t\t};\r\n\t\tthis.prevSize = {\r\n\t\t\twidth: this.size.width,\r\n\t\t\theight: this.size.height\r\n\t\t};\r\n\t},\r\n\r\n\t_applyChanges: function() {\r\n\t\tvar props = {};\r\n\r\n\t\tif ( this.position.top !== this.prevPosition.top ) {\r\n\t\t\tprops.top = this.position.top + \"px\";\r\n\t\t}\r\n\t\tif ( this.position.left !== this.prevPosition.left ) {\r\n\t\t\tprops.left = this.position.left + \"px\";\r\n\t\t}\r\n\t\tif ( this.size.width !== this.prevSize.width ) {\r\n\t\t\tprops.width = this.size.width + \"px\";\r\n\t\t}\r\n\t\tif ( this.size.height !== this.prevSize.height ) {\r\n\t\t\tprops.height = this.size.height + \"px\";\r\n\t\t}\r\n\r\n\t\tthis.helper.css( props );\r\n\r\n\t\treturn props;\r\n\t},\r\n\r\n\t_updateVirtualBoundaries: function(forceAspectRatio) {\r\n\t\tvar pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,\r\n\t\t\to = this.options;\r\n\r\n\t\tb = {\r\n\t\t\tminWidth: this._isNumber(o.minWidth) ? o.minWidth : 0,\r\n\t\t\tmaxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,\r\n\t\t\tminHeight: this._isNumber(o.minHeight) ? o.minHeight : 0,\r\n\t\t\tmaxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity\r\n\t\t};\r\n\r\n\t\tif (this._aspectRatio || forceAspectRatio) {\r\n\t\t\tpMinWidth = b.minHeight * this.aspectRatio;\r\n\t\t\tpMinHeight = b.minWidth / this.aspectRatio;\r\n\t\t\tpMaxWidth = b.maxHeight * this.aspectRatio;\r\n\t\t\tpMaxHeight = b.maxWidth / this.aspectRatio;\r\n\r\n\t\t\tif (pMinWidth > b.minWidth) {\r\n\t\t\t\tb.minWidth = pMinWidth;\r\n\t\t\t}\r\n\t\t\tif (pMinHeight > b.minHeight) {\r\n\t\t\t\tb.minHeight = pMinHeight;\r\n\t\t\t}\r\n\t\t\tif (pMaxWidth < b.maxWidth) {\r\n\t\t\t\tb.maxWidth = pMaxWidth;\r\n\t\t\t}\r\n\t\t\tif (pMaxHeight < b.maxHeight) {\r\n\t\t\t\tb.maxHeight = pMaxHeight;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis._vBoundaries = b;\r\n\t},\r\n\r\n\t_updateCache: function(data) {\r\n\t\tthis.offset = this.helper.offset();\r\n\t\tif (this._isNumber(data.left)) {\r\n\t\t\tthis.position.left = data.left;\r\n\t\t}\r\n\t\tif (this._isNumber(data.top)) {\r\n\t\t\tthis.position.top = data.top;\r\n\t\t}\r\n\t\tif (this._isNumber(data.height)) {\r\n\t\t\tthis.size.height = data.height;\r\n\t\t}\r\n\t\tif (this._isNumber(data.width)) {\r\n\t\t\tthis.size.width = data.width;\r\n\t\t}\r\n\t},\r\n\r\n\t_updateRatio: function( data ) {\r\n\r\n\t\tvar cpos = this.position,\r\n\t\t\tcsize = this.size,\r\n\t\t\ta = this.axis;\r\n\r\n\t\tif (this._isNumber(data.height)) {\r\n\t\t\tdata.width = (data.height * this.aspectRatio);\r\n\t\t} else if (this._isNumber(data.width)) {\r\n\t\t\tdata.height = (data.width / this.aspectRatio);\r\n\t\t}\r\n\r\n\t\tif (a === \"sw\") {\r\n\t\t\tdata.left = cpos.left + (csize.width - data.width);\r\n\t\t\tdata.top = null;\r\n\t\t}\r\n\t\tif (a === \"nw\") {\r\n\t\t\tdata.top = cpos.top + (csize.height - data.height);\r\n\t\t\tdata.left = cpos.left + (csize.width - data.width);\r\n\t\t}\r\n\r\n\t\treturn data;\r\n\t},\r\n\r\n\t_respectSize: function( data ) {\r\n\r\n\t\tvar o = this._vBoundaries,\r\n\t\t\ta = this.axis,\r\n\t\t\tismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width),\r\n\t\t\tismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),\r\n\t\t\tisminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width),\r\n\t\t\tisminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height),\r\n\t\t\tdw = this.originalPosition.left + this.originalSize.width,\r\n\t\t\tdh = this.position.top + this.size.height,\r\n\t\t\tcw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);\r\n\t\tif (isminw) {\r\n\t\t\tdata.width = o.minWidth;\r\n\t\t}\r\n\t\tif (isminh) {\r\n\t\t\tdata.height = o.minHeight;\r\n\t\t}\r\n\t\tif (ismaxw) {\r\n\t\t\tdata.width = o.maxWidth;\r\n\t\t}\r\n\t\tif (ismaxh) {\r\n\t\t\tdata.height = o.maxHeight;\r\n\t\t}\r\n\r\n\t\tif (isminw && cw) {\r\n\t\t\tdata.left = dw - o.minWidth;\r\n\t\t}\r\n\t\tif (ismaxw && cw) {\r\n\t\t\tdata.left = dw - o.maxWidth;\r\n\t\t}\r\n\t\tif (isminh && ch) {\r\n\t\t\tdata.top = dh - o.minHeight;\r\n\t\t}\r\n\t\tif (ismaxh && ch) {\r\n\t\t\tdata.top = dh - o.maxHeight;\r\n\t\t}\r\n\r\n\t\t// Fixing jump error on top/left - bug #2330\r\n\t\tif (!data.width && !data.height && !data.left && data.top) {\r\n\t\t\tdata.top = null;\r\n\t\t} else if (!data.width && !data.height && !data.top && data.left) {\r\n\t\t\tdata.left = null;\r\n\t\t}\r\n\r\n\t\treturn data;\r\n\t},\r\n\r\n\t_getPaddingPlusBorderDimensions: function( element ) {\r\n\t\tvar i = 0,\r\n\t\t\twidths = [],\r\n\t\t\tborders = [\r\n\t\t\t\telement.css( \"borderTopWidth\" ),\r\n\t\t\t\telement.css( \"borderRightWidth\" ),\r\n\t\t\t\telement.css( \"borderBottomWidth\" ),\r\n\t\t\t\telement.css( \"borderLeftWidth\" )\r\n\t\t\t],\r\n\t\t\tpaddings = [\r\n\t\t\t\telement.css( \"paddingTop\" ),\r\n\t\t\t\telement.css( \"paddingRight\" ),\r\n\t\t\t\telement.css( \"paddingBottom\" ),\r\n\t\t\t\telement.css( \"paddingLeft\" )\r\n\t\t\t];\r\n\r\n\t\tfor ( ; i < 4; i++ ) {\r\n\t\t\twidths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 );\r\n\t\t\twidths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 );\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\theight: widths[ 0 ] + widths[ 2 ],\r\n\t\t\twidth: widths[ 1 ] + widths[ 3 ]\r\n\t\t};\r\n\t},\r\n\r\n\t_proportionallyResize: function() {\r\n\r\n\t\tif (!this._proportionallyResizeElements.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar prel,\r\n\t\t\ti = 0,\r\n\t\t\telement = this.helper || this.element;\r\n\r\n\t\tfor ( ; i < this._proportionallyResizeElements.length; i++) {\r\n\r\n\t\t\tprel = this._proportionallyResizeElements[i];\r\n\r\n\t\t\t// TODO: Seems like a bug to cache this.outerDimensions\r\n\t\t\t// considering that we are in a loop.\r\n\t\t\tif (!this.outerDimensions) {\r\n\t\t\t\tthis.outerDimensions = this._getPaddingPlusBorderDimensions( prel );\r\n\t\t\t}\r\n\r\n\t\t\tprel.css({\r\n\t\t\t\theight: (element.height() - this.outerDimensions.height) || 0,\r\n\t\t\t\twidth: (element.width() - this.outerDimensions.width) || 0\r\n\t\t\t});\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_renderProxy: function() {\r\n\r\n\t\tvar el = this.element, o = this.options;\r\n\t\tthis.elementOffset = el.offset();\r\n\r\n\t\tif (this._helper) {\r\n\r\n\t\t\tthis.helper = this.helper || $(\"<div style='overflow:hidden;'></div>\");\r\n\r\n\t\t\tthis.helper.addClass(this._helper).css({\r\n\t\t\t\twidth: this.element.outerWidth() - 1,\r\n\t\t\t\theight: this.element.outerHeight() - 1,\r\n\t\t\t\tposition: \"absolute\",\r\n\t\t\t\tleft: this.elementOffset.left + \"px\",\r\n\t\t\t\ttop: this.elementOffset.top + \"px\",\r\n\t\t\t\tzIndex: ++o.zIndex //TODO: Don't modify option\r\n\t\t\t});\r\n\r\n\t\t\tthis.helper\r\n\t\t\t\t.appendTo(\"body\")\r\n\t\t\t\t.disableSelection();\r\n\r\n\t\t} else {\r\n\t\t\tthis.helper = this.element;\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_change: {\r\n\t\te: function(event, dx) {\r\n\t\t\treturn { width: this.originalSize.width + dx };\r\n\t\t},\r\n\t\tw: function(event, dx) {\r\n\t\t\tvar cs = this.originalSize, sp = this.originalPosition;\r\n\t\t\treturn { left: sp.left + dx, width: cs.width - dx };\r\n\t\t},\r\n\t\tn: function(event, dx, dy) {\r\n\t\t\tvar cs = this.originalSize, sp = this.originalPosition;\r\n\t\t\treturn { top: sp.top + dy, height: cs.height - dy };\r\n\t\t},\r\n\t\ts: function(event, dx, dy) {\r\n\t\t\treturn { height: this.originalSize.height + dy };\r\n\t\t},\r\n\t\tse: function(event, dx, dy) {\r\n\t\t\treturn $.extend(this._change.s.apply(this, arguments),\r\n\t\t\t\tthis._change.e.apply(this, [ event, dx, dy ]));\r\n\t\t},\r\n\t\tsw: function(event, dx, dy) {\r\n\t\t\treturn $.extend(this._change.s.apply(this, arguments),\r\n\t\t\t\tthis._change.w.apply(this, [ event, dx, dy ]));\r\n\t\t},\r\n\t\tne: function(event, dx, dy) {\r\n\t\t\treturn $.extend(this._change.n.apply(this, arguments),\r\n\t\t\t\tthis._change.e.apply(this, [ event, dx, dy ]));\r\n\t\t},\r\n\t\tnw: function(event, dx, dy) {\r\n\t\t\treturn $.extend(this._change.n.apply(this, arguments),\r\n\t\t\t\tthis._change.w.apply(this, [ event, dx, dy ]));\r\n\t\t}\r\n\t},\r\n\r\n\t_propagate: function(n, event) {\r\n\t\t$.ui.plugin.call(this, n, [ event, this.ui() ]);\r\n\t\t(n !== \"resize\" && this._trigger(n, event, this.ui()));\r\n\t},\r\n\r\n\tplugins: {},\r\n\r\n\tui: function() {\r\n\t\treturn {\r\n\t\t\toriginalElement: this.originalElement,\r\n\t\t\telement: this.element,\r\n\t\t\thelper: this.helper,\r\n\t\t\tposition: this.position,\r\n\t\t\tsize: this.size,\r\n\t\t\toriginalSize: this.originalSize,\r\n\t\t\toriginalPosition: this.originalPosition\r\n\t\t};\r\n\t}\r\n\r\n});\r\n\r\n/*\r\n * Resizable Extensions\r\n */\r\n\r\n$.ui.plugin.add(\"resizable\", \"animate\", {\r\n\r\n\tstop: function( event ) {\r\n\t\tvar that = $(this).resizable( \"instance\" ),\r\n\t\t\to = that.options,\r\n\t\t\tpr = that._proportionallyResizeElements,\r\n\t\t\tista = pr.length && (/textarea/i).test(pr[0].nodeName),\r\n\t\t\tsoffseth = ista && that._hasScroll(pr[0], \"left\") ? 0 : that.sizeDiff.height,\r\n\t\t\tsoffsetw = ista ? 0 : that.sizeDiff.width,\r\n\t\t\tstyle = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },\r\n\t\t\tleft = (parseInt(that.element.css(\"left\"), 10) +\r\n\t\t\t\t(that.position.left - that.originalPosition.left)) || null,\r\n\t\t\ttop = (parseInt(that.element.css(\"top\"), 10) +\r\n\t\t\t\t(that.position.top - that.originalPosition.top)) || null;\r\n\r\n\t\tthat.element.animate(\r\n\t\t\t$.extend(style, top && left ? { top: top, left: left } : {}), {\r\n\t\t\t\tduration: o.animateDuration,\r\n\t\t\t\teasing: o.animateEasing,\r\n\t\t\t\tstep: function() {\r\n\r\n\t\t\t\t\tvar data = {\r\n\t\t\t\t\t\twidth: parseInt(that.element.css(\"width\"), 10),\r\n\t\t\t\t\t\theight: parseInt(that.element.css(\"height\"), 10),\r\n\t\t\t\t\t\ttop: parseInt(that.element.css(\"top\"), 10),\r\n\t\t\t\t\t\tleft: parseInt(that.element.css(\"left\"), 10)\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tif (pr && pr.length) {\r\n\t\t\t\t\t\t$(pr[0]).css({ width: data.width, height: data.height });\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// propagating resize, and updating values for each animation step\r\n\t\t\t\t\tthat._updateCache(data);\r\n\t\t\t\t\tthat._propagate(\"resize\", event);\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t);\r\n\t}\r\n\r\n});\r\n\r\n$.ui.plugin.add( \"resizable\", \"containment\", {\r\n\r\n\tstart: function() {\r\n\t\tvar element, p, co, ch, cw, width, height,\r\n\t\t\tthat = $( this ).resizable( \"instance\" ),\r\n\t\t\to = that.options,\r\n\t\t\tel = that.element,\r\n\t\t\toc = o.containment,\r\n\t\t\tce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;\r\n\r\n\t\tif ( !ce ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthat.containerElement = $( ce );\r\n\r\n\t\tif ( /document/.test( oc ) || oc === document ) {\r\n\t\t\tthat.containerOffset = {\r\n\t\t\t\tleft: 0,\r\n\t\t\t\ttop: 0\r\n\t\t\t};\r\n\t\t\tthat.containerPosition = {\r\n\t\t\t\tleft: 0,\r\n\t\t\t\ttop: 0\r\n\t\t\t};\r\n\r\n\t\t\tthat.parentData = {\r\n\t\t\t\telement: $( document ),\r\n\t\t\t\tleft: 0,\r\n\t\t\t\ttop: 0,\r\n\t\t\t\twidth: $( document ).width(),\r\n\t\t\t\theight: $( document ).height() || document.body.parentNode.scrollHeight\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\telement = $( ce );\r\n\t\t\tp = [];\r\n\t\t\t$([ \"Top\", \"Right\", \"Left\", \"Bottom\" ]).each(function( i, name ) {\r\n\t\t\t\tp[ i ] = that._num( element.css( \"padding\" + name ) );\r\n\t\t\t});\r\n\r\n\t\t\tthat.containerOffset = element.offset();\r\n\t\t\tthat.containerPosition = element.position();\r\n\t\t\tthat.containerSize = {\r\n\t\t\t\theight: ( element.innerHeight() - p[ 3 ] ),\r\n\t\t\t\twidth: ( element.innerWidth() - p[ 1 ] )\r\n\t\t\t};\r\n\r\n\t\t\tco = that.containerOffset;\r\n\t\t\tch = that.containerSize.height;\r\n\t\t\tcw = that.containerSize.width;\r\n\t\t\twidth = ( that._hasScroll ( ce, \"left\" ) ? ce.scrollWidth : cw );\r\n\t\t\theight = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;\r\n\r\n\t\t\tthat.parentData = {\r\n\t\t\t\telement: ce,\r\n\t\t\t\tleft: co.left,\r\n\t\t\t\ttop: co.top,\r\n\t\t\t\twidth: width,\r\n\t\t\t\theight: height\r\n\t\t\t};\r\n\t\t}\r\n\t},\r\n\r\n\tresize: function( event ) {\r\n\t\tvar woset, hoset, isParent, isOffsetRelative,\r\n\t\t\tthat = $( this ).resizable( \"instance\" ),\r\n\t\t\to = that.options,\r\n\t\t\tco = that.containerOffset,\r\n\t\t\tcp = that.position,\r\n\t\t\tpRatio = that._aspectRatio || event.shiftKey,\r\n\t\t\tcop = {\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tleft: 0\r\n\t\t\t},\r\n\t\t\tce = that.containerElement,\r\n\t\t\tcontinueResize = true;\r\n\r\n\t\tif ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( \"position\" ) ) ) {\r\n\t\t\tcop = co;\r\n\t\t}\r\n\r\n\t\tif ( cp.left < ( that._helper ? co.left : 0 ) ) {\r\n\t\t\tthat.size.width = that.size.width +\r\n\t\t\t\t( that._helper ?\r\n\t\t\t\t\t( that.position.left - co.left ) :\r\n\t\t\t\t\t( that.position.left - cop.left ) );\r\n\r\n\t\t\tif ( pRatio ) {\r\n\t\t\t\tthat.size.height = that.size.width / that.aspectRatio;\r\n\t\t\t\tcontinueResize = false;\r\n\t\t\t}\r\n\t\t\tthat.position.left = o.helper ? co.left : 0;\r\n\t\t}\r\n\r\n\t\tif ( cp.top < ( that._helper ? co.top : 0 ) ) {\r\n\t\t\tthat.size.height = that.size.height +\r\n\t\t\t\t( that._helper ?\r\n\t\t\t\t\t( that.position.top - co.top ) :\r\n\t\t\t\t\tthat.position.top );\r\n\r\n\t\t\tif ( pRatio ) {\r\n\t\t\t\tthat.size.width = that.size.height * that.aspectRatio;\r\n\t\t\t\tcontinueResize = false;\r\n\t\t\t}\r\n\t\t\tthat.position.top = that._helper ? co.top : 0;\r\n\t\t}\r\n\r\n\t\tisParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );\r\n\t\tisOffsetRelative = /relative|absolute/.test( that.containerElement.css( \"position\" ) );\r\n\r\n\t\tif ( isParent && isOffsetRelative ) {\r\n\t\t\tthat.offset.left = that.parentData.left + that.position.left;\r\n\t\t\tthat.offset.top = that.parentData.top + that.position.top;\r\n\t\t} else {\r\n\t\t\tthat.offset.left = that.element.offset().left;\r\n\t\t\tthat.offset.top = that.element.offset().top;\r\n\t\t}\r\n\r\n\t\twoset = Math.abs( that.sizeDiff.width +\r\n\t\t\t(that._helper ?\r\n\t\t\t\tthat.offset.left - cop.left :\r\n\t\t\t\t(that.offset.left - co.left)) );\r\n\r\n\t\thoset = Math.abs( that.sizeDiff.height +\r\n\t\t\t(that._helper ?\r\n\t\t\t\tthat.offset.top - cop.top :\r\n\t\t\t\t(that.offset.top - co.top)) );\r\n\r\n\t\tif ( woset + that.size.width >= that.parentData.width ) {\r\n\t\t\tthat.size.width = that.parentData.width - woset;\r\n\t\t\tif ( pRatio ) {\r\n\t\t\t\tthat.size.height = that.size.width / that.aspectRatio;\r\n\t\t\t\tcontinueResize = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( hoset + that.size.height >= that.parentData.height ) {\r\n\t\t\tthat.size.height = that.parentData.height - hoset;\r\n\t\t\tif ( pRatio ) {\r\n\t\t\t\tthat.size.width = that.size.height * that.aspectRatio;\r\n\t\t\t\tcontinueResize = false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( !continueResize ) {\r\n\t\t\tthat.position.left = that.prevPosition.left;\r\n\t\t\tthat.position.top = that.prevPosition.top;\r\n\t\t\tthat.size.width = that.prevSize.width;\r\n\t\t\tthat.size.height = that.prevSize.height;\r\n\t\t}\r\n\t},\r\n\r\n\tstop: function() {\r\n\t\tvar that = $( this ).resizable( \"instance\" ),\r\n\t\t\to = that.options,\r\n\t\t\tco = that.containerOffset,\r\n\t\t\tcop = that.containerPosition,\r\n\t\t\tce = that.containerElement,\r\n\t\t\thelper = $( that.helper ),\r\n\t\t\tho = helper.offset(),\r\n\t\t\tw = helper.outerWidth() - that.sizeDiff.width,\r\n\t\t\th = helper.outerHeight() - that.sizeDiff.height;\r\n\r\n\t\tif ( that._helper && !o.animate && ( /relative/ ).test( ce.css( \"position\" ) ) ) {\r\n\t\t\t$( this ).css({\r\n\t\t\t\tleft: ho.left - cop.left - co.left,\r\n\t\t\t\twidth: w,\r\n\t\t\t\theight: h\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( that._helper && !o.animate && ( /static/ ).test( ce.css( \"position\" ) ) ) {\r\n\t\t\t$( this ).css({\r\n\t\t\t\tleft: ho.left - cop.left - co.left,\r\n\t\t\t\twidth: w,\r\n\t\t\t\theight: h\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n});\r\n\r\n$.ui.plugin.add(\"resizable\", \"alsoResize\", {\r\n\r\n\tstart: function() {\r\n\t\tvar that = $(this).resizable( \"instance\" ),\r\n\t\t\to = that.options;\r\n\r\n\t\t$(o.alsoResize).each(function() {\r\n\t\t\tvar el = $(this);\r\n\t\t\tel.data(\"ui-resizable-alsoresize\", {\r\n\t\t\t\twidth: parseInt(el.width(), 10), height: parseInt(el.height(), 10),\r\n\t\t\t\tleft: parseInt(el.css(\"left\"), 10), top: parseInt(el.css(\"top\"), 10)\r\n\t\t\t});\r\n\t\t});\r\n\t},\r\n\r\n\tresize: function(event, ui) {\r\n\t\tvar that = $(this).resizable( \"instance\" ),\r\n\t\t\to = that.options,\r\n\t\t\tos = that.originalSize,\r\n\t\t\top = that.originalPosition,\r\n\t\t\tdelta = {\r\n\t\t\t\theight: (that.size.height - os.height) || 0,\r\n\t\t\t\twidth: (that.size.width - os.width) || 0,\r\n\t\t\t\ttop: (that.position.top - op.top) || 0,\r\n\t\t\t\tleft: (that.position.left - op.left) || 0\r\n\t\t\t};\r\n\r\n\t\t\t$(o.alsoResize).each(function() {\r\n\t\t\t\tvar el = $(this), start = $(this).data(\"ui-resizable-alsoresize\"), style = {},\r\n\t\t\t\t\tcss = el.parents(ui.originalElement[0]).length ?\r\n\t\t\t\t\t\t\t[ \"width\", \"height\" ] :\r\n\t\t\t\t\t\t\t[ \"width\", \"height\", \"top\", \"left\" ];\r\n\r\n\t\t\t\t$.each(css, function(i, prop) {\r\n\t\t\t\t\tvar sum = (start[prop] || 0) + (delta[prop] || 0);\r\n\t\t\t\t\tif (sum && sum >= 0) {\r\n\t\t\t\t\t\tstyle[prop] = sum || null;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\tel.css(style);\r\n\t\t\t});\r\n\t},\r\n\r\n\tstop: function() {\r\n\t\t$(this).removeData(\"resizable-alsoresize\");\r\n\t}\r\n});\r\n\r\n$.ui.plugin.add(\"resizable\", \"ghost\", {\r\n\r\n\tstart: function() {\r\n\r\n\t\tvar that = $(this).resizable( \"instance\" ), o = that.options, cs = that.size;\r\n\r\n\t\tthat.ghost = that.originalElement.clone();\r\n\t\tthat.ghost\r\n\t\t\t.css({\r\n\t\t\t\topacity: 0.25,\r\n\t\t\t\tdisplay: \"block\",\r\n\t\t\t\tposition: \"relative\",\r\n\t\t\t\theight: cs.height,\r\n\t\t\t\twidth: cs.width,\r\n\t\t\t\tmargin: 0,\r\n\t\t\t\tleft: 0,\r\n\t\t\t\ttop: 0\r\n\t\t\t})\r\n\t\t\t.addClass(\"ui-resizable-ghost\")\r\n\t\t\t.addClass(typeof o.ghost === \"string\" ? o.ghost : \"\");\r\n\r\n\t\tthat.ghost.appendTo(that.helper);\r\n\r\n\t},\r\n\r\n\tresize: function() {\r\n\t\tvar that = $(this).resizable( \"instance\" );\r\n\t\tif (that.ghost) {\r\n\t\t\tthat.ghost.css({\r\n\t\t\t\tposition: \"relative\",\r\n\t\t\t\theight: that.size.height,\r\n\t\t\t\twidth: that.size.width\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\tstop: function() {\r\n\t\tvar that = $(this).resizable( \"instance\" );\r\n\t\tif (that.ghost && that.helper) {\r\n\t\t\tthat.helper.get(0).removeChild(that.ghost.get(0));\r\n\t\t}\r\n\t}\r\n\r\n});\r\n\r\n$.ui.plugin.add(\"resizable\", \"grid\", {\r\n\r\n\tresize: function() {\r\n\t\tvar outerDimensions,\r\n\t\t\tthat = $(this).resizable( \"instance\" ),\r\n\t\t\to = that.options,\r\n\t\t\tcs = that.size,\r\n\t\t\tos = that.originalSize,\r\n\t\t\top = that.originalPosition,\r\n\t\t\ta = that.axis,\r\n\t\t\tgrid = typeof o.grid === \"number\" ? [ o.grid, o.grid ] : o.grid,\r\n\t\t\tgridX = (grid[0] || 1),\r\n\t\t\tgridY = (grid[1] || 1),\r\n\t\t\tox = Math.round((cs.width - os.width) / gridX) * gridX,\r\n\t\t\toy = Math.round((cs.height - os.height) / gridY) * gridY,\r\n\t\t\tnewWidth = os.width + ox,\r\n\t\t\tnewHeight = os.height + oy,\r\n\t\t\tisMaxWidth = o.maxWidth && (o.maxWidth < newWidth),\r\n\t\t\tisMaxHeight = o.maxHeight && (o.maxHeight < newHeight),\r\n\t\t\tisMinWidth = o.minWidth && (o.minWidth > newWidth),\r\n\t\t\tisMinHeight = o.minHeight && (o.minHeight > newHeight);\r\n\r\n\t\to.grid = grid;\r\n\r\n\t\tif (isMinWidth) {\r\n\t\t\tnewWidth += gridX;\r\n\t\t}\r\n\t\tif (isMinHeight) {\r\n\t\t\tnewHeight += gridY;\r\n\t\t}\r\n\t\tif (isMaxWidth) {\r\n\t\t\tnewWidth -= gridX;\r\n\t\t}\r\n\t\tif (isMaxHeight) {\r\n\t\t\tnewHeight -= gridY;\r\n\t\t}\r\n\r\n\t\tif (/^(se|s|e)$/.test(a)) {\r\n\t\t\tthat.size.width = newWidth;\r\n\t\t\tthat.size.height = newHeight;\r\n\t\t} else if (/^(ne)$/.test(a)) {\r\n\t\t\tthat.size.width = newWidth;\r\n\t\t\tthat.size.height = newHeight;\r\n\t\t\tthat.position.top = op.top - oy;\r\n\t\t} else if (/^(sw)$/.test(a)) {\r\n\t\t\tthat.size.width = newWidth;\r\n\t\t\tthat.size.height = newHeight;\r\n\t\t\tthat.position.left = op.left - ox;\r\n\t\t} else {\r\n\t\t\tif ( newHeight - gridY <= 0 || newWidth - gridX <= 0) {\r\n\t\t\t\touterDimensions = that._getPaddingPlusBorderDimensions( this );\r\n\t\t\t}\r\n\r\n\t\t\tif ( newHeight - gridY > 0 ) {\r\n\t\t\t\tthat.size.height = newHeight;\r\n\t\t\t\tthat.position.top = op.top - oy;\r\n\t\t\t} else {\r\n\t\t\t\tnewHeight = gridY - outerDimensions.height;\r\n\t\t\t\tthat.size.height = newHeight;\r\n\t\t\t\tthat.position.top = op.top + os.height - newHeight;\r\n\t\t\t}\r\n\t\t\tif ( newWidth - gridX > 0 ) {\r\n\t\t\t\tthat.size.width = newWidth;\r\n\t\t\t\tthat.position.left = op.left - ox;\r\n\t\t\t} else {\r\n\t\t\t\tnewWidth = gridX - outerDimensions.width;\r\n\t\t\t\tthat.size.width = newWidth;\r\n\t\t\t\tthat.position.left = op.left + os.width - newWidth;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n});\r\n\r\nvar resizable = $.ui.resizable;\r\n\r\n\r\n/*!\r\n * jQuery UI Selectable 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/selectable/\r\n */\r\n\r\n\r\nvar selectable = $.widget(\"ui.selectable\", $.ui.mouse, {\r\n\tversion: \"1.11.4\",\r\n\toptions: {\r\n\t\tappendTo: \"body\",\r\n\t\tautoRefresh: true,\r\n\t\tdistance: 0,\r\n\t\tfilter: \"*\",\r\n\t\ttolerance: \"touch\",\r\n\r\n\t\t// callbacks\r\n\t\tselected: null,\r\n\t\tselecting: null,\r\n\t\tstart: null,\r\n\t\tstop: null,\r\n\t\tunselected: null,\r\n\t\tunselecting: null\r\n\t},\r\n\t_create: function() {\r\n\t\tvar selectees,\r\n\t\t\tthat = this;\r\n\r\n\t\tthis.element.addClass(\"ui-selectable\");\r\n\r\n\t\tthis.dragged = false;\r\n\r\n\t\t// cache selectee children based on filter\r\n\t\tthis.refresh = function() {\r\n\t\t\tselectees = $(that.options.filter, that.element[0]);\r\n\t\t\tselectees.addClass(\"ui-selectee\");\r\n\t\t\tselectees.each(function() {\r\n\t\t\t\tvar $this = $(this),\r\n\t\t\t\t\tpos = $this.offset();\r\n\t\t\t\t$.data(this, \"selectable-item\", {\r\n\t\t\t\t\telement: this,\r\n\t\t\t\t\t$element: $this,\r\n\t\t\t\t\tleft: pos.left,\r\n\t\t\t\t\ttop: pos.top,\r\n\t\t\t\t\tright: pos.left + $this.outerWidth(),\r\n\t\t\t\t\tbottom: pos.top + $this.outerHeight(),\r\n\t\t\t\t\tstartselected: false,\r\n\t\t\t\t\tselected: $this.hasClass(\"ui-selected\"),\r\n\t\t\t\t\tselecting: $this.hasClass(\"ui-selecting\"),\r\n\t\t\t\t\tunselecting: $this.hasClass(\"ui-unselecting\")\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t};\r\n\t\tthis.refresh();\r\n\r\n\t\tthis.selectees = selectees.addClass(\"ui-selectee\");\r\n\r\n\t\tthis._mouseInit();\r\n\r\n\t\tthis.helper = $(\"<div class='ui-selectable-helper'></div>\");\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tthis.selectees\r\n\t\t\t.removeClass(\"ui-selectee\")\r\n\t\t\t.removeData(\"selectable-item\");\r\n\t\tthis.element\r\n\t\t\t.removeClass(\"ui-selectable ui-selectable-disabled\");\r\n\t\tthis._mouseDestroy();\r\n\t},\r\n\r\n\t_mouseStart: function(event) {\r\n\t\tvar that = this,\r\n\t\t\toptions = this.options;\r\n\r\n\t\tthis.opos = [ event.pageX, event.pageY ];\r\n\r\n\t\tif (this.options.disabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.selectees = $(options.filter, this.element[0]);\r\n\r\n\t\tthis._trigger(\"start\", event);\r\n\r\n\t\t$(options.appendTo).append(this.helper);\r\n\t\t// position helper (lasso)\r\n\t\tthis.helper.css({\r\n\t\t\t\"left\": event.pageX,\r\n\t\t\t\"top\": event.pageY,\r\n\t\t\t\"width\": 0,\r\n\t\t\t\"height\": 0\r\n\t\t});\r\n\r\n\t\tif (options.autoRefresh) {\r\n\t\t\tthis.refresh();\r\n\t\t}\r\n\r\n\t\tthis.selectees.filter(\".ui-selected\").each(function() {\r\n\t\t\tvar selectee = $.data(this, \"selectable-item\");\r\n\t\t\tselectee.startselected = true;\r\n\t\t\tif (!event.metaKey && !event.ctrlKey) {\r\n\t\t\t\tselectee.$element.removeClass(\"ui-selected\");\r\n\t\t\t\tselectee.selected = false;\r\n\t\t\t\tselectee.$element.addClass(\"ui-unselecting\");\r\n\t\t\t\tselectee.unselecting = true;\r\n\t\t\t\t// selectable UNSELECTING callback\r\n\t\t\t\tthat._trigger(\"unselecting\", event, {\r\n\t\t\t\t\tunselecting: selectee.element\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t$(event.target).parents().addBack().each(function() {\r\n\t\t\tvar doSelect,\r\n\t\t\t\tselectee = $.data(this, \"selectable-item\");\r\n\t\t\tif (selectee) {\r\n\t\t\t\tdoSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass(\"ui-selected\");\r\n\t\t\t\tselectee.$element\r\n\t\t\t\t\t.removeClass(doSelect ? \"ui-unselecting\" : \"ui-selected\")\r\n\t\t\t\t\t.addClass(doSelect ? \"ui-selecting\" : \"ui-unselecting\");\r\n\t\t\t\tselectee.unselecting = !doSelect;\r\n\t\t\t\tselectee.selecting = doSelect;\r\n\t\t\t\tselectee.selected = doSelect;\r\n\t\t\t\t// selectable (UN)SELECTING callback\r\n\t\t\t\tif (doSelect) {\r\n\t\t\t\t\tthat._trigger(\"selecting\", event, {\r\n\t\t\t\t\t\tselecting: selectee.element\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthat._trigger(\"unselecting\", event, {\r\n\t\t\t\t\t\tunselecting: selectee.element\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t},\r\n\r\n\t_mouseDrag: function(event) {\r\n\r\n\t\tthis.dragged = true;\r\n\r\n\t\tif (this.options.disabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar tmp,\r\n\t\t\tthat = this,\r\n\t\t\toptions = this.options,\r\n\t\t\tx1 = this.opos[0],\r\n\t\t\ty1 = this.opos[1],\r\n\t\t\tx2 = event.pageX,\r\n\t\t\ty2 = event.pageY;\r\n\r\n\t\tif (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; }\r\n\t\tif (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; }\r\n\t\tthis.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 });\r\n\r\n\t\tthis.selectees.each(function() {\r\n\t\t\tvar selectee = $.data(this, \"selectable-item\"),\r\n\t\t\t\thit = false;\r\n\r\n\t\t\t//prevent helper from being selected if appendTo: selectable\r\n\t\t\tif (!selectee || selectee.element === that.element[0]) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (options.tolerance === \"touch\") {\r\n\t\t\t\thit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) );\r\n\t\t\t} else if (options.tolerance === \"fit\") {\r\n\t\t\t\thit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2);\r\n\t\t\t}\r\n\r\n\t\t\tif (hit) {\r\n\t\t\t\t// SELECT\r\n\t\t\t\tif (selectee.selected) {\r\n\t\t\t\t\tselectee.$element.removeClass(\"ui-selected\");\r\n\t\t\t\t\tselectee.selected = false;\r\n\t\t\t\t}\r\n\t\t\t\tif (selectee.unselecting) {\r\n\t\t\t\t\tselectee.$element.removeClass(\"ui-unselecting\");\r\n\t\t\t\t\tselectee.unselecting = false;\r\n\t\t\t\t}\r\n\t\t\t\tif (!selectee.selecting) {\r\n\t\t\t\t\tselectee.$element.addClass(\"ui-selecting\");\r\n\t\t\t\t\tselectee.selecting = true;\r\n\t\t\t\t\t// selectable SELECTING callback\r\n\t\t\t\t\tthat._trigger(\"selecting\", event, {\r\n\t\t\t\t\t\tselecting: selectee.element\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// UNSELECT\r\n\t\t\t\tif (selectee.selecting) {\r\n\t\t\t\t\tif ((event.metaKey || event.ctrlKey) && selectee.startselected) {\r\n\t\t\t\t\t\tselectee.$element.removeClass(\"ui-selecting\");\r\n\t\t\t\t\t\tselectee.selecting = false;\r\n\t\t\t\t\t\tselectee.$element.addClass(\"ui-selected\");\r\n\t\t\t\t\t\tselectee.selected = true;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tselectee.$element.removeClass(\"ui-selecting\");\r\n\t\t\t\t\t\tselectee.selecting = false;\r\n\t\t\t\t\t\tif (selectee.startselected) {\r\n\t\t\t\t\t\t\tselectee.$element.addClass(\"ui-unselecting\");\r\n\t\t\t\t\t\t\tselectee.unselecting = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// selectable UNSELECTING callback\r\n\t\t\t\t\t\tthat._trigger(\"unselecting\", event, {\r\n\t\t\t\t\t\t\tunselecting: selectee.element\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (selectee.selected) {\r\n\t\t\t\t\tif (!event.metaKey && !event.ctrlKey && !selectee.startselected) {\r\n\t\t\t\t\t\tselectee.$element.removeClass(\"ui-selected\");\r\n\t\t\t\t\t\tselectee.selected = false;\r\n\r\n\t\t\t\t\t\tselectee.$element.addClass(\"ui-unselecting\");\r\n\t\t\t\t\t\tselectee.unselecting = true;\r\n\t\t\t\t\t\t// selectable UNSELECTING callback\r\n\t\t\t\t\t\tthat._trigger(\"unselecting\", event, {\r\n\t\t\t\t\t\t\tunselecting: selectee.element\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\t_mouseStop: function(event) {\r\n\t\tvar that = this;\r\n\r\n\t\tthis.dragged = false;\r\n\r\n\t\t$(\".ui-unselecting\", this.element[0]).each(function() {\r\n\t\t\tvar selectee = $.data(this, \"selectable-item\");\r\n\t\t\tselectee.$element.removeClass(\"ui-unselecting\");\r\n\t\t\tselectee.unselecting = false;\r\n\t\t\tselectee.startselected = false;\r\n\t\t\tthat._trigger(\"unselected\", event, {\r\n\t\t\t\tunselected: selectee.element\r\n\t\t\t});\r\n\t\t});\r\n\t\t$(\".ui-selecting\", this.element[0]).each(function() {\r\n\t\t\tvar selectee = $.data(this, \"selectable-item\");\r\n\t\t\tselectee.$element.removeClass(\"ui-selecting\").addClass(\"ui-selected\");\r\n\t\t\tselectee.selecting = false;\r\n\t\t\tselectee.selected = true;\r\n\t\t\tselectee.startselected = true;\r\n\t\t\tthat._trigger(\"selected\", event, {\r\n\t\t\t\tselected: selectee.element\r\n\t\t\t});\r\n\t\t});\r\n\t\tthis._trigger(\"stop\", event);\r\n\r\n\t\tthis.helper.remove();\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n});\r\n\r\n\r\n/*!\r\n * jQuery UI Sortable 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/sortable/\r\n */\r\n\r\n\r\nvar sortable = $.widget(\"ui.sortable\", $.ui.mouse, {\r\n\tversion: \"1.11.4\",\r\n\twidgetEventPrefix: \"sort\",\r\n\tready: false,\r\n\toptions: {\r\n\t\tappendTo: \"parent\",\r\n\t\taxis: false,\r\n\t\tconnectWith: false,\r\n\t\tcontainment: false,\r\n\t\tcursor: \"auto\",\r\n\t\tcursorAt: false,\r\n\t\tdropOnEmpty: true,\r\n\t\tforcePlaceholderSize: false,\r\n\t\tforceHelperSize: false,\r\n\t\tgrid: false,\r\n\t\thandle: false,\r\n\t\thelper: \"original\",\r\n\t\titems: \"> *\",\r\n\t\topacity: false,\r\n\t\tplaceholder: false,\r\n\t\trevert: false,\r\n\t\tscroll: true,\r\n\t\tscrollSensitivity: 20,\r\n\t\tscrollSpeed: 20,\r\n\t\tscope: \"default\",\r\n\t\ttolerance: \"intersect\",\r\n\t\tzIndex: 1000,\r\n\r\n\t\t// callbacks\r\n\t\tactivate: null,\r\n\t\tbeforeStop: null,\r\n\t\tchange: null,\r\n\t\tdeactivate: null,\r\n\t\tout: null,\r\n\t\tover: null,\r\n\t\treceive: null,\r\n\t\tremove: null,\r\n\t\tsort: null,\r\n\t\tstart: null,\r\n\t\tstop: null,\r\n\t\tupdate: null\r\n\t},\r\n\r\n\t_isOverAxis: function( x, reference, size ) {\r\n\t\treturn ( x >= reference ) && ( x < ( reference + size ) );\r\n\t},\r\n\r\n\t_isFloating: function( item ) {\r\n\t\treturn (/left|right/).test(item.css(\"float\")) || (/inline|table-cell/).test(item.css(\"display\"));\r\n\t},\r\n\r\n\t_create: function() {\r\n\t\tthis.containerCache = {};\r\n\t\tthis.element.addClass(\"ui-sortable\");\r\n\r\n\t\t//Get the items\r\n\t\tthis.refresh();\r\n\r\n\t\t//Let's determine the parent's offset\r\n\t\tthis.offset = this.element.offset();\r\n\r\n\t\t//Initialize mouse events for interaction\r\n\t\tthis._mouseInit();\r\n\r\n\t\tthis._setHandleClassName();\r\n\r\n\t\t//We're ready to go\r\n\t\tthis.ready = true;\r\n\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tthis._super( key, value );\r\n\r\n\t\tif ( key === \"handle\" ) {\r\n\t\t\tthis._setHandleClassName();\r\n\t\t}\r\n\t},\r\n\r\n\t_setHandleClassName: function() {\r\n\t\tthis.element.find( \".ui-sortable-handle\" ).removeClass( \"ui-sortable-handle\" );\r\n\t\t$.each( this.items, function() {\r\n\t\t\t( this.instance.options.handle ?\r\n\t\t\t\tthis.item.find( this.instance.options.handle ) : this.item )\r\n\t\t\t\t.addClass( \"ui-sortable-handle\" );\r\n\t\t});\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tthis.element\r\n\t\t\t.removeClass( \"ui-sortable ui-sortable-disabled\" )\r\n\t\t\t.find( \".ui-sortable-handle\" )\r\n\t\t\t\t.removeClass( \"ui-sortable-handle\" );\r\n\t\tthis._mouseDestroy();\r\n\r\n\t\tfor ( var i = this.items.length - 1; i >= 0; i-- ) {\r\n\t\t\tthis.items[i].item.removeData(this.widgetName + \"-item\");\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_mouseCapture: function(event, overrideHandle) {\r\n\t\tvar currentItem = null,\r\n\t\t\tvalidHandle = false,\r\n\t\t\tthat = this;\r\n\r\n\t\tif (this.reverting) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif(this.options.disabled || this.options.type === \"static\") {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t//We have to refresh the items data once first\r\n\t\tthis._refreshItems(event);\r\n\r\n\t\t//Find out if the clicked node (or one of its parents) is a actual item in this.items\r\n\t\t$(event.target).parents().each(function() {\r\n\t\t\tif($.data(this, that.widgetName + \"-item\") === that) {\r\n\t\t\t\tcurrentItem = $(this);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t});\r\n\t\tif($.data(event.target, that.widgetName + \"-item\") === that) {\r\n\t\t\tcurrentItem = $(event.target);\r\n\t\t}\r\n\r\n\t\tif(!currentItem) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif(this.options.handle && !overrideHandle) {\r\n\t\t\t$(this.options.handle, currentItem).find(\"*\").addBack().each(function() {\r\n\t\t\t\tif(this === event.target) {\r\n\t\t\t\t\tvalidHandle = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tif(!validHandle) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.currentItem = currentItem;\r\n\t\tthis._removeCurrentsFromItems();\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\t_mouseStart: function(event, overrideHandle, noActivation) {\r\n\r\n\t\tvar i, body,\r\n\t\t\to = this.options;\r\n\r\n\t\tthis.currentContainer = this;\r\n\r\n\t\t//We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture\r\n\t\tthis.refreshPositions();\r\n\r\n\t\t//Create and append the visible helper\r\n\t\tthis.helper = this._createHelper(event);\r\n\r\n\t\t//Cache the helper size\r\n\t\tthis._cacheHelperProportions();\r\n\r\n\t\t/*\r\n\t\t * - Position generation -\r\n\t\t * This block generates everything position related - it's the core of draggables.\r\n\t\t */\r\n\r\n\t\t//Cache the margins of the original element\r\n\t\tthis._cacheMargins();\r\n\r\n\t\t//Get the next scrolling parent\r\n\t\tthis.scrollParent = this.helper.scrollParent();\r\n\r\n\t\t//The element's absolute position on the page minus margins\r\n\t\tthis.offset = this.currentItem.offset();\r\n\t\tthis.offset = {\r\n\t\t\ttop: this.offset.top - this.margins.top,\r\n\t\t\tleft: this.offset.left - this.margins.left\r\n\t\t};\r\n\r\n\t\t$.extend(this.offset, {\r\n\t\t\tclick: { //Where the click happened, relative to the element\r\n\t\t\t\tleft: event.pageX - this.offset.left,\r\n\t\t\t\ttop: event.pageY - this.offset.top\r\n\t\t\t},\r\n\t\t\tparent: this._getParentOffset(),\r\n\t\t\trelative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper\r\n\t\t});\r\n\r\n\t\t// Only after we got the offset, we can change the helper's position to absolute\r\n\t\t// TODO: Still need to figure out a way to make relative sorting possible\r\n\t\tthis.helper.css(\"position\", \"absolute\");\r\n\t\tthis.cssPosition = this.helper.css(\"position\");\r\n\r\n\t\t//Generate the original position\r\n\t\tthis.originalPosition = this._generatePosition(event);\r\n\t\tthis.originalPageX = event.pageX;\r\n\t\tthis.originalPageY = event.pageY;\r\n\r\n\t\t//Adjust the mouse offset relative to the helper if \"cursorAt\" is supplied\r\n\t\t(o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));\r\n\r\n\t\t//Cache the former DOM position\r\n\t\tthis.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };\r\n\r\n\t\t//If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way\r\n\t\tif(this.helper[0] !== this.currentItem[0]) {\r\n\t\t\tthis.currentItem.hide();\r\n\t\t}\r\n\r\n\t\t//Create the placeholder\r\n\t\tthis._createPlaceholder();\r\n\r\n\t\t//Set a containment if given in the options\r\n\t\tif(o.containment) {\r\n\t\t\tthis._setContainment();\r\n\t\t}\r\n\r\n\t\tif( o.cursor && o.cursor !== \"auto\" ) { // cursor option\r\n\t\t\tbody = this.document.find( \"body\" );\r\n\r\n\t\t\t// support: IE\r\n\t\t\tthis.storedCursor = body.css( \"cursor\" );\r\n\t\t\tbody.css( \"cursor\", o.cursor );\r\n\r\n\t\t\tthis.storedStylesheet = $( \"<style>*{ cursor: \"+o.cursor+\" !important; }</style>\" ).appendTo( body );\r\n\t\t}\r\n\r\n\t\tif(o.opacity) { // opacity option\r\n\t\t\tif (this.helper.css(\"opacity\")) {\r\n\t\t\t\tthis._storedOpacity = this.helper.css(\"opacity\");\r\n\t\t\t}\r\n\t\t\tthis.helper.css(\"opacity\", o.opacity);\r\n\t\t}\r\n\r\n\t\tif(o.zIndex) { // zIndex option\r\n\t\t\tif (this.helper.css(\"zIndex\")) {\r\n\t\t\t\tthis._storedZIndex = this.helper.css(\"zIndex\");\r\n\t\t\t}\r\n\t\t\tthis.helper.css(\"zIndex\", o.zIndex);\r\n\t\t}\r\n\r\n\t\t//Prepare scrolling\r\n\t\tif(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== \"HTML\") {\r\n\t\t\tthis.overflowOffset = this.scrollParent.offset();\r\n\t\t}\r\n\r\n\t\t//Call callbacks\r\n\t\tthis._trigger(\"start\", event, this._uiHash());\r\n\r\n\t\t//Recache the helper size\r\n\t\tif(!this._preserveHelperProportions) {\r\n\t\t\tthis._cacheHelperProportions();\r\n\t\t}\r\n\r\n\r\n\t\t//Post \"activate\" events to possible containers\r\n\t\tif( !noActivation ) {\r\n\t\t\tfor ( i = this.containers.length - 1; i >= 0; i-- ) {\r\n\t\t\t\tthis.containers[ i ]._trigger( \"activate\", event, this._uiHash( this ) );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//Prepare possible droppables\r\n\t\tif($.ui.ddmanager) {\r\n\t\t\t$.ui.ddmanager.current = this;\r\n\t\t}\r\n\r\n\t\tif ($.ui.ddmanager && !o.dropBehaviour) {\r\n\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\r\n\t\t}\r\n\r\n\t\tthis.dragging = true;\r\n\r\n\t\tthis.helper.addClass(\"ui-sortable-helper\");\r\n\t\tthis._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position\r\n\t\treturn true;\r\n\r\n\t},\r\n\r\n\t_mouseDrag: function(event) {\r\n\t\tvar i, item, itemElement, intersection,\r\n\t\t\to = this.options,\r\n\t\t\tscrolled = false;\r\n\r\n\t\t//Compute the helpers position\r\n\t\tthis.position = this._generatePosition(event);\r\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\r\n\r\n\t\tif (!this.lastPositionAbs) {\r\n\t\t\tthis.lastPositionAbs = this.positionAbs;\r\n\t\t}\r\n\r\n\t\t//Do scrolling\r\n\t\tif(this.options.scroll) {\r\n\t\t\tif(this.scrollParent[0] !== this.document[0] && this.scrollParent[0].tagName !== \"HTML\") {\r\n\r\n\t\t\t\tif((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {\r\n\t\t\t\t\tthis.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;\r\n\t\t\t\t} else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {\r\n\t\t\t\t\tthis.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {\r\n\t\t\t\t\tthis.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;\r\n\t\t\t\t} else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {\r\n\t\t\t\t\tthis.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tif(event.pageY - this.document.scrollTop() < o.scrollSensitivity) {\r\n\t\t\t\t\tscrolled = this.document.scrollTop(this.document.scrollTop() - o.scrollSpeed);\r\n\t\t\t\t} else if(this.window.height() - (event.pageY - this.document.scrollTop()) < o.scrollSensitivity) {\r\n\t\t\t\t\tscrolled = this.document.scrollTop(this.document.scrollTop() + o.scrollSpeed);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif(event.pageX - this.document.scrollLeft() < o.scrollSensitivity) {\r\n\t\t\t\t\tscrolled = this.document.scrollLeft(this.document.scrollLeft() - o.scrollSpeed);\r\n\t\t\t\t} else if(this.window.width() - (event.pageX - this.document.scrollLeft()) < o.scrollSensitivity) {\r\n\t\t\t\t\tscrolled = this.document.scrollLeft(this.document.scrollLeft() + o.scrollSpeed);\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\tif(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {\r\n\t\t\t\t$.ui.ddmanager.prepareOffsets(this, event);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//Regenerate the absolute position used for position checks\r\n\t\tthis.positionAbs = this._convertPositionTo(\"absolute\");\r\n\r\n\t\t//Set the helper position\r\n\t\tif(!this.options.axis || this.options.axis !== \"y\") {\r\n\t\t\tthis.helper[0].style.left = this.position.left+\"px\";\r\n\t\t}\r\n\t\tif(!this.options.axis || this.options.axis !== \"x\") {\r\n\t\t\tthis.helper[0].style.top = this.position.top+\"px\";\r\n\t\t}\r\n\r\n\t\t//Rearrange\r\n\t\tfor (i = this.items.length - 1; i >= 0; i--) {\r\n\r\n\t\t\t//Cache variables and intersection, continue if no intersection\r\n\t\t\titem = this.items[i];\r\n\t\t\titemElement = item.item[0];\r\n\t\t\tintersection = this._intersectsWithPointer(item);\r\n\t\t\tif (!intersection) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// Only put the placeholder inside the current Container, skip all\r\n\t\t\t// items from other containers. This works because when moving\r\n\t\t\t// an item from one container to another the\r\n\t\t\t// currentContainer is switched before the placeholder is moved.\r\n\t\t\t//\r\n\t\t\t// Without this, moving items in \"sub-sortables\" can cause\r\n\t\t\t// the placeholder to jitter between the outer and inner container.\r\n\t\t\tif (item.instance !== this.currentContainer) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\t// cannot intersect with itself\r\n\t\t\t// no useless actions that have been done before\r\n\t\t\t// no action if the item moved is the parent of the item checked\r\n\t\t\tif (itemElement !== this.currentItem[0] &&\r\n\t\t\t\tthis.placeholder[intersection === 1 ? \"next\" : \"prev\"]()[0] !== itemElement &&\r\n\t\t\t\t!$.contains(this.placeholder[0], itemElement) &&\r\n\t\t\t\t(this.options.type === \"semi-dynamic\" ? !$.contains(this.element[0], itemElement) : true)\r\n\t\t\t) {\r\n\r\n\t\t\t\tthis.direction = intersection === 1 ? \"down\" : \"up\";\r\n\r\n\t\t\t\tif (this.options.tolerance === \"pointer\" || this._intersectsWithSides(item)) {\r\n\t\t\t\t\tthis._rearrange(event, item);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis._trigger(\"change\", event, this._uiHash());\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//Post events to containers\r\n\t\tthis._contactContainers(event);\r\n\r\n\t\t//Interconnect with droppables\r\n\t\tif($.ui.ddmanager) {\r\n\t\t\t$.ui.ddmanager.drag(this, event);\r\n\t\t}\r\n\r\n\t\t//Call callbacks\r\n\t\tthis._trigger(\"sort\", event, this._uiHash());\r\n\r\n\t\tthis.lastPositionAbs = this.positionAbs;\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\t_mouseStop: function(event, noPropagation) {\r\n\r\n\t\tif(!event) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t//If we are using droppables, inform the manager about the drop\r\n\t\tif ($.ui.ddmanager && !this.options.dropBehaviour) {\r\n\t\t\t$.ui.ddmanager.drop(this, event);\r\n\t\t}\r\n\r\n\t\tif(this.options.revert) {\r\n\t\t\tvar that = this,\r\n\t\t\t\tcur = this.placeholder.offset(),\r\n\t\t\t\taxis = this.options.axis,\r\n\t\t\t\tanimation = {};\r\n\r\n\t\t\tif ( !axis || axis === \"x\" ) {\r\n\t\t\t\tanimation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollLeft);\r\n\t\t\t}\r\n\t\t\tif ( !axis || axis === \"y\" ) {\r\n\t\t\t\tanimation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === this.document[0].body ? 0 : this.offsetParent[0].scrollTop);\r\n\t\t\t}\r\n\t\t\tthis.reverting = true;\r\n\t\t\t$(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {\r\n\t\t\t\tthat._clear(event);\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tthis._clear(event, noPropagation);\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\r\n\t},\r\n\r\n\tcancel: function() {\r\n\r\n\t\tif(this.dragging) {\r\n\r\n\t\t\tthis._mouseUp({ target: null });\r\n\r\n\t\t\tif(this.options.helper === \"original\") {\r\n\t\t\t\tthis.currentItem.css(this._storedCSS).removeClass(\"ui-sortable-helper\");\r\n\t\t\t} else {\r\n\t\t\t\tthis.currentItem.show();\r\n\t\t\t}\r\n\r\n\t\t\t//Post deactivating events to containers\r\n\t\t\tfor (var i = this.containers.length - 1; i >= 0; i--){\r\n\t\t\t\tthis.containers[i]._trigger(\"deactivate\", null, this._uiHash(this));\r\n\t\t\t\tif(this.containers[i].containerCache.over) {\r\n\t\t\t\t\tthis.containers[i]._trigger(\"out\", null, this._uiHash(this));\r\n\t\t\t\t\tthis.containers[i].containerCache.over = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\tif (this.placeholder) {\r\n\t\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!\r\n\t\t\tif(this.placeholder[0].parentNode) {\r\n\t\t\t\tthis.placeholder[0].parentNode.removeChild(this.placeholder[0]);\r\n\t\t\t}\r\n\t\t\tif(this.options.helper !== \"original\" && this.helper && this.helper[0].parentNode) {\r\n\t\t\t\tthis.helper.remove();\r\n\t\t\t}\r\n\r\n\t\t\t$.extend(this, {\r\n\t\t\t\thelper: null,\r\n\t\t\t\tdragging: false,\r\n\t\t\t\treverting: false,\r\n\t\t\t\t_noFinalSort: null\r\n\t\t\t});\r\n\r\n\t\t\tif(this.domPosition.prev) {\r\n\t\t\t\t$(this.domPosition.prev).after(this.currentItem);\r\n\t\t\t} else {\r\n\t\t\t\t$(this.domPosition.parent).prepend(this.currentItem);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t},\r\n\r\n\tserialize: function(o) {\r\n\r\n\t\tvar items = this._getItemsAsjQuery(o && o.connected),\r\n\t\t\tstr = [];\r\n\t\to = o || {};\r\n\r\n\t\t$(items).each(function() {\r\n\t\t\tvar res = ($(o.item || this).attr(o.attribute || \"id\") || \"\").match(o.expression || (/(.+)[\\-=_](.+)/));\r\n\t\t\tif (res) {\r\n\t\t\t\tstr.push((o.key || res[1]+\"[]\")+\"=\"+(o.key && o.expression ? res[1] : res[2]));\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif(!str.length && o.key) {\r\n\t\t\tstr.push(o.key + \"=\");\r\n\t\t}\r\n\r\n\t\treturn str.join(\"&\");\r\n\r\n\t},\r\n\r\n\ttoArray: function(o) {\r\n\r\n\t\tvar items = this._getItemsAsjQuery(o && o.connected),\r\n\t\t\tret = [];\r\n\r\n\t\to = o || {};\r\n\r\n\t\titems.each(function() { ret.push($(o.item || this).attr(o.attribute || \"id\") || \"\"); });\r\n\t\treturn ret;\r\n\r\n\t},\r\n\r\n\t/* Be careful with the following core functions */\r\n\t_intersectsWith: function(item) {\r\n\r\n\t\tvar x1 = this.positionAbs.left,\r\n\t\t\tx2 = x1 + this.helperProportions.width,\r\n\t\t\ty1 = this.positionAbs.top,\r\n\t\t\ty2 = y1 + this.helperProportions.height,\r\n\t\t\tl = item.left,\r\n\t\t\tr = l + item.width,\r\n\t\t\tt = item.top,\r\n\t\t\tb = t + item.height,\r\n\t\t\tdyClick = this.offset.click.top,\r\n\t\t\tdxClick = this.offset.click.left,\r\n\t\t\tisOverElementHeight = ( this.options.axis === \"x\" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),\r\n\t\t\tisOverElementWidth = ( this.options.axis === \"y\" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),\r\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth;\r\n\r\n\t\tif ( this.options.tolerance === \"pointer\" ||\r\n\t\t\tthis.options.forcePointerForContainers ||\r\n\t\t\t(this.options.tolerance !== \"pointer\" && this.helperProportions[this.floating ? \"width\" : \"height\"] > item[this.floating ? \"width\" : \"height\"])\r\n\t\t) {\r\n\t\t\treturn isOverElement;\r\n\t\t} else {\r\n\r\n\t\t\treturn (l < x1 + (this.helperProportions.width / 2) && // Right Half\r\n\t\t\t\tx2 - (this.helperProportions.width / 2) < r && // Left Half\r\n\t\t\t\tt < y1 + (this.helperProportions.height / 2) && // Bottom Half\r\n\t\t\t\ty2 - (this.helperProportions.height / 2) < b ); // Top Half\r\n\r\n\t\t}\r\n\t},\r\n\r\n\t_intersectsWithPointer: function(item) {\r\n\r\n\t\tvar isOverElementHeight = (this.options.axis === \"x\") || this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),\r\n\t\t\tisOverElementWidth = (this.options.axis === \"y\") || this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),\r\n\t\t\tisOverElement = isOverElementHeight && isOverElementWidth,\r\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\r\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\r\n\r\n\t\tif (!isOverElement) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn this.floating ?\r\n\t\t\t( ((horizontalDirection && horizontalDirection === \"right\") || verticalDirection === \"down\") ? 2 : 1 )\r\n\t\t\t: ( verticalDirection && (verticalDirection === \"down\" ? 2 : 1) );\r\n\r\n\t},\r\n\r\n\t_intersectsWithSides: function(item) {\r\n\r\n\t\tvar isOverBottomHalf = this._isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),\r\n\t\t\tisOverRightHalf = this._isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),\r\n\t\t\tverticalDirection = this._getDragVerticalDirection(),\r\n\t\t\thorizontalDirection = this._getDragHorizontalDirection();\r\n\r\n\t\tif (this.floating && horizontalDirection) {\r\n\t\t\treturn ((horizontalDirection === \"right\" && isOverRightHalf) || (horizontalDirection === \"left\" && !isOverRightHalf));\r\n\t\t} else {\r\n\t\t\treturn verticalDirection && ((verticalDirection === \"down\" && isOverBottomHalf) || (verticalDirection === \"up\" && !isOverBottomHalf));\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_getDragVerticalDirection: function() {\r\n\t\tvar delta = this.positionAbs.top - this.lastPositionAbs.top;\r\n\t\treturn delta !== 0 && (delta > 0 ? \"down\" : \"up\");\r\n\t},\r\n\r\n\t_getDragHorizontalDirection: function() {\r\n\t\tvar delta = this.positionAbs.left - this.lastPositionAbs.left;\r\n\t\treturn delta !== 0 && (delta > 0 ? \"right\" : \"left\");\r\n\t},\r\n\r\n\trefresh: function(event) {\r\n\t\tthis._refreshItems(event);\r\n\t\tthis._setHandleClassName();\r\n\t\tthis.refreshPositions();\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_connectWith: function() {\r\n\t\tvar options = this.options;\r\n\t\treturn options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;\r\n\t},\r\n\r\n\t_getItemsAsjQuery: function(connected) {\r\n\r\n\t\tvar i, j, cur, inst,\r\n\t\t\titems = [],\r\n\t\t\tqueries = [],\r\n\t\t\tconnectWith = this._connectWith();\r\n\r\n\t\tif(connectWith && connected) {\r\n\t\t\tfor (i = connectWith.length - 1; i >= 0; i--){\r\n\t\t\t\tcur = $(connectWith[i], this.document[0]);\r\n\t\t\t\tfor ( j = cur.length - 1; j >= 0; j--){\r\n\t\t\t\t\tinst = $.data(cur[j], this.widgetFullName);\r\n\t\t\t\t\tif(inst && inst !== this && !inst.options.disabled) {\r\n\t\t\t\t\t\tqueries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"), inst]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tqueries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(\".ui-sortable-helper\").not(\".ui-sortable-placeholder\"), this]);\r\n\r\n\t\tfunction addItems() {\r\n\t\t\titems.push( this );\r\n\t\t}\r\n\t\tfor (i = queries.length - 1; i >= 0; i--){\r\n\t\t\tqueries[i][0].each( addItems );\r\n\t\t}\r\n\r\n\t\treturn $(items);\r\n\r\n\t},\r\n\r\n\t_removeCurrentsFromItems: function() {\r\n\r\n\t\tvar list = this.currentItem.find(\":data(\" + this.widgetName + \"-item)\");\r\n\r\n\t\tthis.items = $.grep(this.items, function (item) {\r\n\t\t\tfor (var j=0; j < list.length; j++) {\r\n\t\t\t\tif(list[j] === item.item[0]) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t});\r\n\r\n\t},\r\n\r\n\t_refreshItems: function(event) {\r\n\r\n\t\tthis.items = [];\r\n\t\tthis.containers = [this];\r\n\r\n\t\tvar i, j, cur, inst, targetData, _queries, item, queriesLength,\r\n\t\t\titems = this.items,\r\n\t\t\tqueries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],\r\n\t\t\tconnectWith = this._connectWith();\r\n\r\n\t\tif(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down\r\n\t\t\tfor (i = connectWith.length - 1; i >= 0; i--){\r\n\t\t\t\tcur = $(connectWith[i], this.document[0]);\r\n\t\t\t\tfor (j = cur.length - 1; j >= 0; j--){\r\n\t\t\t\t\tinst = $.data(cur[j], this.widgetFullName);\r\n\t\t\t\t\tif(inst && inst !== this && !inst.options.disabled) {\r\n\t\t\t\t\t\tqueries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);\r\n\t\t\t\t\t\tthis.containers.push(inst);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (i = queries.length - 1; i >= 0; i--) {\r\n\t\t\ttargetData = queries[i][1];\r\n\t\t\t_queries = queries[i][0];\r\n\r\n\t\t\tfor (j=0, queriesLength = _queries.length; j < queriesLength; j++) {\r\n\t\t\t\titem = $(_queries[j]);\r\n\r\n\t\t\t\titem.data(this.widgetName + \"-item\", targetData); // Data for target checking (mouse manager)\r\n\r\n\t\t\t\titems.push({\r\n\t\t\t\t\titem: item,\r\n\t\t\t\t\tinstance: targetData,\r\n\t\t\t\t\twidth: 0, height: 0,\r\n\t\t\t\t\tleft: 0, top: 0\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t},\r\n\r\n\trefreshPositions: function(fast) {\r\n\r\n\t\t// Determine whether items are being displayed horizontally\r\n\t\tthis.floating = this.items.length ?\r\n\t\t\tthis.options.axis === \"x\" || this._isFloating( this.items[ 0 ].item ) :\r\n\t\t\tfalse;\r\n\r\n\t\t//This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change\r\n\t\tif(this.offsetParent && this.helper) {\r\n\t\t\tthis.offset.parent = this._getParentOffset();\r\n\t\t}\r\n\r\n\t\tvar i, item, t, p;\r\n\r\n\t\tfor (i = this.items.length - 1; i >= 0; i--){\r\n\t\t\titem = this.items[i];\r\n\r\n\t\t\t//We ignore calculating positions of all connected containers when we're not over them\r\n\t\t\tif(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tt = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;\r\n\r\n\t\t\tif (!fast) {\r\n\t\t\t\titem.width = t.outerWidth();\r\n\t\t\t\titem.height = t.outerHeight();\r\n\t\t\t}\r\n\r\n\t\t\tp = t.offset();\r\n\t\t\titem.left = p.left;\r\n\t\t\titem.top = p.top;\r\n\t\t}\r\n\r\n\t\tif(this.options.custom && this.options.custom.refreshContainers) {\r\n\t\t\tthis.options.custom.refreshContainers.call(this);\r\n\t\t} else {\r\n\t\t\tfor (i = this.containers.length - 1; i >= 0; i--){\r\n\t\t\t\tp = this.containers[i].element.offset();\r\n\t\t\t\tthis.containers[i].containerCache.left = p.left;\r\n\t\t\t\tthis.containers[i].containerCache.top = p.top;\r\n\t\t\t\tthis.containers[i].containerCache.width = this.containers[i].element.outerWidth();\r\n\t\t\t\tthis.containers[i].containerCache.height = this.containers[i].element.outerHeight();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t_createPlaceholder: function(that) {\r\n\t\tthat = that || this;\r\n\t\tvar className,\r\n\t\t\to = that.options;\r\n\r\n\t\tif(!o.placeholder || o.placeholder.constructor === String) {\r\n\t\t\tclassName = o.placeholder;\r\n\t\t\to.placeholder = {\r\n\t\t\t\telement: function() {\r\n\r\n\t\t\t\t\tvar nodeName = that.currentItem[0].nodeName.toLowerCase(),\r\n\t\t\t\t\t\telement = $( \"<\" + nodeName + \">\", that.document[0] )\r\n\t\t\t\t\t\t\t.addClass(className || that.currentItem[0].className+\" ui-sortable-placeholder\")\r\n\t\t\t\t\t\t\t.removeClass(\"ui-sortable-helper\");\r\n\r\n\t\t\t\t\tif ( nodeName === \"tbody\" ) {\r\n\t\t\t\t\t\tthat._createTrPlaceholder(\r\n\t\t\t\t\t\t\tthat.currentItem.find( \"tr\" ).eq( 0 ),\r\n\t\t\t\t\t\t\t$( \"<tr>\", that.document[ 0 ] ).appendTo( element )\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t} else if ( nodeName === \"tr\" ) {\r\n\t\t\t\t\t\tthat._createTrPlaceholder( that.currentItem, element );\r\n\t\t\t\t\t} else if ( nodeName === \"img\" ) {\r\n\t\t\t\t\t\telement.attr( \"src\", that.currentItem.attr( \"src\" ) );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( !className ) {\r\n\t\t\t\t\t\telement.css( \"visibility\", \"hidden\" );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn element;\r\n\t\t\t\t},\r\n\t\t\t\tupdate: function(container, p) {\r\n\r\n\t\t\t\t\t// 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that\r\n\t\t\t\t\t// 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified\r\n\t\t\t\t\tif(className && !o.forcePlaceholderSize) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t//If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item\r\n\t\t\t\t\tif(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css(\"paddingTop\")||0, 10) - parseInt(that.currentItem.css(\"paddingBottom\")||0, 10)); }\r\n\t\t\t\t\tif(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css(\"paddingLeft\")||0, 10) - parseInt(that.currentItem.css(\"paddingRight\")||0, 10)); }\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t//Create the placeholder\r\n\t\tthat.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));\r\n\r\n\t\t//Append it after the actual current item\r\n\t\tthat.currentItem.after(that.placeholder);\r\n\r\n\t\t//Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)\r\n\t\to.placeholder.update(that, that.placeholder);\r\n\r\n\t},\r\n\r\n\t_createTrPlaceholder: function( sourceTr, targetTr ) {\r\n\t\tvar that = this;\r\n\r\n\t\tsourceTr.children().each(function() {\r\n\t\t\t$( \"<td> </td>\", that.document[ 0 ] )\r\n\t\t\t\t.attr( \"colspan\", $( this ).attr( \"colspan\" ) || 1 )\r\n\t\t\t\t.appendTo( targetTr );\r\n\t\t});\r\n\t},\r\n\r\n\t_contactContainers: function(event) {\r\n\t\tvar i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, cur, nearBottom, floating, axis,\r\n\t\t\tinnermostContainer = null,\r\n\t\t\tinnermostIndex = null;\r\n\r\n\t\t// get innermost container that intersects with item\r\n\t\tfor (i = this.containers.length - 1; i >= 0; i--) {\r\n\r\n\t\t\t// never consider a container that's located within the item itself\r\n\t\t\tif($.contains(this.currentItem[0], this.containers[i].element[0])) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif(this._intersectsWith(this.containers[i].containerCache)) {\r\n\r\n\t\t\t\t// if we've already found a container and it's more \"inner\" than this, then continue\r\n\t\t\t\tif(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tinnermostContainer = this.containers[i];\r\n\t\t\t\tinnermostIndex = i;\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// container doesn't intersect. trigger \"out\" event if necessary\r\n\t\t\t\tif(this.containers[i].containerCache.over) {\r\n\t\t\t\t\tthis.containers[i]._trigger(\"out\", event, this._uiHash(this));\r\n\t\t\t\t\tthis.containers[i].containerCache.over = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// if no intersecting containers found, return\r\n\t\tif(!innermostContainer) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// move the item into the container if it's not there already\r\n\t\tif(this.containers.length === 1) {\r\n\t\t\tif (!this.containers[innermostIndex].containerCache.over) {\r\n\t\t\t\tthis.containers[innermostIndex]._trigger(\"over\", event, this._uiHash(this));\r\n\t\t\t\tthis.containers[innermostIndex].containerCache.over = 1;\r\n\t\t\t}\r\n\t\t} else {\r\n\r\n\t\t\t//When entering a new container, we will find the item with the least distance and append our item near it\r\n\t\t\tdist = 10000;\r\n\t\t\titemWithLeastDistance = null;\r\n\t\t\tfloating = innermostContainer.floating || this._isFloating(this.currentItem);\r\n\t\t\tposProperty = floating ? \"left\" : \"top\";\r\n\t\t\tsizeProperty = floating ? \"width\" : \"height\";\r\n\t\t\taxis = floating ? \"clientX\" : \"clientY\";\r\n\r\n\t\t\tfor (j = this.items.length - 1; j >= 0; j--) {\r\n\t\t\t\tif(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif(this.items[j].item[0] === this.currentItem[0]) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcur = this.items[j].item.offset()[posProperty];\r\n\t\t\t\tnearBottom = false;\r\n\t\t\t\tif ( event[ axis ] - cur > this.items[ j ][ sizeProperty ] / 2 ) {\r\n\t\t\t\t\tnearBottom = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( Math.abs( event[ axis ] - cur ) < dist ) {\r\n\t\t\t\t\tdist = Math.abs( event[ axis ] - cur );\r\n\t\t\t\t\titemWithLeastDistance = this.items[ j ];\r\n\t\t\t\t\tthis.direction = nearBottom ? \"up\": \"down\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t//Check if dropOnEmpty is enabled\r\n\t\t\tif(!itemWithLeastDistance && !this.options.dropOnEmpty) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif(this.currentContainer === this.containers[innermostIndex]) {\r\n\t\t\t\tif ( !this.currentContainer.containerCache.over ) {\r\n\t\t\t\t\tthis.containers[ innermostIndex ]._trigger( \"over\", event, this._uiHash() );\r\n\t\t\t\t\tthis.currentContainer.containerCache.over = 1;\r\n\t\t\t\t}\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\titemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);\r\n\t\t\tthis._trigger(\"change\", event, this._uiHash());\r\n\t\t\tthis.containers[innermostIndex]._trigger(\"change\", event, this._uiHash(this));\r\n\t\t\tthis.currentContainer = this.containers[innermostIndex];\r\n\r\n\t\t\t//Update the placeholder\r\n\t\t\tthis.options.placeholder.update(this.currentContainer, this.placeholder);\r\n\r\n\t\t\tthis.containers[innermostIndex]._trigger(\"over\", event, this._uiHash(this));\r\n\t\t\tthis.containers[innermostIndex].containerCache.over = 1;\r\n\t\t}\r\n\r\n\r\n\t},\r\n\r\n\t_createHelper: function(event) {\r\n\r\n\t\tvar o = this.options,\r\n\t\t\thelper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === \"clone\" ? this.currentItem.clone() : this.currentItem);\r\n\r\n\t\t//Add the helper to the DOM if that didn't happen already\r\n\t\tif(!helper.parents(\"body\").length) {\r\n\t\t\t$(o.appendTo !== \"parent\" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);\r\n\t\t}\r\n\r\n\t\tif(helper[0] === this.currentItem[0]) {\r\n\t\t\tthis._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css(\"position\"), top: this.currentItem.css(\"top\"), left: this.currentItem.css(\"left\") };\r\n\t\t}\r\n\r\n\t\tif(!helper[0].style.width || o.forceHelperSize) {\r\n\t\t\thelper.width(this.currentItem.width());\r\n\t\t}\r\n\t\tif(!helper[0].style.height || o.forceHelperSize) {\r\n\t\t\thelper.height(this.currentItem.height());\r\n\t\t}\r\n\r\n\t\treturn helper;\r\n\r\n\t},\r\n\r\n\t_adjustOffsetFromHelper: function(obj) {\r\n\t\tif (typeof obj === \"string\") {\r\n\t\t\tobj = obj.split(\" \");\r\n\t\t}\r\n\t\tif ($.isArray(obj)) {\r\n\t\t\tobj = {left: +obj[0], top: +obj[1] || 0};\r\n\t\t}\r\n\t\tif (\"left\" in obj) {\r\n\t\t\tthis.offset.click.left = obj.left + this.margins.left;\r\n\t\t}\r\n\t\tif (\"right\" in obj) {\r\n\t\t\tthis.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;\r\n\t\t}\r\n\t\tif (\"top\" in obj) {\r\n\t\t\tthis.offset.click.top = obj.top + this.margins.top;\r\n\t\t}\r\n\t\tif (\"bottom\" in obj) {\r\n\t\t\tthis.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;\r\n\t\t}\r\n\t},\r\n\r\n\t_getParentOffset: function() {\r\n\r\n\r\n\t\t//Get the offsetParent and cache its position\r\n\t\tthis.offsetParent = this.helper.offsetParent();\r\n\t\tvar po = this.offsetParent.offset();\r\n\r\n\t\t// This is a special case where we need to modify a offset calculated on start, since the following happened:\r\n\t\t// 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent\r\n\t\t// 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that\r\n\t\t// the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag\r\n\t\tif(this.cssPosition === \"absolute\" && this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) {\r\n\t\t\tpo.left += this.scrollParent.scrollLeft();\r\n\t\t\tpo.top += this.scrollParent.scrollTop();\r\n\t\t}\r\n\r\n\t\t// This needs to be actually done for all browsers, since pageX/pageY includes this information\r\n\t\t// with an ugly IE fix\r\n\t\tif( this.offsetParent[0] === this.document[0].body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === \"html\" && $.ui.ie)) {\r\n\t\t\tpo = { top: 0, left: 0 };\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttop: po.top + (parseInt(this.offsetParent.css(\"borderTopWidth\"),10) || 0),\r\n\t\t\tleft: po.left + (parseInt(this.offsetParent.css(\"borderLeftWidth\"),10) || 0)\r\n\t\t};\r\n\r\n\t},\r\n\r\n\t_getRelativeOffset: function() {\r\n\r\n\t\tif(this.cssPosition === \"relative\") {\r\n\t\t\tvar p = this.currentItem.position();\r\n\t\t\treturn {\r\n\t\t\t\ttop: p.top - (parseInt(this.helper.css(\"top\"),10) || 0) + this.scrollParent.scrollTop(),\r\n\t\t\t\tleft: p.left - (parseInt(this.helper.css(\"left\"),10) || 0) + this.scrollParent.scrollLeft()\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\treturn { top: 0, left: 0 };\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_cacheMargins: function() {\r\n\t\tthis.margins = {\r\n\t\t\tleft: (parseInt(this.currentItem.css(\"marginLeft\"),10) || 0),\r\n\t\t\ttop: (parseInt(this.currentItem.css(\"marginTop\"),10) || 0)\r\n\t\t};\r\n\t},\r\n\r\n\t_cacheHelperProportions: function() {\r\n\t\tthis.helperProportions = {\r\n\t\t\twidth: this.helper.outerWidth(),\r\n\t\t\theight: this.helper.outerHeight()\r\n\t\t};\r\n\t},\r\n\r\n\t_setContainment: function() {\r\n\r\n\t\tvar ce, co, over,\r\n\t\t\to = this.options;\r\n\t\tif(o.containment === \"parent\") {\r\n\t\t\to.containment = this.helper[0].parentNode;\r\n\t\t}\r\n\t\tif(o.containment === \"document\" || o.containment === \"window\") {\r\n\t\t\tthis.containment = [\r\n\t\t\t\t0 - this.offset.relative.left - this.offset.parent.left,\r\n\t\t\t\t0 - this.offset.relative.top - this.offset.parent.top,\r\n\t\t\t\to.containment === \"document\" ? this.document.width() : this.window.width() - this.helperProportions.width - this.margins.left,\r\n\t\t\t\t(o.containment === \"document\" ? this.document.width() : this.window.height() || this.document[0].body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top\r\n\t\t\t];\r\n\t\t}\r\n\r\n\t\tif(!(/^(document|window|parent)$/).test(o.containment)) {\r\n\t\t\tce = $(o.containment)[0];\r\n\t\t\tco = $(o.containment).offset();\r\n\t\t\tover = ($(ce).css(\"overflow\") !== \"hidden\");\r\n\r\n\t\t\tthis.containment = [\r\n\t\t\t\tco.left + (parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingLeft\"),10) || 0) - this.margins.left,\r\n\t\t\t\tco.top + (parseInt($(ce).css(\"borderTopWidth\"),10) || 0) + (parseInt($(ce).css(\"paddingTop\"),10) || 0) - this.margins.top,\r\n\t\t\t\tco.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css(\"borderLeftWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingRight\"),10) || 0) - this.helperProportions.width - this.margins.left,\r\n\t\t\t\tco.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css(\"borderTopWidth\"),10) || 0) - (parseInt($(ce).css(\"paddingBottom\"),10) || 0) - this.helperProportions.height - this.margins.top\r\n\t\t\t];\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t_convertPositionTo: function(d, pos) {\r\n\r\n\t\tif(!pos) {\r\n\t\t\tpos = this.position;\r\n\t\t}\r\n\t\tvar mod = d === \"absolute\" ? 1 : -1,\r\n\t\t\tscroll = this.cssPosition === \"absolute\" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,\r\n\t\t\tscrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);\r\n\r\n\t\treturn {\r\n\t\t\ttop: (\r\n\t\t\t\tpos.top\t+\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\r\n\t\t\t\tthis.offset.relative.top * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\r\n\t\t\t\tthis.offset.parent.top * mod -\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\r\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)\r\n\t\t\t),\r\n\t\t\tleft: (\r\n\t\t\t\tpos.left +\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\r\n\t\t\t\tthis.offset.relative.left * mod +\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\r\n\t\t\t\tthis.offset.parent.left * mod\t-\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\r\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)\r\n\t\t\t)\r\n\t\t};\r\n\r\n\t},\r\n\r\n\t_generatePosition: function(event) {\r\n\r\n\t\tvar top, left,\r\n\t\t\to = this.options,\r\n\t\t\tpageX = event.pageX,\r\n\t\t\tpageY = event.pageY,\r\n\t\t\tscroll = this.cssPosition === \"absolute\" && !(this.scrollParent[0] !== this.document[0] && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);\r\n\r\n\t\t// This is another very weird special case that only happens for relative elements:\r\n\t\t// 1. If the css position is relative\r\n\t\t// 2. and the scroll parent is the document or similar to the offset parent\r\n\t\t// we have to refresh the relative offset during the scroll so there are no jumps\r\n\t\tif(this.cssPosition === \"relative\" && !(this.scrollParent[0] !== this.document[0] && this.scrollParent[0] !== this.offsetParent[0])) {\r\n\t\t\tthis.offset.relative = this._getRelativeOffset();\r\n\t\t}\r\n\r\n\t\t/*\r\n\t\t * - Position constraining -\r\n\t\t * Constrain the position to a mix of grid, containment.\r\n\t\t */\r\n\r\n\t\tif(this.originalPosition) { //If we are not dragging yet, we won't check for options\r\n\r\n\t\t\tif(this.containment) {\r\n\t\t\t\tif(event.pageX - this.offset.click.left < this.containment[0]) {\r\n\t\t\t\t\tpageX = this.containment[0] + this.offset.click.left;\r\n\t\t\t\t}\r\n\t\t\t\tif(event.pageY - this.offset.click.top < this.containment[1]) {\r\n\t\t\t\t\tpageY = this.containment[1] + this.offset.click.top;\r\n\t\t\t\t}\r\n\t\t\t\tif(event.pageX - this.offset.click.left > this.containment[2]) {\r\n\t\t\t\t\tpageX = this.containment[2] + this.offset.click.left;\r\n\t\t\t\t}\r\n\t\t\t\tif(event.pageY - this.offset.click.top > this.containment[3]) {\r\n\t\t\t\t\tpageY = this.containment[3] + this.offset.click.top;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif(o.grid) {\r\n\t\t\t\ttop = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];\r\n\t\t\t\tpageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;\r\n\r\n\t\t\t\tleft = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];\r\n\t\t\t\tpageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttop: (\r\n\t\t\t\tpageY -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\r\n\t\t\t\tthis.offset.click.top -\t\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\r\n\t\t\t\tthis.offset.relative.top\t-\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\r\n\t\t\t\tthis.offset.parent.top +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\r\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))\r\n\t\t\t),\r\n\t\t\tleft: (\r\n\t\t\t\tpageX -\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// The absolute mouse position\r\n\t\t\t\tthis.offset.click.left -\t\t\t\t\t\t\t\t\t\t\t\t// Click offset (relative to the element)\r\n\t\t\t\tthis.offset.relative.left\t-\t\t\t\t\t\t\t\t\t\t\t// Only for relative positioned nodes: Relative offset from element to offset parent\r\n\t\t\t\tthis.offset.parent.left +\t\t\t\t\t\t\t\t\t\t\t\t// The offsetParent's offset without borders (offset + border)\r\n\t\t\t\t( ( this.cssPosition === \"fixed\" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))\r\n\t\t\t)\r\n\t\t};\r\n\r\n\t},\r\n\r\n\t_rearrange: function(event, i, a, hardRefresh) {\r\n\r\n\t\ta ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === \"down\" ? i.item[0] : i.item[0].nextSibling));\r\n\r\n\t\t//Various things done here to improve the performance:\r\n\t\t// 1. we create a setTimeout, that calls refreshPositions\r\n\t\t// 2. on the instance, we have a counter variable, that get's higher after every append\r\n\t\t// 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same\r\n\t\t// 4. this lets only the last addition to the timeout stack through\r\n\t\tthis.counter = this.counter ? ++this.counter : 1;\r\n\t\tvar counter = this.counter;\r\n\r\n\t\tthis._delay(function() {\r\n\t\t\tif(counter === this.counter) {\r\n\t\t\t\tthis.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t},\r\n\r\n\t_clear: function(event, noPropagation) {\r\n\r\n\t\tthis.reverting = false;\r\n\t\t// We delay all events that have to be triggered to after the point where the placeholder has been removed and\r\n\t\t// everything else normalized again\r\n\t\tvar i,\r\n\t\t\tdelayedTriggers = [];\r\n\r\n\t\t// We first have to update the dom position of the actual currentItem\r\n\t\t// Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)\r\n\t\tif(!this._noFinalSort && this.currentItem.parent().length) {\r\n\t\t\tthis.placeholder.before(this.currentItem);\r\n\t\t}\r\n\t\tthis._noFinalSort = null;\r\n\r\n\t\tif(this.helper[0] === this.currentItem[0]) {\r\n\t\t\tfor(i in this._storedCSS) {\r\n\t\t\t\tif(this._storedCSS[i] === \"auto\" || this._storedCSS[i] === \"static\") {\r\n\t\t\t\t\tthis._storedCSS[i] = \"\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.currentItem.css(this._storedCSS).removeClass(\"ui-sortable-helper\");\r\n\t\t} else {\r\n\t\t\tthis.currentItem.show();\r\n\t\t}\r\n\r\n\t\tif(this.fromOutside && !noPropagation) {\r\n\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"receive\", event, this._uiHash(this.fromOutside)); });\r\n\t\t}\r\n\t\tif((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(\".ui-sortable-helper\")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {\r\n\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"update\", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed\r\n\t\t}\r\n\r\n\t\t// Check if the items Container has Changed and trigger appropriate\r\n\t\t// events.\r\n\t\tif (this !== this.currentContainer) {\r\n\t\t\tif(!noPropagation) {\r\n\t\t\t\tdelayedTriggers.push(function(event) { this._trigger(\"remove\", event, this._uiHash()); });\r\n\t\t\t\tdelayedTriggers.push((function(c) { return function(event) { c._trigger(\"receive\", event, this._uiHash(this)); }; }).call(this, this.currentContainer));\r\n\t\t\t\tdelayedTriggers.push((function(c) { return function(event) { c._trigger(\"update\", event, this._uiHash(this)); }; }).call(this, this.currentContainer));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t//Post events to containers\r\n\t\tfunction delayEvent( type, instance, container ) {\r\n\t\t\treturn function( event ) {\r\n\t\t\t\tcontainer._trigger( type, event, instance._uiHash( instance ) );\r\n\t\t\t};\r\n\t\t}\r\n\t\tfor (i = this.containers.length - 1; i >= 0; i--){\r\n\t\t\tif (!noPropagation) {\r\n\t\t\t\tdelayedTriggers.push( delayEvent( \"deactivate\", this, this.containers[ i ] ) );\r\n\t\t\t}\r\n\t\t\tif(this.containers[i].containerCache.over) {\r\n\t\t\t\tdelayedTriggers.push( delayEvent( \"out\", this, this.containers[ i ] ) );\r\n\t\t\t\tthis.containers[i].containerCache.over = 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t//Do what was originally in plugins\r\n\t\tif ( this.storedCursor ) {\r\n\t\t\tthis.document.find( \"body\" ).css( \"cursor\", this.storedCursor );\r\n\t\t\tthis.storedStylesheet.remove();\r\n\t\t}\r\n\t\tif(this._storedOpacity) {\r\n\t\t\tthis.helper.css(\"opacity\", this._storedOpacity);\r\n\t\t}\r\n\t\tif(this._storedZIndex) {\r\n\t\t\tthis.helper.css(\"zIndex\", this._storedZIndex === \"auto\" ? \"\" : this._storedZIndex);\r\n\t\t}\r\n\r\n\t\tthis.dragging = false;\r\n\r\n\t\tif(!noPropagation) {\r\n\t\t\tthis._trigger(\"beforeStop\", event, this._uiHash());\r\n\t\t}\r\n\r\n\t\t//$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!\r\n\t\tthis.placeholder[0].parentNode.removeChild(this.placeholder[0]);\r\n\r\n\t\tif ( !this.cancelHelperRemoval ) {\r\n\t\t\tif ( this.helper[ 0 ] !== this.currentItem[ 0 ] ) {\r\n\t\t\t\tthis.helper.remove();\r\n\t\t\t}\r\n\t\t\tthis.helper = null;\r\n\t\t}\r\n\r\n\t\tif(!noPropagation) {\r\n\t\t\tfor (i=0; i < delayedTriggers.length; i++) {\r\n\t\t\t\tdelayedTriggers[i].call(this, event);\r\n\t\t\t} //Trigger all delayed events\r\n\t\t\tthis._trigger(\"stop\", event, this._uiHash());\r\n\t\t}\r\n\r\n\t\tthis.fromOutside = false;\r\n\t\treturn !this.cancelHelperRemoval;\r\n\r\n\t},\r\n\r\n\t_trigger: function() {\r\n\t\tif ($.Widget.prototype._trigger.apply(this, arguments) === false) {\r\n\t\t\tthis.cancel();\r\n\t\t}\r\n\t},\r\n\r\n\t_uiHash: function(_inst) {\r\n\t\tvar inst = _inst || this;\r\n\t\treturn {\r\n\t\t\thelper: inst.helper,\r\n\t\t\tplaceholder: inst.placeholder || $([]),\r\n\t\t\tposition: inst.position,\r\n\t\t\toriginalPosition: inst.originalPosition,\r\n\t\t\toffset: inst.positionAbs,\r\n\t\t\titem: inst.currentItem,\r\n\t\t\tsender: _inst ? _inst.element : null\r\n\t\t};\r\n\t}\r\n\r\n});\r\n\r\n\r\n/*!\r\n * jQuery UI Accordion 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/accordion/\r\n */\r\n\r\n\r\nvar accordion = $.widget( \"ui.accordion\", {\r\n\tversion: \"1.11.4\",\r\n\toptions: {\r\n\t\tactive: 0,\r\n\t\tanimate: {},\r\n\t\tcollapsible: false,\r\n\t\tevent: \"click\",\r\n\t\theader: \"> li > :first-child,> :not(li):even\",\r\n\t\theightStyle: \"auto\",\r\n\t\ticons: {\r\n\t\t\tactiveHeader: \"ui-icon-triangle-1-s\",\r\n\t\t\theader: \"ui-icon-triangle-1-e\"\r\n\t\t},\r\n\r\n\t\t// callbacks\r\n\t\tactivate: null,\r\n\t\tbeforeActivate: null\r\n\t},\r\n\r\n\thideProps: {\r\n\t\tborderTopWidth: \"hide\",\r\n\t\tborderBottomWidth: \"hide\",\r\n\t\tpaddingTop: \"hide\",\r\n\t\tpaddingBottom: \"hide\",\r\n\t\theight: \"hide\"\r\n\t},\r\n\r\n\tshowProps: {\r\n\t\tborderTopWidth: \"show\",\r\n\t\tborderBottomWidth: \"show\",\r\n\t\tpaddingTop: \"show\",\r\n\t\tpaddingBottom: \"show\",\r\n\t\theight: \"show\"\r\n\t},\r\n\r\n\t_create: function() {\r\n\t\tvar options = this.options;\r\n\t\tthis.prevShow = this.prevHide = $();\r\n\t\tthis.element.addClass( \"ui-accordion ui-widget ui-helper-reset\" )\r\n\t\t\t// ARIA\r\n\t\t\t.attr( \"role\", \"tablist\" );\r\n\r\n\t\t// don't allow collapsible: false and active: false / null\r\n\t\tif ( !options.collapsible && (options.active === false || options.active == null) ) {\r\n\t\t\toptions.active = 0;\r\n\t\t}\r\n\r\n\t\tthis._processPanels();\r\n\t\t// handle negative values\r\n\t\tif ( options.active < 0 ) {\r\n\t\t\toptions.active += this.headers.length;\r\n\t\t}\r\n\t\tthis._refresh();\r\n\t},\r\n\r\n\t_getCreateEventData: function() {\r\n\t\treturn {\r\n\t\t\theader: this.active,\r\n\t\t\tpanel: !this.active.length ? $() : this.active.next()\r\n\t\t};\r\n\t},\r\n\r\n\t_createIcons: function() {\r\n\t\tvar icons = this.options.icons;\r\n\t\tif ( icons ) {\r\n\t\t\t$( \"<span>\" )\r\n\t\t\t\t.addClass( \"ui-accordion-header-icon ui-icon \" + icons.header )\r\n\t\t\t\t.prependTo( this.headers );\r\n\t\t\tthis.active.children( \".ui-accordion-header-icon\" )\r\n\t\t\t\t.removeClass( icons.header )\r\n\t\t\t\t.addClass( icons.activeHeader );\r\n\t\t\tthis.headers.addClass( \"ui-accordion-icons\" );\r\n\t\t}\r\n\t},\r\n\r\n\t_destroyIcons: function() {\r\n\t\tthis.headers\r\n\t\t\t.removeClass( \"ui-accordion-icons\" )\r\n\t\t\t.children( \".ui-accordion-header-icon\" )\r\n\t\t\t\t.remove();\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tvar contents;\r\n\r\n\t\t// clean up main element\r\n\t\tthis.element\r\n\t\t\t.removeClass( \"ui-accordion ui-widget ui-helper-reset\" )\r\n\t\t\t.removeAttr( \"role\" );\r\n\r\n\t\t// clean up headers\r\n\t\tthis.headers\r\n\t\t\t.removeClass( \"ui-accordion-header ui-accordion-header-active ui-state-default \" +\r\n\t\t\t\t\"ui-corner-all ui-state-active ui-state-disabled ui-corner-top\" )\r\n\t\t\t.removeAttr( \"role\" )\r\n\t\t\t.removeAttr( \"aria-expanded\" )\r\n\t\t\t.removeAttr( \"aria-selected\" )\r\n\t\t\t.removeAttr( \"aria-controls\" )\r\n\t\t\t.removeAttr( \"tabIndex\" )\r\n\t\t\t.removeUniqueId();\r\n\r\n\t\tthis._destroyIcons();\r\n\r\n\t\t// clean up content panels\r\n\t\tcontents = this.headers.next()\r\n\t\t\t.removeClass( \"ui-helper-reset ui-widget-content ui-corner-bottom \" +\r\n\t\t\t\t\"ui-accordion-content ui-accordion-content-active ui-state-disabled\" )\r\n\t\t\t.css( \"display\", \"\" )\r\n\t\t\t.removeAttr( \"role\" )\r\n\t\t\t.removeAttr( \"aria-hidden\" )\r\n\t\t\t.removeAttr( \"aria-labelledby\" )\r\n\t\t\t.removeUniqueId();\r\n\r\n\t\tif ( this.options.heightStyle !== \"content\" ) {\r\n\t\t\tcontents.css( \"height\", \"\" );\r\n\t\t}\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tif ( key === \"active\" ) {\r\n\t\t\t// _activate() will handle invalid values and update this.options\r\n\t\t\tthis._activate( value );\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( key === \"event\" ) {\r\n\t\t\tif ( this.options.event ) {\r\n\t\t\t\tthis._off( this.headers, this.options.event );\r\n\t\t\t}\r\n\t\t\tthis._setupEvents( value );\r\n\t\t}\r\n\r\n\t\tthis._super( key, value );\r\n\r\n\t\t// setting collapsible: false while collapsed; open first panel\r\n\t\tif ( key === \"collapsible\" && !value && this.options.active === false ) {\r\n\t\t\tthis._activate( 0 );\r\n\t\t}\r\n\r\n\t\tif ( key === \"icons\" ) {\r\n\t\t\tthis._destroyIcons();\r\n\t\t\tif ( value ) {\r\n\t\t\t\tthis._createIcons();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// #5332 - opacity doesn't cascade to positioned elements in IE\r\n\t\t// so we need to add the disabled class to the headers and panels\r\n\t\tif ( key === \"disabled\" ) {\r\n\t\t\tthis.element\r\n\t\t\t\t.toggleClass( \"ui-state-disabled\", !!value )\r\n\t\t\t\t.attr( \"aria-disabled\", value );\r\n\t\t\tthis.headers.add( this.headers.next() )\r\n\t\t\t\t.toggleClass( \"ui-state-disabled\", !!value );\r\n\t\t}\r\n\t},\r\n\r\n\t_keydown: function( event ) {\r\n\t\tif ( event.altKey || event.ctrlKey ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar keyCode = $.ui.keyCode,\r\n\t\t\tlength = this.headers.length,\r\n\t\t\tcurrentIndex = this.headers.index( event.target ),\r\n\t\t\ttoFocus = false;\r\n\r\n\t\tswitch ( event.keyCode ) {\r\n\t\t\tcase keyCode.RIGHT:\r\n\t\t\tcase keyCode.DOWN:\r\n\t\t\t\ttoFocus = this.headers[ ( currentIndex + 1 ) % length ];\r\n\t\t\t\tbreak;\r\n\t\t\tcase keyCode.LEFT:\r\n\t\t\tcase keyCode.UP:\r\n\t\t\t\ttoFocus = this.headers[ ( currentIndex - 1 + length ) % length ];\r\n\t\t\t\tbreak;\r\n\t\t\tcase keyCode.SPACE:\r\n\t\t\tcase keyCode.ENTER:\r\n\t\t\t\tthis._eventHandler( event );\r\n\t\t\t\tbreak;\r\n\t\t\tcase keyCode.HOME:\r\n\t\t\t\ttoFocus = this.headers[ 0 ];\r\n\t\t\t\tbreak;\r\n\t\t\tcase keyCode.END:\r\n\t\t\t\ttoFocus = this.headers[ length - 1 ];\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tif ( toFocus ) {\r\n\t\t\t$( event.target ).attr( \"tabIndex\", -1 );\r\n\t\t\t$( toFocus ).attr( \"tabIndex\", 0 );\r\n\t\t\ttoFocus.focus();\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t},\r\n\r\n\t_panelKeyDown: function( event ) {\r\n\t\tif ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) {\r\n\t\t\t$( event.currentTarget ).prev().focus();\r\n\t\t}\r\n\t},\r\n\r\n\trefresh: function() {\r\n\t\tvar options = this.options;\r\n\t\tthis._processPanels();\r\n\r\n\t\t// was collapsed or no panel\r\n\t\tif ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) {\r\n\t\t\toptions.active = false;\r\n\t\t\tthis.active = $();\r\n\t\t// active false only when collapsible is true\r\n\t\t} else if ( options.active === false ) {\r\n\t\t\tthis._activate( 0 );\r\n\t\t// was active, but active panel is gone\r\n\t\t} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\r\n\t\t\t// all remaining panel are disabled\r\n\t\t\tif ( this.headers.length === this.headers.find(\".ui-state-disabled\").length ) {\r\n\t\t\t\toptions.active = false;\r\n\t\t\t\tthis.active = $();\r\n\t\t\t// activate previous panel\r\n\t\t\t} else {\r\n\t\t\t\tthis._activate( Math.max( 0, options.active - 1 ) );\r\n\t\t\t}\r\n\t\t// was active, active panel still exists\r\n\t\t} else {\r\n\t\t\t// make sure active index is correct\r\n\t\t\toptions.active = this.headers.index( this.active );\r\n\t\t}\r\n\r\n\t\tthis._destroyIcons();\r\n\r\n\t\tthis._refresh();\r\n\t},\r\n\r\n\t_processPanels: function() {\r\n\t\tvar prevHeaders = this.headers,\r\n\t\t\tprevPanels = this.panels;\r\n\r\n\t\tthis.headers = this.element.find( this.options.header )\r\n\t\t\t.addClass( \"ui-accordion-header ui-state-default ui-corner-all\" );\r\n\r\n\t\tthis.panels = this.headers.next()\r\n\t\t\t.addClass( \"ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom\" )\r\n\t\t\t.filter( \":not(.ui-accordion-content-active)\" )\r\n\t\t\t.hide();\r\n\r\n\t\t// Avoid memory leaks (#10056)\r\n\t\tif ( prevPanels ) {\r\n\t\t\tthis._off( prevHeaders.not( this.headers ) );\r\n\t\t\tthis._off( prevPanels.not( this.panels ) );\r\n\t\t}\r\n\t},\r\n\r\n\t_refresh: function() {\r\n\t\tvar maxHeight,\r\n\t\t\toptions = this.options,\r\n\t\t\theightStyle = options.heightStyle,\r\n\t\t\tparent = this.element.parent();\r\n\r\n\t\tthis.active = this._findActive( options.active )\r\n\t\t\t.addClass( \"ui-accordion-header-active ui-state-active ui-corner-top\" )\r\n\t\t\t.removeClass( \"ui-corner-all\" );\r\n\t\tthis.active.next()\r\n\t\t\t.addClass( \"ui-accordion-content-active\" )\r\n\t\t\t.show();\r\n\r\n\t\tthis.headers\r\n\t\t\t.attr( \"role\", \"tab\" )\r\n\t\t\t.each(function() {\r\n\t\t\t\tvar header = $( this ),\r\n\t\t\t\t\theaderId = header.uniqueId().attr( \"id\" ),\r\n\t\t\t\t\tpanel = header.next(),\r\n\t\t\t\t\tpanelId = panel.uniqueId().attr( \"id\" );\r\n\t\t\t\theader.attr( \"aria-controls\", panelId );\r\n\t\t\t\tpanel.attr( \"aria-labelledby\", headerId );\r\n\t\t\t})\r\n\t\t\t.next()\r\n\t\t\t\t.attr( \"role\", \"tabpanel\" );\r\n\r\n\t\tthis.headers\r\n\t\t\t.not( this.active )\r\n\t\t\t.attr({\r\n\t\t\t\t\"aria-selected\": \"false\",\r\n\t\t\t\t\"aria-expanded\": \"false\",\r\n\t\t\t\ttabIndex: -1\r\n\t\t\t})\r\n\t\t\t.next()\r\n\t\t\t\t.attr({\r\n\t\t\t\t\t\"aria-hidden\": \"true\"\r\n\t\t\t\t})\r\n\t\t\t\t.hide();\r\n\r\n\t\t// make sure at least one header is in the tab order\r\n\t\tif ( !this.active.length ) {\r\n\t\t\tthis.headers.eq( 0 ).attr( \"tabIndex\", 0 );\r\n\t\t} else {\r\n\t\t\tthis.active.attr({\r\n\t\t\t\t\"aria-selected\": \"true\",\r\n\t\t\t\t\"aria-expanded\": \"true\",\r\n\t\t\t\ttabIndex: 0\r\n\t\t\t})\r\n\t\t\t.next()\r\n\t\t\t\t.attr({\r\n\t\t\t\t\t\"aria-hidden\": \"false\"\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._createIcons();\r\n\r\n\t\tthis._setupEvents( options.event );\r\n\r\n\t\tif ( heightStyle === \"fill\" ) {\r\n\t\t\tmaxHeight = parent.height();\r\n\t\t\tthis.element.siblings( \":visible\" ).each(function() {\r\n\t\t\t\tvar elem = $( this ),\r\n\t\t\t\t\tposition = elem.css( \"position\" );\r\n\r\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\r\n\t\t\t});\r\n\r\n\t\t\tthis.headers.each(function() {\r\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\r\n\t\t\t});\r\n\r\n\t\t\tthis.headers.next()\r\n\t\t\t\t.each(function() {\r\n\t\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\r\n\t\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\r\n\t\t\t\t})\r\n\t\t\t\t.css( \"overflow\", \"auto\" );\r\n\t\t} else if ( heightStyle === \"auto\" ) {\r\n\t\t\tmaxHeight = 0;\r\n\t\t\tthis.headers.next()\r\n\t\t\t\t.each(function() {\r\n\t\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).css( \"height\", \"\" ).height() );\r\n\t\t\t\t})\r\n\t\t\t\t.height( maxHeight );\r\n\t\t}\r\n\t},\r\n\r\n\t_activate: function( index ) {\r\n\t\tvar active = this._findActive( index )[ 0 ];\r\n\r\n\t\t// trying to activate the already active panel\r\n\t\tif ( active === this.active[ 0 ] ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// trying to collapse, simulate a click on the currently active header\r\n\t\tactive = active || this.active[ 0 ];\r\n\r\n\t\tthis._eventHandler({\r\n\t\t\ttarget: active,\r\n\t\t\tcurrentTarget: active,\r\n\t\t\tpreventDefault: $.noop\r\n\t\t});\r\n\t},\r\n\r\n\t_findActive: function( selector ) {\r\n\t\treturn typeof selector === \"number\" ? this.headers.eq( selector ) : $();\r\n\t},\r\n\r\n\t_setupEvents: function( event ) {\r\n\t\tvar events = {\r\n\t\t\tkeydown: \"_keydown\"\r\n\t\t};\r\n\t\tif ( event ) {\r\n\t\t\t$.each( event.split( \" \" ), function( index, eventName ) {\r\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._off( this.headers.add( this.headers.next() ) );\r\n\t\tthis._on( this.headers, events );\r\n\t\tthis._on( this.headers.next(), { keydown: \"_panelKeyDown\" });\r\n\t\tthis._hoverable( this.headers );\r\n\t\tthis._focusable( this.headers );\r\n\t},\r\n\r\n\t_eventHandler: function( event ) {\r\n\t\tvar options = this.options,\r\n\t\t\tactive = this.active,\r\n\t\t\tclicked = $( event.currentTarget ),\r\n\t\t\tclickedIsActive = clicked[ 0 ] === active[ 0 ],\r\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\r\n\t\t\ttoShow = collapsing ? $() : clicked.next(),\r\n\t\t\ttoHide = active.next(),\r\n\t\t\teventData = {\r\n\t\t\t\toldHeader: active,\r\n\t\t\t\toldPanel: toHide,\r\n\t\t\t\tnewHeader: collapsing ? $() : clicked,\r\n\t\t\t\tnewPanel: toShow\r\n\t\t\t};\r\n\r\n\t\tevent.preventDefault();\r\n\r\n\t\tif (\r\n\t\t\t\t// click on active header, but not collapsible\r\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\r\n\t\t\t\t// allow canceling activation\r\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\toptions.active = collapsing ? false : this.headers.index( clicked );\r\n\r\n\t\t// when the call to ._toggle() comes after the class changes\r\n\t\t// it causes a very odd bug in IE 8 (see #6720)\r\n\t\tthis.active = clickedIsActive ? $() : clicked;\r\n\t\tthis._toggle( eventData );\r\n\r\n\t\t// switch classes\r\n\t\t// corner classes on the previously active header stay after the animation\r\n\t\tactive.removeClass( \"ui-accordion-header-active ui-state-active\" );\r\n\t\tif ( options.icons ) {\r\n\t\t\tactive.children( \".ui-accordion-header-icon\" )\r\n\t\t\t\t.removeClass( options.icons.activeHeader )\r\n\t\t\t\t.addClass( options.icons.header );\r\n\t\t}\r\n\r\n\t\tif ( !clickedIsActive ) {\r\n\t\t\tclicked\r\n\t\t\t\t.removeClass( \"ui-corner-all\" )\r\n\t\t\t\t.addClass( \"ui-accordion-header-active ui-state-active ui-corner-top\" );\r\n\t\t\tif ( options.icons ) {\r\n\t\t\t\tclicked.children( \".ui-accordion-header-icon\" )\r\n\t\t\t\t\t.removeClass( options.icons.header )\r\n\t\t\t\t\t.addClass( options.icons.activeHeader );\r\n\t\t\t}\r\n\r\n\t\t\tclicked\r\n\t\t\t\t.next()\r\n\t\t\t\t.addClass( \"ui-accordion-content-active\" );\r\n\t\t}\r\n\t},\r\n\r\n\t_toggle: function( data ) {\r\n\t\tvar toShow = data.newPanel,\r\n\t\t\ttoHide = this.prevShow.length ? this.prevShow : data.oldPanel;\r\n\r\n\t\t// handle activating a panel during the animation for another activation\r\n\t\tthis.prevShow.add( this.prevHide ).stop( true, true );\r\n\t\tthis.prevShow = toShow;\r\n\t\tthis.prevHide = toHide;\r\n\r\n\t\tif ( this.options.animate ) {\r\n\t\t\tthis._animate( toShow, toHide, data );\r\n\t\t} else {\r\n\t\t\ttoHide.hide();\r\n\t\t\ttoShow.show();\r\n\t\t\tthis._toggleComplete( data );\r\n\t\t}\r\n\r\n\t\ttoHide.attr({\r\n\t\t\t\"aria-hidden\": \"true\"\r\n\t\t});\r\n\t\ttoHide.prev().attr({\r\n\t\t\t\"aria-selected\": \"false\",\r\n\t\t\t\"aria-expanded\": \"false\"\r\n\t\t});\r\n\t\t// if we're switching panels, remove the old header from the tab order\r\n\t\t// if we're opening from collapsed state, remove the previous header from the tab order\r\n\t\t// if we're collapsing, then keep the collapsing header in the tab order\r\n\t\tif ( toShow.length && toHide.length ) {\r\n\t\t\ttoHide.prev().attr({\r\n\t\t\t\t\"tabIndex\": -1,\r\n\t\t\t\t\"aria-expanded\": \"false\"\r\n\t\t\t});\r\n\t\t} else if ( toShow.length ) {\r\n\t\t\tthis.headers.filter(function() {\r\n\t\t\t\treturn parseInt( $( this ).attr( \"tabIndex\" ), 10 ) === 0;\r\n\t\t\t})\r\n\t\t\t.attr( \"tabIndex\", -1 );\r\n\t\t}\r\n\r\n\t\ttoShow\r\n\t\t\t.attr( \"aria-hidden\", \"false\" )\r\n\t\t\t.prev()\r\n\t\t\t\t.attr({\r\n\t\t\t\t\t\"aria-selected\": \"true\",\r\n\t\t\t\t\t\"aria-expanded\": \"true\",\r\n\t\t\t\t\ttabIndex: 0\r\n\t\t\t\t});\r\n\t},\r\n\r\n\t_animate: function( toShow, toHide, data ) {\r\n\t\tvar total, easing, duration,\r\n\t\t\tthat = this,\r\n\t\t\tadjust = 0,\r\n\t\t\tboxSizing = toShow.css( \"box-sizing\" ),\r\n\t\t\tdown = toShow.length &&\r\n\t\t\t\t( !toHide.length || ( toShow.index() < toHide.index() ) ),\r\n\t\t\tanimate = this.options.animate || {},\r\n\t\t\toptions = down && animate.down || animate,\r\n\t\t\tcomplete = function() {\r\n\t\t\t\tthat._toggleComplete( data );\r\n\t\t\t};\r\n\r\n\t\tif ( typeof options === \"number\" ) {\r\n\t\t\tduration = options;\r\n\t\t}\r\n\t\tif ( typeof options === \"string\" ) {\r\n\t\t\teasing = options;\r\n\t\t}\r\n\t\t// fall back from options to animation in case of partial down settings\r\n\t\teasing = easing || options.easing || animate.easing;\r\n\t\tduration = duration || options.duration || animate.duration;\r\n\r\n\t\tif ( !toHide.length ) {\r\n\t\t\treturn toShow.animate( this.showProps, duration, easing, complete );\r\n\t\t}\r\n\t\tif ( !toShow.length ) {\r\n\t\t\treturn toHide.animate( this.hideProps, duration, easing, complete );\r\n\t\t}\r\n\r\n\t\ttotal = toShow.show().outerHeight();\r\n\t\ttoHide.animate( this.hideProps, {\r\n\t\t\tduration: duration,\r\n\t\t\teasing: easing,\r\n\t\t\tstep: function( now, fx ) {\r\n\t\t\t\tfx.now = Math.round( now );\r\n\t\t\t}\r\n\t\t});\r\n\t\ttoShow\r\n\t\t\t.hide()\r\n\t\t\t.animate( this.showProps, {\r\n\t\t\t\tduration: duration,\r\n\t\t\t\teasing: easing,\r\n\t\t\t\tcomplete: complete,\r\n\t\t\t\tstep: function( now, fx ) {\r\n\t\t\t\t\tfx.now = Math.round( now );\r\n\t\t\t\t\tif ( fx.prop !== \"height\" ) {\r\n\t\t\t\t\t\tif ( boxSizing === \"content-box\" ) {\r\n\t\t\t\t\t\t\tadjust += fx.now;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if ( that.options.heightStyle !== \"content\" ) {\r\n\t\t\t\t\t\tfx.now = Math.round( total - toHide.outerHeight() - adjust );\r\n\t\t\t\t\t\tadjust = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t},\r\n\r\n\t_toggleComplete: function( data ) {\r\n\t\tvar toHide = data.oldPanel;\r\n\r\n\t\ttoHide\r\n\t\t\t.removeClass( \"ui-accordion-content-active\" )\r\n\t\t\t.prev()\r\n\t\t\t\t.removeClass( \"ui-corner-top\" )\r\n\t\t\t\t.addClass( \"ui-corner-all\" );\r\n\r\n\t\t// Work around for rendering bug in IE (#5421)\r\n\t\tif ( toHide.length ) {\r\n\t\t\ttoHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className;\r\n\t\t}\r\n\t\tthis._trigger( \"activate\", null, data );\r\n\t}\r\n});\r\n\r\n\r\n/*!\r\n * jQuery UI Menu 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/menu/\r\n */\r\n\r\n\r\nvar menu = $.widget( \"ui.menu\", {\r\n\tversion: \"1.11.4\",\r\n\tdefaultElement: \"<ul>\",\r\n\tdelay: 300,\r\n\toptions: {\r\n\t\ticons: {\r\n\t\t\tsubmenu: \"ui-icon-carat-1-e\"\r\n\t\t},\r\n\t\titems: \"> *\",\r\n\t\tmenus: \"ul\",\r\n\t\tposition: {\r\n\t\t\tmy: \"left-1 top\",\r\n\t\t\tat: \"right top\"\r\n\t\t},\r\n\t\trole: \"menu\",\r\n\r\n\t\t// callbacks\r\n\t\tblur: null,\r\n\t\tfocus: null,\r\n\t\tselect: null\r\n\t},\r\n\r\n\t_create: function() {\r\n\t\tthis.activeMenu = this.element;\r\n\r\n\t\t// Flag used to prevent firing of the click handler\r\n\t\t// as the event bubbles up through nested menus\r\n\t\tthis.mouseHandled = false;\r\n\t\tthis.element\r\n\t\t\t.uniqueId()\r\n\t\t\t.addClass( \"ui-menu ui-widget ui-widget-content\" )\r\n\t\t\t.toggleClass( \"ui-menu-icons\", !!this.element.find( \".ui-icon\" ).length )\r\n\t\t\t.attr({\r\n\t\t\t\trole: this.options.role,\r\n\t\t\t\ttabIndex: 0\r\n\t\t\t});\r\n\r\n\t\tif ( this.options.disabled ) {\r\n\t\t\tthis.element\r\n\t\t\t\t.addClass( \"ui-state-disabled\" )\r\n\t\t\t\t.attr( \"aria-disabled\", \"true\" );\r\n\t\t}\r\n\r\n\t\tthis._on({\r\n\t\t\t// Prevent focus from sticking to links inside menu after clicking\r\n\t\t\t// them (focus should always stay on UL during navigation).\r\n\t\t\t\"mousedown .ui-menu-item\": function( event ) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t},\r\n\t\t\t\"click .ui-menu-item\": function( event ) {\r\n\t\t\t\tvar target = $( event.target );\r\n\t\t\t\tif ( !this.mouseHandled && target.not( \".ui-state-disabled\" ).length ) {\r\n\t\t\t\t\tthis.select( event );\r\n\r\n\t\t\t\t\t// Only set the mouseHandled flag if the event will bubble, see #9469.\r\n\t\t\t\t\tif ( !event.isPropagationStopped() ) {\r\n\t\t\t\t\t\tthis.mouseHandled = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Open submenu on click\r\n\t\t\t\t\tif ( target.has( \".ui-menu\" ).length ) {\r\n\t\t\t\t\t\tthis.expand( event );\r\n\t\t\t\t\t} else if ( !this.element.is( \":focus\" ) && $( this.document[ 0 ].activeElement ).closest( \".ui-menu\" ).length ) {\r\n\r\n\t\t\t\t\t\t// Redirect focus to the menu\r\n\t\t\t\t\t\tthis.element.trigger( \"focus\", [ true ] );\r\n\r\n\t\t\t\t\t\t// If the active item is on the top level, let it stay active.\r\n\t\t\t\t\t\t// Otherwise, blur the active item since it is no longer visible.\r\n\t\t\t\t\t\tif ( this.active && this.active.parents( \".ui-menu\" ).length === 1 ) {\r\n\t\t\t\t\t\t\tclearTimeout( this.timer );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t\"mouseenter .ui-menu-item\": function( event ) {\r\n\t\t\t\t// Ignore mouse events while typeahead is active, see #10458.\r\n\t\t\t\t// Prevents focusing the wrong item when typeahead causes a scroll while the mouse\r\n\t\t\t\t// is over an item in the menu\r\n\t\t\t\tif ( this.previousFilter ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar target = $( event.currentTarget );\r\n\t\t\t\t// Remove ui-state-active class from siblings of the newly focused menu item\r\n\t\t\t\t// to avoid a jump caused by adjacent elements both having a class with a border\r\n\t\t\t\ttarget.siblings( \".ui-state-active\" ).removeClass( \"ui-state-active\" );\r\n\t\t\t\tthis.focus( event, target );\r\n\t\t\t},\r\n\t\t\tmouseleave: \"collapseAll\",\r\n\t\t\t\"mouseleave .ui-menu\": \"collapseAll\",\r\n\t\t\tfocus: function( event, keepActiveItem ) {\r\n\t\t\t\t// If there's already an active item, keep it active\r\n\t\t\t\t// If not, activate the first item\r\n\t\t\t\tvar item = this.active || this.element.find( this.options.items ).eq( 0 );\r\n\r\n\t\t\t\tif ( !keepActiveItem ) {\r\n\t\t\t\t\tthis.focus( event, item );\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tblur: function( event ) {\r\n\t\t\t\tthis._delay(function() {\r\n\t\t\t\t\tif ( !$.contains( this.element[0], this.document[0].activeElement ) ) {\r\n\t\t\t\t\t\tthis.collapseAll( event );\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\tkeydown: \"_keydown\"\r\n\t\t});\r\n\r\n\t\tthis.refresh();\r\n\r\n\t\t// Clicks outside of a menu collapse any open menus\r\n\t\tthis._on( this.document, {\r\n\t\t\tclick: function( event ) {\r\n\t\t\t\tif ( this._closeOnDocumentClick( event ) ) {\r\n\t\t\t\t\tthis.collapseAll( event );\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Reset the mouseHandled flag\r\n\t\t\t\tthis.mouseHandled = false;\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\t// Destroy (sub)menus\r\n\t\tthis.element\r\n\t\t\t.removeAttr( \"aria-activedescendant\" )\r\n\t\t\t.find( \".ui-menu\" ).addBack()\r\n\t\t\t\t.removeClass( \"ui-menu ui-widget ui-widget-content ui-menu-icons ui-front\" )\r\n\t\t\t\t.removeAttr( \"role\" )\r\n\t\t\t\t.removeAttr( \"tabIndex\" )\r\n\t\t\t\t.removeAttr( \"aria-labelledby\" )\r\n\t\t\t\t.removeAttr( \"aria-expanded\" )\r\n\t\t\t\t.removeAttr( \"aria-hidden\" )\r\n\t\t\t\t.removeAttr( \"aria-disabled\" )\r\n\t\t\t\t.removeUniqueId()\r\n\t\t\t\t.show();\r\n\r\n\t\t// Destroy menu items\r\n\t\tthis.element.find( \".ui-menu-item\" )\r\n\t\t\t.removeClass( \"ui-menu-item\" )\r\n\t\t\t.removeAttr( \"role\" )\r\n\t\t\t.removeAttr( \"aria-disabled\" )\r\n\t\t\t.removeUniqueId()\r\n\t\t\t.removeClass( \"ui-state-hover\" )\r\n\t\t\t.removeAttr( \"tabIndex\" )\r\n\t\t\t.removeAttr( \"role\" )\r\n\t\t\t.removeAttr( \"aria-haspopup\" )\r\n\t\t\t.children().each( function() {\r\n\t\t\t\tvar elem = $( this );\r\n\t\t\t\tif ( elem.data( \"ui-menu-submenu-carat\" ) ) {\r\n\t\t\t\t\telem.remove();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t// Destroy menu dividers\r\n\t\tthis.element.find( \".ui-menu-divider\" ).removeClass( \"ui-menu-divider ui-widget-content\" );\r\n\t},\r\n\r\n\t_keydown: function( event ) {\r\n\t\tvar match, prev, character, skip,\r\n\t\t\tpreventDefault = true;\r\n\r\n\t\tswitch ( event.keyCode ) {\r\n\t\tcase $.ui.keyCode.PAGE_UP:\r\n\t\t\tthis.previousPage( event );\r\n\t\t\tbreak;\r\n\t\tcase $.ui.keyCode.PAGE_DOWN:\r\n\t\t\tthis.nextPage( event );\r\n\t\t\tbreak;\r\n\t\tcase $.ui.keyCode.HOME:\r\n\t\t\tthis._move( \"first\", \"first\", event );\r\n\t\t\tbreak;\r\n\t\tcase $.ui.keyCode.END:\r\n\t\t\tthis._move( \"last\", \"last\", event );\r\n\t\t\tbreak;\r\n\t\tcase $.ui.keyCode.UP:\r\n\t\t\tthis.previous( event );\r\n\t\t\tbreak;\r\n\t\tcase $.ui.keyCode.DOWN:\r\n\t\t\tthis.next( event );\r\n\t\t\tbreak;\r\n\t\tcase $.ui.keyCode.LEFT:\r\n\t\t\tthis.collapse( event );\r\n\t\t\tbreak;\r\n\t\tcase $.ui.keyCode.RIGHT:\r\n\t\t\tif ( this.active && !this.active.is( \".ui-state-disabled\" ) ) {\r\n\t\t\t\tthis.expand( event );\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase $.ui.keyCode.ENTER:\r\n\t\tcase $.ui.keyCode.SPACE:\r\n\t\t\tthis._activate( event );\r\n\t\t\tbreak;\r\n\t\tcase $.ui.keyCode.ESCAPE:\r\n\t\t\tthis.collapse( event );\r\n\t\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tpreventDefault = false;\r\n\t\t\tprev = this.previousFilter || \"\";\r\n\t\t\tcharacter = String.fromCharCode( event.keyCode );\r\n\t\t\tskip = false;\r\n\r\n\t\t\tclearTimeout( this.filterTimer );\r\n\r\n\t\t\tif ( character === prev ) {\r\n\t\t\t\tskip = true;\r\n\t\t\t} else {\r\n\t\t\t\tcharacter = prev + character;\r\n\t\t\t}\r\n\r\n\t\t\tmatch = this._filterMenuItems( character );\r\n\t\t\tmatch = skip && match.index( this.active.next() ) !== -1 ?\r\n\t\t\t\tthis.active.nextAll( \".ui-menu-item\" ) :\r\n\t\t\t\tmatch;\r\n\r\n\t\t\t// If no matches on the current filter, reset to the last character pressed\r\n\t\t\t// to move down the menu to the first item that starts with that character\r\n\t\t\tif ( !match.length ) {\r\n\t\t\t\tcharacter = String.fromCharCode( event.keyCode );\r\n\t\t\t\tmatch = this._filterMenuItems( character );\r\n\t\t\t}\r\n\r\n\t\t\tif ( match.length ) {\r\n\t\t\t\tthis.focus( event, match );\r\n\t\t\t\tthis.previousFilter = character;\r\n\t\t\t\tthis.filterTimer = this._delay(function() {\r\n\t\t\t\t\tdelete this.previousFilter;\r\n\t\t\t\t}, 1000 );\r\n\t\t\t} else {\r\n\t\t\t\tdelete this.previousFilter;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( preventDefault ) {\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t},\r\n\r\n\t_activate: function( event ) {\r\n\t\tif ( !this.active.is( \".ui-state-disabled\" ) ) {\r\n\t\t\tif ( this.active.is( \"[aria-haspopup='true']\" ) ) {\r\n\t\t\t\tthis.expand( event );\r\n\t\t\t} else {\r\n\t\t\t\tthis.select( event );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\trefresh: function() {\r\n\t\tvar menus, items,\r\n\t\t\tthat = this,\r\n\t\t\ticon = this.options.icons.submenu,\r\n\t\t\tsubmenus = this.element.find( this.options.menus );\r\n\r\n\t\tthis.element.toggleClass( \"ui-menu-icons\", !!this.element.find( \".ui-icon\" ).length );\r\n\r\n\t\t// Initialize nested menus\r\n\t\tsubmenus.filter( \":not(.ui-menu)\" )\r\n\t\t\t.addClass( \"ui-menu ui-widget ui-widget-content ui-front\" )\r\n\t\t\t.hide()\r\n\t\t\t.attr({\r\n\t\t\t\trole: this.options.role,\r\n\t\t\t\t\"aria-hidden\": \"true\",\r\n\t\t\t\t\"aria-expanded\": \"false\"\r\n\t\t\t})\r\n\t\t\t.each(function() {\r\n\t\t\t\tvar menu = $( this ),\r\n\t\t\t\t\titem = menu.parent(),\r\n\t\t\t\t\tsubmenuCarat = $( \"<span>\" )\r\n\t\t\t\t\t\t.addClass( \"ui-menu-icon ui-icon \" + icon )\r\n\t\t\t\t\t\t.data( \"ui-menu-submenu-carat\", true );\r\n\r\n\t\t\t\titem\r\n\t\t\t\t\t.attr( \"aria-haspopup\", \"true\" )\r\n\t\t\t\t\t.prepend( submenuCarat );\r\n\t\t\t\tmenu.attr( \"aria-labelledby\", item.attr( \"id\" ) );\r\n\t\t\t});\r\n\r\n\t\tmenus = submenus.add( this.element );\r\n\t\titems = menus.find( this.options.items );\r\n\r\n\t\t// Initialize menu-items containing spaces and/or dashes only as dividers\r\n\t\titems.not( \".ui-menu-item\" ).each(function() {\r\n\t\t\tvar item = $( this );\r\n\t\t\tif ( that._isDivider( item ) ) {\r\n\t\t\t\titem.addClass( \"ui-widget-content ui-menu-divider\" );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Don't refresh list items that are already adapted\r\n\t\titems.not( \".ui-menu-item, .ui-menu-divider\" )\r\n\t\t\t.addClass( \"ui-menu-item\" )\r\n\t\t\t.uniqueId()\r\n\t\t\t.attr({\r\n\t\t\t\ttabIndex: -1,\r\n\t\t\t\trole: this._itemRole()\r\n\t\t\t});\r\n\r\n\t\t// Add aria-disabled attribute to any disabled menu item\r\n\t\titems.filter( \".ui-state-disabled\" ).attr( \"aria-disabled\", \"true\" );\r\n\r\n\t\t// If the active item has been removed, blur the menu\r\n\t\tif ( this.active && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {\r\n\t\t\tthis.blur();\r\n\t\t}\r\n\t},\r\n\r\n\t_itemRole: function() {\r\n\t\treturn {\r\n\t\t\tmenu: \"menuitem\",\r\n\t\t\tlistbox: \"option\"\r\n\t\t}[ this.options.role ];\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tif ( key === \"icons\" ) {\r\n\t\t\tthis.element.find( \".ui-menu-icon\" )\r\n\t\t\t\t.removeClass( this.options.icons.submenu )\r\n\t\t\t\t.addClass( value.submenu );\r\n\t\t}\r\n\t\tif ( key === \"disabled\" ) {\r\n\t\t\tthis.element\r\n\t\t\t\t.toggleClass( \"ui-state-disabled\", !!value )\r\n\t\t\t\t.attr( \"aria-disabled\", value );\r\n\t\t}\r\n\t\tthis._super( key, value );\r\n\t},\r\n\r\n\tfocus: function( event, item ) {\r\n\t\tvar nested, focused;\r\n\t\tthis.blur( event, event && event.type === \"focus\" );\r\n\r\n\t\tthis._scrollIntoView( item );\r\n\r\n\t\tthis.active = item.first();\r\n\t\tfocused = this.active.addClass( \"ui-state-focus\" ).removeClass( \"ui-state-active\" );\r\n\t\t// Only update aria-activedescendant if there's a role\r\n\t\t// otherwise we assume focus is managed elsewhere\r\n\t\tif ( this.options.role ) {\r\n\t\t\tthis.element.attr( \"aria-activedescendant\", focused.attr( \"id\" ) );\r\n\t\t}\r\n\r\n\t\t// Highlight active parent menu item, if any\r\n\t\tthis.active\r\n\t\t\t.parent()\r\n\t\t\t.closest( \".ui-menu-item\" )\r\n\t\t\t.addClass( \"ui-state-active\" );\r\n\r\n\t\tif ( event && event.type === \"keydown\" ) {\r\n\t\t\tthis._close();\r\n\t\t} else {\r\n\t\t\tthis.timer = this._delay(function() {\r\n\t\t\t\tthis._close();\r\n\t\t\t}, this.delay );\r\n\t\t}\r\n\r\n\t\tnested = item.children( \".ui-menu\" );\r\n\t\tif ( nested.length && event && ( /^mouse/.test( event.type ) ) ) {\r\n\t\t\tthis._startOpening(nested);\r\n\t\t}\r\n\t\tthis.activeMenu = item.parent();\r\n\r\n\t\tthis._trigger( \"focus\", event, { item: item } );\r\n\t},\r\n\r\n\t_scrollIntoView: function( item ) {\r\n\t\tvar borderTop, paddingTop, offset, scroll, elementHeight, itemHeight;\r\n\t\tif ( this._hasScroll() ) {\r\n\t\t\tborderTop = parseFloat( $.css( this.activeMenu[0], \"borderTopWidth\" ) ) || 0;\r\n\t\t\tpaddingTop = parseFloat( $.css( this.activeMenu[0], \"paddingTop\" ) ) || 0;\r\n\t\t\toffset = item.offset().top - this.activeMenu.offset().top - borderTop - paddingTop;\r\n\t\t\tscroll = this.activeMenu.scrollTop();\r\n\t\t\telementHeight = this.activeMenu.height();\r\n\t\t\titemHeight = item.outerHeight();\r\n\r\n\t\t\tif ( offset < 0 ) {\r\n\t\t\t\tthis.activeMenu.scrollTop( scroll + offset );\r\n\t\t\t} else if ( offset + itemHeight > elementHeight ) {\r\n\t\t\t\tthis.activeMenu.scrollTop( scroll + offset - elementHeight + itemHeight );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tblur: function( event, fromFocus ) {\r\n\t\tif ( !fromFocus ) {\r\n\t\t\tclearTimeout( this.timer );\r\n\t\t}\r\n\r\n\t\tif ( !this.active ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.active.removeClass( \"ui-state-focus\" );\r\n\t\tthis.active = null;\r\n\r\n\t\tthis._trigger( \"blur\", event, { item: this.active } );\r\n\t},\r\n\r\n\t_startOpening: function( submenu ) {\r\n\t\tclearTimeout( this.timer );\r\n\r\n\t\t// Don't open if already open fixes a Firefox bug that caused a .5 pixel\r\n\t\t// shift in the submenu position when mousing over the carat icon\r\n\t\tif ( submenu.attr( \"aria-hidden\" ) !== \"true\" ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.timer = this._delay(function() {\r\n\t\t\tthis._close();\r\n\t\t\tthis._open( submenu );\r\n\t\t}, this.delay );\r\n\t},\r\n\r\n\t_open: function( submenu ) {\r\n\t\tvar position = $.extend({\r\n\t\t\tof: this.active\r\n\t\t}, this.options.position );\r\n\r\n\t\tclearTimeout( this.timer );\r\n\t\tthis.element.find( \".ui-menu\" ).not( submenu.parents( \".ui-menu\" ) )\r\n\t\t\t.hide()\r\n\t\t\t.attr( \"aria-hidden\", \"true\" );\r\n\r\n\t\tsubmenu\r\n\t\t\t.show()\r\n\t\t\t.removeAttr( \"aria-hidden\" )\r\n\t\t\t.attr( \"aria-expanded\", \"true\" )\r\n\t\t\t.position( position );\r\n\t},\r\n\r\n\tcollapseAll: function( event, all ) {\r\n\t\tclearTimeout( this.timer );\r\n\t\tthis.timer = this._delay(function() {\r\n\t\t\t// If we were passed an event, look for the submenu that contains the event\r\n\t\t\tvar currentMenu = all ? this.element :\r\n\t\t\t\t$( event && event.target ).closest( this.element.find( \".ui-menu\" ) );\r\n\r\n\t\t\t// If we found no valid submenu ancestor, use the main menu to close all sub menus anyway\r\n\t\t\tif ( !currentMenu.length ) {\r\n\t\t\t\tcurrentMenu = this.element;\r\n\t\t\t}\r\n\r\n\t\t\tthis._close( currentMenu );\r\n\r\n\t\t\tthis.blur( event );\r\n\t\t\tthis.activeMenu = currentMenu;\r\n\t\t}, this.delay );\r\n\t},\r\n\r\n\t// With no arguments, closes the currently active menu - if nothing is active\r\n\t// it closes all menus. If passed an argument, it will search for menus BELOW\r\n\t_close: function( startMenu ) {\r\n\t\tif ( !startMenu ) {\r\n\t\t\tstartMenu = this.active ? this.active.parent() : this.element;\r\n\t\t}\r\n\r\n\t\tstartMenu\r\n\t\t\t.find( \".ui-menu\" )\r\n\t\t\t\t.hide()\r\n\t\t\t\t.attr( \"aria-hidden\", \"true\" )\r\n\t\t\t\t.attr( \"aria-expanded\", \"false\" )\r\n\t\t\t.end()\r\n\t\t\t.find( \".ui-state-active\" ).not( \".ui-state-focus\" )\r\n\t\t\t\t.removeClass( \"ui-state-active\" );\r\n\t},\r\n\r\n\t_closeOnDocumentClick: function( event ) {\r\n\t\treturn !$( event.target ).closest( \".ui-menu\" ).length;\r\n\t},\r\n\r\n\t_isDivider: function( item ) {\r\n\r\n\t\t// Match hyphen, em dash, en dash\r\n\t\treturn !/[^\\-\\u2014\\u2013\\s]/.test( item.text() );\r\n\t},\r\n\r\n\tcollapse: function( event ) {\r\n\t\tvar newItem = this.active &&\r\n\t\t\tthis.active.parent().closest( \".ui-menu-item\", this.element );\r\n\t\tif ( newItem && newItem.length ) {\r\n\t\t\tthis._close();\r\n\t\t\tthis.focus( event, newItem );\r\n\t\t}\r\n\t},\r\n\r\n\texpand: function( event ) {\r\n\t\tvar newItem = this.active &&\r\n\t\t\tthis.active\r\n\t\t\t\t.children( \".ui-menu \" )\r\n\t\t\t\t.find( this.options.items )\r\n\t\t\t\t.first();\r\n\r\n\t\tif ( newItem && newItem.length ) {\r\n\t\t\tthis._open( newItem.parent() );\r\n\r\n\t\t\t// Delay so Firefox will not hide activedescendant change in expanding submenu from AT\r\n\t\t\tthis._delay(function() {\r\n\t\t\t\tthis.focus( event, newItem );\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\tnext: function( event ) {\r\n\t\tthis._move( \"next\", \"first\", event );\r\n\t},\r\n\r\n\tprevious: function( event ) {\r\n\t\tthis._move( \"prev\", \"last\", event );\r\n\t},\r\n\r\n\tisFirstItem: function() {\r\n\t\treturn this.active && !this.active.prevAll( \".ui-menu-item\" ).length;\r\n\t},\r\n\r\n\tisLastItem: function() {\r\n\t\treturn this.active && !this.active.nextAll( \".ui-menu-item\" ).length;\r\n\t},\r\n\r\n\t_move: function( direction, filter, event ) {\r\n\t\tvar next;\r\n\t\tif ( this.active ) {\r\n\t\t\tif ( direction === \"first\" || direction === \"last\" ) {\r\n\t\t\t\tnext = this.active\r\n\t\t\t\t\t[ direction === \"first\" ? \"prevAll\" : \"nextAll\" ]( \".ui-menu-item\" )\r\n\t\t\t\t\t.eq( -1 );\r\n\t\t\t} else {\r\n\t\t\t\tnext = this.active\r\n\t\t\t\t\t[ direction + \"All\" ]( \".ui-menu-item\" )\r\n\t\t\t\t\t.eq( 0 );\r\n\t\t\t}\r\n\t\t}\r\n\t\tif ( !next || !next.length || !this.active ) {\r\n\t\t\tnext = this.activeMenu.find( this.options.items )[ filter ]();\r\n\t\t}\r\n\r\n\t\tthis.focus( event, next );\r\n\t},\r\n\r\n\tnextPage: function( event ) {\r\n\t\tvar item, base, height;\r\n\r\n\t\tif ( !this.active ) {\r\n\t\t\tthis.next( event );\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif ( this.isLastItem() ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif ( this._hasScroll() ) {\r\n\t\t\tbase = this.active.offset().top;\r\n\t\t\theight = this.element.height();\r\n\t\t\tthis.active.nextAll( \".ui-menu-item\" ).each(function() {\r\n\t\t\t\titem = $( this );\r\n\t\t\t\treturn item.offset().top - base - height < 0;\r\n\t\t\t});\r\n\r\n\t\t\tthis.focus( event, item );\r\n\t\t} else {\r\n\t\t\tthis.focus( event, this.activeMenu.find( this.options.items )\r\n\t\t\t\t[ !this.active ? \"first\" : \"last\" ]() );\r\n\t\t}\r\n\t},\r\n\r\n\tpreviousPage: function( event ) {\r\n\t\tvar item, base, height;\r\n\t\tif ( !this.active ) {\r\n\t\t\tthis.next( event );\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif ( this.isFirstItem() ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif ( this._hasScroll() ) {\r\n\t\t\tbase = this.active.offset().top;\r\n\t\t\theight = this.element.height();\r\n\t\t\tthis.active.prevAll( \".ui-menu-item\" ).each(function() {\r\n\t\t\t\titem = $( this );\r\n\t\t\t\treturn item.offset().top - base + height > 0;\r\n\t\t\t});\r\n\r\n\t\t\tthis.focus( event, item );\r\n\t\t} else {\r\n\t\t\tthis.focus( event, this.activeMenu.find( this.options.items ).first() );\r\n\t\t}\r\n\t},\r\n\r\n\t_hasScroll: function() {\r\n\t\treturn this.element.outerHeight() < this.element.prop( \"scrollHeight\" );\r\n\t},\r\n\r\n\tselect: function( event ) {\r\n\t\t// TODO: It should never be possible to not have an active item at this\r\n\t\t// point, but the tests don't trigger mouseenter before click.\r\n\t\tthis.active = this.active || $( event.target ).closest( \".ui-menu-item\" );\r\n\t\tvar ui = { item: this.active };\r\n\t\tif ( !this.active.has( \".ui-menu\" ).length ) {\r\n\t\t\tthis.collapseAll( event, true );\r\n\t\t}\r\n\t\tthis._trigger( \"select\", event, ui );\r\n\t},\r\n\r\n\t_filterMenuItems: function(character) {\r\n\t\tvar escapedCharacter = character.replace( /[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\" ),\r\n\t\t\tregex = new RegExp( \"^\" + escapedCharacter, \"i\" );\r\n\r\n\t\treturn this.activeMenu\r\n\t\t\t.find( this.options.items )\r\n\r\n\t\t\t// Only match on items, not dividers or other content (#10571)\r\n\t\t\t.filter( \".ui-menu-item\" )\r\n\t\t\t.filter(function() {\r\n\t\t\t\treturn regex.test( $.trim( $( this ).text() ) );\r\n\t\t\t});\r\n\t}\r\n});\r\n\r\n\r\n/*!\r\n * jQuery UI Autocomplete 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/autocomplete/\r\n */\r\n\r\n\r\n$.widget( \"ui.autocomplete\", {\r\n\tversion: \"1.11.4\",\r\n\tdefaultElement: \"<input>\",\r\n\toptions: {\r\n\t\tappendTo: null,\r\n\t\tautoFocus: false,\r\n\t\tdelay: 300,\r\n\t\tminLength: 1,\r\n\t\tposition: {\r\n\t\t\tmy: \"left top\",\r\n\t\t\tat: \"left bottom\",\r\n\t\t\tcollision: \"none\"\r\n\t\t},\r\n\t\tsource: null,\r\n\r\n\t\t// callbacks\r\n\t\tchange: null,\r\n\t\tclose: null,\r\n\t\tfocus: null,\r\n\t\topen: null,\r\n\t\tresponse: null,\r\n\t\tsearch: null,\r\n\t\tselect: null\r\n\t},\r\n\r\n\trequestIndex: 0,\r\n\tpending: 0,\r\n\r\n\t_create: function() {\r\n\t\t// Some browsers only repeat keydown events, not keypress events,\r\n\t\t// so we use the suppressKeyPress flag to determine if we've already\r\n\t\t// handled the keydown event. #7269\r\n\t\t// Unfortunately the code for & in keypress is the same as the up arrow,\r\n\t\t// so we use the suppressKeyPressRepeat flag to avoid handling keypress\r\n\t\t// events when we know the keydown event was used to modify the\r\n\t\t// search term. #7799\r\n\t\tvar suppressKeyPress, suppressKeyPressRepeat, suppressInput,\r\n\t\t\tnodeName = this.element[ 0 ].nodeName.toLowerCase(),\r\n\t\t\tisTextarea = nodeName === \"textarea\",\r\n\t\t\tisInput = nodeName === \"input\";\r\n\r\n\t\tthis.isMultiLine =\r\n\t\t\t// Textareas are always multi-line\r\n\t\t\tisTextarea ? true :\r\n\t\t\t// Inputs are always single-line, even if inside a contentEditable element\r\n\t\t\t// IE also treats inputs as contentEditable\r\n\t\t\tisInput ? false :\r\n\t\t\t// All other element types are determined by whether or not they're contentEditable\r\n\t\t\tthis.element.prop( \"isContentEditable\" );\r\n\r\n\t\tthis.valueMethod = this.element[ isTextarea || isInput ? \"val\" : \"text\" ];\r\n\t\tthis.isNewMenu = true;\r\n\r\n\t\tthis.element\r\n\t\t\t.addClass( \"ui-autocomplete-input\" )\r\n\t\t\t.attr( \"autocomplete\", \"off\" );\r\n\r\n\t\tthis._on( this.element, {\r\n\t\t\tkeydown: function( event ) {\r\n\t\t\t\tif ( this.element.prop( \"readOnly\" ) ) {\r\n\t\t\t\t\tsuppressKeyPress = true;\r\n\t\t\t\t\tsuppressInput = true;\r\n\t\t\t\t\tsuppressKeyPressRepeat = true;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsuppressKeyPress = false;\r\n\t\t\t\tsuppressInput = false;\r\n\t\t\t\tsuppressKeyPressRepeat = false;\r\n\t\t\t\tvar keyCode = $.ui.keyCode;\r\n\t\t\t\tswitch ( event.keyCode ) {\r\n\t\t\t\tcase keyCode.PAGE_UP:\r\n\t\t\t\t\tsuppressKeyPress = true;\r\n\t\t\t\t\tthis._move( \"previousPage\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.PAGE_DOWN:\r\n\t\t\t\t\tsuppressKeyPress = true;\r\n\t\t\t\t\tthis._move( \"nextPage\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.UP:\r\n\t\t\t\t\tsuppressKeyPress = true;\r\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.DOWN:\r\n\t\t\t\t\tsuppressKeyPress = true;\r\n\t\t\t\t\tthis._keyEvent( \"next\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.ENTER:\r\n\t\t\t\t\t// when menu is open and has focus\r\n\t\t\t\t\tif ( this.menu.active ) {\r\n\t\t\t\t\t\t// #6055 - Opera still allows the keypress to occur\r\n\t\t\t\t\t\t// which causes forms to submit\r\n\t\t\t\t\t\tsuppressKeyPress = true;\r\n\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\tthis.menu.select( event );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.TAB:\r\n\t\t\t\t\tif ( this.menu.active ) {\r\n\t\t\t\t\t\tthis.menu.select( event );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.ESCAPE:\r\n\t\t\t\t\tif ( this.menu.element.is( \":visible\" ) ) {\r\n\t\t\t\t\t\tif ( !this.isMultiLine ) {\r\n\t\t\t\t\t\t\tthis._value( this.term );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tthis.close( event );\r\n\t\t\t\t\t\t// Different browsers have different default behavior for escape\r\n\t\t\t\t\t\t// Single press can mean undo or clear\r\n\t\t\t\t\t\t// Double press in IE means clear the whole form\r\n\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tsuppressKeyPressRepeat = true;\r\n\t\t\t\t\t// search timeout should be triggered before the input value is changed\r\n\t\t\t\t\tthis._searchTimeout( event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tkeypress: function( event ) {\r\n\t\t\t\tif ( suppressKeyPress ) {\r\n\t\t\t\t\tsuppressKeyPress = false;\r\n\t\t\t\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\r\n\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif ( suppressKeyPressRepeat ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// replicate some key handlers to allow them to repeat in Firefox and Opera\r\n\t\t\t\tvar keyCode = $.ui.keyCode;\r\n\t\t\t\tswitch ( event.keyCode ) {\r\n\t\t\t\tcase keyCode.PAGE_UP:\r\n\t\t\t\t\tthis._move( \"previousPage\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.PAGE_DOWN:\r\n\t\t\t\t\tthis._move( \"nextPage\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.UP:\r\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.DOWN:\r\n\t\t\t\t\tthis._keyEvent( \"next\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tinput: function( event ) {\r\n\t\t\t\tif ( suppressInput ) {\r\n\t\t\t\t\tsuppressInput = false;\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis._searchTimeout( event );\r\n\t\t\t},\r\n\t\t\tfocus: function() {\r\n\t\t\t\tthis.selectedItem = null;\r\n\t\t\t\tthis.previous = this._value();\r\n\t\t\t},\r\n\t\t\tblur: function( event ) {\r\n\t\t\t\tif ( this.cancelBlur ) {\r\n\t\t\t\t\tdelete this.cancelBlur;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tclearTimeout( this.searching );\r\n\t\t\t\tthis.close( event );\r\n\t\t\t\tthis._change( event );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis._initSource();\r\n\t\tthis.menu = $( \"<ul>\" )\r\n\t\t\t.addClass( \"ui-autocomplete ui-front\" )\r\n\t\t\t.appendTo( this._appendTo() )\r\n\t\t\t.menu({\r\n\t\t\t\t// disable ARIA support, the live region takes care of that\r\n\t\t\t\trole: null\r\n\t\t\t})\r\n\t\t\t.hide()\r\n\t\t\t.menu( \"instance\" );\r\n\r\n\t\tthis._on( this.menu.element, {\r\n\t\t\tmousedown: function( event ) {\r\n\t\t\t\t// prevent moving focus out of the text field\r\n\t\t\t\tevent.preventDefault();\r\n\r\n\t\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\r\n\t\t\t\t// so we set a flag to know when we should ignore the blur event\r\n\t\t\t\tthis.cancelBlur = true;\r\n\t\t\t\tthis._delay(function() {\r\n\t\t\t\t\tdelete this.cancelBlur;\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// clicking on the scrollbar causes focus to shift to the body\r\n\t\t\t\t// but we can't detect a mouseup or a click immediately afterward\r\n\t\t\t\t// so we have to track the next mousedown and close the menu if\r\n\t\t\t\t// the user clicks somewhere outside of the autocomplete\r\n\t\t\t\tvar menuElement = this.menu.element[ 0 ];\r\n\t\t\t\tif ( !$( event.target ).closest( \".ui-menu-item\" ).length ) {\r\n\t\t\t\t\tthis._delay(function() {\r\n\t\t\t\t\t\tvar that = this;\r\n\t\t\t\t\t\tthis.document.one( \"mousedown\", function( event ) {\r\n\t\t\t\t\t\t\tif ( event.target !== that.element[ 0 ] &&\r\n\t\t\t\t\t\t\t\t\tevent.target !== menuElement &&\r\n\t\t\t\t\t\t\t\t\t!$.contains( menuElement, event.target ) ) {\r\n\t\t\t\t\t\t\t\tthat.close();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tmenufocus: function( event, ui ) {\r\n\t\t\t\tvar label, item;\r\n\t\t\t\t// support: Firefox\r\n\t\t\t\t// Prevent accidental activation of menu items in Firefox (#7024 #9118)\r\n\t\t\t\tif ( this.isNewMenu ) {\r\n\t\t\t\t\tthis.isNewMenu = false;\r\n\t\t\t\t\tif ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {\r\n\t\t\t\t\t\tthis.menu.blur();\r\n\r\n\t\t\t\t\t\tthis.document.one( \"mousemove\", function() {\r\n\t\t\t\t\t\t\t$( event.target ).trigger( event.originalEvent );\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\titem = ui.item.data( \"ui-autocomplete-item\" );\r\n\t\t\t\tif ( false !== this._trigger( \"focus\", event, { item: item } ) ) {\r\n\t\t\t\t\t// use value to match what will end up in the input, if it was a key event\r\n\t\t\t\t\tif ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {\r\n\t\t\t\t\t\tthis._value( item.value );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Announce the value in the liveRegion\r\n\t\t\t\tlabel = ui.item.attr( \"aria-label\" ) || item.value;\r\n\t\t\t\tif ( label && $.trim( label ).length ) {\r\n\t\t\t\t\tthis.liveRegion.children().hide();\r\n\t\t\t\t\t$( \"<div>\" ).text( label ).appendTo( this.liveRegion );\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tmenuselect: function( event, ui ) {\r\n\t\t\t\tvar item = ui.item.data( \"ui-autocomplete-item\" ),\r\n\t\t\t\t\tprevious = this.previous;\r\n\r\n\t\t\t\t// only trigger when focus was lost (click on menu)\r\n\t\t\t\tif ( this.element[ 0 ] !== this.document[ 0 ].activeElement ) {\r\n\t\t\t\t\tthis.element.focus();\r\n\t\t\t\t\tthis.previous = previous;\r\n\t\t\t\t\t// #6109 - IE triggers two focus events and the second\r\n\t\t\t\t\t// is asynchronous, so we need to reset the previous\r\n\t\t\t\t\t// term synchronously and asynchronously :-(\r\n\t\t\t\t\tthis._delay(function() {\r\n\t\t\t\t\t\tthis.previous = previous;\r\n\t\t\t\t\t\tthis.selectedItem = item;\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( false !== this._trigger( \"select\", event, { item: item } ) ) {\r\n\t\t\t\t\tthis._value( item.value );\r\n\t\t\t\t}\r\n\t\t\t\t// reset the term after the select event\r\n\t\t\t\t// this allows custom select handling to work properly\r\n\t\t\t\tthis.term = this._value();\r\n\r\n\t\t\t\tthis.close( event );\r\n\t\t\t\tthis.selectedItem = item;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.liveRegion = $( \"<span>\", {\r\n\t\t\t\trole: \"status\",\r\n\t\t\t\t\"aria-live\": \"assertive\",\r\n\t\t\t\t\"aria-relevant\": \"additions\"\r\n\t\t\t})\r\n\t\t\t.addClass( \"ui-helper-hidden-accessible\" )\r\n\t\t\t.appendTo( this.document[ 0 ].body );\r\n\r\n\t\t// turning off autocomplete prevents the browser from remembering the\r\n\t\t// value when navigating through history, so we re-enable autocomplete\r\n\t\t// if the page is unloaded before the widget is destroyed. #7790\r\n\t\tthis._on( this.window, {\r\n\t\t\tbeforeunload: function() {\r\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tclearTimeout( this.searching );\r\n\t\tthis.element\r\n\t\t\t.removeClass( \"ui-autocomplete-input\" )\r\n\t\t\t.removeAttr( \"autocomplete\" );\r\n\t\tthis.menu.element.remove();\r\n\t\tthis.liveRegion.remove();\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tthis._super( key, value );\r\n\t\tif ( key === \"source\" ) {\r\n\t\t\tthis._initSource();\r\n\t\t}\r\n\t\tif ( key === \"appendTo\" ) {\r\n\t\t\tthis.menu.element.appendTo( this._appendTo() );\r\n\t\t}\r\n\t\tif ( key === \"disabled\" && value && this.xhr ) {\r\n\t\t\tthis.xhr.abort();\r\n\t\t}\r\n\t},\r\n\r\n\t_appendTo: function() {\r\n\t\tvar element = this.options.appendTo;\r\n\r\n\t\tif ( element ) {\r\n\t\t\telement = element.jquery || element.nodeType ?\r\n\t\t\t\t$( element ) :\r\n\t\t\t\tthis.document.find( element ).eq( 0 );\r\n\t\t}\r\n\r\n\t\tif ( !element || !element[ 0 ] ) {\r\n\t\t\telement = this.element.closest( \".ui-front\" );\r\n\t\t}\r\n\r\n\t\tif ( !element.length ) {\r\n\t\t\telement = this.document[ 0 ].body;\r\n\t\t}\r\n\r\n\t\treturn element;\r\n\t},\r\n\r\n\t_initSource: function() {\r\n\t\tvar array, url,\r\n\t\t\tthat = this;\r\n\t\tif ( $.isArray( this.options.source ) ) {\r\n\t\t\tarray = this.options.source;\r\n\t\t\tthis.source = function( request, response ) {\r\n\t\t\t\tresponse( $.ui.autocomplete.filter( array, request.term ) );\r\n\t\t\t};\r\n\t\t} else if ( typeof this.options.source === \"string\" ) {\r\n\t\t\turl = this.options.source;\r\n\t\t\tthis.source = function( request, response ) {\r\n\t\t\t\tif ( that.xhr ) {\r\n\t\t\t\t\tthat.xhr.abort();\r\n\t\t\t\t}\r\n\t\t\t\tthat.xhr = $.ajax({\r\n\t\t\t\t\turl: url,\r\n\t\t\t\t\tdata: request,\r\n\t\t\t\t\tdataType: \"json\",\r\n\t\t\t\t\tsuccess: function( data ) {\r\n\t\t\t\t\t\tresponse( data );\r\n\t\t\t\t\t},\r\n\t\t\t\t\terror: function() {\r\n\t\t\t\t\t\tresponse([]);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\tthis.source = this.options.source;\r\n\t\t}\r\n\t},\r\n\r\n\t_searchTimeout: function( event ) {\r\n\t\tclearTimeout( this.searching );\r\n\t\tthis.searching = this._delay(function() {\r\n\r\n\t\t\t// Search if the value has changed, or if the user retypes the same value (see #7434)\r\n\t\t\tvar equalValues = this.term === this._value(),\r\n\t\t\t\tmenuVisible = this.menu.element.is( \":visible\" ),\r\n\t\t\t\tmodifierKey = event.altKey || event.ctrlKey || event.metaKey || event.shiftKey;\r\n\r\n\t\t\tif ( !equalValues || ( equalValues && !menuVisible && !modifierKey ) ) {\r\n\t\t\t\tthis.selectedItem = null;\r\n\t\t\t\tthis.search( null, event );\r\n\t\t\t}\r\n\t\t}, this.options.delay );\r\n\t},\r\n\r\n\tsearch: function( value, event ) {\r\n\t\tvalue = value != null ? value : this._value();\r\n\r\n\t\t// always save the actual value, not the one passed as an argument\r\n\t\tthis.term = this._value();\r\n\r\n\t\tif ( value.length < this.options.minLength ) {\r\n\t\t\treturn this.close( event );\r\n\t\t}\r\n\r\n\t\tif ( this._trigger( \"search\", event ) === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\treturn this._search( value );\r\n\t},\r\n\r\n\t_search: function( value ) {\r\n\t\tthis.pending++;\r\n\t\tthis.element.addClass( \"ui-autocomplete-loading\" );\r\n\t\tthis.cancelSearch = false;\r\n\r\n\t\tthis.source( { term: value }, this._response() );\r\n\t},\r\n\r\n\t_response: function() {\r\n\t\tvar index = ++this.requestIndex;\r\n\r\n\t\treturn $.proxy(function( content ) {\r\n\t\t\tif ( index === this.requestIndex ) {\r\n\t\t\t\tthis.__response( content );\r\n\t\t\t}\r\n\r\n\t\t\tthis.pending--;\r\n\t\t\tif ( !this.pending ) {\r\n\t\t\t\tthis.element.removeClass( \"ui-autocomplete-loading\" );\r\n\t\t\t}\r\n\t\t}, this );\r\n\t},\r\n\r\n\t__response: function( content ) {\r\n\t\tif ( content ) {\r\n\t\t\tcontent = this._normalize( content );\r\n\t\t}\r\n\t\tthis._trigger( \"response\", null, { content: content } );\r\n\t\tif ( !this.options.disabled && content && content.length && !this.cancelSearch ) {\r\n\t\t\tthis._suggest( content );\r\n\t\t\tthis._trigger( \"open\" );\r\n\t\t} else {\r\n\t\t\t// use ._close() instead of .close() so we don't cancel future searches\r\n\t\t\tthis._close();\r\n\t\t}\r\n\t},\r\n\r\n\tclose: function( event ) {\r\n\t\tthis.cancelSearch = true;\r\n\t\tthis._close( event );\r\n\t},\r\n\r\n\t_close: function( event ) {\r\n\t\tif ( this.menu.element.is( \":visible\" ) ) {\r\n\t\t\tthis.menu.element.hide();\r\n\t\t\tthis.menu.blur();\r\n\t\t\tthis.isNewMenu = true;\r\n\t\t\tthis._trigger( \"close\", event );\r\n\t\t}\r\n\t},\r\n\r\n\t_change: function( event ) {\r\n\t\tif ( this.previous !== this._value() ) {\r\n\t\t\tthis._trigger( \"change\", event, { item: this.selectedItem } );\r\n\t\t}\r\n\t},\r\n\r\n\t_normalize: function( items ) {\r\n\t\t// assume all items have the right format when the first item is complete\r\n\t\tif ( items.length && items[ 0 ].label && items[ 0 ].value ) {\r\n\t\t\treturn items;\r\n\t\t}\r\n\t\treturn $.map( items, function( item ) {\r\n\t\t\tif ( typeof item === \"string\" ) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tlabel: item,\r\n\t\t\t\t\tvalue: item\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\treturn $.extend( {}, item, {\r\n\t\t\t\tlabel: item.label || item.value,\r\n\t\t\t\tvalue: item.value || item.label\r\n\t\t\t});\r\n\t\t});\r\n\t},\r\n\r\n\t_suggest: function( items ) {\r\n\t\tvar ul = this.menu.element.empty();\r\n\t\tthis._renderMenu( ul, items );\r\n\t\tthis.isNewMenu = true;\r\n\t\tthis.menu.refresh();\r\n\r\n\t\t// size and position menu\r\n\t\tul.show();\r\n\t\tthis._resizeMenu();\r\n\t\tul.position( $.extend({\r\n\t\t\tof: this.element\r\n\t\t}, this.options.position ) );\r\n\r\n\t\tif ( this.options.autoFocus ) {\r\n\t\t\tthis.menu.next();\r\n\t\t}\r\n\t},\r\n\r\n\t_resizeMenu: function() {\r\n\t\tvar ul = this.menu.element;\r\n\t\tul.outerWidth( Math.max(\r\n\t\t\t// Firefox wraps long text (possibly a rounding bug)\r\n\t\t\t// so we add 1px to avoid the wrapping (#7513)\r\n\t\t\tul.width( \"\" ).outerWidth() + 1,\r\n\t\t\tthis.element.outerWidth()\r\n\t\t) );\r\n\t},\r\n\r\n\t_renderMenu: function( ul, items ) {\r\n\t\tvar that = this;\r\n\t\t$.each( items, function( index, item ) {\r\n\t\t\tthat._renderItemData( ul, item );\r\n\t\t});\r\n\t},\r\n\r\n\t_renderItemData: function( ul, item ) {\r\n\t\treturn this._renderItem( ul, item ).data( \"ui-autocomplete-item\", item );\r\n\t},\r\n\r\n\t_renderItem: function( ul, item ) {\r\n\t\treturn $( \"<li>\" ).text( item.label ).appendTo( ul );\r\n\t},\r\n\r\n\t_move: function( direction, event ) {\r\n\t\tif ( !this.menu.element.is( \":visible\" ) ) {\r\n\t\t\tthis.search( null, event );\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif ( this.menu.isFirstItem() && /^previous/.test( direction ) ||\r\n\t\t\t\tthis.menu.isLastItem() && /^next/.test( direction ) ) {\r\n\r\n\t\t\tif ( !this.isMultiLine ) {\r\n\t\t\t\tthis._value( this.term );\r\n\t\t\t}\r\n\r\n\t\t\tthis.menu.blur();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.menu[ direction ]( event );\r\n\t},\r\n\r\n\twidget: function() {\r\n\t\treturn this.menu.element;\r\n\t},\r\n\r\n\t_value: function() {\r\n\t\treturn this.valueMethod.apply( this.element, arguments );\r\n\t},\r\n\r\n\t_keyEvent: function( keyEvent, event ) {\r\n\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\r\n\t\t\tthis._move( keyEvent, event );\r\n\r\n\t\t\t// prevents moving cursor to beginning/end of the text field in some browsers\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t}\r\n});\r\n\r\n$.extend( $.ui.autocomplete, {\r\n\tescapeRegex: function( value ) {\r\n\t\treturn value.replace( /[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\" );\r\n\t},\r\n\tfilter: function( array, term ) {\r\n\t\tvar matcher = new RegExp( $.ui.autocomplete.escapeRegex( term ), \"i\" );\r\n\t\treturn $.grep( array, function( value ) {\r\n\t\t\treturn matcher.test( value.label || value.value || value );\r\n\t\t});\r\n\t}\r\n});\r\n\r\n// live region extension, adding a `messages` option\r\n// NOTE: This is an experimental API. We are still investigating\r\n// a full solution for string manipulation and internationalization.\r\n$.widget( \"ui.autocomplete\", $.ui.autocomplete, {\r\n\toptions: {\r\n\t\tmessages: {\r\n\t\t\tnoResults: \"No search results.\",\r\n\t\t\tresults: function( amount ) {\r\n\t\t\t\treturn amount + ( amount > 1 ? \" results are\" : \" result is\" ) +\r\n\t\t\t\t\t\" available, use up and down arrow keys to navigate.\";\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t__response: function( content ) {\r\n\t\tvar message;\r\n\t\tthis._superApply( arguments );\r\n\t\tif ( this.options.disabled || this.cancelSearch ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif ( content && content.length ) {\r\n\t\t\tmessage = this.options.messages.results( content.length );\r\n\t\t} else {\r\n\t\t\tmessage = this.options.messages.noResults;\r\n\t\t}\r\n\t\tthis.liveRegion.children().hide();\r\n\t\t$( \"<div>\" ).text( message ).appendTo( this.liveRegion );\r\n\t}\r\n});\r\n\r\nvar autocomplete = $.ui.autocomplete;\r\n\r\n\r\n/*!\r\n * jQuery UI Button 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/button/\r\n */\r\n\r\n\r\nvar lastActive,\r\n\tbaseClasses = \"ui-button ui-widget ui-state-default ui-corner-all\",\r\n\ttypeClasses = \"ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only\",\r\n\tformResetHandler = function() {\r\n\t\tvar form = $( this );\r\n\t\tsetTimeout(function() {\r\n\t\t\tform.find( \":ui-button\" ).button( \"refresh\" );\r\n\t\t}, 1 );\r\n\t},\r\n\tradioGroup = function( radio ) {\r\n\t\tvar name = radio.name,\r\n\t\t\tform = radio.form,\r\n\t\t\tradios = $( [] );\r\n\t\tif ( name ) {\r\n\t\t\tname = name.replace( /'/g, \"\\\\'\" );\r\n\t\t\tif ( form ) {\r\n\t\t\t\tradios = $( form ).find( \"[name='\" + name + \"'][type=radio]\" );\r\n\t\t\t} else {\r\n\t\t\t\tradios = $( \"[name='\" + name + \"'][type=radio]\", radio.ownerDocument )\r\n\t\t\t\t\t.filter(function() {\r\n\t\t\t\t\t\treturn !this.form;\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn radios;\r\n\t};\r\n\r\n$.widget( \"ui.button\", {\r\n\tversion: \"1.11.4\",\r\n\tdefaultElement: \"<button>\",\r\n\toptions: {\r\n\t\tdisabled: null,\r\n\t\ttext: true,\r\n\t\tlabel: null,\r\n\t\ticons: {\r\n\t\t\tprimary: null,\r\n\t\t\tsecondary: null\r\n\t\t}\r\n\t},\r\n\t_create: function() {\r\n\t\tthis.element.closest( \"form\" )\r\n\t\t\t.unbind( \"reset\" + this.eventNamespace )\r\n\t\t\t.bind( \"reset\" + this.eventNamespace, formResetHandler );\r\n\r\n\t\tif ( typeof this.options.disabled !== \"boolean\" ) {\r\n\t\t\tthis.options.disabled = !!this.element.prop( \"disabled\" );\r\n\t\t} else {\r\n\t\t\tthis.element.prop( \"disabled\", this.options.disabled );\r\n\t\t}\r\n\r\n\t\tthis._determineButtonType();\r\n\t\tthis.hasTitle = !!this.buttonElement.attr( \"title\" );\r\n\r\n\t\tvar that = this,\r\n\t\t\toptions = this.options,\r\n\t\t\ttoggleButton = this.type === \"checkbox\" || this.type === \"radio\",\r\n\t\t\tactiveClass = !toggleButton ? \"ui-state-active\" : \"\";\r\n\r\n\t\tif ( options.label === null ) {\r\n\t\t\toptions.label = (this.type === \"input\" ? this.buttonElement.val() : this.buttonElement.html());\r\n\t\t}\r\n\r\n\t\tthis._hoverable( this.buttonElement );\r\n\r\n\t\tthis.buttonElement\r\n\t\t\t.addClass( baseClasses )\r\n\t\t\t.attr( \"role\", \"button\" )\r\n\t\t\t.bind( \"mouseenter\" + this.eventNamespace, function() {\r\n\t\t\t\tif ( options.disabled ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif ( this === lastActive ) {\r\n\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.bind( \"mouseleave\" + this.eventNamespace, function() {\r\n\t\t\t\tif ( options.disabled ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\t$( this ).removeClass( activeClass );\r\n\t\t\t})\r\n\t\t\t.bind( \"click\" + this.eventNamespace, function( event ) {\r\n\t\t\t\tif ( options.disabled ) {\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\tevent.stopImmediatePropagation();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t// Can't use _focusable() because the element that receives focus\r\n\t\t// and the element that gets the ui-state-focus class are different\r\n\t\tthis._on({\r\n\t\t\tfocus: function() {\r\n\t\t\t\tthis.buttonElement.addClass( \"ui-state-focus\" );\r\n\t\t\t},\r\n\t\t\tblur: function() {\r\n\t\t\t\tthis.buttonElement.removeClass( \"ui-state-focus\" );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif ( toggleButton ) {\r\n\t\t\tthis.element.bind( \"change\" + this.eventNamespace, function() {\r\n\t\t\t\tthat.refresh();\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( this.type === \"checkbox\" ) {\r\n\t\t\tthis.buttonElement.bind( \"click\" + this.eventNamespace, function() {\r\n\t\t\t\tif ( options.disabled ) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else if ( this.type === \"radio\" ) {\r\n\t\t\tthis.buttonElement.bind( \"click\" + this.eventNamespace, function() {\r\n\t\t\t\tif ( options.disabled ) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t\t$( this ).addClass( \"ui-state-active\" );\r\n\t\t\t\tthat.buttonElement.attr( \"aria-pressed\", \"true\" );\r\n\r\n\t\t\t\tvar radio = that.element[ 0 ];\r\n\t\t\t\tradioGroup( radio )\r\n\t\t\t\t\t.not( radio )\r\n\t\t\t\t\t.map(function() {\r\n\t\t\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.removeClass( \"ui-state-active\" )\r\n\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tthis.buttonElement\r\n\t\t\t\t.bind( \"mousedown\" + this.eventNamespace, function() {\r\n\t\t\t\t\tif ( options.disabled ) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\r\n\t\t\t\t\tlastActive = this;\r\n\t\t\t\t\tthat.document.one( \"mouseup\", function() {\r\n\t\t\t\t\t\tlastActive = null;\r\n\t\t\t\t\t});\r\n\t\t\t\t})\r\n\t\t\t\t.bind( \"mouseup\" + this.eventNamespace, function() {\r\n\t\t\t\t\tif ( options.disabled ) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$( this ).removeClass( \"ui-state-active\" );\r\n\t\t\t\t})\r\n\t\t\t\t.bind( \"keydown\" + this.eventNamespace, function(event) {\r\n\t\t\t\t\tif ( options.disabled ) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif ( event.keyCode === $.ui.keyCode.SPACE || event.keyCode === $.ui.keyCode.ENTER ) {\r\n\t\t\t\t\t\t$( this ).addClass( \"ui-state-active\" );\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t\t\t// see #8559, we bind to blur here in case the button element loses\r\n\t\t\t\t// focus between keydown and keyup, it would be left in an \"active\" state\r\n\t\t\t\t.bind( \"keyup\" + this.eventNamespace + \" blur\" + this.eventNamespace, function() {\r\n\t\t\t\t\t$( this ).removeClass( \"ui-state-active\" );\r\n\t\t\t\t});\r\n\r\n\t\t\tif ( this.buttonElement.is(\"a\") ) {\r\n\t\t\t\tthis.buttonElement.keyup(function(event) {\r\n\t\t\t\t\tif ( event.keyCode === $.ui.keyCode.SPACE ) {\r\n\t\t\t\t\t\t// TODO pass through original event correctly (just as 2nd argument doesn't work)\r\n\t\t\t\t\t\t$( this ).click();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis._setOption( \"disabled\", options.disabled );\r\n\t\tthis._resetButton();\r\n\t},\r\n\r\n\t_determineButtonType: function() {\r\n\t\tvar ancestor, labelSelector, checked;\r\n\r\n\t\tif ( this.element.is(\"[type=checkbox]\") ) {\r\n\t\t\tthis.type = \"checkbox\";\r\n\t\t} else if ( this.element.is(\"[type=radio]\") ) {\r\n\t\t\tthis.type = \"radio\";\r\n\t\t} else if ( this.element.is(\"input\") ) {\r\n\t\t\tthis.type = \"input\";\r\n\t\t} else {\r\n\t\t\tthis.type = \"button\";\r\n\t\t}\r\n\r\n\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\r\n\t\t\t// we don't search against the document in case the element\r\n\t\t\t// is disconnected from the DOM\r\n\t\t\tancestor = this.element.parents().last();\r\n\t\t\tlabelSelector = \"label[for='\" + this.element.attr(\"id\") + \"']\";\r\n\t\t\tthis.buttonElement = ancestor.find( labelSelector );\r\n\t\t\tif ( !this.buttonElement.length ) {\r\n\t\t\t\tancestor = ancestor.length ? ancestor.siblings() : this.element.siblings();\r\n\t\t\t\tthis.buttonElement = ancestor.filter( labelSelector );\r\n\t\t\t\tif ( !this.buttonElement.length ) {\r\n\t\t\t\t\tthis.buttonElement = ancestor.find( labelSelector );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.element.addClass( \"ui-helper-hidden-accessible\" );\r\n\r\n\t\t\tchecked = this.element.is( \":checked\" );\r\n\t\t\tif ( checked ) {\r\n\t\t\t\tthis.buttonElement.addClass( \"ui-state-active\" );\r\n\t\t\t}\r\n\t\t\tthis.buttonElement.prop( \"aria-pressed\", checked );\r\n\t\t} else {\r\n\t\t\tthis.buttonElement = this.element;\r\n\t\t}\r\n\t},\r\n\r\n\twidget: function() {\r\n\t\treturn this.buttonElement;\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tthis.element\r\n\t\t\t.removeClass( \"ui-helper-hidden-accessible\" );\r\n\t\tthis.buttonElement\r\n\t\t\t.removeClass( baseClasses + \" ui-state-active \" + typeClasses )\r\n\t\t\t.removeAttr( \"role\" )\r\n\t\t\t.removeAttr( \"aria-pressed\" )\r\n\t\t\t.html( this.buttonElement.find(\".ui-button-text\").html() );\r\n\r\n\t\tif ( !this.hasTitle ) {\r\n\t\t\tthis.buttonElement.removeAttr( \"title\" );\r\n\t\t}\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tthis._super( key, value );\r\n\t\tif ( key === \"disabled\" ) {\r\n\t\t\tthis.widget().toggleClass( \"ui-state-disabled\", !!value );\r\n\t\t\tthis.element.prop( \"disabled\", !!value );\r\n\t\t\tif ( value ) {\r\n\t\t\t\tif ( this.type === \"checkbox\" || this.type === \"radio\" ) {\r\n\t\t\t\t\tthis.buttonElement.removeClass( \"ui-state-focus\" );\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.buttonElement.removeClass( \"ui-state-focus ui-state-active\" );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._resetButton();\r\n\t},\r\n\r\n\trefresh: function() {\r\n\t\t//See #8237 & #8828\r\n\t\tvar isDisabled = this.element.is( \"input, button\" ) ? this.element.is( \":disabled\" ) : this.element.hasClass( \"ui-button-disabled\" );\r\n\r\n\t\tif ( isDisabled !== this.options.disabled ) {\r\n\t\t\tthis._setOption( \"disabled\", isDisabled );\r\n\t\t}\r\n\t\tif ( this.type === \"radio\" ) {\r\n\t\t\tradioGroup( this.element[0] ).each(function() {\r\n\t\t\t\tif ( $( this ).is( \":checked\" ) ) {\r\n\t\t\t\t\t$( this ).button( \"widget\" )\r\n\t\t\t\t\t\t.addClass( \"ui-state-active\" )\r\n\t\t\t\t\t\t.attr( \"aria-pressed\", \"true\" );\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$( this ).button( \"widget\" )\r\n\t\t\t\t\t\t.removeClass( \"ui-state-active\" )\r\n\t\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else if ( this.type === \"checkbox\" ) {\r\n\t\t\tif ( this.element.is( \":checked\" ) ) {\r\n\t\t\t\tthis.buttonElement\r\n\t\t\t\t\t.addClass( \"ui-state-active\" )\r\n\t\t\t\t\t.attr( \"aria-pressed\", \"true\" );\r\n\t\t\t} else {\r\n\t\t\t\tthis.buttonElement\r\n\t\t\t\t\t.removeClass( \"ui-state-active\" )\r\n\t\t\t\t\t.attr( \"aria-pressed\", \"false\" );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_resetButton: function() {\r\n\t\tif ( this.type === \"input\" ) {\r\n\t\t\tif ( this.options.label ) {\r\n\t\t\t\tthis.element.val( this.options.label );\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tvar buttonElement = this.buttonElement.removeClass( typeClasses ),\r\n\t\t\tbuttonText = $( \"<span></span>\", this.document[0] )\r\n\t\t\t\t.addClass( \"ui-button-text\" )\r\n\t\t\t\t.html( this.options.label )\r\n\t\t\t\t.appendTo( buttonElement.empty() )\r\n\t\t\t\t.text(),\r\n\t\t\ticons = this.options.icons,\r\n\t\t\tmultipleIcons = icons.primary && icons.secondary,\r\n\t\t\tbuttonClasses = [];\r\n\r\n\t\tif ( icons.primary || icons.secondary ) {\r\n\t\t\tif ( this.options.text ) {\r\n\t\t\t\tbuttonClasses.push( \"ui-button-text-icon\" + ( multipleIcons ? \"s\" : ( icons.primary ? \"-primary\" : \"-secondary\" ) ) );\r\n\t\t\t}\r\n\r\n\t\t\tif ( icons.primary ) {\r\n\t\t\t\tbuttonElement.prepend( \"<span class='ui-button-icon-primary ui-icon \" + icons.primary + \"'></span>\" );\r\n\t\t\t}\r\n\r\n\t\t\tif ( icons.secondary ) {\r\n\t\t\t\tbuttonElement.append( \"<span class='ui-button-icon-secondary ui-icon \" + icons.secondary + \"'></span>\" );\r\n\t\t\t}\r\n\r\n\t\t\tif ( !this.options.text ) {\r\n\t\t\t\tbuttonClasses.push( multipleIcons ? \"ui-button-icons-only\" : \"ui-button-icon-only\" );\r\n\r\n\t\t\t\tif ( !this.hasTitle ) {\r\n\t\t\t\t\tbuttonElement.attr( \"title\", $.trim( buttonText ) );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tbuttonClasses.push( \"ui-button-text-only\" );\r\n\t\t}\r\n\t\tbuttonElement.addClass( buttonClasses.join( \" \" ) );\r\n\t}\r\n});\r\n\r\n$.widget( \"ui.buttonset\", {\r\n\tversion: \"1.11.4\",\r\n\toptions: {\r\n\t\titems: \"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)\"\r\n\t},\r\n\r\n\t_create: function() {\r\n\t\tthis.element.addClass( \"ui-buttonset\" );\r\n\t},\r\n\r\n\t_init: function() {\r\n\t\tthis.refresh();\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tif ( key === \"disabled\" ) {\r\n\t\t\tthis.buttons.button( \"option\", key, value );\r\n\t\t}\r\n\r\n\t\tthis._super( key, value );\r\n\t},\r\n\r\n\trefresh: function() {\r\n\t\tvar rtl = this.element.css( \"direction\" ) === \"rtl\",\r\n\t\t\tallButtons = this.element.find( this.options.items ),\r\n\t\t\texistingButtons = allButtons.filter( \":ui-button\" );\r\n\r\n\t\t// Initialize new buttons\r\n\t\tallButtons.not( \":ui-button\" ).button();\r\n\r\n\t\t// Refresh existing buttons\r\n\t\texistingButtons.button( \"refresh\" );\r\n\r\n\t\tthis.buttons = allButtons\r\n\t\t\t.map(function() {\r\n\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\r\n\t\t\t})\r\n\t\t\t\t.removeClass( \"ui-corner-all ui-corner-left ui-corner-right\" )\r\n\t\t\t\t.filter( \":first\" )\r\n\t\t\t\t\t.addClass( rtl ? \"ui-corner-right\" : \"ui-corner-left\" )\r\n\t\t\t\t.end()\r\n\t\t\t\t.filter( \":last\" )\r\n\t\t\t\t\t.addClass( rtl ? \"ui-corner-left\" : \"ui-corner-right\" )\r\n\t\t\t\t.end()\r\n\t\t\t.end();\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tthis.element.removeClass( \"ui-buttonset\" );\r\n\t\tthis.buttons\r\n\t\t\t.map(function() {\r\n\t\t\t\treturn $( this ).button( \"widget\" )[ 0 ];\r\n\t\t\t})\r\n\t\t\t\t.removeClass( \"ui-corner-left ui-corner-right\" )\r\n\t\t\t.end()\r\n\t\t\t.button( \"destroy\" );\r\n\t}\r\n});\r\n\r\nvar button = $.ui.button;\r\n\r\n\r\n/*!\r\n * jQuery UI Datepicker 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/datepicker/\r\n */\r\n\r\n\r\n$.extend($.ui, { datepicker: { version: \"1.11.4\" } });\r\n\r\nvar datepicker_instActive;\r\n\r\nfunction datepicker_getZindex( elem ) {\r\n\tvar position, value;\r\n\twhile ( elem.length && elem[ 0 ] !== document ) {\r\n\t\t// Ignore z-index if position is set to a value where z-index is ignored by the browser\r\n\t\t// This makes behavior of this function consistent across browsers\r\n\t\t// WebKit always returns auto if the element is positioned\r\n\t\tposition = elem.css( \"position\" );\r\n\t\tif ( position === \"absolute\" || position === \"relative\" || position === \"fixed\" ) {\r\n\t\t\t// IE returns 0 when zIndex is not specified\r\n\t\t\t// other browsers return a string\r\n\t\t\t// we ignore the case of nested elements with an explicit value of 0\r\n\t\t\t// <div style=\"z-index: -10;\"><div style=\"z-index: 0;\"></div></div>\r\n\t\t\tvalue = parseInt( elem.css( \"zIndex\" ), 10 );\r\n\t\t\tif ( !isNaN( value ) && value !== 0 ) {\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\t\t}\r\n\t\telem = elem.parent();\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n/* Date picker manager.\r\n Use the singleton instance of this class, $.datepicker, to interact with the date picker.\r\n Settings for (groups of) date pickers are maintained in an instance object,\r\n allowing multiple different settings on the same page. */\r\n\r\nfunction Datepicker() {\r\n\tthis._curInst = null; // The current instance in use\r\n\tthis._keyEvent = false; // If the last event was a key event\r\n\tthis._disabledInputs = []; // List of date picker inputs that have been disabled\r\n\tthis._datepickerShowing = false; // True if the popup picker is showing , false if not\r\n\tthis._inDialog = false; // True if showing within a \"dialog\", false if not\r\n\tthis._mainDivId = \"ui-datepicker-div\"; // The ID of the main datepicker division\r\n\tthis._inlineClass = \"ui-datepicker-inline\"; // The name of the inline marker class\r\n\tthis._appendClass = \"ui-datepicker-append\"; // The name of the append marker class\r\n\tthis._triggerClass = \"ui-datepicker-trigger\"; // The name of the trigger marker class\r\n\tthis._dialogClass = \"ui-datepicker-dialog\"; // The name of the dialog marker class\r\n\tthis._disableClass = \"ui-datepicker-disabled\"; // The name of the disabled covering marker class\r\n\tthis._unselectableClass = \"ui-datepicker-unselectable\"; // The name of the unselectable cell marker class\r\n\tthis._currentClass = \"ui-datepicker-current-day\"; // The name of the current day marker class\r\n\tthis._dayOverClass = \"ui-datepicker-days-cell-over\"; // The name of the day hover marker class\r\n\tthis.regional = []; // Available regional settings, indexed by language code\r\n\tthis.regional[\"\"] = { // Default regional settings\r\n\t\tcloseText: \"Done\", // Display text for close link\r\n\t\tprevText: \"Prev\", // Display text for previous month link\r\n\t\tnextText: \"Next\", // Display text for next month link\r\n\t\tcurrentText: \"Today\", // Display text for current month link\r\n\t\tmonthNames: [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\r\n\t\t\t\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"], // Names of months for drop-down and formatting\r\n\t\tmonthNamesShort: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"], // For formatting\r\n\t\tdayNames: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"], // For formatting\r\n\t\tdayNamesShort: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"], // For formatting\r\n\t\tdayNamesMin: [\"Su\",\"Mo\",\"Tu\",\"We\",\"Th\",\"Fr\",\"Sa\"], // Column headings for days starting at Sunday\r\n\t\tweekHeader: \"Wk\", // Column header for week of the year\r\n\t\tdateFormat: \"mm/dd/yy\", // See format options on parseDate\r\n\t\tfirstDay: 0, // The first day of the week, Sun = 0, Mon = 1, ...\r\n\t\tisRTL: false, // True if right-to-left language, false if left-to-right\r\n\t\tshowMonthAfterYear: false, // True if the year select precedes month, false for month then year\r\n\t\tyearSuffix: \"\" // Additional text to append to the year in the month headers\r\n\t};\r\n\tthis._defaults = { // Global defaults for all the date picker instances\r\n\t\tshowOn: \"focus\", // \"focus\" for popup on focus,\r\n\t\t\t// \"button\" for trigger button, or \"both\" for either\r\n\t\tshowAnim: \"fadeIn\", // Name of jQuery animation for popup\r\n\t\tshowOptions: {}, // Options for enhanced animations\r\n\t\tdefaultDate: null, // Used when field is blank: actual date,\r\n\t\t\t// +/-number for offset from today, null for today\r\n\t\tappendText: \"\", // Display text following the input box, e.g. showing the format\r\n\t\tbuttonText: \"...\", // Text for trigger button\r\n\t\tbuttonImage: \"\", // URL for trigger button image\r\n\t\tbuttonImageOnly: false, // True if the image appears alone, false if it appears on a button\r\n\t\thideIfNoPrevNext: false, // True to hide next/previous month links\r\n\t\t\t// if not applicable, false to just disable them\r\n\t\tnavigationAsDateFormat: false, // True if date formatting applied to prev/today/next links\r\n\t\tgotoCurrent: false, // True if today link goes back to current selection instead\r\n\t\tchangeMonth: false, // True if month can be selected directly, false if only prev/next\r\n\t\tchangeYear: false, // True if year can be selected directly, false if only prev/next\r\n\t\tyearRange: \"c-10:c+10\", // Range of years to display in drop-down,\r\n\t\t\t// either relative to today's year (-nn:+nn), relative to currently displayed year\r\n\t\t\t// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)\r\n\t\tshowOtherMonths: false, // True to show dates in other months, false to leave blank\r\n\t\tselectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable\r\n\t\tshowWeek: false, // True to show week of the year, false to not show it\r\n\t\tcalculateWeek: this.iso8601Week, // How to calculate the week of the year,\r\n\t\t\t// takes a Date and returns the number of the week for it\r\n\t\tshortYearCutoff: \"+10\", // Short year values < this are in the current century,\r\n\t\t\t// > this are in the previous century,\r\n\t\t\t// string value starting with \"+\" for current year + value\r\n\t\tminDate: null, // The earliest selectable date, or null for no limit\r\n\t\tmaxDate: null, // The latest selectable date, or null for no limit\r\n\t\tduration: \"fast\", // Duration of display/closure\r\n\t\tbeforeShowDay: null, // Function that takes a date and returns an array with\r\n\t\t\t// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or \"\",\r\n\t\t\t// [2] = cell title (optional), e.g. $.datepicker.noWeekends\r\n\t\tbeforeShow: null, // Function that takes an input field and\r\n\t\t\t// returns a set of custom settings for the date picker\r\n\t\tonSelect: null, // Define a callback function when a date is selected\r\n\t\tonChangeMonthYear: null, // Define a callback function when the month or year is changed\r\n\t\tonClose: null, // Define a callback function when the datepicker is closed\r\n\t\tnumberOfMonths: 1, // Number of months to show at a time\r\n\t\tshowCurrentAtPos: 0, // The position in multipe months at which to show the current month (starting at 0)\r\n\t\tstepMonths: 1, // Number of months to step back/forward\r\n\t\tstepBigMonths: 12, // Number of months to step back/forward for the big links\r\n\t\taltField: \"\", // Selector for an alternate field to store selected dates into\r\n\t\taltFormat: \"\", // The date format to use for the alternate field\r\n\t\tconstrainInput: true, // The input is constrained by the current date format\r\n\t\tshowButtonPanel: false, // True to show button panel, false to not show it\r\n\t\tautoSize: false, // True to size the input for the date format, false to leave as is\r\n\t\tdisabled: false // The initial disabled state\r\n\t};\r\n\t$.extend(this._defaults, this.regional[\"\"]);\r\n\tthis.regional.en = $.extend( true, {}, this.regional[ \"\" ]);\r\n\tthis.regional[ \"en-US\" ] = $.extend( true, {}, this.regional.en );\r\n\tthis.dpDiv = datepicker_bindHover($(\"<div id='\" + this._mainDivId + \"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\"));\r\n}\r\n\r\n$.extend(Datepicker.prototype, {\r\n\t/* Class name added to elements to indicate already configured with a date picker. */\r\n\tmarkerClassName: \"hasDatepicker\",\r\n\r\n\t//Keep track of the maximum number of rows displayed (see #7043)\r\n\tmaxRows: 4,\r\n\r\n\t// TODO rename to \"widget\" when switching to widget factory\r\n\t_widgetDatepicker: function() {\r\n\t\treturn this.dpDiv;\r\n\t},\r\n\r\n\t/* Override the default settings for all instances of the date picker.\r\n\t * @param settings object - the new settings to use as defaults (anonymous object)\r\n\t * @return the manager object\r\n\t */\r\n\tsetDefaults: function(settings) {\r\n\t\tdatepicker_extendRemove(this._defaults, settings || {});\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/* Attach the date picker to a jQuery selection.\r\n\t * @param target\telement - the target input field or division or span\r\n\t * @param settings object - the new settings to use for this date picker instance (anonymous)\r\n\t */\r\n\t_attachDatepicker: function(target, settings) {\r\n\t\tvar nodeName, inline, inst;\r\n\t\tnodeName = target.nodeName.toLowerCase();\r\n\t\tinline = (nodeName === \"div\" || nodeName === \"span\");\r\n\t\tif (!target.id) {\r\n\t\t\tthis.uuid += 1;\r\n\t\t\ttarget.id = \"dp\" + this.uuid;\r\n\t\t}\r\n\t\tinst = this._newInst($(target), inline);\r\n\t\tinst.settings = $.extend({}, settings || {});\r\n\t\tif (nodeName === \"input\") {\r\n\t\t\tthis._connectDatepicker(target, inst);\r\n\t\t} else if (inline) {\r\n\t\t\tthis._inlineDatepicker(target, inst);\r\n\t\t}\r\n\t},\r\n\r\n\t/* Create a new instance object. */\r\n\t_newInst: function(target, inline) {\r\n\t\tvar id = target[0].id.replace(/([^A-Za-z0-9_\\-])/g, \"\\\\\\\\$1\"); // escape jQuery meta chars\r\n\t\treturn {id: id, input: target, // associated target\r\n\t\t\tselectedDay: 0, selectedMonth: 0, selectedYear: 0, // current selection\r\n\t\t\tdrawMonth: 0, drawYear: 0, // month being drawn\r\n\t\t\tinline: inline, // is datepicker inline or not\r\n\t\t\tdpDiv: (!inline ? this.dpDiv : // presentation div\r\n\t\t\tdatepicker_bindHover($(\"<div class='\" + this._inlineClass + \" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>\")))};\r\n\t},\r\n\r\n\t/* Attach the date picker to an input field. */\r\n\t_connectDatepicker: function(target, inst) {\r\n\t\tvar input = $(target);\r\n\t\tinst.append = $([]);\r\n\t\tinst.trigger = $([]);\r\n\t\tif (input.hasClass(this.markerClassName)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._attachments(input, inst);\r\n\t\tinput.addClass(this.markerClassName).keydown(this._doKeyDown).\r\n\t\t\tkeypress(this._doKeyPress).keyup(this._doKeyUp);\r\n\t\tthis._autoSize(inst);\r\n\t\t$.data(target, \"datepicker\", inst);\r\n\t\t//If disabled option is true, disable the datepicker once it has been attached to the input (see ticket #5665)\r\n\t\tif( inst.settings.disabled ) {\r\n\t\t\tthis._disableDatepicker( target );\r\n\t\t}\r\n\t},\r\n\r\n\t/* Make attachments based on settings. */\r\n\t_attachments: function(input, inst) {\r\n\t\tvar showOn, buttonText, buttonImage,\r\n\t\t\tappendText = this._get(inst, \"appendText\"),\r\n\t\t\tisRTL = this._get(inst, \"isRTL\");\r\n\r\n\t\tif (inst.append) {\r\n\t\t\tinst.append.remove();\r\n\t\t}\r\n\t\tif (appendText) {\r\n\t\t\tinst.append = $(\"<span class='\" + this._appendClass + \"'>\" + appendText + \"</span>\");\r\n\t\t\tinput[isRTL ? \"before\" : \"after\"](inst.append);\r\n\t\t}\r\n\r\n\t\tinput.unbind(\"focus\", this._showDatepicker);\r\n\r\n\t\tif (inst.trigger) {\r\n\t\t\tinst.trigger.remove();\r\n\t\t}\r\n\r\n\t\tshowOn = this._get(inst, \"showOn\");\r\n\t\tif (showOn === \"focus\" || showOn === \"both\") { // pop-up date picker when in the marked field\r\n\t\t\tinput.focus(this._showDatepicker);\r\n\t\t}\r\n\t\tif (showOn === \"button\" || showOn === \"both\") { // pop-up date picker when button clicked\r\n\t\t\tbuttonText = this._get(inst, \"buttonText\");\r\n\t\t\tbuttonImage = this._get(inst, \"buttonImage\");\r\n\t\t\tinst.trigger = $(this._get(inst, \"buttonImageOnly\") ?\r\n\t\t\t\t$(\"<img/>\").addClass(this._triggerClass).\r\n\t\t\t\t\tattr({ src: buttonImage, alt: buttonText, title: buttonText }) :\r\n\t\t\t\t$(\"<button type='button'></button>\").addClass(this._triggerClass).\r\n\t\t\t\t\thtml(!buttonImage ? buttonText : $(\"<img/>\").attr(\r\n\t\t\t\t\t{ src:buttonImage, alt:buttonText, title:buttonText })));\r\n\t\t\tinput[isRTL ? \"before\" : \"after\"](inst.trigger);\r\n\t\t\tinst.trigger.click(function() {\r\n\t\t\t\tif ($.datepicker._datepickerShowing && $.datepicker._lastInput === input[0]) {\r\n\t\t\t\t\t$.datepicker._hideDatepicker();\r\n\t\t\t\t} else if ($.datepicker._datepickerShowing && $.datepicker._lastInput !== input[0]) {\r\n\t\t\t\t\t$.datepicker._hideDatepicker();\r\n\t\t\t\t\t$.datepicker._showDatepicker(input[0]);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$.datepicker._showDatepicker(input[0]);\r\n\t\t\t\t}\r\n\t\t\t\treturn false;\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t/* Apply the maximum length for the date format. */\r\n\t_autoSize: function(inst) {\r\n\t\tif (this._get(inst, \"autoSize\") && !inst.inline) {\r\n\t\t\tvar findMax, max, maxI, i,\r\n\t\t\t\tdate = new Date(2009, 12 - 1, 20), // Ensure double digits\r\n\t\t\t\tdateFormat = this._get(inst, \"dateFormat\");\r\n\r\n\t\t\tif (dateFormat.match(/[DM]/)) {\r\n\t\t\t\tfindMax = function(names) {\r\n\t\t\t\t\tmax = 0;\r\n\t\t\t\t\tmaxI = 0;\r\n\t\t\t\t\tfor (i = 0; i < names.length; i++) {\r\n\t\t\t\t\t\tif (names[i].length > max) {\r\n\t\t\t\t\t\t\tmax = names[i].length;\r\n\t\t\t\t\t\t\tmaxI = i;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn maxI;\r\n\t\t\t\t};\r\n\t\t\t\tdate.setMonth(findMax(this._get(inst, (dateFormat.match(/MM/) ?\r\n\t\t\t\t\t\"monthNames\" : \"monthNamesShort\"))));\r\n\t\t\t\tdate.setDate(findMax(this._get(inst, (dateFormat.match(/DD/) ?\r\n\t\t\t\t\t\"dayNames\" : \"dayNamesShort\"))) + 20 - date.getDay());\r\n\t\t\t}\r\n\t\t\tinst.input.attr(\"size\", this._formatDate(inst, date).length);\r\n\t\t}\r\n\t},\r\n\r\n\t/* Attach an inline date picker to a div. */\r\n\t_inlineDatepicker: function(target, inst) {\r\n\t\tvar divSpan = $(target);\r\n\t\tif (divSpan.hasClass(this.markerClassName)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tdivSpan.addClass(this.markerClassName).append(inst.dpDiv);\r\n\t\t$.data(target, \"datepicker\", inst);\r\n\t\tthis._setDate(inst, this._getDefaultDate(inst), true);\r\n\t\tthis._updateDatepicker(inst);\r\n\t\tthis._updateAlternate(inst);\r\n\t\t//If disabled option is true, disable the datepicker before showing it (see ticket #5665)\r\n\t\tif( inst.settings.disabled ) {\r\n\t\t\tthis._disableDatepicker( target );\r\n\t\t}\r\n\t\t// Set display:block in place of inst.dpDiv.show() which won't work on disconnected elements\r\n\t\t// http://bugs.jqueryui.com/ticket/7552 - A Datepicker created on a detached div has zero height\r\n\t\tinst.dpDiv.css( \"display\", \"block\" );\r\n\t},\r\n\r\n\t/* Pop-up the date picker in a \"dialog\" box.\r\n\t * @param input element - ignored\r\n\t * @param date\tstring or Date - the initial date to display\r\n\t * @param onSelect function - the function to call when a date is selected\r\n\t * @param settings object - update the dialog date picker instance's settings (anonymous object)\r\n\t * @param pos int[2] - coordinates for the dialog's position within the screen or\r\n\t *\t\t\t\t\tevent - with x/y coordinates or\r\n\t *\t\t\t\t\tleave empty for default (screen centre)\r\n\t * @return the manager object\r\n\t */\r\n\t_dialogDatepicker: function(input, date, onSelect, settings, pos) {\r\n\t\tvar id, browserWidth, browserHeight, scrollX, scrollY,\r\n\t\t\tinst = this._dialogInst; // internal instance\r\n\r\n\t\tif (!inst) {\r\n\t\t\tthis.uuid += 1;\r\n\t\t\tid = \"dp\" + this.uuid;\r\n\t\t\tthis._dialogInput = $(\"<input type='text' id='\" + id +\r\n\t\t\t\t\"' style='position: absolute; top: -100px; width: 0px;'/>\");\r\n\t\t\tthis._dialogInput.keydown(this._doKeyDown);\r\n\t\t\t$(\"body\").append(this._dialogInput);\r\n\t\t\tinst = this._dialogInst = this._newInst(this._dialogInput, false);\r\n\t\t\tinst.settings = {};\r\n\t\t\t$.data(this._dialogInput[0], \"datepicker\", inst);\r\n\t\t}\r\n\t\tdatepicker_extendRemove(inst.settings, settings || {});\r\n\t\tdate = (date && date.constructor === Date ? this._formatDate(inst, date) : date);\r\n\t\tthis._dialogInput.val(date);\r\n\r\n\t\tthis._pos = (pos ? (pos.length ? pos : [pos.pageX, pos.pageY]) : null);\r\n\t\tif (!this._pos) {\r\n\t\t\tbrowserWidth = document.documentElement.clientWidth;\r\n\t\t\tbrowserHeight = document.documentElement.clientHeight;\r\n\t\t\tscrollX = document.documentElement.scrollLeft || document.body.scrollLeft;\r\n\t\t\tscrollY = document.documentElement.scrollTop || document.body.scrollTop;\r\n\t\t\tthis._pos = // should use actual width/height below\r\n\t\t\t\t[(browserWidth / 2) - 100 + scrollX, (browserHeight / 2) - 150 + scrollY];\r\n\t\t}\r\n\r\n\t\t// move input on screen for focus, but hidden behind dialog\r\n\t\tthis._dialogInput.css(\"left\", (this._pos[0] + 20) + \"px\").css(\"top\", this._pos[1] + \"px\");\r\n\t\tinst.settings.onSelect = onSelect;\r\n\t\tthis._inDialog = true;\r\n\t\tthis.dpDiv.addClass(this._dialogClass);\r\n\t\tthis._showDatepicker(this._dialogInput[0]);\r\n\t\tif ($.blockUI) {\r\n\t\t\t$.blockUI(this.dpDiv);\r\n\t\t}\r\n\t\t$.data(this._dialogInput[0], \"datepicker\", inst);\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/* Detach a datepicker from its control.\r\n\t * @param target\telement - the target input field or division or span\r\n\t */\r\n\t_destroyDatepicker: function(target) {\r\n\t\tvar nodeName,\r\n\t\t\t$target = $(target),\r\n\t\t\tinst = $.data(target, \"datepicker\");\r\n\r\n\t\tif (!$target.hasClass(this.markerClassName)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tnodeName = target.nodeName.toLowerCase();\r\n\t\t$.removeData(target, \"datepicker\");\r\n\t\tif (nodeName === \"input\") {\r\n\t\t\tinst.append.remove();\r\n\t\t\tinst.trigger.remove();\r\n\t\t\t$target.removeClass(this.markerClassName).\r\n\t\t\t\tunbind(\"focus\", this._showDatepicker).\r\n\t\t\t\tunbind(\"keydown\", this._doKeyDown).\r\n\t\t\t\tunbind(\"keypress\", this._doKeyPress).\r\n\t\t\t\tunbind(\"keyup\", this._doKeyUp);\r\n\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\r\n\t\t\t$target.removeClass(this.markerClassName).empty();\r\n\t\t}\r\n\r\n\t\tif ( datepicker_instActive === inst ) {\r\n\t\t\tdatepicker_instActive = null;\r\n\t\t}\r\n\t},\r\n\r\n\t/* Enable the date picker to a jQuery selection.\r\n\t * @param target\telement - the target input field or division or span\r\n\t */\r\n\t_enableDatepicker: function(target) {\r\n\t\tvar nodeName, inline,\r\n\t\t\t$target = $(target),\r\n\t\t\tinst = $.data(target, \"datepicker\");\r\n\r\n\t\tif (!$target.hasClass(this.markerClassName)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tnodeName = target.nodeName.toLowerCase();\r\n\t\tif (nodeName === \"input\") {\r\n\t\t\ttarget.disabled = false;\r\n\t\t\tinst.trigger.filter(\"button\").\r\n\t\t\t\teach(function() { this.disabled = false; }).end().\r\n\t\t\t\tfilter(\"img\").css({opacity: \"1.0\", cursor: \"\"});\r\n\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\r\n\t\t\tinline = $target.children(\".\" + this._inlineClass);\r\n\t\t\tinline.children().removeClass(\"ui-state-disabled\");\r\n\t\t\tinline.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").\r\n\t\t\t\tprop(\"disabled\", false);\r\n\t\t}\r\n\t\tthis._disabledInputs = $.map(this._disabledInputs,\r\n\t\t\tfunction(value) { return (value === target ? null : value); }); // delete entry\r\n\t},\r\n\r\n\t/* Disable the date picker to a jQuery selection.\r\n\t * @param target\telement - the target input field or division or span\r\n\t */\r\n\t_disableDatepicker: function(target) {\r\n\t\tvar nodeName, inline,\r\n\t\t\t$target = $(target),\r\n\t\t\tinst = $.data(target, \"datepicker\");\r\n\r\n\t\tif (!$target.hasClass(this.markerClassName)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tnodeName = target.nodeName.toLowerCase();\r\n\t\tif (nodeName === \"input\") {\r\n\t\t\ttarget.disabled = true;\r\n\t\t\tinst.trigger.filter(\"button\").\r\n\t\t\t\teach(function() { this.disabled = true; }).end().\r\n\t\t\t\tfilter(\"img\").css({opacity: \"0.5\", cursor: \"default\"});\r\n\t\t} else if (nodeName === \"div\" || nodeName === \"span\") {\r\n\t\t\tinline = $target.children(\".\" + this._inlineClass);\r\n\t\t\tinline.children().addClass(\"ui-state-disabled\");\r\n\t\t\tinline.find(\"select.ui-datepicker-month, select.ui-datepicker-year\").\r\n\t\t\t\tprop(\"disabled\", true);\r\n\t\t}\r\n\t\tthis._disabledInputs = $.map(this._disabledInputs,\r\n\t\t\tfunction(value) { return (value === target ? null : value); }); // delete entry\r\n\t\tthis._disabledInputs[this._disabledInputs.length] = target;\r\n\t},\r\n\r\n\t/* Is the first field in a jQuery collection disabled as a datepicker?\r\n\t * @param target\telement - the target input field or division or span\r\n\t * @return boolean - true if disabled, false if enabled\r\n\t */\r\n\t_isDisabledDatepicker: function(target) {\r\n\t\tif (!target) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tfor (var i = 0; i < this._disabledInputs.length; i++) {\r\n\t\t\tif (this._disabledInputs[i] === target) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\t/* Retrieve the instance data for the target control.\r\n\t * @param target element - the target input field or division or span\r\n\t * @return object - the associated instance data\r\n\t * @throws error if a jQuery problem getting data\r\n\t */\r\n\t_getInst: function(target) {\r\n\t\ttry {\r\n\t\t\treturn $.data(target, \"datepicker\");\r\n\t\t}\r\n\t\tcatch (err) {\r\n\t\t\tthrow \"Missing instance data for this datepicker\";\r\n\t\t}\r\n\t},\r\n\r\n\t/* Update or retrieve the settings for a date picker attached to an input field or division.\r\n\t * @param target element - the target input field or division or span\r\n\t * @param name\tobject - the new settings to update or\r\n\t *\t\t\t\tstring - the name of the setting to change or retrieve,\r\n\t *\t\t\t\twhen retrieving also \"all\" for all instance settings or\r\n\t *\t\t\t\t\"defaults\" for all global defaults\r\n\t * @param value any - the new value for the setting\r\n\t *\t\t\t\t(omit if above is an object or to retrieve a value)\r\n\t */\r\n\t_optionDatepicker: function(target, name, value) {\r\n\t\tvar settings, date, minDate, maxDate,\r\n\t\t\tinst = this._getInst(target);\r\n\r\n\t\tif (arguments.length === 2 && typeof name === \"string\") {\r\n\t\t\treturn (name === \"defaults\" ? $.extend({}, $.datepicker._defaults) :\r\n\t\t\t\t(inst ? (name === \"all\" ? $.extend({}, inst.settings) :\r\n\t\t\t\tthis._get(inst, name)) : null));\r\n\t\t}\r\n\r\n\t\tsettings = name || {};\r\n\t\tif (typeof name === \"string\") {\r\n\t\t\tsettings = {};\r\n\t\t\tsettings[name] = value;\r\n\t\t}\r\n\r\n\t\tif (inst) {\r\n\t\t\tif (this._curInst === inst) {\r\n\t\t\t\tthis._hideDatepicker();\r\n\t\t\t}\r\n\r\n\t\t\tdate = this._getDateDatepicker(target, true);\r\n\t\t\tminDate = this._getMinMaxDate(inst, \"min\");\r\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\");\r\n\t\t\tdatepicker_extendRemove(inst.settings, settings);\r\n\t\t\t// reformat the old minDate/maxDate values if dateFormat changes and a new minDate/maxDate isn't provided\r\n\t\t\tif (minDate !== null && settings.dateFormat !== undefined && settings.minDate === undefined) {\r\n\t\t\t\tinst.settings.minDate = this._formatDate(inst, minDate);\r\n\t\t\t}\r\n\t\t\tif (maxDate !== null && settings.dateFormat !== undefined && settings.maxDate === undefined) {\r\n\t\t\t\tinst.settings.maxDate = this._formatDate(inst, maxDate);\r\n\t\t\t}\r\n\t\t\tif ( \"disabled\" in settings ) {\r\n\t\t\t\tif ( settings.disabled ) {\r\n\t\t\t\t\tthis._disableDatepicker(target);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._enableDatepicker(target);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis._attachments($(target), inst);\r\n\t\t\tthis._autoSize(inst);\r\n\t\t\tthis._setDate(inst, date);\r\n\t\t\tthis._updateAlternate(inst);\r\n\t\t\tthis._updateDatepicker(inst);\r\n\t\t}\r\n\t},\r\n\r\n\t// change method deprecated\r\n\t_changeDatepicker: function(target, name, value) {\r\n\t\tthis._optionDatepicker(target, name, value);\r\n\t},\r\n\r\n\t/* Redraw the date picker attached to an input field or division.\r\n\t * @param target element - the target input field or division or span\r\n\t */\r\n\t_refreshDatepicker: function(target) {\r\n\t\tvar inst = this._getInst(target);\r\n\t\tif (inst) {\r\n\t\t\tthis._updateDatepicker(inst);\r\n\t\t}\r\n\t},\r\n\r\n\t/* Set the dates for a jQuery selection.\r\n\t * @param target element - the target input field or division or span\r\n\t * @param date\tDate - the new date\r\n\t */\r\n\t_setDateDatepicker: function(target, date) {\r\n\t\tvar inst = this._getInst(target);\r\n\t\tif (inst) {\r\n\t\t\tthis._setDate(inst, date);\r\n\t\t\tthis._updateDatepicker(inst);\r\n\t\t\tthis._updateAlternate(inst);\r\n\t\t}\r\n\t},\r\n\r\n\t/* Get the date(s) for the first entry in a jQuery selection.\r\n\t * @param target element - the target input field or division or span\r\n\t * @param noDefault boolean - true if no default date is to be used\r\n\t * @return Date - the current date\r\n\t */\r\n\t_getDateDatepicker: function(target, noDefault) {\r\n\t\tvar inst = this._getInst(target);\r\n\t\tif (inst && !inst.inline) {\r\n\t\t\tthis._setDateFromField(inst, noDefault);\r\n\t\t}\r\n\t\treturn (inst ? this._getDate(inst) : null);\r\n\t},\r\n\r\n\t/* Handle keystrokes. */\r\n\t_doKeyDown: function(event) {\r\n\t\tvar onSelect, dateStr, sel,\r\n\t\t\tinst = $.datepicker._getInst(event.target),\r\n\t\t\thandled = true,\r\n\t\t\tisRTL = inst.dpDiv.is(\".ui-datepicker-rtl\");\r\n\r\n\t\tinst._keyEvent = true;\r\n\t\tif ($.datepicker._datepickerShowing) {\r\n\t\t\tswitch (event.keyCode) {\r\n\t\t\t\tcase 9: $.datepicker._hideDatepicker();\r\n\t\t\t\t\t\thandled = false;\r\n\t\t\t\t\t\tbreak; // hide on tab out\r\n\t\t\t\tcase 13: sel = $(\"td.\" + $.datepicker._dayOverClass + \":not(.\" +\r\n\t\t\t\t\t\t\t\t\t$.datepicker._currentClass + \")\", inst.dpDiv);\r\n\t\t\t\t\t\tif (sel[0]) {\r\n\t\t\t\t\t\t\t$.datepicker._selectDay(event.target, inst.selectedMonth, inst.selectedYear, sel[0]);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tonSelect = $.datepicker._get(inst, \"onSelect\");\r\n\t\t\t\t\t\tif (onSelect) {\r\n\t\t\t\t\t\t\tdateStr = $.datepicker._formatDate(inst);\r\n\r\n\t\t\t\t\t\t\t// trigger custom callback\r\n\t\t\t\t\t\t\tonSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t$.datepicker._hideDatepicker();\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn false; // don't submit the form\r\n\t\t\t\tcase 27: $.datepicker._hideDatepicker();\r\n\t\t\t\t\t\tbreak; // hide on escape\r\n\t\t\t\tcase 33: $.datepicker._adjustDate(event.target, (event.ctrlKey ?\r\n\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepBigMonths\") :\r\n\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepMonths\")), \"M\");\r\n\t\t\t\t\t\tbreak; // previous month/year on page up/+ ctrl\r\n\t\t\t\tcase 34: $.datepicker._adjustDate(event.target, (event.ctrlKey ?\r\n\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepBigMonths\") :\r\n\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepMonths\")), \"M\");\r\n\t\t\t\t\t\tbreak; // next month/year on page down/+ ctrl\r\n\t\t\t\tcase 35: if (event.ctrlKey || event.metaKey) {\r\n\t\t\t\t\t\t\t$.datepicker._clearDate(event.target);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\r\n\t\t\t\t\t\tbreak; // clear on ctrl or command +end\r\n\t\t\t\tcase 36: if (event.ctrlKey || event.metaKey) {\r\n\t\t\t\t\t\t\t$.datepicker._gotoToday(event.target);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\r\n\t\t\t\t\t\tbreak; // current on ctrl or command +home\r\n\t\t\t\tcase 37: if (event.ctrlKey || event.metaKey) {\r\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (isRTL ? +1 : -1), \"D\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\r\n\t\t\t\t\t\t// -1 day on ctrl or command +left\r\n\t\t\t\t\t\tif (event.originalEvent.altKey) {\r\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (event.ctrlKey ?\r\n\t\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepBigMonths\") :\r\n\t\t\t\t\t\t\t\t-$.datepicker._get(inst, \"stepMonths\")), \"M\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// next month/year on alt +left on Mac\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\tcase 38: if (event.ctrlKey || event.metaKey) {\r\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, -7, \"D\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\r\n\t\t\t\t\t\tbreak; // -1 week on ctrl or command +up\r\n\t\t\t\tcase 39: if (event.ctrlKey || event.metaKey) {\r\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (isRTL ? -1 : +1), \"D\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\r\n\t\t\t\t\t\t// +1 day on ctrl or command +right\r\n\t\t\t\t\t\tif (event.originalEvent.altKey) {\r\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, (event.ctrlKey ?\r\n\t\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepBigMonths\") :\r\n\t\t\t\t\t\t\t\t+$.datepicker._get(inst, \"stepMonths\")), \"M\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// next month/year on alt +right\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\tcase 40: if (event.ctrlKey || event.metaKey) {\r\n\t\t\t\t\t\t\t$.datepicker._adjustDate(event.target, +7, \"D\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\thandled = event.ctrlKey || event.metaKey;\r\n\t\t\t\t\t\tbreak; // +1 week on ctrl or command +down\r\n\t\t\t\tdefault: handled = false;\r\n\t\t\t}\r\n\t\t} else if (event.keyCode === 36 && event.ctrlKey) { // display the date picker on ctrl+home\r\n\t\t\t$.datepicker._showDatepicker(this);\r\n\t\t} else {\r\n\t\t\thandled = false;\r\n\t\t}\r\n\r\n\t\tif (handled) {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tevent.stopPropagation();\r\n\t\t}\r\n\t},\r\n\r\n\t/* Filter entered characters - based on date format. */\r\n\t_doKeyPress: function(event) {\r\n\t\tvar chars, chr,\r\n\t\t\tinst = $.datepicker._getInst(event.target);\r\n\r\n\t\tif ($.datepicker._get(inst, \"constrainInput\")) {\r\n\t\t\tchars = $.datepicker._possibleChars($.datepicker._get(inst, \"dateFormat\"));\r\n\t\t\tchr = String.fromCharCode(event.charCode == null ? event.keyCode : event.charCode);\r\n\t\t\treturn event.ctrlKey || event.metaKey || (chr < \" \" || !chars || chars.indexOf(chr) > -1);\r\n\t\t}\r\n\t},\r\n\r\n\t/* Synchronise manual entry and field/alternate field. */\r\n\t_doKeyUp: function(event) {\r\n\t\tvar date,\r\n\t\t\tinst = $.datepicker._getInst(event.target);\r\n\r\n\t\tif (inst.input.val() !== inst.lastVal) {\r\n\t\t\ttry {\r\n\t\t\t\tdate = $.datepicker.parseDate($.datepicker._get(inst, \"dateFormat\"),\r\n\t\t\t\t\t(inst.input ? inst.input.val() : null),\r\n\t\t\t\t\t$.datepicker._getFormatConfig(inst));\r\n\r\n\t\t\t\tif (date) { // only if valid\r\n\t\t\t\t\t$.datepicker._setDateFromField(inst);\r\n\t\t\t\t\t$.datepicker._updateAlternate(inst);\r\n\t\t\t\t\t$.datepicker._updateDatepicker(inst);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tcatch (err) {\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n\r\n\t/* Pop-up the date picker for a given input field.\r\n\t * If false returned from beforeShow event handler do not show.\r\n\t * @param input element - the input field attached to the date picker or\r\n\t *\t\t\t\t\tevent - if triggered by focus\r\n\t */\r\n\t_showDatepicker: function(input) {\r\n\t\tinput = input.target || input;\r\n\t\tif (input.nodeName.toLowerCase() !== \"input\") { // find from button/image trigger\r\n\t\t\tinput = $(\"input\", input.parentNode)[0];\r\n\t\t}\r\n\r\n\t\tif ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput === input) { // already here\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar inst, beforeShow, beforeShowSettings, isFixed,\r\n\t\t\toffset, showAnim, duration;\r\n\r\n\t\tinst = $.datepicker._getInst(input);\r\n\t\tif ($.datepicker._curInst && $.datepicker._curInst !== inst) {\r\n\t\t\t$.datepicker._curInst.dpDiv.stop(true, true);\r\n\t\t\tif ( inst && $.datepicker._datepickerShowing ) {\r\n\t\t\t\t$.datepicker._hideDatepicker( $.datepicker._curInst.input[0] );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tbeforeShow = $.datepicker._get(inst, \"beforeShow\");\r\n\t\tbeforeShowSettings = beforeShow ? beforeShow.apply(input, [input, inst]) : {};\r\n\t\tif(beforeShowSettings === false){\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tdatepicker_extendRemove(inst.settings, beforeShowSettings);\r\n\r\n\t\tinst.lastVal = null;\r\n\t\t$.datepicker._lastInput = input;\r\n\t\t$.datepicker._setDateFromField(inst);\r\n\r\n\t\tif ($.datepicker._inDialog) { // hide cursor\r\n\t\t\tinput.value = \"\";\r\n\t\t}\r\n\t\tif (!$.datepicker._pos) { // position below input\r\n\t\t\t$.datepicker._pos = $.datepicker._findPos(input);\r\n\t\t\t$.datepicker._pos[1] += input.offsetHeight; // add the height\r\n\t\t}\r\n\r\n\t\tisFixed = false;\r\n\t\t$(input).parents().each(function() {\r\n\t\t\tisFixed |= $(this).css(\"position\") === \"fixed\";\r\n\t\t\treturn !isFixed;\r\n\t\t});\r\n\r\n\t\toffset = {left: $.datepicker._pos[0], top: $.datepicker._pos[1]};\r\n\t\t$.datepicker._pos = null;\r\n\t\t//to avoid flashes on Firefox\r\n\t\tinst.dpDiv.empty();\r\n\t\t// determine sizing offscreen\r\n\t\tinst.dpDiv.css({position: \"absolute\", display: \"block\", top: \"-1000px\"});\r\n\t\t$.datepicker._updateDatepicker(inst);\r\n\t\t// fix width for dynamic number of date pickers\r\n\t\t// and adjust position before showing\r\n\t\toffset = $.datepicker._checkOffset(inst, offset, isFixed);\r\n\t\tinst.dpDiv.css({position: ($.datepicker._inDialog && $.blockUI ?\r\n\t\t\t\"static\" : (isFixed ? \"fixed\" : \"absolute\")), display: \"none\",\r\n\t\t\tleft: offset.left + \"px\", top: offset.top + \"px\"});\r\n\r\n\t\tif (!inst.inline) {\r\n\t\t\tshowAnim = $.datepicker._get(inst, \"showAnim\");\r\n\t\t\tduration = $.datepicker._get(inst, \"duration\");\r\n\t\t\tinst.dpDiv.css( \"z-index\", datepicker_getZindex( $( input ) ) + 1 );\r\n\t\t\t$.datepicker._datepickerShowing = true;\r\n\r\n\t\t\tif ( $.effects && $.effects.effect[ showAnim ] ) {\r\n\t\t\t\tinst.dpDiv.show(showAnim, $.datepicker._get(inst, \"showOptions\"), duration);\r\n\t\t\t} else {\r\n\t\t\t\tinst.dpDiv[showAnim || \"show\"](showAnim ? duration : null);\r\n\t\t\t}\r\n\r\n\t\t\tif ( $.datepicker._shouldFocusInput( inst ) ) {\r\n\t\t\t\tinst.input.focus();\r\n\t\t\t}\r\n\r\n\t\t\t$.datepicker._curInst = inst;\r\n\t\t}\r\n\t},\r\n\r\n\t/* Generate the date picker content. */\r\n\t_updateDatepicker: function(inst) {\r\n\t\tthis.maxRows = 4; //Reset the max number of rows being displayed (see #7043)\r\n\t\tdatepicker_instActive = inst; // for delegate hover events\r\n\t\tinst.dpDiv.empty().append(this._generateHTML(inst));\r\n\t\tthis._attachHandlers(inst);\r\n\r\n\t\tvar origyearshtml,\r\n\t\t\tnumMonths = this._getNumberOfMonths(inst),\r\n\t\t\tcols = numMonths[1],\r\n\t\t\twidth = 17,\r\n\t\t\tactiveCell = inst.dpDiv.find( \".\" + this._dayOverClass + \" a\" );\r\n\r\n\t\tif ( activeCell.length > 0 ) {\r\n\t\t\tdatepicker_handleMouseover.apply( activeCell.get( 0 ) );\r\n\t\t}\r\n\r\n\t\tinst.dpDiv.removeClass(\"ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4\").width(\"\");\r\n\t\tif (cols > 1) {\r\n\t\t\tinst.dpDiv.addClass(\"ui-datepicker-multi-\" + cols).css(\"width\", (width * cols) + \"em\");\r\n\t\t}\r\n\t\tinst.dpDiv[(numMonths[0] !== 1 || numMonths[1] !== 1 ? \"add\" : \"remove\") +\r\n\t\t\t\"Class\"](\"ui-datepicker-multi\");\r\n\t\tinst.dpDiv[(this._get(inst, \"isRTL\") ? \"add\" : \"remove\") +\r\n\t\t\t\"Class\"](\"ui-datepicker-rtl\");\r\n\r\n\t\tif (inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {\r\n\t\t\tinst.input.focus();\r\n\t\t}\r\n\r\n\t\t// deffered render of the years select (to avoid flashes on Firefox)\r\n\t\tif( inst.yearshtml ){\r\n\t\t\torigyearshtml = inst.yearshtml;\r\n\t\t\tsetTimeout(function(){\r\n\t\t\t\t//assure that inst.yearshtml didn't change.\r\n\t\t\t\tif( origyearshtml === inst.yearshtml && inst.yearshtml ){\r\n\t\t\t\t\tinst.dpDiv.find(\"select.ui-datepicker-year:first\").replaceWith(inst.yearshtml);\r\n\t\t\t\t}\r\n\t\t\t\torigyearshtml = inst.yearshtml = null;\r\n\t\t\t}, 0);\r\n\t\t}\r\n\t},\r\n\r\n\t// #6694 - don't focus the input if it's already focused\r\n\t// this breaks the change event in IE\r\n\t// Support: IE and jQuery <1.9\r\n\t_shouldFocusInput: function( inst ) {\r\n\t\treturn inst.input && inst.input.is( \":visible\" ) && !inst.input.is( \":disabled\" ) && !inst.input.is( \":focus\" );\r\n\t},\r\n\r\n\t/* Check positioning to remain on screen. */\r\n\t_checkOffset: function(inst, offset, isFixed) {\r\n\t\tvar dpWidth = inst.dpDiv.outerWidth(),\r\n\t\t\tdpHeight = inst.dpDiv.outerHeight(),\r\n\t\t\tinputWidth = inst.input ? inst.input.outerWidth() : 0,\r\n\t\t\tinputHeight = inst.input ? inst.input.outerHeight() : 0,\r\n\t\t\tviewWidth = document.documentElement.clientWidth + (isFixed ? 0 : $(document).scrollLeft()),\r\n\t\t\tviewHeight = document.documentElement.clientHeight + (isFixed ? 0 : $(document).scrollTop());\r\n\r\n\t\toffset.left -= (this._get(inst, \"isRTL\") ? (dpWidth - inputWidth) : 0);\r\n\t\toffset.left -= (isFixed && offset.left === inst.input.offset().left) ? $(document).scrollLeft() : 0;\r\n\t\toffset.top -= (isFixed && offset.top === (inst.input.offset().top + inputHeight)) ? $(document).scrollTop() : 0;\r\n\r\n\t\t// now check if datepicker is showing outside window viewport - move to a better place if so.\r\n\t\toffset.left -= Math.min(offset.left, (offset.left + dpWidth > viewWidth && viewWidth > dpWidth) ?\r\n\t\t\tMath.abs(offset.left + dpWidth - viewWidth) : 0);\r\n\t\toffset.top -= Math.min(offset.top, (offset.top + dpHeight > viewHeight && viewHeight > dpHeight) ?\r\n\t\t\tMath.abs(dpHeight + inputHeight) : 0);\r\n\r\n\t\treturn offset;\r\n\t},\r\n\r\n\t/* Find an object's position on the screen. */\r\n\t_findPos: function(obj) {\r\n\t\tvar position,\r\n\t\t\tinst = this._getInst(obj),\r\n\t\t\tisRTL = this._get(inst, \"isRTL\");\r\n\r\n\t\twhile (obj && (obj.type === \"hidden\" || obj.nodeType !== 1 || $.expr.filters.hidden(obj))) {\r\n\t\t\tobj = obj[isRTL ? \"previousSibling\" : \"nextSibling\"];\r\n\t\t}\r\n\r\n\t\tposition = $(obj).offset();\r\n\t\treturn [position.left, position.top];\r\n\t},\r\n\r\n\t/* Hide the date picker from view.\r\n\t * @param input element - the input field attached to the date picker\r\n\t */\r\n\t_hideDatepicker: function(input) {\r\n\t\tvar showAnim, duration, postProcess, onClose,\r\n\t\t\tinst = this._curInst;\r\n\r\n\t\tif (!inst || (input && inst !== $.data(input, \"datepicker\"))) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (this._datepickerShowing) {\r\n\t\t\tshowAnim = this._get(inst, \"showAnim\");\r\n\t\t\tduration = this._get(inst, \"duration\");\r\n\t\t\tpostProcess = function() {\r\n\t\t\t\t$.datepicker._tidyDialog(inst);\r\n\t\t\t};\r\n\r\n\t\t\t// DEPRECATED: after BC for 1.8.x $.effects[ showAnim ] is not needed\r\n\t\t\tif ( $.effects && ( $.effects.effect[ showAnim ] || $.effects[ showAnim ] ) ) {\r\n\t\t\t\tinst.dpDiv.hide(showAnim, $.datepicker._get(inst, \"showOptions\"), duration, postProcess);\r\n\t\t\t} else {\r\n\t\t\t\tinst.dpDiv[(showAnim === \"slideDown\" ? \"slideUp\" :\r\n\t\t\t\t\t(showAnim === \"fadeIn\" ? \"fadeOut\" : \"hide\"))]((showAnim ? duration : null), postProcess);\r\n\t\t\t}\r\n\r\n\t\t\tif (!showAnim) {\r\n\t\t\t\tpostProcess();\r\n\t\t\t}\r\n\t\t\tthis._datepickerShowing = false;\r\n\r\n\t\t\tonClose = this._get(inst, \"onClose\");\r\n\t\t\tif (onClose) {\r\n\t\t\t\tonClose.apply((inst.input ? inst.input[0] : null), [(inst.input ? inst.input.val() : \"\"), inst]);\r\n\t\t\t}\r\n\r\n\t\t\tthis._lastInput = null;\r\n\t\t\tif (this._inDialog) {\r\n\t\t\t\tthis._dialogInput.css({ position: \"absolute\", left: \"0\", top: \"-100px\" });\r\n\t\t\t\tif ($.blockUI) {\r\n\t\t\t\t\t$.unblockUI();\r\n\t\t\t\t\t$(\"body\").append(this.dpDiv);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis._inDialog = false;\r\n\t\t}\r\n\t},\r\n\r\n\t/* Tidy up after a dialog display. */\r\n\t_tidyDialog: function(inst) {\r\n\t\tinst.dpDiv.removeClass(this._dialogClass).unbind(\".ui-datepicker-calendar\");\r\n\t},\r\n\r\n\t/* Close date picker if clicked elsewhere. */\r\n\t_checkExternalClick: function(event) {\r\n\t\tif (!$.datepicker._curInst) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar $target = $(event.target),\r\n\t\t\tinst = $.datepicker._getInst($target[0]);\r\n\r\n\t\tif ( ( ( $target[0].id !== $.datepicker._mainDivId &&\r\n\t\t\t\t$target.parents(\"#\" + $.datepicker._mainDivId).length === 0 &&\r\n\t\t\t\t!$target.hasClass($.datepicker.markerClassName) &&\r\n\t\t\t\t!$target.closest(\".\" + $.datepicker._triggerClass).length &&\r\n\t\t\t\t$.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI) ) ) ||\r\n\t\t\t( $target.hasClass($.datepicker.markerClassName) && $.datepicker._curInst !== inst ) ) {\r\n\t\t\t\t$.datepicker._hideDatepicker();\r\n\t\t}\r\n\t},\r\n\r\n\t/* Adjust one of the date sub-fields. */\r\n\t_adjustDate: function(id, offset, period) {\r\n\t\tvar target = $(id),\r\n\t\t\tinst = this._getInst(target[0]);\r\n\r\n\t\tif (this._isDisabledDatepicker(target[0])) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._adjustInstDate(inst, offset +\r\n\t\t\t(period === \"M\" ? this._get(inst, \"showCurrentAtPos\") : 0), // undo positioning\r\n\t\t\tperiod);\r\n\t\tthis._updateDatepicker(inst);\r\n\t},\r\n\r\n\t/* Action for current link. */\r\n\t_gotoToday: function(id) {\r\n\t\tvar date,\r\n\t\t\ttarget = $(id),\r\n\t\t\tinst = this._getInst(target[0]);\r\n\r\n\t\tif (this._get(inst, \"gotoCurrent\") && inst.currentDay) {\r\n\t\t\tinst.selectedDay = inst.currentDay;\r\n\t\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth;\r\n\t\t\tinst.drawYear = inst.selectedYear = inst.currentYear;\r\n\t\t} else {\r\n\t\t\tdate = new Date();\r\n\t\t\tinst.selectedDay = date.getDate();\r\n\t\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\r\n\t\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\r\n\t\t}\r\n\t\tthis._notifyChange(inst);\r\n\t\tthis._adjustDate(target);\r\n\t},\r\n\r\n\t/* Action for selecting a new month/year. */\r\n\t_selectMonthYear: function(id, select, period) {\r\n\t\tvar target = $(id),\r\n\t\t\tinst = this._getInst(target[0]);\r\n\r\n\t\tinst[\"selected\" + (period === \"M\" ? \"Month\" : \"Year\")] =\r\n\t\tinst[\"draw\" + (period === \"M\" ? \"Month\" : \"Year\")] =\r\n\t\t\tparseInt(select.options[select.selectedIndex].value,10);\r\n\r\n\t\tthis._notifyChange(inst);\r\n\t\tthis._adjustDate(target);\r\n\t},\r\n\r\n\t/* Action for selecting a day. */\r\n\t_selectDay: function(id, month, year, td) {\r\n\t\tvar inst,\r\n\t\t\ttarget = $(id);\r\n\r\n\t\tif ($(td).hasClass(this._unselectableClass) || this._isDisabledDatepicker(target[0])) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tinst = this._getInst(target[0]);\r\n\t\tinst.selectedDay = inst.currentDay = $(\"a\", td).html();\r\n\t\tinst.selectedMonth = inst.currentMonth = month;\r\n\t\tinst.selectedYear = inst.currentYear = year;\r\n\t\tthis._selectDate(id, this._formatDate(inst,\r\n\t\t\tinst.currentDay, inst.currentMonth, inst.currentYear));\r\n\t},\r\n\r\n\t/* Erase the input field and hide the date picker. */\r\n\t_clearDate: function(id) {\r\n\t\tvar target = $(id);\r\n\t\tthis._selectDate(target, \"\");\r\n\t},\r\n\r\n\t/* Update the input field with the selected date. */\r\n\t_selectDate: function(id, dateStr) {\r\n\t\tvar onSelect,\r\n\t\t\ttarget = $(id),\r\n\t\t\tinst = this._getInst(target[0]);\r\n\r\n\t\tdateStr = (dateStr != null ? dateStr : this._formatDate(inst));\r\n\t\tif (inst.input) {\r\n\t\t\tinst.input.val(dateStr);\r\n\t\t}\r\n\t\tthis._updateAlternate(inst);\r\n\r\n\t\tonSelect = this._get(inst, \"onSelect\");\r\n\t\tif (onSelect) {\r\n\t\t\tonSelect.apply((inst.input ? inst.input[0] : null), [dateStr, inst]); // trigger custom callback\r\n\t\t} else if (inst.input) {\r\n\t\t\tinst.input.trigger(\"change\"); // fire the change event\r\n\t\t}\r\n\r\n\t\tif (inst.inline){\r\n\t\t\tthis._updateDatepicker(inst);\r\n\t\t} else {\r\n\t\t\tthis._hideDatepicker();\r\n\t\t\tthis._lastInput = inst.input[0];\r\n\t\t\tif (typeof(inst.input[0]) !== \"object\") {\r\n\t\t\t\tinst.input.focus(); // restore focus\r\n\t\t\t}\r\n\t\t\tthis._lastInput = null;\r\n\t\t}\r\n\t},\r\n\r\n\t/* Update any alternate field to synchronise with the main field. */\r\n\t_updateAlternate: function(inst) {\r\n\t\tvar altFormat, date, dateStr,\r\n\t\t\taltField = this._get(inst, \"altField\");\r\n\r\n\t\tif (altField) { // update alternate field too\r\n\t\t\taltFormat = this._get(inst, \"altFormat\") || this._get(inst, \"dateFormat\");\r\n\t\t\tdate = this._getDate(inst);\r\n\t\t\tdateStr = this.formatDate(altFormat, date, this._getFormatConfig(inst));\r\n\t\t\t$(altField).each(function() { $(this).val(dateStr); });\r\n\t\t}\r\n\t},\r\n\r\n\t/* Set as beforeShowDay function to prevent selection of weekends.\r\n\t * @param date Date - the date to customise\r\n\t * @return [boolean, string] - is this date selectable?, what is its CSS class?\r\n\t */\r\n\tnoWeekends: function(date) {\r\n\t\tvar day = date.getDay();\r\n\t\treturn [(day > 0 && day < 6), \"\"];\r\n\t},\r\n\r\n\t/* Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.\r\n\t * @param date Date - the date to get the week for\r\n\t * @return number - the number of the week within the year that contains this date\r\n\t */\r\n\tiso8601Week: function(date) {\r\n\t\tvar time,\r\n\t\t\tcheckDate = new Date(date.getTime());\r\n\r\n\t\t// Find Thursday of this week starting on Monday\r\n\t\tcheckDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));\r\n\r\n\t\ttime = checkDate.getTime();\r\n\t\tcheckDate.setMonth(0); // Compare with Jan 1\r\n\t\tcheckDate.setDate(1);\r\n\t\treturn Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;\r\n\t},\r\n\r\n\t/* Parse a string value into a date object.\r\n\t * See formatDate below for the possible formats.\r\n\t *\r\n\t * @param format string - the expected format of the date\r\n\t * @param value string - the date in the above format\r\n\t * @param settings Object - attributes include:\r\n\t *\t\t\t\t\tshortYearCutoff number - the cutoff year for determining the century (optional)\r\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\r\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\r\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\r\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\r\n\t * @return Date - the extracted date value or null if value is blank\r\n\t */\r\n\tparseDate: function (format, value, settings) {\r\n\t\tif (format == null || value == null) {\r\n\t\t\tthrow \"Invalid arguments\";\r\n\t\t}\r\n\r\n\t\tvalue = (typeof value === \"object\" ? value.toString() : value + \"\");\r\n\t\tif (value === \"\") {\r\n\t\t\treturn null;\r\n\t\t}\r\n\r\n\t\tvar iFormat, dim, extra,\r\n\t\t\tiValue = 0,\r\n\t\t\tshortYearCutoffTemp = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff,\r\n\t\t\tshortYearCutoff = (typeof shortYearCutoffTemp !== \"string\" ? shortYearCutoffTemp :\r\n\t\t\t\tnew Date().getFullYear() % 100 + parseInt(shortYearCutoffTemp, 10)),\r\n\t\t\tdayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,\r\n\t\t\tdayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,\r\n\t\t\tmonthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,\r\n\t\t\tmonthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,\r\n\t\t\tyear = -1,\r\n\t\t\tmonth = -1,\r\n\t\t\tday = -1,\r\n\t\t\tdoy = -1,\r\n\t\t\tliteral = false,\r\n\t\t\tdate,\r\n\t\t\t// Check whether a format character is doubled\r\n\t\t\tlookAhead = function(match) {\r\n\t\t\t\tvar matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);\r\n\t\t\t\tif (matches) {\r\n\t\t\t\t\tiFormat++;\r\n\t\t\t\t}\r\n\t\t\t\treturn matches;\r\n\t\t\t},\r\n\t\t\t// Extract a number from the string value\r\n\t\t\tgetNumber = function(match) {\r\n\t\t\t\tvar isDoubled = lookAhead(match),\r\n\t\t\t\t\tsize = (match === \"@\" ? 14 : (match === \"!\" ? 20 :\r\n\t\t\t\t\t(match === \"y\" && isDoubled ? 4 : (match === \"o\" ? 3 : 2)))),\r\n\t\t\t\t\tminSize = (match === \"y\" ? size : 1),\r\n\t\t\t\t\tdigits = new RegExp(\"^\\\\d{\" + minSize + \",\" + size + \"}\"),\r\n\t\t\t\t\tnum = value.substring(iValue).match(digits);\r\n\t\t\t\tif (!num) {\r\n\t\t\t\t\tthrow \"Missing number at position \" + iValue;\r\n\t\t\t\t}\r\n\t\t\t\tiValue += num[0].length;\r\n\t\t\t\treturn parseInt(num[0], 10);\r\n\t\t\t},\r\n\t\t\t// Extract a name from the string value and convert to an index\r\n\t\t\tgetName = function(match, shortNames, longNames) {\r\n\t\t\t\tvar index = -1,\r\n\t\t\t\t\tnames = $.map(lookAhead(match) ? longNames : shortNames, function (v, k) {\r\n\t\t\t\t\t\treturn [ [k, v] ];\r\n\t\t\t\t\t}).sort(function (a, b) {\r\n\t\t\t\t\t\treturn -(a[1].length - b[1].length);\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t$.each(names, function (i, pair) {\r\n\t\t\t\t\tvar name = pair[1];\r\n\t\t\t\t\tif (value.substr(iValue, name.length).toLowerCase() === name.toLowerCase()) {\r\n\t\t\t\t\t\tindex = pair[0];\r\n\t\t\t\t\t\tiValue += name.length;\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tif (index !== -1) {\r\n\t\t\t\t\treturn index + 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthrow \"Unknown name at position \" + iValue;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// Confirm that a literal character matches the string value\r\n\t\t\tcheckLiteral = function() {\r\n\t\t\t\tif (value.charAt(iValue) !== format.charAt(iFormat)) {\r\n\t\t\t\t\tthrow \"Unexpected literal at position \" + iValue;\r\n\t\t\t\t}\r\n\t\t\t\tiValue++;\r\n\t\t\t};\r\n\r\n\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\r\n\t\t\tif (literal) {\r\n\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\r\n\t\t\t\t\tliteral = false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcheckLiteral();\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tswitch (format.charAt(iFormat)) {\r\n\t\t\t\t\tcase \"d\":\r\n\t\t\t\t\t\tday = getNumber(\"d\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"D\":\r\n\t\t\t\t\t\tgetName(\"D\", dayNamesShort, dayNames);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"o\":\r\n\t\t\t\t\t\tdoy = getNumber(\"o\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"m\":\r\n\t\t\t\t\t\tmonth = getNumber(\"m\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"M\":\r\n\t\t\t\t\t\tmonth = getName(\"M\", monthNamesShort, monthNames);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"y\":\r\n\t\t\t\t\t\tyear = getNumber(\"y\");\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"@\":\r\n\t\t\t\t\t\tdate = new Date(getNumber(\"@\"));\r\n\t\t\t\t\t\tyear = date.getFullYear();\r\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\r\n\t\t\t\t\t\tday = date.getDate();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"!\":\r\n\t\t\t\t\t\tdate = new Date((getNumber(\"!\") - this._ticksTo1970) / 10000);\r\n\t\t\t\t\t\tyear = date.getFullYear();\r\n\t\t\t\t\t\tmonth = date.getMonth() + 1;\r\n\t\t\t\t\t\tday = date.getDate();\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"'\":\r\n\t\t\t\t\t\tif (lookAhead(\"'\")){\r\n\t\t\t\t\t\t\tcheckLiteral();\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tliteral = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tcheckLiteral();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (iValue < value.length){\r\n\t\t\textra = value.substr(iValue);\r\n\t\t\tif (!/^\\s+/.test(extra)) {\r\n\t\t\t\tthrow \"Extra/unparsed characters found in date: \" + extra;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (year === -1) {\r\n\t\t\tyear = new Date().getFullYear();\r\n\t\t} else if (year < 100) {\r\n\t\t\tyear += new Date().getFullYear() - new Date().getFullYear() % 100 +\r\n\t\t\t\t(year <= shortYearCutoff ? 0 : -100);\r\n\t\t}\r\n\r\n\t\tif (doy > -1) {\r\n\t\t\tmonth = 1;\r\n\t\t\tday = doy;\r\n\t\t\tdo {\r\n\t\t\t\tdim = this._getDaysInMonth(year, month - 1);\r\n\t\t\t\tif (day <= dim) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tmonth++;\r\n\t\t\t\tday -= dim;\r\n\t\t\t} while (true);\r\n\t\t}\r\n\r\n\t\tdate = this._daylightSavingAdjust(new Date(year, month - 1, day));\r\n\t\tif (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) {\r\n\t\t\tthrow \"Invalid date\"; // E.g. 31/02/00\r\n\t\t}\r\n\t\treturn date;\r\n\t},\r\n\r\n\t/* Standard date formats. */\r\n\tATOM: \"yy-mm-dd\", // RFC 3339 (ISO 8601)\r\n\tCOOKIE: \"D, dd M yy\",\r\n\tISO_8601: \"yy-mm-dd\",\r\n\tRFC_822: \"D, d M y\",\r\n\tRFC_850: \"DD, dd-M-y\",\r\n\tRFC_1036: \"D, d M y\",\r\n\tRFC_1123: \"D, d M yy\",\r\n\tRFC_2822: \"D, d M yy\",\r\n\tRSS: \"D, d M y\", // RFC 822\r\n\tTICKS: \"!\",\r\n\tTIMESTAMP: \"@\",\r\n\tW3C: \"yy-mm-dd\", // ISO 8601\r\n\r\n\t_ticksTo1970: (((1970 - 1) * 365 + Math.floor(1970 / 4) - Math.floor(1970 / 100) +\r\n\t\tMath.floor(1970 / 400)) * 24 * 60 * 60 * 10000000),\r\n\r\n\t/* Format a date object into a string value.\r\n\t * The format can be combinations of the following:\r\n\t * d - day of month (no leading zero)\r\n\t * dd - day of month (two digit)\r\n\t * o - day of year (no leading zeros)\r\n\t * oo - day of year (three digit)\r\n\t * D - day name short\r\n\t * DD - day name long\r\n\t * m - month of year (no leading zero)\r\n\t * mm - month of year (two digit)\r\n\t * M - month name short\r\n\t * MM - month name long\r\n\t * y - year (two digit)\r\n\t * yy - year (four digit)\r\n\t * @ - Unix timestamp (ms since 01/01/1970)\r\n\t * ! - Windows ticks (100ns since 01/01/0001)\r\n\t * \"...\" - literal text\r\n\t * '' - single quote\r\n\t *\r\n\t * @param format string - the desired format of the date\r\n\t * @param date Date - the date value to format\r\n\t * @param settings Object - attributes include:\r\n\t *\t\t\t\t\tdayNamesShort\tstring[7] - abbreviated names of the days from Sunday (optional)\r\n\t *\t\t\t\t\tdayNames\t\tstring[7] - names of the days from Sunday (optional)\r\n\t *\t\t\t\t\tmonthNamesShort string[12] - abbreviated names of the months (optional)\r\n\t *\t\t\t\t\tmonthNames\t\tstring[12] - names of the months (optional)\r\n\t * @return string - the date in the above format\r\n\t */\r\n\tformatDate: function (format, date, settings) {\r\n\t\tif (!date) {\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\r\n\t\tvar iFormat,\r\n\t\t\tdayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort,\r\n\t\t\tdayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames,\r\n\t\t\tmonthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort,\r\n\t\t\tmonthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames,\r\n\t\t\t// Check whether a format character is doubled\r\n\t\t\tlookAhead = function(match) {\r\n\t\t\t\tvar matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);\r\n\t\t\t\tif (matches) {\r\n\t\t\t\t\tiFormat++;\r\n\t\t\t\t}\r\n\t\t\t\treturn matches;\r\n\t\t\t},\r\n\t\t\t// Format a number, with leading zero if necessary\r\n\t\t\tformatNumber = function(match, value, len) {\r\n\t\t\t\tvar num = \"\" + value;\r\n\t\t\t\tif (lookAhead(match)) {\r\n\t\t\t\t\twhile (num.length < len) {\r\n\t\t\t\t\t\tnum = \"0\" + num;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn num;\r\n\t\t\t},\r\n\t\t\t// Format a name, short or long as requested\r\n\t\t\tformatName = function(match, value, shortNames, longNames) {\r\n\t\t\t\treturn (lookAhead(match) ? longNames[value] : shortNames[value]);\r\n\t\t\t},\r\n\t\t\toutput = \"\",\r\n\t\t\tliteral = false;\r\n\r\n\t\tif (date) {\r\n\t\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\r\n\t\t\t\tif (literal) {\r\n\t\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\r\n\t\t\t\t\t\tliteral = false;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\toutput += format.charAt(iFormat);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tswitch (format.charAt(iFormat)) {\r\n\t\t\t\t\t\tcase \"d\":\r\n\t\t\t\t\t\t\toutput += formatNumber(\"d\", date.getDate(), 2);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"D\":\r\n\t\t\t\t\t\t\toutput += formatName(\"D\", date.getDay(), dayNamesShort, dayNames);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"o\":\r\n\t\t\t\t\t\t\toutput += formatNumber(\"o\",\r\n\t\t\t\t\t\t\t\tMath.round((new Date(date.getFullYear(), date.getMonth(), date.getDate()).getTime() - new Date(date.getFullYear(), 0, 0).getTime()) / 86400000), 3);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"m\":\r\n\t\t\t\t\t\t\toutput += formatNumber(\"m\", date.getMonth() + 1, 2);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"M\":\r\n\t\t\t\t\t\t\toutput += formatName(\"M\", date.getMonth(), monthNamesShort, monthNames);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"y\":\r\n\t\t\t\t\t\t\toutput += (lookAhead(\"y\") ? date.getFullYear() :\r\n\t\t\t\t\t\t\t\t(date.getYear() % 100 < 10 ? \"0\" : \"\") + date.getYear() % 100);\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"@\":\r\n\t\t\t\t\t\t\toutput += date.getTime();\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"!\":\r\n\t\t\t\t\t\t\toutput += date.getTime() * 10000 + this._ticksTo1970;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"'\":\r\n\t\t\t\t\t\t\tif (lookAhead(\"'\")) {\r\n\t\t\t\t\t\t\t\toutput += \"'\";\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tliteral = true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\toutput += format.charAt(iFormat);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn output;\r\n\t},\r\n\r\n\t/* Extract all possible characters from the date format. */\r\n\t_possibleChars: function (format) {\r\n\t\tvar iFormat,\r\n\t\t\tchars = \"\",\r\n\t\t\tliteral = false,\r\n\t\t\t// Check whether a format character is doubled\r\n\t\t\tlookAhead = function(match) {\r\n\t\t\t\tvar matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) === match);\r\n\t\t\t\tif (matches) {\r\n\t\t\t\t\tiFormat++;\r\n\t\t\t\t}\r\n\t\t\t\treturn matches;\r\n\t\t\t};\r\n\r\n\t\tfor (iFormat = 0; iFormat < format.length; iFormat++) {\r\n\t\t\tif (literal) {\r\n\t\t\t\tif (format.charAt(iFormat) === \"'\" && !lookAhead(\"'\")) {\r\n\t\t\t\t\tliteral = false;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tchars += format.charAt(iFormat);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tswitch (format.charAt(iFormat)) {\r\n\t\t\t\t\tcase \"d\": case \"m\": case \"y\": case \"@\":\r\n\t\t\t\t\t\tchars += \"0123456789\";\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tcase \"D\": case \"M\":\r\n\t\t\t\t\t\treturn null; // Accept anything\r\n\t\t\t\t\tcase \"'\":\r\n\t\t\t\t\t\tif (lookAhead(\"'\")) {\r\n\t\t\t\t\t\t\tchars += \"'\";\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tliteral = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\tchars += format.charAt(iFormat);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn chars;\r\n\t},\r\n\r\n\t/* Get a setting value, defaulting if necessary. */\r\n\t_get: function(inst, name) {\r\n\t\treturn inst.settings[name] !== undefined ?\r\n\t\t\tinst.settings[name] : this._defaults[name];\r\n\t},\r\n\r\n\t/* Parse existing date and initialise date picker. */\r\n\t_setDateFromField: function(inst, noDefault) {\r\n\t\tif (inst.input.val() === inst.lastVal) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar dateFormat = this._get(inst, \"dateFormat\"),\r\n\t\t\tdates = inst.lastVal = inst.input ? inst.input.val() : null,\r\n\t\t\tdefaultDate = this._getDefaultDate(inst),\r\n\t\t\tdate = defaultDate,\r\n\t\t\tsettings = this._getFormatConfig(inst);\r\n\r\n\t\ttry {\r\n\t\t\tdate = this.parseDate(dateFormat, dates, settings) || defaultDate;\r\n\t\t} catch (event) {\r\n\t\t\tdates = (noDefault ? \"\" : dates);\r\n\t\t}\r\n\t\tinst.selectedDay = date.getDate();\r\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\r\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\r\n\t\tinst.currentDay = (dates ? date.getDate() : 0);\r\n\t\tinst.currentMonth = (dates ? date.getMonth() : 0);\r\n\t\tinst.currentYear = (dates ? date.getFullYear() : 0);\r\n\t\tthis._adjustInstDate(inst);\r\n\t},\r\n\r\n\t/* Retrieve the default date shown on opening. */\r\n\t_getDefaultDate: function(inst) {\r\n\t\treturn this._restrictMinMax(inst,\r\n\t\t\tthis._determineDate(inst, this._get(inst, \"defaultDate\"), new Date()));\r\n\t},\r\n\r\n\t/* A date may be specified as an exact value or a relative one. */\r\n\t_determineDate: function(inst, date, defaultDate) {\r\n\t\tvar offsetNumeric = function(offset) {\r\n\t\t\t\tvar date = new Date();\r\n\t\t\t\tdate.setDate(date.getDate() + offset);\r\n\t\t\t\treturn date;\r\n\t\t\t},\r\n\t\t\toffsetString = function(offset) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\treturn $.datepicker.parseDate($.datepicker._get(inst, \"dateFormat\"),\r\n\t\t\t\t\t\toffset, $.datepicker._getFormatConfig(inst));\r\n\t\t\t\t}\r\n\t\t\t\tcatch (e) {\r\n\t\t\t\t\t// Ignore\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar date = (offset.toLowerCase().match(/^c/) ?\r\n\t\t\t\t\t$.datepicker._getDate(inst) : null) || new Date(),\r\n\t\t\t\t\tyear = date.getFullYear(),\r\n\t\t\t\t\tmonth = date.getMonth(),\r\n\t\t\t\t\tday = date.getDate(),\r\n\t\t\t\t\tpattern = /([+\\-]?[0-9]+)\\s*(d|D|w|W|m|M|y|Y)?/g,\r\n\t\t\t\t\tmatches = pattern.exec(offset);\r\n\r\n\t\t\t\twhile (matches) {\r\n\t\t\t\t\tswitch (matches[2] || \"d\") {\r\n\t\t\t\t\t\tcase \"d\" : case \"D\" :\r\n\t\t\t\t\t\t\tday += parseInt(matches[1],10); break;\r\n\t\t\t\t\t\tcase \"w\" : case \"W\" :\r\n\t\t\t\t\t\t\tday += parseInt(matches[1],10) * 7; break;\r\n\t\t\t\t\t\tcase \"m\" : case \"M\" :\r\n\t\t\t\t\t\t\tmonth += parseInt(matches[1],10);\r\n\t\t\t\t\t\t\tday = Math.min(day, $.datepicker._getDaysInMonth(year, month));\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\tcase \"y\": case \"Y\" :\r\n\t\t\t\t\t\t\tyear += parseInt(matches[1],10);\r\n\t\t\t\t\t\t\tday = Math.min(day, $.datepicker._getDaysInMonth(year, month));\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tmatches = pattern.exec(offset);\r\n\t\t\t\t}\r\n\t\t\t\treturn new Date(year, month, day);\r\n\t\t\t},\r\n\t\t\tnewDate = (date == null || date === \"\" ? defaultDate : (typeof date === \"string\" ? offsetString(date) :\r\n\t\t\t\t(typeof date === \"number\" ? (isNaN(date) ? defaultDate : offsetNumeric(date)) : new Date(date.getTime()))));\r\n\r\n\t\tnewDate = (newDate && newDate.toString() === \"Invalid Date\" ? defaultDate : newDate);\r\n\t\tif (newDate) {\r\n\t\t\tnewDate.setHours(0);\r\n\t\t\tnewDate.setMinutes(0);\r\n\t\t\tnewDate.setSeconds(0);\r\n\t\t\tnewDate.setMilliseconds(0);\r\n\t\t}\r\n\t\treturn this._daylightSavingAdjust(newDate);\r\n\t},\r\n\r\n\t/* Handle switch to/from daylight saving.\r\n\t * Hours may be non-zero on daylight saving cut-over:\r\n\t * > 12 when midnight changeover, but then cannot generate\r\n\t * midnight datetime, so jump to 1AM, otherwise reset.\r\n\t * @param date (Date) the date to check\r\n\t * @return (Date) the corrected date\r\n\t */\r\n\t_daylightSavingAdjust: function(date) {\r\n\t\tif (!date) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tdate.setHours(date.getHours() > 12 ? date.getHours() + 2 : 0);\r\n\t\treturn date;\r\n\t},\r\n\r\n\t/* Set the date(s) directly. */\r\n\t_setDate: function(inst, date, noChange) {\r\n\t\tvar clear = !date,\r\n\t\t\torigMonth = inst.selectedMonth,\r\n\t\t\torigYear = inst.selectedYear,\r\n\t\t\tnewDate = this._restrictMinMax(inst, this._determineDate(inst, date, new Date()));\r\n\r\n\t\tinst.selectedDay = inst.currentDay = newDate.getDate();\r\n\t\tinst.drawMonth = inst.selectedMonth = inst.currentMonth = newDate.getMonth();\r\n\t\tinst.drawYear = inst.selectedYear = inst.currentYear = newDate.getFullYear();\r\n\t\tif ((origMonth !== inst.selectedMonth || origYear !== inst.selectedYear) && !noChange) {\r\n\t\t\tthis._notifyChange(inst);\r\n\t\t}\r\n\t\tthis._adjustInstDate(inst);\r\n\t\tif (inst.input) {\r\n\t\t\tinst.input.val(clear ? \"\" : this._formatDate(inst));\r\n\t\t}\r\n\t},\r\n\r\n\t/* Retrieve the date(s) directly. */\r\n\t_getDate: function(inst) {\r\n\t\tvar startDate = (!inst.currentYear || (inst.input && inst.input.val() === \"\") ? null :\r\n\t\t\tthis._daylightSavingAdjust(new Date(\r\n\t\t\tinst.currentYear, inst.currentMonth, inst.currentDay)));\r\n\t\t\treturn startDate;\r\n\t},\r\n\r\n\t/* Attach the onxxx handlers. These are declared statically so\r\n\t * they work with static code transformers like Caja.\r\n\t */\r\n\t_attachHandlers: function(inst) {\r\n\t\tvar stepMonths = this._get(inst, \"stepMonths\"),\r\n\t\t\tid = \"#\" + inst.id.replace( /\\\\\\\\/g, \"\\\\\" );\r\n\t\tinst.dpDiv.find(\"[data-handler]\").map(function () {\r\n\t\t\tvar handler = {\r\n\t\t\t\tprev: function () {\r\n\t\t\t\t\t$.datepicker._adjustDate(id, -stepMonths, \"M\");\r\n\t\t\t\t},\r\n\t\t\t\tnext: function () {\r\n\t\t\t\t\t$.datepicker._adjustDate(id, +stepMonths, \"M\");\r\n\t\t\t\t},\r\n\t\t\t\thide: function () {\r\n\t\t\t\t\t$.datepicker._hideDatepicker();\r\n\t\t\t\t},\r\n\t\t\t\ttoday: function () {\r\n\t\t\t\t\t$.datepicker._gotoToday(id);\r\n\t\t\t\t},\r\n\t\t\t\tselectDay: function () {\r\n\t\t\t\t\t$.datepicker._selectDay(id, +this.getAttribute(\"data-month\"), +this.getAttribute(\"data-year\"), this);\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t},\r\n\t\t\t\tselectMonth: function () {\r\n\t\t\t\t\t$.datepicker._selectMonthYear(id, this, \"M\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t},\r\n\t\t\t\tselectYear: function () {\r\n\t\t\t\t\t$.datepicker._selectMonthYear(id, this, \"Y\");\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t$(this).bind(this.getAttribute(\"data-event\"), handler[this.getAttribute(\"data-handler\")]);\r\n\t\t});\r\n\t},\r\n\r\n\t/* Generate the HTML for the current state of the date picker. */\r\n\t_generateHTML: function(inst) {\r\n\t\tvar maxDraw, prevText, prev, nextText, next, currentText, gotoDate,\r\n\t\t\tcontrols, buttonPanel, firstDay, showWeek, dayNames, dayNamesMin,\r\n\t\t\tmonthNames, monthNamesShort, beforeShowDay, showOtherMonths,\r\n\t\t\tselectOtherMonths, defaultDate, html, dow, row, group, col, selectedDate,\r\n\t\t\tcornerClass, calender, thead, day, daysInMonth, leadDays, curRows, numRows,\r\n\t\t\tprintDate, dRow, tbody, daySettings, otherMonth, unselectable,\r\n\t\t\ttempDate = new Date(),\r\n\t\t\ttoday = this._daylightSavingAdjust(\r\n\t\t\t\tnew Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate())), // clear time\r\n\t\t\tisRTL = this._get(inst, \"isRTL\"),\r\n\t\t\tshowButtonPanel = this._get(inst, \"showButtonPanel\"),\r\n\t\t\thideIfNoPrevNext = this._get(inst, \"hideIfNoPrevNext\"),\r\n\t\t\tnavigationAsDateFormat = this._get(inst, \"navigationAsDateFormat\"),\r\n\t\t\tnumMonths = this._getNumberOfMonths(inst),\r\n\t\t\tshowCurrentAtPos = this._get(inst, \"showCurrentAtPos\"),\r\n\t\t\tstepMonths = this._get(inst, \"stepMonths\"),\r\n\t\t\tisMultiMonth = (numMonths[0] !== 1 || numMonths[1] !== 1),\r\n\t\t\tcurrentDate = this._daylightSavingAdjust((!inst.currentDay ? new Date(9999, 9, 9) :\r\n\t\t\t\tnew Date(inst.currentYear, inst.currentMonth, inst.currentDay))),\r\n\t\t\tminDate = this._getMinMaxDate(inst, \"min\"),\r\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\"),\r\n\t\t\tdrawMonth = inst.drawMonth - showCurrentAtPos,\r\n\t\t\tdrawYear = inst.drawYear;\r\n\r\n\t\tif (drawMonth < 0) {\r\n\t\t\tdrawMonth += 12;\r\n\t\t\tdrawYear--;\r\n\t\t}\r\n\t\tif (maxDate) {\r\n\t\t\tmaxDraw = this._daylightSavingAdjust(new Date(maxDate.getFullYear(),\r\n\t\t\t\tmaxDate.getMonth() - (numMonths[0] * numMonths[1]) + 1, maxDate.getDate()));\r\n\t\t\tmaxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);\r\n\t\t\twhile (this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1)) > maxDraw) {\r\n\t\t\t\tdrawMonth--;\r\n\t\t\t\tif (drawMonth < 0) {\r\n\t\t\t\t\tdrawMonth = 11;\r\n\t\t\t\t\tdrawYear--;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tinst.drawMonth = drawMonth;\r\n\t\tinst.drawYear = drawYear;\r\n\r\n\t\tprevText = this._get(inst, \"prevText\");\r\n\t\tprevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText,\r\n\t\t\tthis._daylightSavingAdjust(new Date(drawYear, drawMonth - stepMonths, 1)),\r\n\t\t\tthis._getFormatConfig(inst)));\r\n\r\n\t\tprev = (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ?\r\n\t\t\t\"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click'\" +\r\n\t\t\t\" title='\" + prevText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"e\" : \"w\") + \"'>\" + prevText + \"</span></a>\" :\r\n\t\t\t(hideIfNoPrevNext ? \"\" : \"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='\"+ prevText +\"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"e\" : \"w\") + \"'>\" + prevText + \"</span></a>\"));\r\n\r\n\t\tnextText = this._get(inst, \"nextText\");\r\n\t\tnextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText,\r\n\t\t\tthis._daylightSavingAdjust(new Date(drawYear, drawMonth + stepMonths, 1)),\r\n\t\t\tthis._getFormatConfig(inst)));\r\n\r\n\t\tnext = (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ?\r\n\t\t\t\"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click'\" +\r\n\t\t\t\" title='\" + nextText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"w\" : \"e\") + \"'>\" + nextText + \"</span></a>\" :\r\n\t\t\t(hideIfNoPrevNext ? \"\" : \"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='\"+ nextText + \"'><span class='ui-icon ui-icon-circle-triangle-\" + ( isRTL ? \"w\" : \"e\") + \"'>\" + nextText + \"</span></a>\"));\r\n\r\n\t\tcurrentText = this._get(inst, \"currentText\");\r\n\t\tgotoDate = (this._get(inst, \"gotoCurrent\") && inst.currentDay ? currentDate : today);\r\n\t\tcurrentText = (!navigationAsDateFormat ? currentText :\r\n\t\t\tthis.formatDate(currentText, gotoDate, this._getFormatConfig(inst)));\r\n\r\n\t\tcontrols = (!inst.inline ? \"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>\" +\r\n\t\t\tthis._get(inst, \"closeText\") + \"</button>\" : \"\");\r\n\r\n\t\tbuttonPanel = (showButtonPanel) ? \"<div class='ui-datepicker-buttonpane ui-widget-content'>\" + (isRTL ? controls : \"\") +\r\n\t\t\t(this._isInRange(inst, gotoDate) ? \"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'\" +\r\n\t\t\t\">\" + currentText + \"</button>\" : \"\") + (isRTL ? \"\" : controls) + \"</div>\" : \"\";\r\n\r\n\t\tfirstDay = parseInt(this._get(inst, \"firstDay\"),10);\r\n\t\tfirstDay = (isNaN(firstDay) ? 0 : firstDay);\r\n\r\n\t\tshowWeek = this._get(inst, \"showWeek\");\r\n\t\tdayNames = this._get(inst, \"dayNames\");\r\n\t\tdayNamesMin = this._get(inst, \"dayNamesMin\");\r\n\t\tmonthNames = this._get(inst, \"monthNames\");\r\n\t\tmonthNamesShort = this._get(inst, \"monthNamesShort\");\r\n\t\tbeforeShowDay = this._get(inst, \"beforeShowDay\");\r\n\t\tshowOtherMonths = this._get(inst, \"showOtherMonths\");\r\n\t\tselectOtherMonths = this._get(inst, \"selectOtherMonths\");\r\n\t\tdefaultDate = this._getDefaultDate(inst);\r\n\t\thtml = \"\";\r\n\t\tdow;\r\n\t\tfor (row = 0; row < numMonths[0]; row++) {\r\n\t\t\tgroup = \"\";\r\n\t\t\tthis.maxRows = 4;\r\n\t\t\tfor (col = 0; col < numMonths[1]; col++) {\r\n\t\t\t\tselectedDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, inst.selectedDay));\r\n\t\t\t\tcornerClass = \" ui-corner-all\";\r\n\t\t\t\tcalender = \"\";\r\n\t\t\t\tif (isMultiMonth) {\r\n\t\t\t\t\tcalender += \"<div class='ui-datepicker-group\";\r\n\t\t\t\t\tif (numMonths[1] > 1) {\r\n\t\t\t\t\t\tswitch (col) {\r\n\t\t\t\t\t\t\tcase 0: calender += \" ui-datepicker-group-first\";\r\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + (isRTL ? \"right\" : \"left\"); break;\r\n\t\t\t\t\t\t\tcase numMonths[1]-1: calender += \" ui-datepicker-group-last\";\r\n\t\t\t\t\t\t\t\tcornerClass = \" ui-corner-\" + (isRTL ? \"left\" : \"right\"); break;\r\n\t\t\t\t\t\t\tdefault: calender += \" ui-datepicker-group-middle\"; cornerClass = \"\"; break;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcalender += \"'>\";\r\n\t\t\t\t}\r\n\t\t\t\tcalender += \"<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix\" + cornerClass + \"'>\" +\r\n\t\t\t\t\t(/all|left/.test(cornerClass) && row === 0 ? (isRTL ? next : prev) : \"\") +\r\n\t\t\t\t\t(/all|right/.test(cornerClass) && row === 0 ? (isRTL ? prev : next) : \"\") +\r\n\t\t\t\t\tthis._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate,\r\n\t\t\t\t\trow > 0 || col > 0, monthNames, monthNamesShort) + // draw month headers\r\n\t\t\t\t\t\"</div><table class='ui-datepicker-calendar'><thead>\" +\r\n\t\t\t\t\t\"<tr>\";\r\n\t\t\t\tthead = (showWeek ? \"<th class='ui-datepicker-week-col'>\" + this._get(inst, \"weekHeader\") + \"</th>\" : \"\");\r\n\t\t\t\tfor (dow = 0; dow < 7; dow++) { // days of the week\r\n\t\t\t\t\tday = (dow + firstDay) % 7;\r\n\t\t\t\t\tthead += \"<th scope='col'\" + ((dow + firstDay + 6) % 7 >= 5 ? \" class='ui-datepicker-week-end'\" : \"\") + \">\" +\r\n\t\t\t\t\t\t\"<span title='\" + dayNames[day] + \"'>\" + dayNamesMin[day] + \"</span></th>\";\r\n\t\t\t\t}\r\n\t\t\t\tcalender += thead + \"</tr></thead><tbody>\";\r\n\t\t\t\tdaysInMonth = this._getDaysInMonth(drawYear, drawMonth);\r\n\t\t\t\tif (drawYear === inst.selectedYear && drawMonth === inst.selectedMonth) {\r\n\t\t\t\t\tinst.selectedDay = Math.min(inst.selectedDay, daysInMonth);\r\n\t\t\t\t}\r\n\t\t\t\tleadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;\r\n\t\t\t\tcurRows = Math.ceil((leadDays + daysInMonth) / 7); // calculate the number of rows to generate\r\n\t\t\t\tnumRows = (isMultiMonth ? this.maxRows > curRows ? this.maxRows : curRows : curRows); //If multiple months, use the higher number of rows (see #7043)\r\n\t\t\t\tthis.maxRows = numRows;\r\n\t\t\t\tprintDate = this._daylightSavingAdjust(new Date(drawYear, drawMonth, 1 - leadDays));\r\n\t\t\t\tfor (dRow = 0; dRow < numRows; dRow++) { // create date picker rows\r\n\t\t\t\t\tcalender += \"<tr>\";\r\n\t\t\t\t\ttbody = (!showWeek ? \"\" : \"<td class='ui-datepicker-week-col'>\" +\r\n\t\t\t\t\t\tthis._get(inst, \"calculateWeek\")(printDate) + \"</td>\");\r\n\t\t\t\t\tfor (dow = 0; dow < 7; dow++) { // create date picker days\r\n\t\t\t\t\t\tdaySettings = (beforeShowDay ?\r\n\t\t\t\t\t\t\tbeforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true, \"\"]);\r\n\t\t\t\t\t\totherMonth = (printDate.getMonth() !== drawMonth);\r\n\t\t\t\t\t\tunselectable = (otherMonth && !selectOtherMonths) || !daySettings[0] ||\r\n\t\t\t\t\t\t\t(minDate && printDate < minDate) || (maxDate && printDate > maxDate);\r\n\t\t\t\t\t\ttbody += \"<td class='\" +\r\n\t\t\t\t\t\t\t((dow + firstDay + 6) % 7 >= 5 ? \" ui-datepicker-week-end\" : \"\") + // highlight weekends\r\n\t\t\t\t\t\t\t(otherMonth ? \" ui-datepicker-other-month\" : \"\") + // highlight days from other months\r\n\t\t\t\t\t\t\t((printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent) || // user pressed key\r\n\t\t\t\t\t\t\t(defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime()) ?\r\n\t\t\t\t\t\t\t// or defaultDate is current printedDate and defaultDate is selectedDate\r\n\t\t\t\t\t\t\t\" \" + this._dayOverClass : \"\") + // highlight selected day\r\n\t\t\t\t\t\t\t(unselectable ? \" \" + this._unselectableClass + \" ui-state-disabled\": \"\") + // highlight unselectable days\r\n\t\t\t\t\t\t\t(otherMonth && !showOtherMonths ? \"\" : \" \" + daySettings[1] + // highlight custom dates\r\n\t\t\t\t\t\t\t(printDate.getTime() === currentDate.getTime() ? \" \" + this._currentClass : \"\") + // highlight selected day\r\n\t\t\t\t\t\t\t(printDate.getTime() === today.getTime() ? \" ui-datepicker-today\" : \"\")) + \"'\" + // highlight today (if different)\r\n\t\t\t\t\t\t\t((!otherMonth || showOtherMonths) && daySettings[2] ? \" title='\" + daySettings[2].replace(/'/g, \"'\") + \"'\" : \"\") + // cell title\r\n\t\t\t\t\t\t\t(unselectable ? \"\" : \" data-handler='selectDay' data-event='click' data-month='\" + printDate.getMonth() + \"' data-year='\" + printDate.getFullYear() + \"'\") + \">\" + // actions\r\n\t\t\t\t\t\t\t(otherMonth && !showOtherMonths ? \" \" : // display for other months\r\n\t\t\t\t\t\t\t(unselectable ? \"<span class='ui-state-default'>\" + printDate.getDate() + \"</span>\" : \"<a class='ui-state-default\" +\r\n\t\t\t\t\t\t\t(printDate.getTime() === today.getTime() ? \" ui-state-highlight\" : \"\") +\r\n\t\t\t\t\t\t\t(printDate.getTime() === currentDate.getTime() ? \" ui-state-active\" : \"\") + // highlight selected day\r\n\t\t\t\t\t\t\t(otherMonth ? \" ui-priority-secondary\" : \"\") + // distinguish dates from other months\r\n\t\t\t\t\t\t\t\"' href='#'>\" + printDate.getDate() + \"</a>\")) + \"</td>\"; // display selectable date\r\n\t\t\t\t\t\tprintDate.setDate(printDate.getDate() + 1);\r\n\t\t\t\t\t\tprintDate = this._daylightSavingAdjust(printDate);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcalender += tbody + \"</tr>\";\r\n\t\t\t\t}\r\n\t\t\t\tdrawMonth++;\r\n\t\t\t\tif (drawMonth > 11) {\r\n\t\t\t\t\tdrawMonth = 0;\r\n\t\t\t\t\tdrawYear++;\r\n\t\t\t\t}\r\n\t\t\t\tcalender += \"</tbody></table>\" + (isMultiMonth ? \"</div>\" +\r\n\t\t\t\t\t\t\t((numMonths[0] > 0 && col === numMonths[1]-1) ? \"<div class='ui-datepicker-row-break'></div>\" : \"\") : \"\");\r\n\t\t\t\tgroup += calender;\r\n\t\t\t}\r\n\t\t\thtml += group;\r\n\t\t}\r\n\t\thtml += buttonPanel;\r\n\t\tinst._keyEvent = false;\r\n\t\treturn html;\r\n\t},\r\n\r\n\t/* Generate the month and year header. */\r\n\t_generateMonthYearHeader: function(inst, drawMonth, drawYear, minDate, maxDate,\r\n\t\t\tsecondary, monthNames, monthNamesShort) {\r\n\r\n\t\tvar inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,\r\n\t\t\tchangeMonth = this._get(inst, \"changeMonth\"),\r\n\t\t\tchangeYear = this._get(inst, \"changeYear\"),\r\n\t\t\tshowMonthAfterYear = this._get(inst, \"showMonthAfterYear\"),\r\n\t\t\thtml = \"<div class='ui-datepicker-title'>\",\r\n\t\t\tmonthHtml = \"\";\r\n\r\n\t\t// month selection\r\n\t\tif (secondary || !changeMonth) {\r\n\t\t\tmonthHtml += \"<span class='ui-datepicker-month'>\" + monthNames[drawMonth] + \"</span>\";\r\n\t\t} else {\r\n\t\t\tinMinYear = (minDate && minDate.getFullYear() === drawYear);\r\n\t\t\tinMaxYear = (maxDate && maxDate.getFullYear() === drawYear);\r\n\t\t\tmonthHtml += \"<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>\";\r\n\t\t\tfor ( month = 0; month < 12; month++) {\r\n\t\t\t\tif ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth())) {\r\n\t\t\t\t\tmonthHtml += \"<option value='\" + month + \"'\" +\r\n\t\t\t\t\t\t(month === drawMonth ? \" selected='selected'\" : \"\") +\r\n\t\t\t\t\t\t\">\" + monthNamesShort[month] + \"</option>\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tmonthHtml += \"</select>\";\r\n\t\t}\r\n\r\n\t\tif (!showMonthAfterYear) {\r\n\t\t\thtml += monthHtml + (secondary || !(changeMonth && changeYear) ? \" \" : \"\");\r\n\t\t}\r\n\r\n\t\t// year selection\r\n\t\tif ( !inst.yearshtml ) {\r\n\t\t\tinst.yearshtml = \"\";\r\n\t\t\tif (secondary || !changeYear) {\r\n\t\t\t\thtml += \"<span class='ui-datepicker-year'>\" + drawYear + \"</span>\";\r\n\t\t\t} else {\r\n\t\t\t\t// determine range of years to display\r\n\t\t\t\tyears = this._get(inst, \"yearRange\").split(\":\");\r\n\t\t\t\tthisYear = new Date().getFullYear();\r\n\t\t\t\tdetermineYear = function(value) {\r\n\t\t\t\t\tvar year = (value.match(/c[+\\-].*/) ? drawYear + parseInt(value.substring(1), 10) :\r\n\t\t\t\t\t\t(value.match(/[+\\-].*/) ? thisYear + parseInt(value, 10) :\r\n\t\t\t\t\t\tparseInt(value, 10)));\r\n\t\t\t\t\treturn (isNaN(year) ? thisYear : year);\r\n\t\t\t\t};\r\n\t\t\t\tyear = determineYear(years[0]);\r\n\t\t\t\tendYear = Math.max(year, determineYear(years[1] || \"\"));\r\n\t\t\t\tyear = (minDate ? Math.max(year, minDate.getFullYear()) : year);\r\n\t\t\t\tendYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);\r\n\t\t\t\tinst.yearshtml += \"<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>\";\r\n\t\t\t\tfor (; year <= endYear; year++) {\r\n\t\t\t\t\tinst.yearshtml += \"<option value='\" + year + \"'\" +\r\n\t\t\t\t\t\t(year === drawYear ? \" selected='selected'\" : \"\") +\r\n\t\t\t\t\t\t\">\" + year + \"</option>\";\r\n\t\t\t\t}\r\n\t\t\t\tinst.yearshtml += \"</select>\";\r\n\r\n\t\t\t\thtml += inst.yearshtml;\r\n\t\t\t\tinst.yearshtml = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\thtml += this._get(inst, \"yearSuffix\");\r\n\t\tif (showMonthAfterYear) {\r\n\t\t\thtml += (secondary || !(changeMonth && changeYear) ? \" \" : \"\") + monthHtml;\r\n\t\t}\r\n\t\thtml += \"</div>\"; // Close datepicker_header\r\n\t\treturn html;\r\n\t},\r\n\r\n\t/* Adjust one of the date sub-fields. */\r\n\t_adjustInstDate: function(inst, offset, period) {\r\n\t\tvar year = inst.drawYear + (period === \"Y\" ? offset : 0),\r\n\t\t\tmonth = inst.drawMonth + (period === \"M\" ? offset : 0),\r\n\t\t\tday = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) + (period === \"D\" ? offset : 0),\r\n\t\t\tdate = this._restrictMinMax(inst, this._daylightSavingAdjust(new Date(year, month, day)));\r\n\r\n\t\tinst.selectedDay = date.getDate();\r\n\t\tinst.drawMonth = inst.selectedMonth = date.getMonth();\r\n\t\tinst.drawYear = inst.selectedYear = date.getFullYear();\r\n\t\tif (period === \"M\" || period === \"Y\") {\r\n\t\t\tthis._notifyChange(inst);\r\n\t\t}\r\n\t},\r\n\r\n\t/* Ensure a date is within any min/max bounds. */\r\n\t_restrictMinMax: function(inst, date) {\r\n\t\tvar minDate = this._getMinMaxDate(inst, \"min\"),\r\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\"),\r\n\t\t\tnewDate = (minDate && date < minDate ? minDate : date);\r\n\t\treturn (maxDate && newDate > maxDate ? maxDate : newDate);\r\n\t},\r\n\r\n\t/* Notify change of month/year. */\r\n\t_notifyChange: function(inst) {\r\n\t\tvar onChange = this._get(inst, \"onChangeMonthYear\");\r\n\t\tif (onChange) {\r\n\t\t\tonChange.apply((inst.input ? inst.input[0] : null),\r\n\t\t\t\t[inst.selectedYear, inst.selectedMonth + 1, inst]);\r\n\t\t}\r\n\t},\r\n\r\n\t/* Determine the number of months to show. */\r\n\t_getNumberOfMonths: function(inst) {\r\n\t\tvar numMonths = this._get(inst, \"numberOfMonths\");\r\n\t\treturn (numMonths == null ? [1, 1] : (typeof numMonths === \"number\" ? [1, numMonths] : numMonths));\r\n\t},\r\n\r\n\t/* Determine the current maximum date - ensure no time components are set. */\r\n\t_getMinMaxDate: function(inst, minMax) {\r\n\t\treturn this._determineDate(inst, this._get(inst, minMax + \"Date\"), null);\r\n\t},\r\n\r\n\t/* Find the number of days in a given month. */\r\n\t_getDaysInMonth: function(year, month) {\r\n\t\treturn 32 - this._daylightSavingAdjust(new Date(year, month, 32)).getDate();\r\n\t},\r\n\r\n\t/* Find the day of the week of the first of a month. */\r\n\t_getFirstDayOfMonth: function(year, month) {\r\n\t\treturn new Date(year, month, 1).getDay();\r\n\t},\r\n\r\n\t/* Determines if we should allow a \"next/prev\" month display change. */\r\n\t_canAdjustMonth: function(inst, offset, curYear, curMonth) {\r\n\t\tvar numMonths = this._getNumberOfMonths(inst),\r\n\t\t\tdate = this._daylightSavingAdjust(new Date(curYear,\r\n\t\t\tcurMonth + (offset < 0 ? offset : numMonths[0] * numMonths[1]), 1));\r\n\r\n\t\tif (offset < 0) {\r\n\t\t\tdate.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));\r\n\t\t}\r\n\t\treturn this._isInRange(inst, date);\r\n\t},\r\n\r\n\t/* Is the given date in the accepted range? */\r\n\t_isInRange: function(inst, date) {\r\n\t\tvar yearSplit, currentYear,\r\n\t\t\tminDate = this._getMinMaxDate(inst, \"min\"),\r\n\t\t\tmaxDate = this._getMinMaxDate(inst, \"max\"),\r\n\t\t\tminYear = null,\r\n\t\t\tmaxYear = null,\r\n\t\t\tyears = this._get(inst, \"yearRange\");\r\n\t\t\tif (years){\r\n\t\t\t\tyearSplit = years.split(\":\");\r\n\t\t\t\tcurrentYear = new Date().getFullYear();\r\n\t\t\t\tminYear = parseInt(yearSplit[0], 10);\r\n\t\t\t\tmaxYear = parseInt(yearSplit[1], 10);\r\n\t\t\t\tif ( yearSplit[0].match(/[+\\-].*/) ) {\r\n\t\t\t\t\tminYear += currentYear;\r\n\t\t\t\t}\r\n\t\t\t\tif ( yearSplit[1].match(/[+\\-].*/) ) {\r\n\t\t\t\t\tmaxYear += currentYear;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\treturn ((!minDate || date.getTime() >= minDate.getTime()) &&\r\n\t\t\t(!maxDate || date.getTime() <= maxDate.getTime()) &&\r\n\t\t\t(!minYear || date.getFullYear() >= minYear) &&\r\n\t\t\t(!maxYear || date.getFullYear() <= maxYear));\r\n\t},\r\n\r\n\t/* Provide the configuration settings for formatting/parsing. */\r\n\t_getFormatConfig: function(inst) {\r\n\t\tvar shortYearCutoff = this._get(inst, \"shortYearCutoff\");\r\n\t\tshortYearCutoff = (typeof shortYearCutoff !== \"string\" ? shortYearCutoff :\r\n\t\t\tnew Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));\r\n\t\treturn {shortYearCutoff: shortYearCutoff,\r\n\t\t\tdayNamesShort: this._get(inst, \"dayNamesShort\"), dayNames: this._get(inst, \"dayNames\"),\r\n\t\t\tmonthNamesShort: this._get(inst, \"monthNamesShort\"), monthNames: this._get(inst, \"monthNames\")};\r\n\t},\r\n\r\n\t/* Format the given date for display. */\r\n\t_formatDate: function(inst, day, month, year) {\r\n\t\tif (!day) {\r\n\t\t\tinst.currentDay = inst.selectedDay;\r\n\t\t\tinst.currentMonth = inst.selectedMonth;\r\n\t\t\tinst.currentYear = inst.selectedYear;\r\n\t\t}\r\n\t\tvar date = (day ? (typeof day === \"object\" ? day :\r\n\t\t\tthis._daylightSavingAdjust(new Date(year, month, day))) :\r\n\t\t\tthis._daylightSavingAdjust(new Date(inst.currentYear, inst.currentMonth, inst.currentDay)));\r\n\t\treturn this.formatDate(this._get(inst, \"dateFormat\"), date, this._getFormatConfig(inst));\r\n\t}\r\n});\r\n\r\n/*\r\n * Bind hover events for datepicker elements.\r\n * Done via delegate so the binding only occurs once in the lifetime of the parent div.\r\n * Global datepicker_instActive, set by _updateDatepicker allows the handlers to find their way back to the active picker.\r\n */\r\nfunction datepicker_bindHover(dpDiv) {\r\n\tvar selector = \"button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a\";\r\n\treturn dpDiv.delegate(selector, \"mouseout\", function() {\r\n\t\t\t$(this).removeClass(\"ui-state-hover\");\r\n\t\t\tif (this.className.indexOf(\"ui-datepicker-prev\") !== -1) {\r\n\t\t\t\t$(this).removeClass(\"ui-datepicker-prev-hover\");\r\n\t\t\t}\r\n\t\t\tif (this.className.indexOf(\"ui-datepicker-next\") !== -1) {\r\n\t\t\t\t$(this).removeClass(\"ui-datepicker-next-hover\");\r\n\t\t\t}\r\n\t\t})\r\n\t\t.delegate( selector, \"mouseover\", datepicker_handleMouseover );\r\n}\r\n\r\nfunction datepicker_handleMouseover() {\r\n\tif (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) {\r\n\t\t$(this).parents(\".ui-datepicker-calendar\").find(\"a\").removeClass(\"ui-state-hover\");\r\n\t\t$(this).addClass(\"ui-state-hover\");\r\n\t\tif (this.className.indexOf(\"ui-datepicker-prev\") !== -1) {\r\n\t\t\t$(this).addClass(\"ui-datepicker-prev-hover\");\r\n\t\t}\r\n\t\tif (this.className.indexOf(\"ui-datepicker-next\") !== -1) {\r\n\t\t\t$(this).addClass(\"ui-datepicker-next-hover\");\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/* jQuery extend now ignores nulls! */\r\nfunction datepicker_extendRemove(target, props) {\r\n\t$.extend(target, props);\r\n\tfor (var name in props) {\r\n\t\tif (props[name] == null) {\r\n\t\t\ttarget[name] = props[name];\r\n\t\t}\r\n\t}\r\n\treturn target;\r\n}\r\n\r\n/* Invoke the datepicker functionality.\r\n @param options string - a command, optionally followed by additional parameters or\r\n\t\t\t\t\tObject - settings for attaching new datepicker functionality\r\n @return jQuery object */\r\n$.fn.datepicker = function(options){\r\n\r\n\t/* Verify an empty collection wasn't passed - Fixes #6976 */\r\n\tif ( !this.length ) {\r\n\t\treturn this;\r\n\t}\r\n\r\n\t/* Initialise the date picker. */\r\n\tif (!$.datepicker.initialized) {\r\n\t\t$(document).mousedown($.datepicker._checkExternalClick);\r\n\t\t$.datepicker.initialized = true;\r\n\t}\r\n\r\n\t/* Append datepicker main container to body if not exist. */\r\n\tif ($(\"#\"+$.datepicker._mainDivId).length === 0) {\r\n\t\t$(\"body\").append($.datepicker.dpDiv);\r\n\t}\r\n\r\n\tvar otherArgs = Array.prototype.slice.call(arguments, 1);\r\n\tif (typeof options === \"string\" && (options === \"isDisabled\" || options === \"getDate\" || options === \"widget\")) {\r\n\t\treturn $.datepicker[\"_\" + options + \"Datepicker\"].\r\n\t\t\tapply($.datepicker, [this[0]].concat(otherArgs));\r\n\t}\r\n\tif (options === \"option\" && arguments.length === 2 && typeof arguments[1] === \"string\") {\r\n\t\treturn $.datepicker[\"_\" + options + \"Datepicker\"].\r\n\t\t\tapply($.datepicker, [this[0]].concat(otherArgs));\r\n\t}\r\n\treturn this.each(function() {\r\n\t\ttypeof options === \"string\" ?\r\n\t\t\t$.datepicker[\"_\" + options + \"Datepicker\"].\r\n\t\t\t\tapply($.datepicker, [this].concat(otherArgs)) :\r\n\t\t\t$.datepicker._attachDatepicker(this, options);\r\n\t});\r\n};\r\n\r\n$.datepicker = new Datepicker(); // singleton instance\r\n$.datepicker.initialized = false;\r\n$.datepicker.uuid = new Date().getTime();\r\n$.datepicker.version = \"1.11.4\";\r\n\r\nvar datepicker = $.datepicker;\r\n\r\n\r\n/*!\r\n * jQuery UI Dialog 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/dialog/\r\n */\r\n\r\n\r\nvar dialog = $.widget( \"ui.dialog\", {\r\n\tversion: \"1.11.4\",\r\n\toptions: {\r\n\t\tappendTo: \"body\",\r\n\t\tautoOpen: true,\r\n\t\tbuttons: [],\r\n\t\tcloseOnEscape: true,\r\n\t\tcloseText: \"Close\",\r\n\t\tdialogClass: \"\",\r\n\t\tdraggable: true,\r\n\t\thide: null,\r\n\t\theight: \"auto\",\r\n\t\tmaxHeight: null,\r\n\t\tmaxWidth: null,\r\n\t\tminHeight: 150,\r\n\t\tminWidth: 150,\r\n\t\tmodal: false,\r\n\t\tposition: {\r\n\t\t\tmy: \"center\",\r\n\t\t\tat: \"center\",\r\n\t\t\tof: window,\r\n\t\t\tcollision: \"fit\",\r\n\t\t\t// Ensure the titlebar is always visible\r\n\t\t\tusing: function( pos ) {\r\n\t\t\t\tvar topOffset = $( this ).css( pos ).offset().top;\r\n\t\t\t\tif ( topOffset < 0 ) {\r\n\t\t\t\t\t$( this ).css( \"top\", pos.top - topOffset );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tresizable: true,\r\n\t\tshow: null,\r\n\t\ttitle: null,\r\n\t\twidth: 300,\r\n\r\n\t\t// callbacks\r\n\t\tbeforeClose: null,\r\n\t\tclose: null,\r\n\t\tdrag: null,\r\n\t\tdragStart: null,\r\n\t\tdragStop: null,\r\n\t\tfocus: null,\r\n\t\topen: null,\r\n\t\tresize: null,\r\n\t\tresizeStart: null,\r\n\t\tresizeStop: null\r\n\t},\r\n\r\n\tsizeRelatedOptions: {\r\n\t\tbuttons: true,\r\n\t\theight: true,\r\n\t\tmaxHeight: true,\r\n\t\tmaxWidth: true,\r\n\t\tminHeight: true,\r\n\t\tminWidth: true,\r\n\t\twidth: true\r\n\t},\r\n\r\n\tresizableRelatedOptions: {\r\n\t\tmaxHeight: true,\r\n\t\tmaxWidth: true,\r\n\t\tminHeight: true,\r\n\t\tminWidth: true\r\n\t},\r\n\r\n\t_create: function() {\r\n\t\tthis.originalCss = {\r\n\t\t\tdisplay: this.element[ 0 ].style.display,\r\n\t\t\twidth: this.element[ 0 ].style.width,\r\n\t\t\tminHeight: this.element[ 0 ].style.minHeight,\r\n\t\t\tmaxHeight: this.element[ 0 ].style.maxHeight,\r\n\t\t\theight: this.element[ 0 ].style.height\r\n\t\t};\r\n\t\tthis.originalPosition = {\r\n\t\t\tparent: this.element.parent(),\r\n\t\t\tindex: this.element.parent().children().index( this.element )\r\n\t\t};\r\n\t\tthis.originalTitle = this.element.attr( \"title\" );\r\n\t\tthis.options.title = this.options.title || this.originalTitle;\r\n\r\n\t\tthis._createWrapper();\r\n\r\n\t\tthis.element\r\n\t\t\t.show()\r\n\t\t\t.removeAttr( \"title\" )\r\n\t\t\t.addClass( \"ui-dialog-content ui-widget-content\" )\r\n\t\t\t.appendTo( this.uiDialog );\r\n\r\n\t\tthis._createTitlebar();\r\n\t\tthis._createButtonPane();\r\n\r\n\t\tif ( this.options.draggable && $.fn.draggable ) {\r\n\t\t\tthis._makeDraggable();\r\n\t\t}\r\n\t\tif ( this.options.resizable && $.fn.resizable ) {\r\n\t\t\tthis._makeResizable();\r\n\t\t}\r\n\r\n\t\tthis._isOpen = false;\r\n\r\n\t\tthis._trackFocus();\r\n\t},\r\n\r\n\t_init: function() {\r\n\t\tif ( this.options.autoOpen ) {\r\n\t\t\tthis.open();\r\n\t\t}\r\n\t},\r\n\r\n\t_appendTo: function() {\r\n\t\tvar element = this.options.appendTo;\r\n\t\tif ( element && (element.jquery || element.nodeType) ) {\r\n\t\t\treturn $( element );\r\n\t\t}\r\n\t\treturn this.document.find( element || \"body\" ).eq( 0 );\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tvar next,\r\n\t\t\toriginalPosition = this.originalPosition;\r\n\r\n\t\tthis._untrackInstance();\r\n\t\tthis._destroyOverlay();\r\n\r\n\t\tthis.element\r\n\t\t\t.removeUniqueId()\r\n\t\t\t.removeClass( \"ui-dialog-content ui-widget-content\" )\r\n\t\t\t.css( this.originalCss )\r\n\t\t\t// Without detaching first, the following becomes really slow\r\n\t\t\t.detach();\r\n\r\n\t\tthis.uiDialog.stop( true, true ).remove();\r\n\r\n\t\tif ( this.originalTitle ) {\r\n\t\t\tthis.element.attr( \"title\", this.originalTitle );\r\n\t\t}\r\n\r\n\t\tnext = originalPosition.parent.children().eq( originalPosition.index );\r\n\t\t// Don't try to place the dialog next to itself (#8613)\r\n\t\tif ( next.length && next[ 0 ] !== this.element[ 0 ] ) {\r\n\t\t\tnext.before( this.element );\r\n\t\t} else {\r\n\t\t\toriginalPosition.parent.append( this.element );\r\n\t\t}\r\n\t},\r\n\r\n\twidget: function() {\r\n\t\treturn this.uiDialog;\r\n\t},\r\n\r\n\tdisable: $.noop,\r\n\tenable: $.noop,\r\n\r\n\tclose: function( event ) {\r\n\t\tvar activeElement,\r\n\t\t\tthat = this;\r\n\r\n\t\tif ( !this._isOpen || this._trigger( \"beforeClose\", event ) === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._isOpen = false;\r\n\t\tthis._focusedElement = null;\r\n\t\tthis._destroyOverlay();\r\n\t\tthis._untrackInstance();\r\n\r\n\t\tif ( !this.opener.filter( \":focusable\" ).focus().length ) {\r\n\r\n\t\t\t// support: IE9\r\n\t\t\t// IE9 throws an \"Unspecified error\" accessing document.activeElement from an <iframe>\r\n\t\t\ttry {\r\n\t\t\t\tactiveElement = this.document[ 0 ].activeElement;\r\n\r\n\t\t\t\t// Support: IE9, IE10\r\n\t\t\t\t// If the <body> is blurred, IE will switch windows, see #4520\r\n\t\t\t\tif ( activeElement && activeElement.nodeName.toLowerCase() !== \"body\" ) {\r\n\r\n\t\t\t\t\t// Hiding a focused element doesn't trigger blur in WebKit\r\n\t\t\t\t\t// so in case we have nothing to focus on, explicitly blur the active element\r\n\t\t\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=47182\r\n\t\t\t\t\t$( activeElement ).blur();\r\n\t\t\t\t}\r\n\t\t\t} catch ( error ) {}\r\n\t\t}\r\n\r\n\t\tthis._hide( this.uiDialog, this.options.hide, function() {\r\n\t\t\tthat._trigger( \"close\", event );\r\n\t\t});\r\n\t},\r\n\r\n\tisOpen: function() {\r\n\t\treturn this._isOpen;\r\n\t},\r\n\r\n\tmoveToTop: function() {\r\n\t\tthis._moveToTop();\r\n\t},\r\n\r\n\t_moveToTop: function( event, silent ) {\r\n\t\tvar moved = false,\r\n\t\t\tzIndices = this.uiDialog.siblings( \".ui-front:visible\" ).map(function() {\r\n\t\t\t\treturn +$( this ).css( \"z-index\" );\r\n\t\t\t}).get(),\r\n\t\t\tzIndexMax = Math.max.apply( null, zIndices );\r\n\r\n\t\tif ( zIndexMax >= +this.uiDialog.css( \"z-index\" ) ) {\r\n\t\t\tthis.uiDialog.css( \"z-index\", zIndexMax + 1 );\r\n\t\t\tmoved = true;\r\n\t\t}\r\n\r\n\t\tif ( moved && !silent ) {\r\n\t\t\tthis._trigger( \"focus\", event );\r\n\t\t}\r\n\t\treturn moved;\r\n\t},\r\n\r\n\topen: function() {\r\n\t\tvar that = this;\r\n\t\tif ( this._isOpen ) {\r\n\t\t\tif ( this._moveToTop() ) {\r\n\t\t\t\tthis._focusTabbable();\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._isOpen = true;\r\n\t\tthis.opener = $( this.document[ 0 ].activeElement );\r\n\r\n\t\tthis._size();\r\n\t\tthis._position();\r\n\t\tthis._createOverlay();\r\n\t\tthis._moveToTop( null, true );\r\n\r\n\t\t// Ensure the overlay is moved to the top with the dialog, but only when\r\n\t\t// opening. The overlay shouldn't move after the dialog is open so that\r\n\t\t// modeless dialogs opened after the modal dialog stack properly.\r\n\t\tif ( this.overlay ) {\r\n\t\t\tthis.overlay.css( \"z-index\", this.uiDialog.css( \"z-index\" ) - 1 );\r\n\t\t}\r\n\r\n\t\tthis._show( this.uiDialog, this.options.show, function() {\r\n\t\t\tthat._focusTabbable();\r\n\t\t\tthat._trigger( \"focus\" );\r\n\t\t});\r\n\r\n\t\t// Track the dialog immediately upon openening in case a focus event\r\n\t\t// somehow occurs outside of the dialog before an element inside the\r\n\t\t// dialog is focused (#10152)\r\n\t\tthis._makeFocusTarget();\r\n\r\n\t\tthis._trigger( \"open\" );\r\n\t},\r\n\r\n\t_focusTabbable: function() {\r\n\t\t// Set focus to the first match:\r\n\t\t// 1. An element that was focused previously\r\n\t\t// 2. First element inside the dialog matching [autofocus]\r\n\t\t// 3. Tabbable element inside the content element\r\n\t\t// 4. Tabbable element inside the buttonpane\r\n\t\t// 5. The close button\r\n\t\t// 6. The dialog itself\r\n\t\tvar hasFocus = this._focusedElement;\r\n\t\tif ( !hasFocus ) {\r\n\t\t\thasFocus = this.element.find( \"[autofocus]\" );\r\n\t\t}\r\n\t\tif ( !hasFocus.length ) {\r\n\t\t\thasFocus = this.element.find( \":tabbable\" );\r\n\t\t}\r\n\t\tif ( !hasFocus.length ) {\r\n\t\t\thasFocus = this.uiDialogButtonPane.find( \":tabbable\" );\r\n\t\t}\r\n\t\tif ( !hasFocus.length ) {\r\n\t\t\thasFocus = this.uiDialogTitlebarClose.filter( \":tabbable\" );\r\n\t\t}\r\n\t\tif ( !hasFocus.length ) {\r\n\t\t\thasFocus = this.uiDialog;\r\n\t\t}\r\n\t\thasFocus.eq( 0 ).focus();\r\n\t},\r\n\r\n\t_keepFocus: function( event ) {\r\n\t\tfunction checkFocus() {\r\n\t\t\tvar activeElement = this.document[0].activeElement,\r\n\t\t\t\tisActive = this.uiDialog[0] === activeElement ||\r\n\t\t\t\t\t$.contains( this.uiDialog[0], activeElement );\r\n\t\t\tif ( !isActive ) {\r\n\t\t\t\tthis._focusTabbable();\r\n\t\t\t}\r\n\t\t}\r\n\t\tevent.preventDefault();\r\n\t\tcheckFocus.call( this );\r\n\t\t// support: IE\r\n\t\t// IE <= 8 doesn't prevent moving focus even with event.preventDefault()\r\n\t\t// so we check again later\r\n\t\tthis._delay( checkFocus );\r\n\t},\r\n\r\n\t_createWrapper: function() {\r\n\t\tthis.uiDialog = $(\"<div>\")\r\n\t\t\t.addClass( \"ui-dialog ui-widget ui-widget-content ui-corner-all ui-front \" +\r\n\t\t\t\tthis.options.dialogClass )\r\n\t\t\t.hide()\r\n\t\t\t.attr({\r\n\t\t\t\t// Setting tabIndex makes the div focusable\r\n\t\t\t\ttabIndex: -1,\r\n\t\t\t\trole: \"dialog\"\r\n\t\t\t})\r\n\t\t\t.appendTo( this._appendTo() );\r\n\r\n\t\tthis._on( this.uiDialog, {\r\n\t\t\tkeydown: function( event ) {\r\n\t\t\t\tif ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&\r\n\t\t\t\t\t\tevent.keyCode === $.ui.keyCode.ESCAPE ) {\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\tthis.close( event );\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// prevent tabbing out of dialogs\r\n\t\t\t\tif ( event.keyCode !== $.ui.keyCode.TAB || event.isDefaultPrevented() ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar tabbables = this.uiDialog.find( \":tabbable\" ),\r\n\t\t\t\t\tfirst = tabbables.filter( \":first\" ),\r\n\t\t\t\t\tlast = tabbables.filter( \":last\" );\r\n\r\n\t\t\t\tif ( ( event.target === last[0] || event.target === this.uiDialog[0] ) && !event.shiftKey ) {\r\n\t\t\t\t\tthis._delay(function() {\r\n\t\t\t\t\t\tfirst.focus();\r\n\t\t\t\t\t});\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t} else if ( ( event.target === first[0] || event.target === this.uiDialog[0] ) && event.shiftKey ) {\r\n\t\t\t\t\tthis._delay(function() {\r\n\t\t\t\t\t\tlast.focus();\r\n\t\t\t\t\t});\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tmousedown: function( event ) {\r\n\t\t\t\tif ( this._moveToTop( event ) ) {\r\n\t\t\t\t\tthis._focusTabbable();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// We assume that any existing aria-describedby attribute means\r\n\t\t// that the dialog content is marked up properly\r\n\t\t// otherwise we brute force the content as the description\r\n\t\tif ( !this.element.find( \"[aria-describedby]\" ).length ) {\r\n\t\t\tthis.uiDialog.attr({\r\n\t\t\t\t\"aria-describedby\": this.element.uniqueId().attr( \"id\" )\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t_createTitlebar: function() {\r\n\t\tvar uiDialogTitle;\r\n\r\n\t\tthis.uiDialogTitlebar = $( \"<div>\" )\r\n\t\t\t.addClass( \"ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix\" )\r\n\t\t\t.prependTo( this.uiDialog );\r\n\t\tthis._on( this.uiDialogTitlebar, {\r\n\t\t\tmousedown: function( event ) {\r\n\t\t\t\t// Don't prevent click on close button (#8838)\r\n\t\t\t\t// Focusing a dialog that is partially scrolled out of view\r\n\t\t\t\t// causes the browser to scroll it into view, preventing the click event\r\n\t\t\t\tif ( !$( event.target ).closest( \".ui-dialog-titlebar-close\" ) ) {\r\n\t\t\t\t\t// Dialog isn't getting focus when dragging (#8063)\r\n\t\t\t\t\tthis.uiDialog.focus();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// support: IE\r\n\t\t// Use type=\"button\" to prevent enter keypresses in textboxes from closing the\r\n\t\t// dialog in IE (#9312)\r\n\t\tthis.uiDialogTitlebarClose = $( \"<button type='button'></button>\" )\r\n\t\t\t.button({\r\n\t\t\t\tlabel: this.options.closeText,\r\n\t\t\t\ticons: {\r\n\t\t\t\t\tprimary: \"ui-icon-closethick\"\r\n\t\t\t\t},\r\n\t\t\t\ttext: false\r\n\t\t\t})\r\n\t\t\t.addClass( \"ui-dialog-titlebar-close\" )\r\n\t\t\t.appendTo( this.uiDialogTitlebar );\r\n\t\tthis._on( this.uiDialogTitlebarClose, {\r\n\t\t\tclick: function( event ) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tthis.close( event );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tuiDialogTitle = $( \"<span>\" )\r\n\t\t\t.uniqueId()\r\n\t\t\t.addClass( \"ui-dialog-title\" )\r\n\t\t\t.prependTo( this.uiDialogTitlebar );\r\n\t\tthis._title( uiDialogTitle );\r\n\r\n\t\tthis.uiDialog.attr({\r\n\t\t\t\"aria-labelledby\": uiDialogTitle.attr( \"id\" )\r\n\t\t});\r\n\t},\r\n\r\n\t_title: function( title ) {\r\n\t\tif ( !this.options.title ) {\r\n\t\t\ttitle.html( \" \" );\r\n\t\t}\r\n\t\ttitle.text( this.options.title );\r\n\t},\r\n\r\n\t_createButtonPane: function() {\r\n\t\tthis.uiDialogButtonPane = $( \"<div>\" )\r\n\t\t\t.addClass( \"ui-dialog-buttonpane ui-widget-content ui-helper-clearfix\" );\r\n\r\n\t\tthis.uiButtonSet = $( \"<div>\" )\r\n\t\t\t.addClass( \"ui-dialog-buttonset\" )\r\n\t\t\t.appendTo( this.uiDialogButtonPane );\r\n\r\n\t\tthis._createButtons();\r\n\t},\r\n\r\n\t_createButtons: function() {\r\n\t\tvar that = this,\r\n\t\t\tbuttons = this.options.buttons;\r\n\r\n\t\t// if we already have a button pane, remove it\r\n\t\tthis.uiDialogButtonPane.remove();\r\n\t\tthis.uiButtonSet.empty();\r\n\r\n\t\tif ( $.isEmptyObject( buttons ) || ($.isArray( buttons ) && !buttons.length) ) {\r\n\t\t\tthis.uiDialog.removeClass( \"ui-dialog-buttons\" );\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t$.each( buttons, function( name, props ) {\r\n\t\t\tvar click, buttonOptions;\r\n\t\t\tprops = $.isFunction( props ) ?\r\n\t\t\t\t{ click: props, text: name } :\r\n\t\t\t\tprops;\r\n\t\t\t// Default to a non-submitting button\r\n\t\t\tprops = $.extend( { type: \"button\" }, props );\r\n\t\t\t// Change the context for the click callback to be the main element\r\n\t\t\tclick = props.click;\r\n\t\t\tprops.click = function() {\r\n\t\t\t\tclick.apply( that.element[ 0 ], arguments );\r\n\t\t\t};\r\n\t\t\tbuttonOptions = {\r\n\t\t\t\ticons: props.icons,\r\n\t\t\t\ttext: props.showText\r\n\t\t\t};\r\n\t\t\tdelete props.icons;\r\n\t\t\tdelete props.showText;\r\n\t\t\t$( \"<button></button>\", props )\r\n\t\t\t\t.button( buttonOptions )\r\n\t\t\t\t.appendTo( that.uiButtonSet );\r\n\t\t});\r\n\t\tthis.uiDialog.addClass( \"ui-dialog-buttons\" );\r\n\t\tthis.uiDialogButtonPane.appendTo( this.uiDialog );\r\n\t},\r\n\r\n\t_makeDraggable: function() {\r\n\t\tvar that = this,\r\n\t\t\toptions = this.options;\r\n\r\n\t\tfunction filteredUi( ui ) {\r\n\t\t\treturn {\r\n\t\t\t\tposition: ui.position,\r\n\t\t\t\toffset: ui.offset\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tthis.uiDialog.draggable({\r\n\t\t\tcancel: \".ui-dialog-content, .ui-dialog-titlebar-close\",\r\n\t\t\thandle: \".ui-dialog-titlebar\",\r\n\t\t\tcontainment: \"document\",\r\n\t\t\tstart: function( event, ui ) {\r\n\t\t\t\t$( this ).addClass( \"ui-dialog-dragging\" );\r\n\t\t\t\tthat._blockFrames();\r\n\t\t\t\tthat._trigger( \"dragStart\", event, filteredUi( ui ) );\r\n\t\t\t},\r\n\t\t\tdrag: function( event, ui ) {\r\n\t\t\t\tthat._trigger( \"drag\", event, filteredUi( ui ) );\r\n\t\t\t},\r\n\t\t\tstop: function( event, ui ) {\r\n\t\t\t\tvar left = ui.offset.left - that.document.scrollLeft(),\r\n\t\t\t\t\ttop = ui.offset.top - that.document.scrollTop();\r\n\r\n\t\t\t\toptions.position = {\r\n\t\t\t\t\tmy: \"left top\",\r\n\t\t\t\t\tat: \"left\" + (left >= 0 ? \"+\" : \"\") + left + \" \" +\r\n\t\t\t\t\t\t\"top\" + (top >= 0 ? \"+\" : \"\") + top,\r\n\t\t\t\t\tof: that.window\r\n\t\t\t\t};\r\n\t\t\t\t$( this ).removeClass( \"ui-dialog-dragging\" );\r\n\t\t\t\tthat._unblockFrames();\r\n\t\t\t\tthat._trigger( \"dragStop\", event, filteredUi( ui ) );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t_makeResizable: function() {\r\n\t\tvar that = this,\r\n\t\t\toptions = this.options,\r\n\t\t\thandles = options.resizable,\r\n\t\t\t// .ui-resizable has position: relative defined in the stylesheet\r\n\t\t\t// but dialogs have to use absolute or fixed positioning\r\n\t\t\tposition = this.uiDialog.css(\"position\"),\r\n\t\t\tresizeHandles = typeof handles === \"string\" ?\r\n\t\t\t\thandles\t:\r\n\t\t\t\t\"n,e,s,w,se,sw,ne,nw\";\r\n\r\n\t\tfunction filteredUi( ui ) {\r\n\t\t\treturn {\r\n\t\t\t\toriginalPosition: ui.originalPosition,\r\n\t\t\t\toriginalSize: ui.originalSize,\r\n\t\t\t\tposition: ui.position,\r\n\t\t\t\tsize: ui.size\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tthis.uiDialog.resizable({\r\n\t\t\tcancel: \".ui-dialog-content\",\r\n\t\t\tcontainment: \"document\",\r\n\t\t\talsoResize: this.element,\r\n\t\t\tmaxWidth: options.maxWidth,\r\n\t\t\tmaxHeight: options.maxHeight,\r\n\t\t\tminWidth: options.minWidth,\r\n\t\t\tminHeight: this._minHeight(),\r\n\t\t\thandles: resizeHandles,\r\n\t\t\tstart: function( event, ui ) {\r\n\t\t\t\t$( this ).addClass( \"ui-dialog-resizing\" );\r\n\t\t\t\tthat._blockFrames();\r\n\t\t\t\tthat._trigger( \"resizeStart\", event, filteredUi( ui ) );\r\n\t\t\t},\r\n\t\t\tresize: function( event, ui ) {\r\n\t\t\t\tthat._trigger( \"resize\", event, filteredUi( ui ) );\r\n\t\t\t},\r\n\t\t\tstop: function( event, ui ) {\r\n\t\t\t\tvar offset = that.uiDialog.offset(),\r\n\t\t\t\t\tleft = offset.left - that.document.scrollLeft(),\r\n\t\t\t\t\ttop = offset.top - that.document.scrollTop();\r\n\r\n\t\t\t\toptions.height = that.uiDialog.height();\r\n\t\t\t\toptions.width = that.uiDialog.width();\r\n\t\t\t\toptions.position = {\r\n\t\t\t\t\tmy: \"left top\",\r\n\t\t\t\t\tat: \"left\" + (left >= 0 ? \"+\" : \"\") + left + \" \" +\r\n\t\t\t\t\t\t\"top\" + (top >= 0 ? \"+\" : \"\") + top,\r\n\t\t\t\t\tof: that.window\r\n\t\t\t\t};\r\n\t\t\t\t$( this ).removeClass( \"ui-dialog-resizing\" );\r\n\t\t\t\tthat._unblockFrames();\r\n\t\t\t\tthat._trigger( \"resizeStop\", event, filteredUi( ui ) );\r\n\t\t\t}\r\n\t\t})\r\n\t\t.css( \"position\", position );\r\n\t},\r\n\r\n\t_trackFocus: function() {\r\n\t\tthis._on( this.widget(), {\r\n\t\t\tfocusin: function( event ) {\r\n\t\t\t\tthis._makeFocusTarget();\r\n\t\t\t\tthis._focusedElement = $( event.target );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t_makeFocusTarget: function() {\r\n\t\tthis._untrackInstance();\r\n\t\tthis._trackingInstances().unshift( this );\r\n\t},\r\n\r\n\t_untrackInstance: function() {\r\n\t\tvar instances = this._trackingInstances(),\r\n\t\t\texists = $.inArray( this, instances );\r\n\t\tif ( exists !== -1 ) {\r\n\t\t\tinstances.splice( exists, 1 );\r\n\t\t}\r\n\t},\r\n\r\n\t_trackingInstances: function() {\r\n\t\tvar instances = this.document.data( \"ui-dialog-instances\" );\r\n\t\tif ( !instances ) {\r\n\t\t\tinstances = [];\r\n\t\t\tthis.document.data( \"ui-dialog-instances\", instances );\r\n\t\t}\r\n\t\treturn instances;\r\n\t},\r\n\r\n\t_minHeight: function() {\r\n\t\tvar options = this.options;\r\n\r\n\t\treturn options.height === \"auto\" ?\r\n\t\t\toptions.minHeight :\r\n\t\t\tMath.min( options.minHeight, options.height );\r\n\t},\r\n\r\n\t_position: function() {\r\n\t\t// Need to show the dialog to get the actual offset in the position plugin\r\n\t\tvar isVisible = this.uiDialog.is( \":visible\" );\r\n\t\tif ( !isVisible ) {\r\n\t\t\tthis.uiDialog.show();\r\n\t\t}\r\n\t\tthis.uiDialog.position( this.options.position );\r\n\t\tif ( !isVisible ) {\r\n\t\t\tthis.uiDialog.hide();\r\n\t\t}\r\n\t},\r\n\r\n\t_setOptions: function( options ) {\r\n\t\tvar that = this,\r\n\t\t\tresize = false,\r\n\t\t\tresizableOptions = {};\r\n\r\n\t\t$.each( options, function( key, value ) {\r\n\t\t\tthat._setOption( key, value );\r\n\r\n\t\t\tif ( key in that.sizeRelatedOptions ) {\r\n\t\t\t\tresize = true;\r\n\t\t\t}\r\n\t\t\tif ( key in that.resizableRelatedOptions ) {\r\n\t\t\t\tresizableOptions[ key ] = value;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif ( resize ) {\r\n\t\t\tthis._size();\r\n\t\t\tthis._position();\r\n\t\t}\r\n\t\tif ( this.uiDialog.is( \":data(ui-resizable)\" ) ) {\r\n\t\t\tthis.uiDialog.resizable( \"option\", resizableOptions );\r\n\t\t}\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tvar isDraggable, isResizable,\r\n\t\t\tuiDialog = this.uiDialog;\r\n\r\n\t\tif ( key === \"dialogClass\" ) {\r\n\t\t\tuiDialog\r\n\t\t\t\t.removeClass( this.options.dialogClass )\r\n\t\t\t\t.addClass( value );\r\n\t\t}\r\n\r\n\t\tif ( key === \"disabled\" ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._super( key, value );\r\n\r\n\t\tif ( key === \"appendTo\" ) {\r\n\t\t\tthis.uiDialog.appendTo( this._appendTo() );\r\n\t\t}\r\n\r\n\t\tif ( key === \"buttons\" ) {\r\n\t\t\tthis._createButtons();\r\n\t\t}\r\n\r\n\t\tif ( key === \"closeText\" ) {\r\n\t\t\tthis.uiDialogTitlebarClose.button({\r\n\t\t\t\t// Ensure that we always pass a string\r\n\t\t\t\tlabel: \"\" + value\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif ( key === \"draggable\" ) {\r\n\t\t\tisDraggable = uiDialog.is( \":data(ui-draggable)\" );\r\n\t\t\tif ( isDraggable && !value ) {\r\n\t\t\t\tuiDialog.draggable( \"destroy\" );\r\n\t\t\t}\r\n\r\n\t\t\tif ( !isDraggable && value ) {\r\n\t\t\t\tthis._makeDraggable();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( key === \"position\" ) {\r\n\t\t\tthis._position();\r\n\t\t}\r\n\r\n\t\tif ( key === \"resizable\" ) {\r\n\t\t\t// currently resizable, becoming non-resizable\r\n\t\t\tisResizable = uiDialog.is( \":data(ui-resizable)\" );\r\n\t\t\tif ( isResizable && !value ) {\r\n\t\t\t\tuiDialog.resizable( \"destroy\" );\r\n\t\t\t}\r\n\r\n\t\t\t// currently resizable, changing handles\r\n\t\t\tif ( isResizable && typeof value === \"string\" ) {\r\n\t\t\t\tuiDialog.resizable( \"option\", \"handles\", value );\r\n\t\t\t}\r\n\r\n\t\t\t// currently non-resizable, becoming resizable\r\n\t\t\tif ( !isResizable && value !== false ) {\r\n\t\t\t\tthis._makeResizable();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( key === \"title\" ) {\r\n\t\t\tthis._title( this.uiDialogTitlebar.find( \".ui-dialog-title\" ) );\r\n\t\t}\r\n\t},\r\n\r\n\t_size: function() {\r\n\t\t// If the user has resized the dialog, the .ui-dialog and .ui-dialog-content\r\n\t\t// divs will both have width and height set, so we need to reset them\r\n\t\tvar nonContentHeight, minContentHeight, maxContentHeight,\r\n\t\t\toptions = this.options;\r\n\r\n\t\t// Reset content sizing\r\n\t\tthis.element.show().css({\r\n\t\t\twidth: \"auto\",\r\n\t\t\tminHeight: 0,\r\n\t\t\tmaxHeight: \"none\",\r\n\t\t\theight: 0\r\n\t\t});\r\n\r\n\t\tif ( options.minWidth > options.width ) {\r\n\t\t\toptions.width = options.minWidth;\r\n\t\t}\r\n\r\n\t\t// reset wrapper sizing\r\n\t\t// determine the height of all the non-content elements\r\n\t\tnonContentHeight = this.uiDialog.css({\r\n\t\t\t\theight: \"auto\",\r\n\t\t\t\twidth: options.width\r\n\t\t\t})\r\n\t\t\t.outerHeight();\r\n\t\tminContentHeight = Math.max( 0, options.minHeight - nonContentHeight );\r\n\t\tmaxContentHeight = typeof options.maxHeight === \"number\" ?\r\n\t\t\tMath.max( 0, options.maxHeight - nonContentHeight ) :\r\n\t\t\t\"none\";\r\n\r\n\t\tif ( options.height === \"auto\" ) {\r\n\t\t\tthis.element.css({\r\n\t\t\t\tminHeight: minContentHeight,\r\n\t\t\t\tmaxHeight: maxContentHeight,\r\n\t\t\t\theight: \"auto\"\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tthis.element.height( Math.max( 0, options.height - nonContentHeight ) );\r\n\t\t}\r\n\r\n\t\tif ( this.uiDialog.is( \":data(ui-resizable)\" ) ) {\r\n\t\t\tthis.uiDialog.resizable( \"option\", \"minHeight\", this._minHeight() );\r\n\t\t}\r\n\t},\r\n\r\n\t_blockFrames: function() {\r\n\t\tthis.iframeBlocks = this.document.find( \"iframe\" ).map(function() {\r\n\t\t\tvar iframe = $( this );\r\n\r\n\t\t\treturn $( \"<div>\" )\r\n\t\t\t\t.css({\r\n\t\t\t\t\tposition: \"absolute\",\r\n\t\t\t\t\twidth: iframe.outerWidth(),\r\n\t\t\t\t\theight: iframe.outerHeight()\r\n\t\t\t\t})\r\n\t\t\t\t.appendTo( iframe.parent() )\r\n\t\t\t\t.offset( iframe.offset() )[0];\r\n\t\t});\r\n\t},\r\n\r\n\t_unblockFrames: function() {\r\n\t\tif ( this.iframeBlocks ) {\r\n\t\t\tthis.iframeBlocks.remove();\r\n\t\t\tdelete this.iframeBlocks;\r\n\t\t}\r\n\t},\r\n\r\n\t_allowInteraction: function( event ) {\r\n\t\tif ( $( event.target ).closest( \".ui-dialog\" ).length ) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t// TODO: Remove hack when datepicker implements\r\n\t\t// the .ui-front logic (#8989)\r\n\t\treturn !!$( event.target ).closest( \".ui-datepicker\" ).length;\r\n\t},\r\n\r\n\t_createOverlay: function() {\r\n\t\tif ( !this.options.modal ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// We use a delay in case the overlay is created from an\r\n\t\t// event that we're going to be cancelling (#2804)\r\n\t\tvar isOpening = true;\r\n\t\tthis._delay(function() {\r\n\t\t\tisOpening = false;\r\n\t\t});\r\n\r\n\t\tif ( !this.document.data( \"ui-dialog-overlays\" ) ) {\r\n\r\n\t\t\t// Prevent use of anchors and inputs\r\n\t\t\t// Using _on() for an event handler shared across many instances is\r\n\t\t\t// safe because the dialogs stack and must be closed in reverse order\r\n\t\t\tthis._on( this.document, {\r\n\t\t\t\tfocusin: function( event ) {\r\n\t\t\t\t\tif ( isOpening ) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif ( !this._allowInteraction( event ) ) {\r\n\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\tthis._trackingInstances()[ 0 ]._focusTabbable();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis.overlay = $( \"<div>\" )\r\n\t\t\t.addClass( \"ui-widget-overlay ui-front\" )\r\n\t\t\t.appendTo( this._appendTo() );\r\n\t\tthis._on( this.overlay, {\r\n\t\t\tmousedown: \"_keepFocus\"\r\n\t\t});\r\n\t\tthis.document.data( \"ui-dialog-overlays\",\r\n\t\t\t(this.document.data( \"ui-dialog-overlays\" ) || 0) + 1 );\r\n\t},\r\n\r\n\t_destroyOverlay: function() {\r\n\t\tif ( !this.options.modal ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( this.overlay ) {\r\n\t\t\tvar overlays = this.document.data( \"ui-dialog-overlays\" ) - 1;\r\n\r\n\t\t\tif ( !overlays ) {\r\n\t\t\t\tthis.document\r\n\t\t\t\t\t.unbind( \"focusin\" )\r\n\t\t\t\t\t.removeData( \"ui-dialog-overlays\" );\r\n\t\t\t} else {\r\n\t\t\t\tthis.document.data( \"ui-dialog-overlays\", overlays );\r\n\t\t\t}\r\n\r\n\t\t\tthis.overlay.remove();\r\n\t\t\tthis.overlay = null;\r\n\t\t}\r\n\t}\r\n});\r\n\r\n\r\n/*!\r\n * jQuery UI Progressbar 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/progressbar/\r\n */\r\n\r\n\r\nvar progressbar = $.widget( \"ui.progressbar\", {\r\n\tversion: \"1.11.4\",\r\n\toptions: {\r\n\t\tmax: 100,\r\n\t\tvalue: 0,\r\n\r\n\t\tchange: null,\r\n\t\tcomplete: null\r\n\t},\r\n\r\n\tmin: 0,\r\n\r\n\t_create: function() {\r\n\t\t// Constrain initial value\r\n\t\tthis.oldValue = this.options.value = this._constrainedValue();\r\n\r\n\t\tthis.element\r\n\t\t\t.addClass( \"ui-progressbar ui-widget ui-widget-content ui-corner-all\" )\r\n\t\t\t.attr({\r\n\t\t\t\t// Only set static values, aria-valuenow and aria-valuemax are\r\n\t\t\t\t// set inside _refreshValue()\r\n\t\t\t\trole: \"progressbar\",\r\n\t\t\t\t\"aria-valuemin\": this.min\r\n\t\t\t});\r\n\r\n\t\tthis.valueDiv = $( \"<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>\" )\r\n\t\t\t.appendTo( this.element );\r\n\r\n\t\tthis._refreshValue();\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tthis.element\r\n\t\t\t.removeClass( \"ui-progressbar ui-widget ui-widget-content ui-corner-all\" )\r\n\t\t\t.removeAttr( \"role\" )\r\n\t\t\t.removeAttr( \"aria-valuemin\" )\r\n\t\t\t.removeAttr( \"aria-valuemax\" )\r\n\t\t\t.removeAttr( \"aria-valuenow\" );\r\n\r\n\t\tthis.valueDiv.remove();\r\n\t},\r\n\r\n\tvalue: function( newValue ) {\r\n\t\tif ( newValue === undefined ) {\r\n\t\t\treturn this.options.value;\r\n\t\t}\r\n\r\n\t\tthis.options.value = this._constrainedValue( newValue );\r\n\t\tthis._refreshValue();\r\n\t},\r\n\r\n\t_constrainedValue: function( newValue ) {\r\n\t\tif ( newValue === undefined ) {\r\n\t\t\tnewValue = this.options.value;\r\n\t\t}\r\n\r\n\t\tthis.indeterminate = newValue === false;\r\n\r\n\t\t// sanitize value\r\n\t\tif ( typeof newValue !== \"number\" ) {\r\n\t\t\tnewValue = 0;\r\n\t\t}\r\n\r\n\t\treturn this.indeterminate ? false :\r\n\t\t\tMath.min( this.options.max, Math.max( this.min, newValue ) );\r\n\t},\r\n\r\n\t_setOptions: function( options ) {\r\n\t\t// Ensure \"value\" option is set after other values (like max)\r\n\t\tvar value = options.value;\r\n\t\tdelete options.value;\r\n\r\n\t\tthis._super( options );\r\n\r\n\t\tthis.options.value = this._constrainedValue( value );\r\n\t\tthis._refreshValue();\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tif ( key === \"max\" ) {\r\n\t\t\t// Don't allow a max less than min\r\n\t\t\tvalue = Math.max( this.min, value );\r\n\t\t}\r\n\t\tif ( key === \"disabled\" ) {\r\n\t\t\tthis.element\r\n\t\t\t\t.toggleClass( \"ui-state-disabled\", !!value )\r\n\t\t\t\t.attr( \"aria-disabled\", value );\r\n\t\t}\r\n\t\tthis._super( key, value );\r\n\t},\r\n\r\n\t_percentage: function() {\r\n\t\treturn this.indeterminate ? 100 : 100 * ( this.options.value - this.min ) / ( this.options.max - this.min );\r\n\t},\r\n\r\n\t_refreshValue: function() {\r\n\t\tvar value = this.options.value,\r\n\t\t\tpercentage = this._percentage();\r\n\r\n\t\tthis.valueDiv\r\n\t\t\t.toggle( this.indeterminate || value > this.min )\r\n\t\t\t.toggleClass( \"ui-corner-right\", value === this.options.max )\r\n\t\t\t.width( percentage.toFixed(0) + \"%\" );\r\n\r\n\t\tthis.element.toggleClass( \"ui-progressbar-indeterminate\", this.indeterminate );\r\n\r\n\t\tif ( this.indeterminate ) {\r\n\t\t\tthis.element.removeAttr( \"aria-valuenow\" );\r\n\t\t\tif ( !this.overlayDiv ) {\r\n\t\t\t\tthis.overlayDiv = $( \"<div class='ui-progressbar-overlay'></div>\" ).appendTo( this.valueDiv );\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tthis.element.attr({\r\n\t\t\t\t\"aria-valuemax\": this.options.max,\r\n\t\t\t\t\"aria-valuenow\": value\r\n\t\t\t});\r\n\t\t\tif ( this.overlayDiv ) {\r\n\t\t\t\tthis.overlayDiv.remove();\r\n\t\t\t\tthis.overlayDiv = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( this.oldValue !== value ) {\r\n\t\t\tthis.oldValue = value;\r\n\t\t\tthis._trigger( \"change\" );\r\n\t\t}\r\n\t\tif ( value === this.options.max ) {\r\n\t\t\tthis._trigger( \"complete\" );\r\n\t\t}\r\n\t}\r\n});\r\n\r\n\r\n/*!\r\n * jQuery UI Selectmenu 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/selectmenu\r\n */\r\n\r\n\r\nvar selectmenu = $.widget( \"ui.selectmenu\", {\r\n\tversion: \"1.11.4\",\r\n\tdefaultElement: \"<select>\",\r\n\toptions: {\r\n\t\tappendTo: null,\r\n\t\tdisabled: null,\r\n\t\ticons: {\r\n\t\t\tbutton: \"ui-icon-triangle-1-s\"\r\n\t\t},\r\n\t\tposition: {\r\n\t\t\tmy: \"left top\",\r\n\t\t\tat: \"left bottom\",\r\n\t\t\tcollision: \"none\"\r\n\t\t},\r\n\t\twidth: null,\r\n\r\n\t\t// callbacks\r\n\t\tchange: null,\r\n\t\tclose: null,\r\n\t\tfocus: null,\r\n\t\topen: null,\r\n\t\tselect: null\r\n\t},\r\n\r\n\t_create: function() {\r\n\t\tvar selectmenuId = this.element.uniqueId().attr( \"id\" );\r\n\t\tthis.ids = {\r\n\t\t\telement: selectmenuId,\r\n\t\t\tbutton: selectmenuId + \"-button\",\r\n\t\t\tmenu: selectmenuId + \"-menu\"\r\n\t\t};\r\n\r\n\t\tthis._drawButton();\r\n\t\tthis._drawMenu();\r\n\r\n\t\tif ( this.options.disabled ) {\r\n\t\t\tthis.disable();\r\n\t\t}\r\n\t},\r\n\r\n\t_drawButton: function() {\r\n\t\tvar that = this;\r\n\r\n\t\t// Associate existing label with the new button\r\n\t\tthis.label = $( \"label[for='\" + this.ids.element + \"']\" ).attr( \"for\", this.ids.button );\r\n\t\tthis._on( this.label, {\r\n\t\t\tclick: function( event ) {\r\n\t\t\t\tthis.button.focus();\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Hide original select element\r\n\t\tthis.element.hide();\r\n\r\n\t\t// Create button\r\n\t\tthis.button = $( \"<span>\", {\r\n\t\t\t\"class\": \"ui-selectmenu-button ui-widget ui-state-default ui-corner-all\",\r\n\t\t\ttabindex: this.options.disabled ? -1 : 0,\r\n\t\t\tid: this.ids.button,\r\n\t\t\trole: \"combobox\",\r\n\t\t\t\"aria-expanded\": \"false\",\r\n\t\t\t\"aria-autocomplete\": \"list\",\r\n\t\t\t\"aria-owns\": this.ids.menu,\r\n\t\t\t\"aria-haspopup\": \"true\"\r\n\t\t})\r\n\t\t\t.insertAfter( this.element );\r\n\r\n\t\t$( \"<span>\", {\r\n\t\t\t\"class\": \"ui-icon \" + this.options.icons.button\r\n\t\t})\r\n\t\t\t.prependTo( this.button );\r\n\r\n\t\tthis.buttonText = $( \"<span>\", {\r\n\t\t\t\"class\": \"ui-selectmenu-text\"\r\n\t\t})\r\n\t\t\t.appendTo( this.button );\r\n\r\n\t\tthis._setText( this.buttonText, this.element.find( \"option:selected\" ).text() );\r\n\t\tthis._resizeButton();\r\n\r\n\t\tthis._on( this.button, this._buttonEvents );\r\n\t\tthis.button.one( \"focusin\", function() {\r\n\r\n\t\t\t// Delay rendering the menu items until the button receives focus.\r\n\t\t\t// The menu may have already been rendered via a programmatic open.\r\n\t\t\tif ( !that.menuItems ) {\r\n\t\t\t\tthat._refreshMenu();\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis._hoverable( this.button );\r\n\t\tthis._focusable( this.button );\r\n\t},\r\n\r\n\t_drawMenu: function() {\r\n\t\tvar that = this;\r\n\r\n\t\t// Create menu\r\n\t\tthis.menu = $( \"<ul>\", {\r\n\t\t\t\"aria-hidden\": \"true\",\r\n\t\t\t\"aria-labelledby\": this.ids.button,\r\n\t\t\tid: this.ids.menu\r\n\t\t});\r\n\r\n\t\t// Wrap menu\r\n\t\tthis.menuWrap = $( \"<div>\", {\r\n\t\t\t\"class\": \"ui-selectmenu-menu ui-front\"\r\n\t\t})\r\n\t\t\t.append( this.menu )\r\n\t\t\t.appendTo( this._appendTo() );\r\n\r\n\t\t// Initialize menu widget\r\n\t\tthis.menuInstance = this.menu\r\n\t\t\t.menu({\r\n\t\t\t\trole: \"listbox\",\r\n\t\t\t\tselect: function( event, ui ) {\r\n\t\t\t\t\tevent.preventDefault();\r\n\r\n\t\t\t\t\t// support: IE8\r\n\t\t\t\t\t// If the item was selected via a click, the text selection\r\n\t\t\t\t\t// will be destroyed in IE\r\n\t\t\t\t\tthat._setSelection();\r\n\r\n\t\t\t\t\tthat._select( ui.item.data( \"ui-selectmenu-item\" ), event );\r\n\t\t\t\t},\r\n\t\t\t\tfocus: function( event, ui ) {\r\n\t\t\t\t\tvar item = ui.item.data( \"ui-selectmenu-item\" );\r\n\r\n\t\t\t\t\t// Prevent inital focus from firing and check if its a newly focused item\r\n\t\t\t\t\tif ( that.focusIndex != null && item.index !== that.focusIndex ) {\r\n\t\t\t\t\t\tthat._trigger( \"focus\", event, { item: item } );\r\n\t\t\t\t\t\tif ( !that.isOpen ) {\r\n\t\t\t\t\t\t\tthat._select( item, event );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthat.focusIndex = item.index;\r\n\r\n\t\t\t\t\tthat.button.attr( \"aria-activedescendant\",\r\n\t\t\t\t\t\tthat.menuItems.eq( item.index ).attr( \"id\" ) );\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.menu( \"instance\" );\r\n\r\n\t\t// Adjust menu styles to dropdown\r\n\t\tthis.menu\r\n\t\t\t.addClass( \"ui-corner-bottom\" )\r\n\t\t\t.removeClass( \"ui-corner-all\" );\r\n\r\n\t\t// Don't close the menu on mouseleave\r\n\t\tthis.menuInstance._off( this.menu, \"mouseleave\" );\r\n\r\n\t\t// Cancel the menu's collapseAll on document click\r\n\t\tthis.menuInstance._closeOnDocumentClick = function() {\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\t\t// Selects often contain empty items, but never contain dividers\r\n\t\tthis.menuInstance._isDivider = function() {\r\n\t\t\treturn false;\r\n\t\t};\r\n\t},\r\n\r\n\trefresh: function() {\r\n\t\tthis._refreshMenu();\r\n\t\tthis._setText( this.buttonText, this._getSelectedItem().text() );\r\n\t\tif ( !this.options.width ) {\r\n\t\t\tthis._resizeButton();\r\n\t\t}\r\n\t},\r\n\r\n\t_refreshMenu: function() {\r\n\t\tthis.menu.empty();\r\n\r\n\t\tvar item,\r\n\t\t\toptions = this.element.find( \"option\" );\r\n\r\n\t\tif ( !options.length ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._parseOptions( options );\r\n\t\tthis._renderMenu( this.menu, this.items );\r\n\r\n\t\tthis.menuInstance.refresh();\r\n\t\tthis.menuItems = this.menu.find( \"li\" ).not( \".ui-selectmenu-optgroup\" );\r\n\r\n\t\titem = this._getSelectedItem();\r\n\r\n\t\t// Update the menu to have the correct item focused\r\n\t\tthis.menuInstance.focus( null, item );\r\n\t\tthis._setAria( item.data( \"ui-selectmenu-item\" ) );\r\n\r\n\t\t// Set disabled state\r\n\t\tthis._setOption( \"disabled\", this.element.prop( \"disabled\" ) );\r\n\t},\r\n\r\n\topen: function( event ) {\r\n\t\tif ( this.options.disabled ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// If this is the first time the menu is being opened, render the items\r\n\t\tif ( !this.menuItems ) {\r\n\t\t\tthis._refreshMenu();\r\n\t\t} else {\r\n\r\n\t\t\t// Menu clears focus on close, reset focus to selected item\r\n\t\t\tthis.menu.find( \".ui-state-focus\" ).removeClass( \"ui-state-focus\" );\r\n\t\t\tthis.menuInstance.focus( null, this._getSelectedItem() );\r\n\t\t}\r\n\r\n\t\tthis.isOpen = true;\r\n\t\tthis._toggleAttr();\r\n\t\tthis._resizeMenu();\r\n\t\tthis._position();\r\n\r\n\t\tthis._on( this.document, this._documentClick );\r\n\r\n\t\tthis._trigger( \"open\", event );\r\n\t},\r\n\r\n\t_position: function() {\r\n\t\tthis.menuWrap.position( $.extend( { of: this.button }, this.options.position ) );\r\n\t},\r\n\r\n\tclose: function( event ) {\r\n\t\tif ( !this.isOpen ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.isOpen = false;\r\n\t\tthis._toggleAttr();\r\n\r\n\t\tthis.range = null;\r\n\t\tthis._off( this.document );\r\n\r\n\t\tthis._trigger( \"close\", event );\r\n\t},\r\n\r\n\twidget: function() {\r\n\t\treturn this.button;\r\n\t},\r\n\r\n\tmenuWidget: function() {\r\n\t\treturn this.menu;\r\n\t},\r\n\r\n\t_renderMenu: function( ul, items ) {\r\n\t\tvar that = this,\r\n\t\t\tcurrentOptgroup = \"\";\r\n\r\n\t\t$.each( items, function( index, item ) {\r\n\t\t\tif ( item.optgroup !== currentOptgroup ) {\r\n\t\t\t\t$( \"<li>\", {\r\n\t\t\t\t\t\"class\": \"ui-selectmenu-optgroup ui-menu-divider\" +\r\n\t\t\t\t\t\t( item.element.parent( \"optgroup\" ).prop( \"disabled\" ) ?\r\n\t\t\t\t\t\t\t\" ui-state-disabled\" :\r\n\t\t\t\t\t\t\t\"\" ),\r\n\t\t\t\t\ttext: item.optgroup\r\n\t\t\t\t})\r\n\t\t\t\t\t.appendTo( ul );\r\n\r\n\t\t\t\tcurrentOptgroup = item.optgroup;\r\n\t\t\t}\r\n\r\n\t\t\tthat._renderItemData( ul, item );\r\n\t\t});\r\n\t},\r\n\r\n\t_renderItemData: function( ul, item ) {\r\n\t\treturn this._renderItem( ul, item ).data( \"ui-selectmenu-item\", item );\r\n\t},\r\n\r\n\t_renderItem: function( ul, item ) {\r\n\t\tvar li = $( \"<li>\" );\r\n\r\n\t\tif ( item.disabled ) {\r\n\t\t\tli.addClass( \"ui-state-disabled\" );\r\n\t\t}\r\n\t\tthis._setText( li, item.label );\r\n\r\n\t\treturn li.appendTo( ul );\r\n\t},\r\n\r\n\t_setText: function( element, value ) {\r\n\t\tif ( value ) {\r\n\t\t\telement.text( value );\r\n\t\t} else {\r\n\t\t\telement.html( \" \" );\r\n\t\t}\r\n\t},\r\n\r\n\t_move: function( direction, event ) {\r\n\t\tvar item, next,\r\n\t\t\tfilter = \".ui-menu-item\";\r\n\r\n\t\tif ( this.isOpen ) {\r\n\t\t\titem = this.menuItems.eq( this.focusIndex );\r\n\t\t} else {\r\n\t\t\titem = this.menuItems.eq( this.element[ 0 ].selectedIndex );\r\n\t\t\tfilter += \":not(.ui-state-disabled)\";\r\n\t\t}\r\n\r\n\t\tif ( direction === \"first\" || direction === \"last\" ) {\r\n\t\t\tnext = item[ direction === \"first\" ? \"prevAll\" : \"nextAll\" ]( filter ).eq( -1 );\r\n\t\t} else {\r\n\t\t\tnext = item[ direction + \"All\" ]( filter ).eq( 0 );\r\n\t\t}\r\n\r\n\t\tif ( next.length ) {\r\n\t\t\tthis.menuInstance.focus( event, next );\r\n\t\t}\r\n\t},\r\n\r\n\t_getSelectedItem: function() {\r\n\t\treturn this.menuItems.eq( this.element[ 0 ].selectedIndex );\r\n\t},\r\n\r\n\t_toggle: function( event ) {\r\n\t\tthis[ this.isOpen ? \"close\" : \"open\" ]( event );\r\n\t},\r\n\r\n\t_setSelection: function() {\r\n\t\tvar selection;\r\n\r\n\t\tif ( !this.range ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( window.getSelection ) {\r\n\t\t\tselection = window.getSelection();\r\n\t\t\tselection.removeAllRanges();\r\n\t\t\tselection.addRange( this.range );\r\n\r\n\t\t// support: IE8\r\n\t\t} else {\r\n\t\t\tthis.range.select();\r\n\t\t}\r\n\r\n\t\t// support: IE\r\n\t\t// Setting the text selection kills the button focus in IE, but\r\n\t\t// restoring the focus doesn't kill the selection.\r\n\t\tthis.button.focus();\r\n\t},\r\n\r\n\t_documentClick: {\r\n\t\tmousedown: function( event ) {\r\n\t\t\tif ( !this.isOpen ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif ( !$( event.target ).closest( \".ui-selectmenu-menu, #\" + this.ids.button ).length ) {\r\n\t\t\t\tthis.close( event );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_buttonEvents: {\r\n\r\n\t\t// Prevent text selection from being reset when interacting with the selectmenu (#10144)\r\n\t\tmousedown: function() {\r\n\t\t\tvar selection;\r\n\r\n\t\t\tif ( window.getSelection ) {\r\n\t\t\t\tselection = window.getSelection();\r\n\t\t\t\tif ( selection.rangeCount ) {\r\n\t\t\t\t\tthis.range = selection.getRangeAt( 0 );\r\n\t\t\t\t}\r\n\r\n\t\t\t// support: IE8\r\n\t\t\t} else {\r\n\t\t\t\tthis.range = document.selection.createRange();\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tclick: function( event ) {\r\n\t\t\tthis._setSelection();\r\n\t\t\tthis._toggle( event );\r\n\t\t},\r\n\r\n\t\tkeydown: function( event ) {\r\n\t\t\tvar preventDefault = true;\r\n\t\t\tswitch ( event.keyCode ) {\r\n\t\t\t\tcase $.ui.keyCode.TAB:\r\n\t\t\t\tcase $.ui.keyCode.ESCAPE:\r\n\t\t\t\t\tthis.close( event );\r\n\t\t\t\t\tpreventDefault = false;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase $.ui.keyCode.ENTER:\r\n\t\t\t\t\tif ( this.isOpen ) {\r\n\t\t\t\t\t\tthis._selectFocusedItem( event );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase $.ui.keyCode.UP:\r\n\t\t\t\t\tif ( event.altKey ) {\r\n\t\t\t\t\t\tthis._toggle( event );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis._move( \"prev\", event );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase $.ui.keyCode.DOWN:\r\n\t\t\t\t\tif ( event.altKey ) {\r\n\t\t\t\t\t\tthis._toggle( event );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis._move( \"next\", event );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase $.ui.keyCode.SPACE:\r\n\t\t\t\t\tif ( this.isOpen ) {\r\n\t\t\t\t\t\tthis._selectFocusedItem( event );\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis._toggle( event );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase $.ui.keyCode.LEFT:\r\n\t\t\t\t\tthis._move( \"prev\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase $.ui.keyCode.RIGHT:\r\n\t\t\t\t\tthis._move( \"next\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase $.ui.keyCode.HOME:\r\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\r\n\t\t\t\t\tthis._move( \"first\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase $.ui.keyCode.END:\r\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\r\n\t\t\t\t\tthis._move( \"last\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tthis.menu.trigger( event );\r\n\t\t\t\t\tpreventDefault = false;\r\n\t\t\t}\r\n\r\n\t\t\tif ( preventDefault ) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_selectFocusedItem: function( event ) {\r\n\t\tvar item = this.menuItems.eq( this.focusIndex );\r\n\t\tif ( !item.hasClass( \"ui-state-disabled\" ) ) {\r\n\t\t\tthis._select( item.data( \"ui-selectmenu-item\" ), event );\r\n\t\t}\r\n\t},\r\n\r\n\t_select: function( item, event ) {\r\n\t\tvar oldIndex = this.element[ 0 ].selectedIndex;\r\n\r\n\t\t// Change native select element\r\n\t\tthis.element[ 0 ].selectedIndex = item.index;\r\n\t\tthis._setText( this.buttonText, item.label );\r\n\t\tthis._setAria( item );\r\n\t\tthis._trigger( \"select\", event, { item: item } );\r\n\r\n\t\tif ( item.index !== oldIndex ) {\r\n\t\t\tthis._trigger( \"change\", event, { item: item } );\r\n\t\t}\r\n\r\n\t\tthis.close( event );\r\n\t},\r\n\r\n\t_setAria: function( item ) {\r\n\t\tvar id = this.menuItems.eq( item.index ).attr( \"id\" );\r\n\r\n\t\tthis.button.attr({\r\n\t\t\t\"aria-labelledby\": id,\r\n\t\t\t\"aria-activedescendant\": id\r\n\t\t});\r\n\t\tthis.menu.attr( \"aria-activedescendant\", id );\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tif ( key === \"icons\" ) {\r\n\t\t\tthis.button.find( \"span.ui-icon\" )\r\n\t\t\t\t.removeClass( this.options.icons.button )\r\n\t\t\t\t.addClass( value.button );\r\n\t\t}\r\n\r\n\t\tthis._super( key, value );\r\n\r\n\t\tif ( key === \"appendTo\" ) {\r\n\t\t\tthis.menuWrap.appendTo( this._appendTo() );\r\n\t\t}\r\n\r\n\t\tif ( key === \"disabled\" ) {\r\n\t\t\tthis.menuInstance.option( \"disabled\", value );\r\n\t\t\tthis.button\r\n\t\t\t\t.toggleClass( \"ui-state-disabled\", value )\r\n\t\t\t\t.attr( \"aria-disabled\", value );\r\n\r\n\t\t\tthis.element.prop( \"disabled\", value );\r\n\t\t\tif ( value ) {\r\n\t\t\t\tthis.button.attr( \"tabindex\", -1 );\r\n\t\t\t\tthis.close();\r\n\t\t\t} else {\r\n\t\t\t\tthis.button.attr( \"tabindex\", 0 );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( key === \"width\" ) {\r\n\t\t\tthis._resizeButton();\r\n\t\t}\r\n\t},\r\n\r\n\t_appendTo: function() {\r\n\t\tvar element = this.options.appendTo;\r\n\r\n\t\tif ( element ) {\r\n\t\t\telement = element.jquery || element.nodeType ?\r\n\t\t\t\t$( element ) :\r\n\t\t\t\tthis.document.find( element ).eq( 0 );\r\n\t\t}\r\n\r\n\t\tif ( !element || !element[ 0 ] ) {\r\n\t\t\telement = this.element.closest( \".ui-front\" );\r\n\t\t}\r\n\r\n\t\tif ( !element.length ) {\r\n\t\t\telement = this.document[ 0 ].body;\r\n\t\t}\r\n\r\n\t\treturn element;\r\n\t},\r\n\r\n\t_toggleAttr: function() {\r\n\t\tthis.button\r\n\t\t\t.toggleClass( \"ui-corner-top\", this.isOpen )\r\n\t\t\t.toggleClass( \"ui-corner-all\", !this.isOpen )\r\n\t\t\t.attr( \"aria-expanded\", this.isOpen );\r\n\t\tthis.menuWrap.toggleClass( \"ui-selectmenu-open\", this.isOpen );\r\n\t\tthis.menu.attr( \"aria-hidden\", !this.isOpen );\r\n\t},\r\n\r\n\t_resizeButton: function() {\r\n\t\tvar width = this.options.width;\r\n\r\n\t\tif ( !width ) {\r\n\t\t\twidth = this.element.show().outerWidth();\r\n\t\t\tthis.element.hide();\r\n\t\t}\r\n\r\n\t\tthis.button.outerWidth( width );\r\n\t},\r\n\r\n\t_resizeMenu: function() {\r\n\t\tthis.menu.outerWidth( Math.max(\r\n\t\t\tthis.button.outerWidth(),\r\n\r\n\t\t\t// support: IE10\r\n\t\t\t// IE10 wraps long text (possibly a rounding bug)\r\n\t\t\t// so we add 1px to avoid the wrapping\r\n\t\t\tthis.menu.width( \"\" ).outerWidth() + 1\r\n\t\t) );\r\n\t},\r\n\r\n\t_getCreateOptions: function() {\r\n\t\treturn { disabled: this.element.prop( \"disabled\" ) };\r\n\t},\r\n\r\n\t_parseOptions: function( options ) {\r\n\t\tvar data = [];\r\n\t\toptions.each(function( index, item ) {\r\n\t\t\tvar option = $( item ),\r\n\t\t\t\toptgroup = option.parent( \"optgroup\" );\r\n\t\t\tdata.push({\r\n\t\t\t\telement: option,\r\n\t\t\t\tindex: index,\r\n\t\t\t\tvalue: option.val(),\r\n\t\t\t\tlabel: option.text(),\r\n\t\t\t\toptgroup: optgroup.attr( \"label\" ) || \"\",\r\n\t\t\t\tdisabled: optgroup.prop( \"disabled\" ) || option.prop( \"disabled\" )\r\n\t\t\t});\r\n\t\t});\r\n\t\tthis.items = data;\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tthis.menuWrap.remove();\r\n\t\tthis.button.remove();\r\n\t\tthis.element.show();\r\n\t\tthis.element.removeUniqueId();\r\n\t\tthis.label.attr( \"for\", this.ids.element );\r\n\t}\r\n});\r\n\r\n\r\n/*!\r\n * jQuery UI Slider 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/slider/\r\n */\r\n\r\n\r\nvar slider = $.widget( \"ui.slider\", $.ui.mouse, {\r\n\tversion: \"1.11.4\",\r\n\twidgetEventPrefix: \"slide\",\r\n\r\n\toptions: {\r\n\t\tanimate: false,\r\n\t\tdistance: 0,\r\n\t\tmax: 100,\r\n\t\tmin: 0,\r\n\t\torientation: \"horizontal\",\r\n\t\trange: false,\r\n\t\tstep: 1,\r\n\t\tvalue: 0,\r\n\t\tvalues: null,\r\n\r\n\t\t// callbacks\r\n\t\tchange: null,\r\n\t\tslide: null,\r\n\t\tstart: null,\r\n\t\tstop: null\r\n\t},\r\n\r\n\t// number of pages in a slider\r\n\t// (how many times can you page up/down to go through the whole range)\r\n\tnumPages: 5,\r\n\r\n\t_create: function() {\r\n\t\tthis._keySliding = false;\r\n\t\tthis._mouseSliding = false;\r\n\t\tthis._animateOff = true;\r\n\t\tthis._handleIndex = null;\r\n\t\tthis._detectOrientation();\r\n\t\tthis._mouseInit();\r\n\t\tthis._calculateNewMax();\r\n\r\n\t\tthis.element\r\n\t\t\t.addClass( \"ui-slider\" +\r\n\t\t\t\t\" ui-slider-\" + this.orientation +\r\n\t\t\t\t\" ui-widget\" +\r\n\t\t\t\t\" ui-widget-content\" +\r\n\t\t\t\t\" ui-corner-all\");\r\n\r\n\t\tthis._refresh();\r\n\t\tthis._setOption( \"disabled\", this.options.disabled );\r\n\r\n\t\tthis._animateOff = false;\r\n\t},\r\n\r\n\t_refresh: function() {\r\n\t\tthis._createRange();\r\n\t\tthis._createHandles();\r\n\t\tthis._setupEvents();\r\n\t\tthis._refreshValue();\r\n\t},\r\n\r\n\t_createHandles: function() {\r\n\t\tvar i, handleCount,\r\n\t\t\toptions = this.options,\r\n\t\t\texistingHandles = this.element.find( \".ui-slider-handle\" ).addClass( \"ui-state-default ui-corner-all\" ),\r\n\t\t\thandle = \"<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>\",\r\n\t\t\thandles = [];\r\n\r\n\t\thandleCount = ( options.values && options.values.length ) || 1;\r\n\r\n\t\tif ( existingHandles.length > handleCount ) {\r\n\t\t\texistingHandles.slice( handleCount ).remove();\r\n\t\t\texistingHandles = existingHandles.slice( 0, handleCount );\r\n\t\t}\r\n\r\n\t\tfor ( i = existingHandles.length; i < handleCount; i++ ) {\r\n\t\t\thandles.push( handle );\r\n\t\t}\r\n\r\n\t\tthis.handles = existingHandles.add( $( handles.join( \"\" ) ).appendTo( this.element ) );\r\n\r\n\t\tthis.handle = this.handles.eq( 0 );\r\n\r\n\t\tthis.handles.each(function( i ) {\r\n\t\t\t$( this ).data( \"ui-slider-handle-index\", i );\r\n\t\t});\r\n\t},\r\n\r\n\t_createRange: function() {\r\n\t\tvar options = this.options,\r\n\t\t\tclasses = \"\";\r\n\r\n\t\tif ( options.range ) {\r\n\t\t\tif ( options.range === true ) {\r\n\t\t\t\tif ( !options.values ) {\r\n\t\t\t\t\toptions.values = [ this._valueMin(), this._valueMin() ];\r\n\t\t\t\t} else if ( options.values.length && options.values.length !== 2 ) {\r\n\t\t\t\t\toptions.values = [ options.values[0], options.values[0] ];\r\n\t\t\t\t} else if ( $.isArray( options.values ) ) {\r\n\t\t\t\t\toptions.values = options.values.slice(0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif ( !this.range || !this.range.length ) {\r\n\t\t\t\tthis.range = $( \"<div></div>\" )\r\n\t\t\t\t\t.appendTo( this.element );\r\n\r\n\t\t\t\tclasses = \"ui-slider-range\" +\r\n\t\t\t\t// note: this isn't the most fittingly semantic framework class for this element,\r\n\t\t\t\t// but worked best visually with a variety of themes\r\n\t\t\t\t\" ui-widget-header ui-corner-all\";\r\n\t\t\t} else {\r\n\t\t\t\tthis.range.removeClass( \"ui-slider-range-min ui-slider-range-max\" )\r\n\t\t\t\t\t// Handle range switching from true to min/max\r\n\t\t\t\t\t.css({\r\n\t\t\t\t\t\t\"left\": \"\",\r\n\t\t\t\t\t\t\"bottom\": \"\"\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis.range.addClass( classes +\r\n\t\t\t\t( ( options.range === \"min\" || options.range === \"max\" ) ? \" ui-slider-range-\" + options.range : \"\" ) );\r\n\t\t} else {\r\n\t\t\tif ( this.range ) {\r\n\t\t\t\tthis.range.remove();\r\n\t\t\t}\r\n\t\t\tthis.range = null;\r\n\t\t}\r\n\t},\r\n\r\n\t_setupEvents: function() {\r\n\t\tthis._off( this.handles );\r\n\t\tthis._on( this.handles, this._handleEvents );\r\n\t\tthis._hoverable( this.handles );\r\n\t\tthis._focusable( this.handles );\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tthis.handles.remove();\r\n\t\tif ( this.range ) {\r\n\t\t\tthis.range.remove();\r\n\t\t}\r\n\r\n\t\tthis.element\r\n\t\t\t.removeClass( \"ui-slider\" +\r\n\t\t\t\t\" ui-slider-horizontal\" +\r\n\t\t\t\t\" ui-slider-vertical\" +\r\n\t\t\t\t\" ui-widget\" +\r\n\t\t\t\t\" ui-widget-content\" +\r\n\t\t\t\t\" ui-corner-all\" );\r\n\r\n\t\tthis._mouseDestroy();\r\n\t},\r\n\r\n\t_mouseCapture: function( event ) {\r\n\t\tvar position, normValue, distance, closestHandle, index, allowed, offset, mouseOverHandle,\r\n\t\t\tthat = this,\r\n\t\t\to = this.options;\r\n\r\n\t\tif ( o.disabled ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.elementSize = {\r\n\t\t\twidth: this.element.outerWidth(),\r\n\t\t\theight: this.element.outerHeight()\r\n\t\t};\r\n\t\tthis.elementOffset = this.element.offset();\r\n\r\n\t\tposition = { x: event.pageX, y: event.pageY };\r\n\t\tnormValue = this._normValueFromMouse( position );\r\n\t\tdistance = this._valueMax() - this._valueMin() + 1;\r\n\t\tthis.handles.each(function( i ) {\r\n\t\t\tvar thisDistance = Math.abs( normValue - that.values(i) );\r\n\t\t\tif (( distance > thisDistance ) ||\r\n\t\t\t\t( distance === thisDistance &&\r\n\t\t\t\t\t(i === that._lastChangedValue || that.values(i) === o.min ))) {\r\n\t\t\t\tdistance = thisDistance;\r\n\t\t\t\tclosestHandle = $( this );\r\n\t\t\t\tindex = i;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tallowed = this._start( event, index );\r\n\t\tif ( allowed === false ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tthis._mouseSliding = true;\r\n\r\n\t\tthis._handleIndex = index;\r\n\r\n\t\tclosestHandle\r\n\t\t\t.addClass( \"ui-state-active\" )\r\n\t\t\t.focus();\r\n\r\n\t\toffset = closestHandle.offset();\r\n\t\tmouseOverHandle = !$( event.target ).parents().addBack().is( \".ui-slider-handle\" );\r\n\t\tthis._clickOffset = mouseOverHandle ? { left: 0, top: 0 } : {\r\n\t\t\tleft: event.pageX - offset.left - ( closestHandle.width() / 2 ),\r\n\t\t\ttop: event.pageY - offset.top -\r\n\t\t\t\t( closestHandle.height() / 2 ) -\r\n\t\t\t\t( parseInt( closestHandle.css(\"borderTopWidth\"), 10 ) || 0 ) -\r\n\t\t\t\t( parseInt( closestHandle.css(\"borderBottomWidth\"), 10 ) || 0) +\r\n\t\t\t\t( parseInt( closestHandle.css(\"marginTop\"), 10 ) || 0)\r\n\t\t};\r\n\r\n\t\tif ( !this.handles.hasClass( \"ui-state-hover\" ) ) {\r\n\t\t\tthis._slide( event, index, normValue );\r\n\t\t}\r\n\t\tthis._animateOff = true;\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_mouseStart: function() {\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_mouseDrag: function( event ) {\r\n\t\tvar position = { x: event.pageX, y: event.pageY },\r\n\t\t\tnormValue = this._normValueFromMouse( position );\r\n\r\n\t\tthis._slide( event, this._handleIndex, normValue );\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\t_mouseStop: function( event ) {\r\n\t\tthis.handles.removeClass( \"ui-state-active\" );\r\n\t\tthis._mouseSliding = false;\r\n\r\n\t\tthis._stop( event, this._handleIndex );\r\n\t\tthis._change( event, this._handleIndex );\r\n\r\n\t\tthis._handleIndex = null;\r\n\t\tthis._clickOffset = null;\r\n\t\tthis._animateOff = false;\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\t_detectOrientation: function() {\r\n\t\tthis.orientation = ( this.options.orientation === \"vertical\" ) ? \"vertical\" : \"horizontal\";\r\n\t},\r\n\r\n\t_normValueFromMouse: function( position ) {\r\n\t\tvar pixelTotal,\r\n\t\t\tpixelMouse,\r\n\t\t\tpercentMouse,\r\n\t\t\tvalueTotal,\r\n\t\t\tvalueMouse;\r\n\r\n\t\tif ( this.orientation === \"horizontal\" ) {\r\n\t\t\tpixelTotal = this.elementSize.width;\r\n\t\t\tpixelMouse = position.x - this.elementOffset.left - ( this._clickOffset ? this._clickOffset.left : 0 );\r\n\t\t} else {\r\n\t\t\tpixelTotal = this.elementSize.height;\r\n\t\t\tpixelMouse = position.y - this.elementOffset.top - ( this._clickOffset ? this._clickOffset.top : 0 );\r\n\t\t}\r\n\r\n\t\tpercentMouse = ( pixelMouse / pixelTotal );\r\n\t\tif ( percentMouse > 1 ) {\r\n\t\t\tpercentMouse = 1;\r\n\t\t}\r\n\t\tif ( percentMouse < 0 ) {\r\n\t\t\tpercentMouse = 0;\r\n\t\t}\r\n\t\tif ( this.orientation === \"vertical\" ) {\r\n\t\t\tpercentMouse = 1 - percentMouse;\r\n\t\t}\r\n\r\n\t\tvalueTotal = this._valueMax() - this._valueMin();\r\n\t\tvalueMouse = this._valueMin() + percentMouse * valueTotal;\r\n\r\n\t\treturn this._trimAlignValue( valueMouse );\r\n\t},\r\n\r\n\t_start: function( event, index ) {\r\n\t\tvar uiHash = {\r\n\t\t\thandle: this.handles[ index ],\r\n\t\t\tvalue: this.value()\r\n\t\t};\r\n\t\tif ( this.options.values && this.options.values.length ) {\r\n\t\t\tuiHash.value = this.values( index );\r\n\t\t\tuiHash.values = this.values();\r\n\t\t}\r\n\t\treturn this._trigger( \"start\", event, uiHash );\r\n\t},\r\n\r\n\t_slide: function( event, index, newVal ) {\r\n\t\tvar otherVal,\r\n\t\t\tnewValues,\r\n\t\t\tallowed;\r\n\r\n\t\tif ( this.options.values && this.options.values.length ) {\r\n\t\t\totherVal = this.values( index ? 0 : 1 );\r\n\r\n\t\t\tif ( ( this.options.values.length === 2 && this.options.range === true ) &&\r\n\t\t\t\t\t( ( index === 0 && newVal > otherVal) || ( index === 1 && newVal < otherVal ) )\r\n\t\t\t\t) {\r\n\t\t\t\tnewVal = otherVal;\r\n\t\t\t}\r\n\r\n\t\t\tif ( newVal !== this.values( index ) ) {\r\n\t\t\t\tnewValues = this.values();\r\n\t\t\t\tnewValues[ index ] = newVal;\r\n\t\t\t\t// A slide can be canceled by returning false from the slide callback\r\n\t\t\t\tallowed = this._trigger( \"slide\", event, {\r\n\t\t\t\t\thandle: this.handles[ index ],\r\n\t\t\t\t\tvalue: newVal,\r\n\t\t\t\t\tvalues: newValues\r\n\t\t\t\t} );\r\n\t\t\t\totherVal = this.values( index ? 0 : 1 );\r\n\t\t\t\tif ( allowed !== false ) {\r\n\t\t\t\t\tthis.values( index, newVal );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif ( newVal !== this.value() ) {\r\n\t\t\t\t// A slide can be canceled by returning false from the slide callback\r\n\t\t\t\tallowed = this._trigger( \"slide\", event, {\r\n\t\t\t\t\thandle: this.handles[ index ],\r\n\t\t\t\t\tvalue: newVal\r\n\t\t\t\t} );\r\n\t\t\t\tif ( allowed !== false ) {\r\n\t\t\t\t\tthis.value( newVal );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_stop: function( event, index ) {\r\n\t\tvar uiHash = {\r\n\t\t\thandle: this.handles[ index ],\r\n\t\t\tvalue: this.value()\r\n\t\t};\r\n\t\tif ( this.options.values && this.options.values.length ) {\r\n\t\t\tuiHash.value = this.values( index );\r\n\t\t\tuiHash.values = this.values();\r\n\t\t}\r\n\r\n\t\tthis._trigger( \"stop\", event, uiHash );\r\n\t},\r\n\r\n\t_change: function( event, index ) {\r\n\t\tif ( !this._keySliding && !this._mouseSliding ) {\r\n\t\t\tvar uiHash = {\r\n\t\t\t\thandle: this.handles[ index ],\r\n\t\t\t\tvalue: this.value()\r\n\t\t\t};\r\n\t\t\tif ( this.options.values && this.options.values.length ) {\r\n\t\t\t\tuiHash.value = this.values( index );\r\n\t\t\t\tuiHash.values = this.values();\r\n\t\t\t}\r\n\r\n\t\t\t//store the last changed value index for reference when handles overlap\r\n\t\t\tthis._lastChangedValue = index;\r\n\r\n\t\t\tthis._trigger( \"change\", event, uiHash );\r\n\t\t}\r\n\t},\r\n\r\n\tvalue: function( newValue ) {\r\n\t\tif ( arguments.length ) {\r\n\t\t\tthis.options.value = this._trimAlignValue( newValue );\r\n\t\t\tthis._refreshValue();\r\n\t\t\tthis._change( null, 0 );\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\treturn this._value();\r\n\t},\r\n\r\n\tvalues: function( index, newValue ) {\r\n\t\tvar vals,\r\n\t\t\tnewValues,\r\n\t\t\ti;\r\n\r\n\t\tif ( arguments.length > 1 ) {\r\n\t\t\tthis.options.values[ index ] = this._trimAlignValue( newValue );\r\n\t\t\tthis._refreshValue();\r\n\t\t\tthis._change( null, index );\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( arguments.length ) {\r\n\t\t\tif ( $.isArray( arguments[ 0 ] ) ) {\r\n\t\t\t\tvals = this.options.values;\r\n\t\t\t\tnewValues = arguments[ 0 ];\r\n\t\t\t\tfor ( i = 0; i < vals.length; i += 1 ) {\r\n\t\t\t\t\tvals[ i ] = this._trimAlignValue( newValues[ i ] );\r\n\t\t\t\t\tthis._change( null, i );\r\n\t\t\t\t}\r\n\t\t\t\tthis._refreshValue();\r\n\t\t\t} else {\r\n\t\t\t\tif ( this.options.values && this.options.values.length ) {\r\n\t\t\t\t\treturn this._values( index );\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn this.value();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\treturn this._values();\r\n\t\t}\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tvar i,\r\n\t\t\tvalsLength = 0;\r\n\r\n\t\tif ( key === \"range\" && this.options.range === true ) {\r\n\t\t\tif ( value === \"min\" ) {\r\n\t\t\t\tthis.options.value = this._values( 0 );\r\n\t\t\t\tthis.options.values = null;\r\n\t\t\t} else if ( value === \"max\" ) {\r\n\t\t\t\tthis.options.value = this._values( this.options.values.length - 1 );\r\n\t\t\t\tthis.options.values = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( $.isArray( this.options.values ) ) {\r\n\t\t\tvalsLength = this.options.values.length;\r\n\t\t}\r\n\r\n\t\tif ( key === \"disabled\" ) {\r\n\t\t\tthis.element.toggleClass( \"ui-state-disabled\", !!value );\r\n\t\t}\r\n\r\n\t\tthis._super( key, value );\r\n\r\n\t\tswitch ( key ) {\r\n\t\t\tcase \"orientation\":\r\n\t\t\t\tthis._detectOrientation();\r\n\t\t\t\tthis.element\r\n\t\t\t\t\t.removeClass( \"ui-slider-horizontal ui-slider-vertical\" )\r\n\t\t\t\t\t.addClass( \"ui-slider-\" + this.orientation );\r\n\t\t\t\tthis._refreshValue();\r\n\r\n\t\t\t\t// Reset positioning from previous orientation\r\n\t\t\t\tthis.handles.css( value === \"horizontal\" ? \"bottom\" : \"left\", \"\" );\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"value\":\r\n\t\t\t\tthis._animateOff = true;\r\n\t\t\t\tthis._refreshValue();\r\n\t\t\t\tthis._change( null, 0 );\r\n\t\t\t\tthis._animateOff = false;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"values\":\r\n\t\t\t\tthis._animateOff = true;\r\n\t\t\t\tthis._refreshValue();\r\n\t\t\t\tfor ( i = 0; i < valsLength; i += 1 ) {\r\n\t\t\t\t\tthis._change( null, i );\r\n\t\t\t\t}\r\n\t\t\t\tthis._animateOff = false;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"step\":\r\n\t\t\tcase \"min\":\r\n\t\t\tcase \"max\":\r\n\t\t\t\tthis._animateOff = true;\r\n\t\t\t\tthis._calculateNewMax();\r\n\t\t\t\tthis._refreshValue();\r\n\t\t\t\tthis._animateOff = false;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"range\":\r\n\t\t\t\tthis._animateOff = true;\r\n\t\t\t\tthis._refresh();\r\n\t\t\t\tthis._animateOff = false;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t},\r\n\r\n\t//internal value getter\r\n\t// _value() returns value trimmed by min and max, aligned by step\r\n\t_value: function() {\r\n\t\tvar val = this.options.value;\r\n\t\tval = this._trimAlignValue( val );\r\n\r\n\t\treturn val;\r\n\t},\r\n\r\n\t//internal values getter\r\n\t// _values() returns array of values trimmed by min and max, aligned by step\r\n\t// _values( index ) returns single value trimmed by min and max, aligned by step\r\n\t_values: function( index ) {\r\n\t\tvar val,\r\n\t\t\tvals,\r\n\t\t\ti;\r\n\r\n\t\tif ( arguments.length ) {\r\n\t\t\tval = this.options.values[ index ];\r\n\t\t\tval = this._trimAlignValue( val );\r\n\r\n\t\t\treturn val;\r\n\t\t} else if ( this.options.values && this.options.values.length ) {\r\n\t\t\t// .slice() creates a copy of the array\r\n\t\t\t// this copy gets trimmed by min and max and then returned\r\n\t\t\tvals = this.options.values.slice();\r\n\t\t\tfor ( i = 0; i < vals.length; i += 1) {\r\n\t\t\t\tvals[ i ] = this._trimAlignValue( vals[ i ] );\r\n\t\t\t}\r\n\r\n\t\t\treturn vals;\r\n\t\t} else {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t},\r\n\r\n\t// returns the step-aligned value that val is closest to, between (inclusive) min and max\r\n\t_trimAlignValue: function( val ) {\r\n\t\tif ( val <= this._valueMin() ) {\r\n\t\t\treturn this._valueMin();\r\n\t\t}\r\n\t\tif ( val >= this._valueMax() ) {\r\n\t\t\treturn this._valueMax();\r\n\t\t}\r\n\t\tvar step = ( this.options.step > 0 ) ? this.options.step : 1,\r\n\t\t\tvalModStep = (val - this._valueMin()) % step,\r\n\t\t\talignValue = val - valModStep;\r\n\r\n\t\tif ( Math.abs(valModStep) * 2 >= step ) {\r\n\t\t\talignValue += ( valModStep > 0 ) ? step : ( -step );\r\n\t\t}\r\n\r\n\t\t// Since JavaScript has problems with large floats, round\r\n\t\t// the final value to 5 digits after the decimal point (see #4124)\r\n\t\treturn parseFloat( alignValue.toFixed(5) );\r\n\t},\r\n\r\n\t_calculateNewMax: function() {\r\n\t\tvar max = this.options.max,\r\n\t\t\tmin = this._valueMin(),\r\n\t\t\tstep = this.options.step,\r\n\t\t\taboveMin = Math.floor( ( +( max - min ).toFixed( this._precision() ) ) / step ) * step;\r\n\t\tmax = aboveMin + min;\r\n\t\tthis.max = parseFloat( max.toFixed( this._precision() ) );\r\n\t},\r\n\r\n\t_precision: function() {\r\n\t\tvar precision = this._precisionOf( this.options.step );\r\n\t\tif ( this.options.min !== null ) {\r\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\r\n\t\t}\r\n\t\treturn precision;\r\n\t},\r\n\r\n\t_precisionOf: function( num ) {\r\n\t\tvar str = num.toString(),\r\n\t\t\tdecimal = str.indexOf( \".\" );\r\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\r\n\t},\r\n\r\n\t_valueMin: function() {\r\n\t\treturn this.options.min;\r\n\t},\r\n\r\n\t_valueMax: function() {\r\n\t\treturn this.max;\r\n\t},\r\n\r\n\t_refreshValue: function() {\r\n\t\tvar lastValPercent, valPercent, value, valueMin, valueMax,\r\n\t\t\toRange = this.options.range,\r\n\t\t\to = this.options,\r\n\t\t\tthat = this,\r\n\t\t\tanimate = ( !this._animateOff ) ? o.animate : false,\r\n\t\t\t_set = {};\r\n\r\n\t\tif ( this.options.values && this.options.values.length ) {\r\n\t\t\tthis.handles.each(function( i ) {\r\n\t\t\t\tvalPercent = ( that.values(i) - that._valueMin() ) / ( that._valueMax() - that._valueMin() ) * 100;\r\n\t\t\t\t_set[ that.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\r\n\t\t\t\t$( this ).stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\r\n\t\t\t\tif ( that.options.range === true ) {\r\n\t\t\t\t\tif ( that.orientation === \"horizontal\" ) {\r\n\t\t\t\t\t\tif ( i === 0 ) {\r\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { left: valPercent + \"%\" }, o.animate );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif ( i === 1 ) {\r\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( { width: ( valPercent - lastValPercent ) + \"%\" }, { queue: false, duration: o.animate } );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif ( i === 0 ) {\r\n\t\t\t\t\t\t\tthat.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { bottom: ( valPercent ) + \"%\" }, o.animate );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif ( i === 1 ) {\r\n\t\t\t\t\t\t\tthat.range[ animate ? \"animate\" : \"css\" ]( { height: ( valPercent - lastValPercent ) + \"%\" }, { queue: false, duration: o.animate } );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tlastValPercent = valPercent;\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tvalue = this.value();\r\n\t\t\tvalueMin = this._valueMin();\r\n\t\t\tvalueMax = this._valueMax();\r\n\t\t\tvalPercent = ( valueMax !== valueMin ) ?\r\n\t\t\t\t\t( value - valueMin ) / ( valueMax - valueMin ) * 100 :\r\n\t\t\t\t\t0;\r\n\t\t\t_set[ this.orientation === \"horizontal\" ? \"left\" : \"bottom\" ] = valPercent + \"%\";\r\n\t\t\tthis.handle.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( _set, o.animate );\r\n\r\n\t\t\tif ( oRange === \"min\" && this.orientation === \"horizontal\" ) {\r\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { width: valPercent + \"%\" }, o.animate );\r\n\t\t\t}\r\n\t\t\tif ( oRange === \"max\" && this.orientation === \"horizontal\" ) {\r\n\t\t\t\tthis.range[ animate ? \"animate\" : \"css\" ]( { width: ( 100 - valPercent ) + \"%\" }, { queue: false, duration: o.animate } );\r\n\t\t\t}\r\n\t\t\tif ( oRange === \"min\" && this.orientation === \"vertical\" ) {\r\n\t\t\t\tthis.range.stop( 1, 1 )[ animate ? \"animate\" : \"css\" ]( { height: valPercent + \"%\" }, o.animate );\r\n\t\t\t}\r\n\t\t\tif ( oRange === \"max\" && this.orientation === \"vertical\" ) {\r\n\t\t\t\tthis.range[ animate ? \"animate\" : \"css\" ]( { height: ( 100 - valPercent ) + \"%\" }, { queue: false, duration: o.animate } );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t_handleEvents: {\r\n\t\tkeydown: function( event ) {\r\n\t\t\tvar allowed, curVal, newVal, step,\r\n\t\t\t\tindex = $( event.target ).data( \"ui-slider-handle-index\" );\r\n\r\n\t\t\tswitch ( event.keyCode ) {\r\n\t\t\t\tcase $.ui.keyCode.HOME:\r\n\t\t\t\tcase $.ui.keyCode.END:\r\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\r\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\r\n\t\t\t\tcase $.ui.keyCode.UP:\r\n\t\t\t\tcase $.ui.keyCode.RIGHT:\r\n\t\t\t\tcase $.ui.keyCode.DOWN:\r\n\t\t\t\tcase $.ui.keyCode.LEFT:\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\tif ( !this._keySliding ) {\r\n\t\t\t\t\t\tthis._keySliding = true;\r\n\t\t\t\t\t\t$( event.target ).addClass( \"ui-state-active\" );\r\n\t\t\t\t\t\tallowed = this._start( event, index );\r\n\t\t\t\t\t\tif ( allowed === false ) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tstep = this.options.step;\r\n\t\t\tif ( this.options.values && this.options.values.length ) {\r\n\t\t\t\tcurVal = newVal = this.values( index );\r\n\t\t\t} else {\r\n\t\t\t\tcurVal = newVal = this.value();\r\n\t\t\t}\r\n\r\n\t\t\tswitch ( event.keyCode ) {\r\n\t\t\t\tcase $.ui.keyCode.HOME:\r\n\t\t\t\t\tnewVal = this._valueMin();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase $.ui.keyCode.END:\r\n\t\t\t\t\tnewVal = this._valueMax();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase $.ui.keyCode.PAGE_UP:\r\n\t\t\t\t\tnewVal = this._trimAlignValue(\r\n\t\t\t\t\t\tcurVal + ( ( this._valueMax() - this._valueMin() ) / this.numPages )\r\n\t\t\t\t\t);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase $.ui.keyCode.PAGE_DOWN:\r\n\t\t\t\t\tnewVal = this._trimAlignValue(\r\n\t\t\t\t\t\tcurVal - ( (this._valueMax() - this._valueMin()) / this.numPages ) );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase $.ui.keyCode.UP:\r\n\t\t\t\tcase $.ui.keyCode.RIGHT:\r\n\t\t\t\t\tif ( curVal === this._valueMax() ) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal + step );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase $.ui.keyCode.DOWN:\r\n\t\t\t\tcase $.ui.keyCode.LEFT:\r\n\t\t\t\t\tif ( curVal === this._valueMin() ) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tnewVal = this._trimAlignValue( curVal - step );\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tthis._slide( event, index, newVal );\r\n\t\t},\r\n\t\tkeyup: function( event ) {\r\n\t\t\tvar index = $( event.target ).data( \"ui-slider-handle-index\" );\r\n\r\n\t\t\tif ( this._keySliding ) {\r\n\t\t\t\tthis._keySliding = false;\r\n\t\t\t\tthis._stop( event, index );\r\n\t\t\t\tthis._change( event, index );\r\n\t\t\t\t$( event.target ).removeClass( \"ui-state-active\" );\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\n\r\n/*!\r\n * jQuery UI Spinner 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/spinner/\r\n */\r\n\r\n\r\nfunction spinner_modifier( fn ) {\r\n\treturn function() {\r\n\t\tvar previous = this.element.val();\r\n\t\tfn.apply( this, arguments );\r\n\t\tthis._refresh();\r\n\t\tif ( previous !== this.element.val() ) {\r\n\t\t\tthis._trigger( \"change\" );\r\n\t\t}\r\n\t};\r\n}\r\n\r\nvar spinner = $.widget( \"ui.spinner\", {\r\n\tversion: \"1.11.4\",\r\n\tdefaultElement: \"<input>\",\r\n\twidgetEventPrefix: \"spin\",\r\n\toptions: {\r\n\t\tculture: null,\r\n\t\ticons: {\r\n\t\t\tdown: \"ui-icon-triangle-1-s\",\r\n\t\t\tup: \"ui-icon-triangle-1-n\"\r\n\t\t},\r\n\t\tincremental: true,\r\n\t\tmax: null,\r\n\t\tmin: null,\r\n\t\tnumberFormat: null,\r\n\t\tpage: 10,\r\n\t\tstep: 1,\r\n\r\n\t\tchange: null,\r\n\t\tspin: null,\r\n\t\tstart: null,\r\n\t\tstop: null\r\n\t},\r\n\r\n\t_create: function() {\r\n\t\t// handle string values that need to be parsed\r\n\t\tthis._setOption( \"max\", this.options.max );\r\n\t\tthis._setOption( \"min\", this.options.min );\r\n\t\tthis._setOption( \"step\", this.options.step );\r\n\r\n\t\t// Only format if there is a value, prevents the field from being marked\r\n\t\t// as invalid in Firefox, see #9573.\r\n\t\tif ( this.value() !== \"\" ) {\r\n\t\t\t// Format the value, but don't constrain.\r\n\t\t\tthis._value( this.element.val(), true );\r\n\t\t}\r\n\r\n\t\tthis._draw();\r\n\t\tthis._on( this._events );\r\n\t\tthis._refresh();\r\n\r\n\t\t// turning off autocomplete prevents the browser from remembering the\r\n\t\t// value when navigating through history, so we re-enable autocomplete\r\n\t\t// if the page is unloaded before the widget is destroyed. #7790\r\n\t\tthis._on( this.window, {\r\n\t\t\tbeforeunload: function() {\r\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t_getCreateOptions: function() {\r\n\t\tvar options = {},\r\n\t\t\telement = this.element;\r\n\r\n\t\t$.each( [ \"min\", \"max\", \"step\" ], function( i, option ) {\r\n\t\t\tvar value = element.attr( option );\r\n\t\t\tif ( value !== undefined && value.length ) {\r\n\t\t\t\toptions[ option ] = value;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn options;\r\n\t},\r\n\r\n\t_events: {\r\n\t\tkeydown: function( event ) {\r\n\t\t\tif ( this._start( event ) && this._keydown( event ) ) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t}\r\n\t\t},\r\n\t\tkeyup: \"_stop\",\r\n\t\tfocus: function() {\r\n\t\t\tthis.previous = this.element.val();\r\n\t\t},\r\n\t\tblur: function( event ) {\r\n\t\t\tif ( this.cancelBlur ) {\r\n\t\t\t\tdelete this.cancelBlur;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis._stop();\r\n\t\t\tthis._refresh();\r\n\t\t\tif ( this.previous !== this.element.val() ) {\r\n\t\t\t\tthis._trigger( \"change\", event );\r\n\t\t\t}\r\n\t\t},\r\n\t\tmousewheel: function( event, delta ) {\r\n\t\t\tif ( !delta ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif ( !this.spinning && !this._start( event ) ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tthis._spin( (delta > 0 ? 1 : -1) * this.options.step, event );\r\n\t\t\tclearTimeout( this.mousewheelTimer );\r\n\t\t\tthis.mousewheelTimer = this._delay(function() {\r\n\t\t\t\tif ( this.spinning ) {\r\n\t\t\t\t\tthis._stop( event );\r\n\t\t\t\t}\r\n\t\t\t}, 100 );\r\n\t\t\tevent.preventDefault();\r\n\t\t},\r\n\t\t\"mousedown .ui-spinner-button\": function( event ) {\r\n\t\t\tvar previous;\r\n\r\n\t\t\t// We never want the buttons to have focus; whenever the user is\r\n\t\t\t// interacting with the spinner, the focus should be on the input.\r\n\t\t\t// If the input is focused then this.previous is properly set from\r\n\t\t\t// when the input first received focus. If the input is not focused\r\n\t\t\t// then we need to set this.previous based on the value before spinning.\r\n\t\t\tprevious = this.element[0] === this.document[0].activeElement ?\r\n\t\t\t\tthis.previous : this.element.val();\r\n\t\t\tfunction checkFocus() {\r\n\t\t\t\tvar isActive = this.element[0] === this.document[0].activeElement;\r\n\t\t\t\tif ( !isActive ) {\r\n\t\t\t\t\tthis.element.focus();\r\n\t\t\t\t\tthis.previous = previous;\r\n\t\t\t\t\t// support: IE\r\n\t\t\t\t\t// IE sets focus asynchronously, so we need to check if focus\r\n\t\t\t\t\t// moved off of the input because the user clicked on the button.\r\n\t\t\t\t\tthis._delay(function() {\r\n\t\t\t\t\t\tthis.previous = previous;\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// ensure focus is on (or stays on) the text field\r\n\t\t\tevent.preventDefault();\r\n\t\t\tcheckFocus.call( this );\r\n\r\n\t\t\t// support: IE\r\n\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\r\n\t\t\t// so we set a flag to know when we should ignore the blur event\r\n\t\t\t// and check (again) if focus moved off of the input.\r\n\t\t\tthis.cancelBlur = true;\r\n\t\t\tthis._delay(function() {\r\n\t\t\t\tdelete this.cancelBlur;\r\n\t\t\t\tcheckFocus.call( this );\r\n\t\t\t});\r\n\r\n\t\t\tif ( this._start( event ) === false ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis._repeat( null, $( event.currentTarget ).hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\r\n\t\t},\r\n\t\t\"mouseup .ui-spinner-button\": \"_stop\",\r\n\t\t\"mouseenter .ui-spinner-button\": function( event ) {\r\n\t\t\t// button will add ui-state-active if mouse was down while mouseleave and kept down\r\n\t\t\tif ( !$( event.currentTarget ).hasClass( \"ui-state-active\" ) ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif ( this._start( event ) === false ) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tthis._repeat( null, $( event.currentTarget ).hasClass( \"ui-spinner-up\" ) ? 1 : -1, event );\r\n\t\t},\r\n\t\t// TODO: do we really want to consider this a stop?\r\n\t\t// shouldn't we just stop the repeater and wait until mouseup before\r\n\t\t// we trigger the stop event?\r\n\t\t\"mouseleave .ui-spinner-button\": \"_stop\"\r\n\t},\r\n\r\n\t_draw: function() {\r\n\t\tvar uiSpinner = this.uiSpinner = this.element\r\n\t\t\t.addClass( \"ui-spinner-input\" )\r\n\t\t\t.attr( \"autocomplete\", \"off\" )\r\n\t\t\t.wrap( this._uiSpinnerHtml() )\r\n\t\t\t.parent()\r\n\t\t\t\t// add buttons\r\n\t\t\t\t.append( this._buttonHtml() );\r\n\r\n\t\tthis.element.attr( \"role\", \"spinbutton\" );\r\n\r\n\t\t// button bindings\r\n\t\tthis.buttons = uiSpinner.find( \".ui-spinner-button\" )\r\n\t\t\t.attr( \"tabIndex\", -1 )\r\n\t\t\t.button()\r\n\t\t\t.removeClass( \"ui-corner-all\" );\r\n\r\n\t\t// IE 6 doesn't understand height: 50% for the buttons\r\n\t\t// unless the wrapper has an explicit height\r\n\t\tif ( this.buttons.height() > Math.ceil( uiSpinner.height() * 0.5 ) &&\r\n\t\t\t\tuiSpinner.height() > 0 ) {\r\n\t\t\tuiSpinner.height( uiSpinner.height() );\r\n\t\t}\r\n\r\n\t\t// disable spinner if element was already disabled\r\n\t\tif ( this.options.disabled ) {\r\n\t\t\tthis.disable();\r\n\t\t}\r\n\t},\r\n\r\n\t_keydown: function( event ) {\r\n\t\tvar options = this.options,\r\n\t\t\tkeyCode = $.ui.keyCode;\r\n\r\n\t\tswitch ( event.keyCode ) {\r\n\t\tcase keyCode.UP:\r\n\t\t\tthis._repeat( null, 1, event );\r\n\t\t\treturn true;\r\n\t\tcase keyCode.DOWN:\r\n\t\t\tthis._repeat( null, -1, event );\r\n\t\t\treturn true;\r\n\t\tcase keyCode.PAGE_UP:\r\n\t\t\tthis._repeat( null, options.page, event );\r\n\t\t\treturn true;\r\n\t\tcase keyCode.PAGE_DOWN:\r\n\t\t\tthis._repeat( null, -options.page, event );\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\t_uiSpinnerHtml: function() {\r\n\t\treturn \"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>\";\r\n\t},\r\n\r\n\t_buttonHtml: function() {\r\n\t\treturn \"\" +\r\n\t\t\t\"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'>\" +\r\n\t\t\t\t\"<span class='ui-icon \" + this.options.icons.up + \"'>▲</span>\" +\r\n\t\t\t\"</a>\" +\r\n\t\t\t\"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>\" +\r\n\t\t\t\t\"<span class='ui-icon \" + this.options.icons.down + \"'>▼</span>\" +\r\n\t\t\t\"</a>\";\r\n\t},\r\n\r\n\t_start: function( event ) {\r\n\t\tif ( !this.spinning && this._trigger( \"start\", event ) === false ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif ( !this.counter ) {\r\n\t\t\tthis.counter = 1;\r\n\t\t}\r\n\t\tthis.spinning = true;\r\n\t\treturn true;\r\n\t},\r\n\r\n\t_repeat: function( i, steps, event ) {\r\n\t\ti = i || 500;\r\n\r\n\t\tclearTimeout( this.timer );\r\n\t\tthis.timer = this._delay(function() {\r\n\t\t\tthis._repeat( 40, steps, event );\r\n\t\t}, i );\r\n\r\n\t\tthis._spin( steps * this.options.step, event );\r\n\t},\r\n\r\n\t_spin: function( step, event ) {\r\n\t\tvar value = this.value() || 0;\r\n\r\n\t\tif ( !this.counter ) {\r\n\t\t\tthis.counter = 1;\r\n\t\t}\r\n\r\n\t\tvalue = this._adjustValue( value + step * this._increment( this.counter ) );\r\n\r\n\t\tif ( !this.spinning || this._trigger( \"spin\", event, { value: value } ) !== false) {\r\n\t\t\tthis._value( value );\r\n\t\t\tthis.counter++;\r\n\t\t}\r\n\t},\r\n\r\n\t_increment: function( i ) {\r\n\t\tvar incremental = this.options.incremental;\r\n\r\n\t\tif ( incremental ) {\r\n\t\t\treturn $.isFunction( incremental ) ?\r\n\t\t\t\tincremental( i ) :\r\n\t\t\t\tMath.floor( i * i * i / 50000 - i * i / 500 + 17 * i / 200 + 1 );\r\n\t\t}\r\n\r\n\t\treturn 1;\r\n\t},\r\n\r\n\t_precision: function() {\r\n\t\tvar precision = this._precisionOf( this.options.step );\r\n\t\tif ( this.options.min !== null ) {\r\n\t\t\tprecision = Math.max( precision, this._precisionOf( this.options.min ) );\r\n\t\t}\r\n\t\treturn precision;\r\n\t},\r\n\r\n\t_precisionOf: function( num ) {\r\n\t\tvar str = num.toString(),\r\n\t\t\tdecimal = str.indexOf( \".\" );\r\n\t\treturn decimal === -1 ? 0 : str.length - decimal - 1;\r\n\t},\r\n\r\n\t_adjustValue: function( value ) {\r\n\t\tvar base, aboveMin,\r\n\t\t\toptions = this.options;\r\n\r\n\t\t// make sure we're at a valid step\r\n\t\t// - find out where we are relative to the base (min or 0)\r\n\t\tbase = options.min !== null ? options.min : 0;\r\n\t\taboveMin = value - base;\r\n\t\t// - round to the nearest step\r\n\t\taboveMin = Math.round(aboveMin / options.step) * options.step;\r\n\t\t// - rounding is based on 0, so adjust back to our base\r\n\t\tvalue = base + aboveMin;\r\n\r\n\t\t// fix precision from bad JS floating point math\r\n\t\tvalue = parseFloat( value.toFixed( this._precision() ) );\r\n\r\n\t\t// clamp the value\r\n\t\tif ( options.max !== null && value > options.max) {\r\n\t\t\treturn options.max;\r\n\t\t}\r\n\t\tif ( options.min !== null && value < options.min ) {\r\n\t\t\treturn options.min;\r\n\t\t}\r\n\r\n\t\treturn value;\r\n\t},\r\n\r\n\t_stop: function( event ) {\r\n\t\tif ( !this.spinning ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tclearTimeout( this.timer );\r\n\t\tclearTimeout( this.mousewheelTimer );\r\n\t\tthis.counter = 0;\r\n\t\tthis.spinning = false;\r\n\t\tthis._trigger( \"stop\", event );\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tif ( key === \"culture\" || key === \"numberFormat\" ) {\r\n\t\t\tvar prevValue = this._parse( this.element.val() );\r\n\t\t\tthis.options[ key ] = value;\r\n\t\t\tthis.element.val( this._format( prevValue ) );\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( key === \"max\" || key === \"min\" || key === \"step\" ) {\r\n\t\t\tif ( typeof value === \"string\" ) {\r\n\t\t\t\tvalue = this._parse( value );\r\n\t\t\t}\r\n\t\t}\r\n\t\tif ( key === \"icons\" ) {\r\n\t\t\tthis.buttons.first().find( \".ui-icon\" )\r\n\t\t\t\t.removeClass( this.options.icons.up )\r\n\t\t\t\t.addClass( value.up );\r\n\t\t\tthis.buttons.last().find( \".ui-icon\" )\r\n\t\t\t\t.removeClass( this.options.icons.down )\r\n\t\t\t\t.addClass( value.down );\r\n\t\t}\r\n\r\n\t\tthis._super( key, value );\r\n\r\n\t\tif ( key === \"disabled\" ) {\r\n\t\t\tthis.widget().toggleClass( \"ui-state-disabled\", !!value );\r\n\t\t\tthis.element.prop( \"disabled\", !!value );\r\n\t\t\tthis.buttons.button( value ? \"disable\" : \"enable\" );\r\n\t\t}\r\n\t},\r\n\r\n\t_setOptions: spinner_modifier(function( options ) {\r\n\t\tthis._super( options );\r\n\t}),\r\n\r\n\t_parse: function( val ) {\r\n\t\tif ( typeof val === \"string\" && val !== \"\" ) {\r\n\t\t\tval = window.Globalize && this.options.numberFormat ?\r\n\t\t\t\tGlobalize.parseFloat( val, 10, this.options.culture ) : +val;\r\n\t\t}\r\n\t\treturn val === \"\" || isNaN( val ) ? null : val;\r\n\t},\r\n\r\n\t_format: function( value ) {\r\n\t\tif ( value === \"\" ) {\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\t\treturn window.Globalize && this.options.numberFormat ?\r\n\t\t\tGlobalize.format( value, this.options.numberFormat, this.options.culture ) :\r\n\t\t\tvalue;\r\n\t},\r\n\r\n\t_refresh: function() {\r\n\t\tthis.element.attr({\r\n\t\t\t\"aria-valuemin\": this.options.min,\r\n\t\t\t\"aria-valuemax\": this.options.max,\r\n\t\t\t// TODO: what should we do with values that can't be parsed?\r\n\t\t\t\"aria-valuenow\": this._parse( this.element.val() )\r\n\t\t});\r\n\t},\r\n\r\n\tisValid: function() {\r\n\t\tvar value = this.value();\r\n\r\n\t\t// null is invalid\r\n\t\tif ( value === null ) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// if value gets adjusted, it's invalid\r\n\t\treturn value === this._adjustValue( value );\r\n\t},\r\n\r\n\t// update the value without triggering change\r\n\t_value: function( value, allowAny ) {\r\n\t\tvar parsed;\r\n\t\tif ( value !== \"\" ) {\r\n\t\t\tparsed = this._parse( value );\r\n\t\t\tif ( parsed !== null ) {\r\n\t\t\t\tif ( !allowAny ) {\r\n\t\t\t\t\tparsed = this._adjustValue( parsed );\r\n\t\t\t\t}\r\n\t\t\t\tvalue = this._format( parsed );\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.element.val( value );\r\n\t\tthis._refresh();\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tthis.element\r\n\t\t\t.removeClass( \"ui-spinner-input\" )\r\n\t\t\t.prop( \"disabled\", false )\r\n\t\t\t.removeAttr( \"autocomplete\" )\r\n\t\t\t.removeAttr( \"role\" )\r\n\t\t\t.removeAttr( \"aria-valuemin\" )\r\n\t\t\t.removeAttr( \"aria-valuemax\" )\r\n\t\t\t.removeAttr( \"aria-valuenow\" );\r\n\t\tthis.uiSpinner.replaceWith( this.element );\r\n\t},\r\n\r\n\tstepUp: spinner_modifier(function( steps ) {\r\n\t\tthis._stepUp( steps );\r\n\t}),\r\n\t_stepUp: function( steps ) {\r\n\t\tif ( this._start() ) {\r\n\t\t\tthis._spin( (steps || 1) * this.options.step );\r\n\t\t\tthis._stop();\r\n\t\t}\r\n\t},\r\n\r\n\tstepDown: spinner_modifier(function( steps ) {\r\n\t\tthis._stepDown( steps );\r\n\t}),\r\n\t_stepDown: function( steps ) {\r\n\t\tif ( this._start() ) {\r\n\t\t\tthis._spin( (steps || 1) * -this.options.step );\r\n\t\t\tthis._stop();\r\n\t\t}\r\n\t},\r\n\r\n\tpageUp: spinner_modifier(function( pages ) {\r\n\t\tthis._stepUp( (pages || 1) * this.options.page );\r\n\t}),\r\n\r\n\tpageDown: spinner_modifier(function( pages ) {\r\n\t\tthis._stepDown( (pages || 1) * this.options.page );\r\n\t}),\r\n\r\n\tvalue: function( newVal ) {\r\n\t\tif ( !arguments.length ) {\r\n\t\t\treturn this._parse( this.element.val() );\r\n\t\t}\r\n\t\tspinner_modifier( this._value ).call( this, newVal );\r\n\t},\r\n\r\n\twidget: function() {\r\n\t\treturn this.uiSpinner;\r\n\t}\r\n});\r\n\r\n\r\n/*!\r\n * jQuery UI Tabs 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/tabs/\r\n */\r\n\r\n\r\nvar tabs = $.widget( \"ui.tabs\", {\r\n\tversion: \"1.11.4\",\r\n\tdelay: 300,\r\n\toptions: {\r\n\t\tactive: null,\r\n\t\tcollapsible: false,\r\n\t\tevent: \"click\",\r\n\t\theightStyle: \"content\",\r\n\t\thide: null,\r\n\t\tshow: null,\r\n\r\n\t\t// callbacks\r\n\t\tactivate: null,\r\n\t\tbeforeActivate: null,\r\n\t\tbeforeLoad: null,\r\n\t\tload: null\r\n\t},\r\n\r\n\t_isLocal: (function() {\r\n\t\tvar rhash = /#.*$/;\r\n\r\n\t\treturn function( anchor ) {\r\n\t\t\tvar anchorUrl, locationUrl;\r\n\r\n\t\t\t// support: IE7\r\n\t\t\t// IE7 doesn't normalize the href property when set via script (#9317)\r\n\t\t\tanchor = anchor.cloneNode( false );\r\n\r\n\t\t\tanchorUrl = anchor.href.replace( rhash, \"\" );\r\n\t\t\tlocationUrl = location.href.replace( rhash, \"\" );\r\n\r\n\t\t\t// decoding may throw an error if the URL isn't UTF-8 (#9518)\r\n\t\t\ttry {\r\n\t\t\t\tanchorUrl = decodeURIComponent( anchorUrl );\r\n\t\t\t} catch ( error ) {}\r\n\t\t\ttry {\r\n\t\t\t\tlocationUrl = decodeURIComponent( locationUrl );\r\n\t\t\t} catch ( error ) {}\r\n\r\n\t\t\treturn anchor.hash.length > 1 && anchorUrl === locationUrl;\r\n\t\t};\r\n\t})(),\r\n\r\n\t_create: function() {\r\n\t\tvar that = this,\r\n\t\t\toptions = this.options;\r\n\r\n\t\tthis.running = false;\r\n\r\n\t\tthis.element\r\n\t\t\t.addClass( \"ui-tabs ui-widget ui-widget-content ui-corner-all\" )\r\n\t\t\t.toggleClass( \"ui-tabs-collapsible\", options.collapsible );\r\n\r\n\t\tthis._processTabs();\r\n\t\toptions.active = this._initialActive();\r\n\r\n\t\t// Take disabling tabs via class attribute from HTML\r\n\t\t// into account and update option properly.\r\n\t\tif ( $.isArray( options.disabled ) ) {\r\n\t\t\toptions.disabled = $.unique( options.disabled.concat(\r\n\t\t\t\t$.map( this.tabs.filter( \".ui-state-disabled\" ), function( li ) {\r\n\t\t\t\t\treturn that.tabs.index( li );\r\n\t\t\t\t})\r\n\t\t\t) ).sort();\r\n\t\t}\r\n\r\n\t\t// check for length avoids error when initializing empty list\r\n\t\tif ( this.options.active !== false && this.anchors.length ) {\r\n\t\t\tthis.active = this._findActive( options.active );\r\n\t\t} else {\r\n\t\t\tthis.active = $();\r\n\t\t}\r\n\r\n\t\tthis._refresh();\r\n\r\n\t\tif ( this.active.length ) {\r\n\t\t\tthis.load( options.active );\r\n\t\t}\r\n\t},\r\n\r\n\t_initialActive: function() {\r\n\t\tvar active = this.options.active,\r\n\t\t\tcollapsible = this.options.collapsible,\r\n\t\t\tlocationHash = location.hash.substring( 1 );\r\n\r\n\t\tif ( active === null ) {\r\n\t\t\t// check the fragment identifier in the URL\r\n\t\t\tif ( locationHash ) {\r\n\t\t\t\tthis.tabs.each(function( i, tab ) {\r\n\t\t\t\t\tif ( $( tab ).attr( \"aria-controls\" ) === locationHash ) {\r\n\t\t\t\t\t\tactive = i;\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// check for a tab marked active via a class\r\n\t\t\tif ( active === null ) {\r\n\t\t\t\tactive = this.tabs.index( this.tabs.filter( \".ui-tabs-active\" ) );\r\n\t\t\t}\r\n\r\n\t\t\t// no active tab, set to false\r\n\t\t\tif ( active === null || active === -1 ) {\r\n\t\t\t\tactive = this.tabs.length ? 0 : false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// handle numbers: negative, out of range\r\n\t\tif ( active !== false ) {\r\n\t\t\tactive = this.tabs.index( this.tabs.eq( active ) );\r\n\t\t\tif ( active === -1 ) {\r\n\t\t\t\tactive = collapsible ? false : 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// don't allow collapsible: false and active: false\r\n\t\tif ( !collapsible && active === false && this.anchors.length ) {\r\n\t\t\tactive = 0;\r\n\t\t}\r\n\r\n\t\treturn active;\r\n\t},\r\n\r\n\t_getCreateEventData: function() {\r\n\t\treturn {\r\n\t\t\ttab: this.active,\r\n\t\t\tpanel: !this.active.length ? $() : this._getPanelForTab( this.active )\r\n\t\t};\r\n\t},\r\n\r\n\t_tabKeydown: function( event ) {\r\n\t\tvar focusedTab = $( this.document[0].activeElement ).closest( \"li\" ),\r\n\t\t\tselectedIndex = this.tabs.index( focusedTab ),\r\n\t\t\tgoingForward = true;\r\n\r\n\t\tif ( this._handlePageNav( event ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tswitch ( event.keyCode ) {\r\n\t\t\tcase $.ui.keyCode.RIGHT:\r\n\t\t\tcase $.ui.keyCode.DOWN:\r\n\t\t\t\tselectedIndex++;\r\n\t\t\t\tbreak;\r\n\t\t\tcase $.ui.keyCode.UP:\r\n\t\t\tcase $.ui.keyCode.LEFT:\r\n\t\t\t\tgoingForward = false;\r\n\t\t\t\tselectedIndex--;\r\n\t\t\t\tbreak;\r\n\t\t\tcase $.ui.keyCode.END:\r\n\t\t\t\tselectedIndex = this.anchors.length - 1;\r\n\t\t\t\tbreak;\r\n\t\t\tcase $.ui.keyCode.HOME:\r\n\t\t\t\tselectedIndex = 0;\r\n\t\t\t\tbreak;\r\n\t\t\tcase $.ui.keyCode.SPACE:\r\n\t\t\t\t// Activate only, no collapsing\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tclearTimeout( this.activating );\r\n\t\t\t\tthis._activate( selectedIndex );\r\n\t\t\t\treturn;\r\n\t\t\tcase $.ui.keyCode.ENTER:\r\n\t\t\t\t// Toggle (cancel delayed activation, allow collapsing)\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t\tclearTimeout( this.activating );\r\n\t\t\t\t// Determine if we should collapse or activate\r\n\t\t\t\tthis._activate( selectedIndex === this.options.active ? false : selectedIndex );\r\n\t\t\t\treturn;\r\n\t\t\tdefault:\r\n\t\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Focus the appropriate tab, based on which key was pressed\r\n\t\tevent.preventDefault();\r\n\t\tclearTimeout( this.activating );\r\n\t\tselectedIndex = this._focusNextTab( selectedIndex, goingForward );\r\n\r\n\t\t// Navigating with control/command key will prevent automatic activation\r\n\t\tif ( !event.ctrlKey && !event.metaKey ) {\r\n\r\n\t\t\t// Update aria-selected immediately so that AT think the tab is already selected.\r\n\t\t\t// Otherwise AT may confuse the user by stating that they need to activate the tab,\r\n\t\t\t// but the tab will already be activated by the time the announcement finishes.\r\n\t\t\tfocusedTab.attr( \"aria-selected\", \"false\" );\r\n\t\t\tthis.tabs.eq( selectedIndex ).attr( \"aria-selected\", \"true\" );\r\n\r\n\t\t\tthis.activating = this._delay(function() {\r\n\t\t\t\tthis.option( \"active\", selectedIndex );\r\n\t\t\t}, this.delay );\r\n\t\t}\r\n\t},\r\n\r\n\t_panelKeydown: function( event ) {\r\n\t\tif ( this._handlePageNav( event ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Ctrl+up moves focus to the current tab\r\n\t\tif ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {\r\n\t\t\tevent.preventDefault();\r\n\t\t\tthis.active.focus();\r\n\t\t}\r\n\t},\r\n\r\n\t// Alt+page up/down moves focus to the previous/next tab (and activates)\r\n\t_handlePageNav: function( event ) {\r\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {\r\n\t\t\tthis._activate( this._focusNextTab( this.options.active - 1, false ) );\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {\r\n\t\t\tthis._activate( this._focusNextTab( this.options.active + 1, true ) );\r\n\t\t\treturn true;\r\n\t\t}\r\n\t},\r\n\r\n\t_findNextTab: function( index, goingForward ) {\r\n\t\tvar lastTabIndex = this.tabs.length - 1;\r\n\r\n\t\tfunction constrain() {\r\n\t\t\tif ( index > lastTabIndex ) {\r\n\t\t\t\tindex = 0;\r\n\t\t\t}\r\n\t\t\tif ( index < 0 ) {\r\n\t\t\t\tindex = lastTabIndex;\r\n\t\t\t}\r\n\t\t\treturn index;\r\n\t\t}\r\n\r\n\t\twhile ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {\r\n\t\t\tindex = goingForward ? index + 1 : index - 1;\r\n\t\t}\r\n\r\n\t\treturn index;\r\n\t},\r\n\r\n\t_focusNextTab: function( index, goingForward ) {\r\n\t\tindex = this._findNextTab( index, goingForward );\r\n\t\tthis.tabs.eq( index ).focus();\r\n\t\treturn index;\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tif ( key === \"active\" ) {\r\n\t\t\t// _activate() will handle invalid values and update this.options\r\n\t\t\tthis._activate( value );\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( key === \"disabled\" ) {\r\n\t\t\t// don't use the widget factory's disabled handling\r\n\t\t\tthis._setupDisabled( value );\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._super( key, value);\r\n\r\n\t\tif ( key === \"collapsible\" ) {\r\n\t\t\tthis.element.toggleClass( \"ui-tabs-collapsible\", value );\r\n\t\t\t// Setting collapsible: false while collapsed; open first panel\r\n\t\t\tif ( !value && this.options.active === false ) {\r\n\t\t\t\tthis._activate( 0 );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif ( key === \"event\" ) {\r\n\t\t\tthis._setupEvents( value );\r\n\t\t}\r\n\r\n\t\tif ( key === \"heightStyle\" ) {\r\n\t\t\tthis._setupHeightStyle( value );\r\n\t\t}\r\n\t},\r\n\r\n\t_sanitizeSelector: function( hash ) {\r\n\t\treturn hash ? hash.replace( /[!\"$%&'()*+,.\\/:;<=>?@\\[\\]\\^`{|}~]/g, \"\\\\$&\" ) : \"\";\r\n\t},\r\n\r\n\trefresh: function() {\r\n\t\tvar options = this.options,\r\n\t\t\tlis = this.tablist.children( \":has(a[href])\" );\r\n\r\n\t\t// get disabled tabs from class attribute from HTML\r\n\t\t// this will get converted to a boolean if needed in _refresh()\r\n\t\toptions.disabled = $.map( lis.filter( \".ui-state-disabled\" ), function( tab ) {\r\n\t\t\treturn lis.index( tab );\r\n\t\t});\r\n\r\n\t\tthis._processTabs();\r\n\r\n\t\t// was collapsed or no tabs\r\n\t\tif ( options.active === false || !this.anchors.length ) {\r\n\t\t\toptions.active = false;\r\n\t\t\tthis.active = $();\r\n\t\t// was active, but active tab is gone\r\n\t\t} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {\r\n\t\t\t// all remaining tabs are disabled\r\n\t\t\tif ( this.tabs.length === options.disabled.length ) {\r\n\t\t\t\toptions.active = false;\r\n\t\t\t\tthis.active = $();\r\n\t\t\t// activate previous tab\r\n\t\t\t} else {\r\n\t\t\t\tthis._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );\r\n\t\t\t}\r\n\t\t// was active, active tab still exists\r\n\t\t} else {\r\n\t\t\t// make sure active index is correct\r\n\t\t\toptions.active = this.tabs.index( this.active );\r\n\t\t}\r\n\r\n\t\tthis._refresh();\r\n\t},\r\n\r\n\t_refresh: function() {\r\n\t\tthis._setupDisabled( this.options.disabled );\r\n\t\tthis._setupEvents( this.options.event );\r\n\t\tthis._setupHeightStyle( this.options.heightStyle );\r\n\r\n\t\tthis.tabs.not( this.active ).attr({\r\n\t\t\t\"aria-selected\": \"false\",\r\n\t\t\t\"aria-expanded\": \"false\",\r\n\t\t\ttabIndex: -1\r\n\t\t});\r\n\t\tthis.panels.not( this._getPanelForTab( this.active ) )\r\n\t\t\t.hide()\r\n\t\t\t.attr({\r\n\t\t\t\t\"aria-hidden\": \"true\"\r\n\t\t\t});\r\n\r\n\t\t// Make sure one tab is in the tab order\r\n\t\tif ( !this.active.length ) {\r\n\t\t\tthis.tabs.eq( 0 ).attr( \"tabIndex\", 0 );\r\n\t\t} else {\r\n\t\t\tthis.active\r\n\t\t\t\t.addClass( \"ui-tabs-active ui-state-active\" )\r\n\t\t\t\t.attr({\r\n\t\t\t\t\t\"aria-selected\": \"true\",\r\n\t\t\t\t\t\"aria-expanded\": \"true\",\r\n\t\t\t\t\ttabIndex: 0\r\n\t\t\t\t});\r\n\t\t\tthis._getPanelForTab( this.active )\r\n\t\t\t\t.show()\r\n\t\t\t\t.attr({\r\n\t\t\t\t\t\"aria-hidden\": \"false\"\r\n\t\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t_processTabs: function() {\r\n\t\tvar that = this,\r\n\t\t\tprevTabs = this.tabs,\r\n\t\t\tprevAnchors = this.anchors,\r\n\t\t\tprevPanels = this.panels;\r\n\r\n\t\tthis.tablist = this._getList()\r\n\t\t\t.addClass( \"ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all\" )\r\n\t\t\t.attr( \"role\", \"tablist\" )\r\n\r\n\t\t\t// Prevent users from focusing disabled tabs via click\r\n\t\t\t.delegate( \"> li\", \"mousedown\" + this.eventNamespace, function( event ) {\r\n\t\t\t\tif ( $( this ).is( \".ui-state-disabled\" ) ) {\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\t// support: IE <9\r\n\t\t\t// Preventing the default action in mousedown doesn't prevent IE\r\n\t\t\t// from focusing the element, so if the anchor gets focused, blur.\r\n\t\t\t// We don't have to worry about focusing the previously focused\r\n\t\t\t// element since clicking on a non-focusable element should focus\r\n\t\t\t// the body anyway.\r\n\t\t\t.delegate( \".ui-tabs-anchor\", \"focus\" + this.eventNamespace, function() {\r\n\t\t\t\tif ( $( this ).closest( \"li\" ).is( \".ui-state-disabled\" ) ) {\r\n\t\t\t\t\tthis.blur();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\tthis.tabs = this.tablist.find( \"> li:has(a[href])\" )\r\n\t\t\t.addClass( \"ui-state-default ui-corner-top\" )\r\n\t\t\t.attr({\r\n\t\t\t\trole: \"tab\",\r\n\t\t\t\ttabIndex: -1\r\n\t\t\t});\r\n\r\n\t\tthis.anchors = this.tabs.map(function() {\r\n\t\t\t\treturn $( \"a\", this )[ 0 ];\r\n\t\t\t})\r\n\t\t\t.addClass( \"ui-tabs-anchor\" )\r\n\t\t\t.attr({\r\n\t\t\t\trole: \"presentation\",\r\n\t\t\t\ttabIndex: -1\r\n\t\t\t});\r\n\r\n\t\tthis.panels = $();\r\n\r\n\t\tthis.anchors.each(function( i, anchor ) {\r\n\t\t\tvar selector, panel, panelId,\r\n\t\t\t\tanchorId = $( anchor ).uniqueId().attr( \"id\" ),\r\n\t\t\t\ttab = $( anchor ).closest( \"li\" ),\r\n\t\t\t\toriginalAriaControls = tab.attr( \"aria-controls\" );\r\n\r\n\t\t\t// inline tab\r\n\t\t\tif ( that._isLocal( anchor ) ) {\r\n\t\t\t\tselector = anchor.hash;\r\n\t\t\t\tpanelId = selector.substring( 1 );\r\n\t\t\t\tpanel = that.element.find( that._sanitizeSelector( selector ) );\r\n\t\t\t// remote tab\r\n\t\t\t} else {\r\n\t\t\t\t// If the tab doesn't already have aria-controls,\r\n\t\t\t\t// generate an id by using a throw-away element\r\n\t\t\t\tpanelId = tab.attr( \"aria-controls\" ) || $( {} ).uniqueId()[ 0 ].id;\r\n\t\t\t\tselector = \"#\" + panelId;\r\n\t\t\t\tpanel = that.element.find( selector );\r\n\t\t\t\tif ( !panel.length ) {\r\n\t\t\t\t\tpanel = that._createPanel( panelId );\r\n\t\t\t\t\tpanel.insertAfter( that.panels[ i - 1 ] || that.tablist );\r\n\t\t\t\t}\r\n\t\t\t\tpanel.attr( \"aria-live\", \"polite\" );\r\n\t\t\t}\r\n\r\n\t\t\tif ( panel.length) {\r\n\t\t\t\tthat.panels = that.panels.add( panel );\r\n\t\t\t}\r\n\t\t\tif ( originalAriaControls ) {\r\n\t\t\t\ttab.data( \"ui-tabs-aria-controls\", originalAriaControls );\r\n\t\t\t}\r\n\t\t\ttab.attr({\r\n\t\t\t\t\"aria-controls\": panelId,\r\n\t\t\t\t\"aria-labelledby\": anchorId\r\n\t\t\t});\r\n\t\t\tpanel.attr( \"aria-labelledby\", anchorId );\r\n\t\t});\r\n\r\n\t\tthis.panels\r\n\t\t\t.addClass( \"ui-tabs-panel ui-widget-content ui-corner-bottom\" )\r\n\t\t\t.attr( \"role\", \"tabpanel\" );\r\n\r\n\t\t// Avoid memory leaks (#10056)\r\n\t\tif ( prevTabs ) {\r\n\t\t\tthis._off( prevTabs.not( this.tabs ) );\r\n\t\t\tthis._off( prevAnchors.not( this.anchors ) );\r\n\t\t\tthis._off( prevPanels.not( this.panels ) );\r\n\t\t}\r\n\t},\r\n\r\n\t// allow overriding how to find the list for rare usage scenarios (#7715)\r\n\t_getList: function() {\r\n\t\treturn this.tablist || this.element.find( \"ol,ul\" ).eq( 0 );\r\n\t},\r\n\r\n\t_createPanel: function( id ) {\r\n\t\treturn $( \"<div>\" )\r\n\t\t\t.attr( \"id\", id )\r\n\t\t\t.addClass( \"ui-tabs-panel ui-widget-content ui-corner-bottom\" )\r\n\t\t\t.data( \"ui-tabs-destroy\", true );\r\n\t},\r\n\r\n\t_setupDisabled: function( disabled ) {\r\n\t\tif ( $.isArray( disabled ) ) {\r\n\t\t\tif ( !disabled.length ) {\r\n\t\t\t\tdisabled = false;\r\n\t\t\t} else if ( disabled.length === this.anchors.length ) {\r\n\t\t\t\tdisabled = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// disable tabs\r\n\t\tfor ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {\r\n\t\t\tif ( disabled === true || $.inArray( i, disabled ) !== -1 ) {\r\n\t\t\t\t$( li )\r\n\t\t\t\t\t.addClass( \"ui-state-disabled\" )\r\n\t\t\t\t\t.attr( \"aria-disabled\", \"true\" );\r\n\t\t\t} else {\r\n\t\t\t\t$( li )\r\n\t\t\t\t\t.removeClass( \"ui-state-disabled\" )\r\n\t\t\t\t\t.removeAttr( \"aria-disabled\" );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.options.disabled = disabled;\r\n\t},\r\n\r\n\t_setupEvents: function( event ) {\r\n\t\tvar events = {};\r\n\t\tif ( event ) {\r\n\t\t\t$.each( event.split(\" \"), function( index, eventName ) {\r\n\t\t\t\tevents[ eventName ] = \"_eventHandler\";\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._off( this.anchors.add( this.tabs ).add( this.panels ) );\r\n\t\t// Always prevent the default action, even when disabled\r\n\t\tthis._on( true, this.anchors, {\r\n\t\t\tclick: function( event ) {\r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis._on( this.anchors, events );\r\n\t\tthis._on( this.tabs, { keydown: \"_tabKeydown\" } );\r\n\t\tthis._on( this.panels, { keydown: \"_panelKeydown\" } );\r\n\r\n\t\tthis._focusable( this.tabs );\r\n\t\tthis._hoverable( this.tabs );\r\n\t},\r\n\r\n\t_setupHeightStyle: function( heightStyle ) {\r\n\t\tvar maxHeight,\r\n\t\t\tparent = this.element.parent();\r\n\r\n\t\tif ( heightStyle === \"fill\" ) {\r\n\t\t\tmaxHeight = parent.height();\r\n\t\t\tmaxHeight -= this.element.outerHeight() - this.element.height();\r\n\r\n\t\t\tthis.element.siblings( \":visible\" ).each(function() {\r\n\t\t\t\tvar elem = $( this ),\r\n\t\t\t\t\tposition = elem.css( \"position\" );\r\n\r\n\t\t\t\tif ( position === \"absolute\" || position === \"fixed\" ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tmaxHeight -= elem.outerHeight( true );\r\n\t\t\t});\r\n\r\n\t\t\tthis.element.children().not( this.panels ).each(function() {\r\n\t\t\t\tmaxHeight -= $( this ).outerHeight( true );\r\n\t\t\t});\r\n\r\n\t\t\tthis.panels.each(function() {\r\n\t\t\t\t$( this ).height( Math.max( 0, maxHeight -\r\n\t\t\t\t\t$( this ).innerHeight() + $( this ).height() ) );\r\n\t\t\t})\r\n\t\t\t.css( \"overflow\", \"auto\" );\r\n\t\t} else if ( heightStyle === \"auto\" ) {\r\n\t\t\tmaxHeight = 0;\r\n\t\t\tthis.panels.each(function() {\r\n\t\t\t\tmaxHeight = Math.max( maxHeight, $( this ).height( \"\" ).height() );\r\n\t\t\t}).height( maxHeight );\r\n\t\t}\r\n\t},\r\n\r\n\t_eventHandler: function( event ) {\r\n\t\tvar options = this.options,\r\n\t\t\tactive = this.active,\r\n\t\t\tanchor = $( event.currentTarget ),\r\n\t\t\ttab = anchor.closest( \"li\" ),\r\n\t\t\tclickedIsActive = tab[ 0 ] === active[ 0 ],\r\n\t\t\tcollapsing = clickedIsActive && options.collapsible,\r\n\t\t\ttoShow = collapsing ? $() : this._getPanelForTab( tab ),\r\n\t\t\ttoHide = !active.length ? $() : this._getPanelForTab( active ),\r\n\t\t\teventData = {\r\n\t\t\t\toldTab: active,\r\n\t\t\t\toldPanel: toHide,\r\n\t\t\t\tnewTab: collapsing ? $() : tab,\r\n\t\t\t\tnewPanel: toShow\r\n\t\t\t};\r\n\r\n\t\tevent.preventDefault();\r\n\r\n\t\tif ( tab.hasClass( \"ui-state-disabled\" ) ||\r\n\t\t\t\t// tab is already loading\r\n\t\t\t\ttab.hasClass( \"ui-tabs-loading\" ) ||\r\n\t\t\t\t// can't switch durning an animation\r\n\t\t\t\tthis.running ||\r\n\t\t\t\t// click on active header, but not collapsible\r\n\t\t\t\t( clickedIsActive && !options.collapsible ) ||\r\n\t\t\t\t// allow canceling activation\r\n\t\t\t\t( this._trigger( \"beforeActivate\", event, eventData ) === false ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\toptions.active = collapsing ? false : this.tabs.index( tab );\r\n\r\n\t\tthis.active = clickedIsActive ? $() : tab;\r\n\t\tif ( this.xhr ) {\r\n\t\t\tthis.xhr.abort();\r\n\t\t}\r\n\r\n\t\tif ( !toHide.length && !toShow.length ) {\r\n\t\t\t$.error( \"jQuery UI Tabs: Mismatching fragment identifier.\" );\r\n\t\t}\r\n\r\n\t\tif ( toShow.length ) {\r\n\t\t\tthis.load( this.tabs.index( tab ), event );\r\n\t\t}\r\n\t\tthis._toggle( event, eventData );\r\n\t},\r\n\r\n\t// handles show/hide for selecting tabs\r\n\t_toggle: function( event, eventData ) {\r\n\t\tvar that = this,\r\n\t\t\ttoShow = eventData.newPanel,\r\n\t\t\ttoHide = eventData.oldPanel;\r\n\r\n\t\tthis.running = true;\r\n\r\n\t\tfunction complete() {\r\n\t\t\tthat.running = false;\r\n\t\t\tthat._trigger( \"activate\", event, eventData );\r\n\t\t}\r\n\r\n\t\tfunction show() {\r\n\t\t\teventData.newTab.closest( \"li\" ).addClass( \"ui-tabs-active ui-state-active\" );\r\n\r\n\t\t\tif ( toShow.length && that.options.show ) {\r\n\t\t\t\tthat._show( toShow, that.options.show, complete );\r\n\t\t\t} else {\r\n\t\t\t\ttoShow.show();\r\n\t\t\t\tcomplete();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// start out by hiding, then showing, then completing\r\n\t\tif ( toHide.length && this.options.hide ) {\r\n\t\t\tthis._hide( toHide, this.options.hide, function() {\r\n\t\t\t\teventData.oldTab.closest( \"li\" ).removeClass( \"ui-tabs-active ui-state-active\" );\r\n\t\t\t\tshow();\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\teventData.oldTab.closest( \"li\" ).removeClass( \"ui-tabs-active ui-state-active\" );\r\n\t\t\ttoHide.hide();\r\n\t\t\tshow();\r\n\t\t}\r\n\r\n\t\ttoHide.attr( \"aria-hidden\", \"true\" );\r\n\t\teventData.oldTab.attr({\r\n\t\t\t\"aria-selected\": \"false\",\r\n\t\t\t\"aria-expanded\": \"false\"\r\n\t\t});\r\n\t\t// If we're switching tabs, remove the old tab from the tab order.\r\n\t\t// If we're opening from collapsed state, remove the previous tab from the tab order.\r\n\t\t// If we're collapsing, then keep the collapsing tab in the tab order.\r\n\t\tif ( toShow.length && toHide.length ) {\r\n\t\t\teventData.oldTab.attr( \"tabIndex\", -1 );\r\n\t\t} else if ( toShow.length ) {\r\n\t\t\tthis.tabs.filter(function() {\r\n\t\t\t\treturn $( this ).attr( \"tabIndex\" ) === 0;\r\n\t\t\t})\r\n\t\t\t.attr( \"tabIndex\", -1 );\r\n\t\t}\r\n\r\n\t\ttoShow.attr( \"aria-hidden\", \"false\" );\r\n\t\teventData.newTab.attr({\r\n\t\t\t\"aria-selected\": \"true\",\r\n\t\t\t\"aria-expanded\": \"true\",\r\n\t\t\ttabIndex: 0\r\n\t\t});\r\n\t},\r\n\r\n\t_activate: function( index ) {\r\n\t\tvar anchor,\r\n\t\t\tactive = this._findActive( index );\r\n\r\n\t\t// trying to activate the already active panel\r\n\t\tif ( active[ 0 ] === this.active[ 0 ] ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// trying to collapse, simulate a click on the current active header\r\n\t\tif ( !active.length ) {\r\n\t\t\tactive = this.active;\r\n\t\t}\r\n\r\n\t\tanchor = active.find( \".ui-tabs-anchor\" )[ 0 ];\r\n\t\tthis._eventHandler({\r\n\t\t\ttarget: anchor,\r\n\t\t\tcurrentTarget: anchor,\r\n\t\t\tpreventDefault: $.noop\r\n\t\t});\r\n\t},\r\n\r\n\t_findActive: function( index ) {\r\n\t\treturn index === false ? $() : this.tabs.eq( index );\r\n\t},\r\n\r\n\t_getIndex: function( index ) {\r\n\t\t// meta-function to give users option to provide a href string instead of a numerical index.\r\n\t\tif ( typeof index === \"string\" ) {\r\n\t\t\tindex = this.anchors.index( this.anchors.filter( \"[href$='\" + index + \"']\" ) );\r\n\t\t}\r\n\r\n\t\treturn index;\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tif ( this.xhr ) {\r\n\t\t\tthis.xhr.abort();\r\n\t\t}\r\n\r\n\t\tthis.element.removeClass( \"ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible\" );\r\n\r\n\t\tthis.tablist\r\n\t\t\t.removeClass( \"ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all\" )\r\n\t\t\t.removeAttr( \"role\" );\r\n\r\n\t\tthis.anchors\r\n\t\t\t.removeClass( \"ui-tabs-anchor\" )\r\n\t\t\t.removeAttr( \"role\" )\r\n\t\t\t.removeAttr( \"tabIndex\" )\r\n\t\t\t.removeUniqueId();\r\n\r\n\t\tthis.tablist.unbind( this.eventNamespace );\r\n\r\n\t\tthis.tabs.add( this.panels ).each(function() {\r\n\t\t\tif ( $.data( this, \"ui-tabs-destroy\" ) ) {\r\n\t\t\t\t$( this ).remove();\r\n\t\t\t} else {\r\n\t\t\t\t$( this )\r\n\t\t\t\t\t.removeClass( \"ui-state-default ui-state-active ui-state-disabled \" +\r\n\t\t\t\t\t\t\"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel\" )\r\n\t\t\t\t\t.removeAttr( \"tabIndex\" )\r\n\t\t\t\t\t.removeAttr( \"aria-live\" )\r\n\t\t\t\t\t.removeAttr( \"aria-busy\" )\r\n\t\t\t\t\t.removeAttr( \"aria-selected\" )\r\n\t\t\t\t\t.removeAttr( \"aria-labelledby\" )\r\n\t\t\t\t\t.removeAttr( \"aria-hidden\" )\r\n\t\t\t\t\t.removeAttr( \"aria-expanded\" )\r\n\t\t\t\t\t.removeAttr( \"role\" );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.tabs.each(function() {\r\n\t\t\tvar li = $( this ),\r\n\t\t\t\tprev = li.data( \"ui-tabs-aria-controls\" );\r\n\t\t\tif ( prev ) {\r\n\t\t\t\tli\r\n\t\t\t\t\t.attr( \"aria-controls\", prev )\r\n\t\t\t\t\t.removeData( \"ui-tabs-aria-controls\" );\r\n\t\t\t} else {\r\n\t\t\t\tli.removeAttr( \"aria-controls\" );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.panels.show();\r\n\r\n\t\tif ( this.options.heightStyle !== \"content\" ) {\r\n\t\t\tthis.panels.css( \"height\", \"\" );\r\n\t\t}\r\n\t},\r\n\r\n\tenable: function( index ) {\r\n\t\tvar disabled = this.options.disabled;\r\n\t\tif ( disabled === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( index === undefined ) {\r\n\t\t\tdisabled = false;\r\n\t\t} else {\r\n\t\t\tindex = this._getIndex( index );\r\n\t\t\tif ( $.isArray( disabled ) ) {\r\n\t\t\t\tdisabled = $.map( disabled, function( num ) {\r\n\t\t\t\t\treturn num !== index ? num : null;\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tdisabled = $.map( this.tabs, function( li, num ) {\r\n\t\t\t\t\treturn num !== index ? num : null;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis._setupDisabled( disabled );\r\n\t},\r\n\r\n\tdisable: function( index ) {\r\n\t\tvar disabled = this.options.disabled;\r\n\t\tif ( disabled === true ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( index === undefined ) {\r\n\t\t\tdisabled = true;\r\n\t\t} else {\r\n\t\t\tindex = this._getIndex( index );\r\n\t\t\tif ( $.inArray( index, disabled ) !== -1 ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif ( $.isArray( disabled ) ) {\r\n\t\t\t\tdisabled = $.merge( [ index ], disabled ).sort();\r\n\t\t\t} else {\r\n\t\t\t\tdisabled = [ index ];\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis._setupDisabled( disabled );\r\n\t},\r\n\r\n\tload: function( index, event ) {\r\n\t\tindex = this._getIndex( index );\r\n\t\tvar that = this,\r\n\t\t\ttab = this.tabs.eq( index ),\r\n\t\t\tanchor = tab.find( \".ui-tabs-anchor\" ),\r\n\t\t\tpanel = this._getPanelForTab( tab ),\r\n\t\t\teventData = {\r\n\t\t\t\ttab: tab,\r\n\t\t\t\tpanel: panel\r\n\t\t\t},\r\n\t\t\tcomplete = function( jqXHR, status ) {\r\n\t\t\t\tif ( status === \"abort\" ) {\r\n\t\t\t\t\tthat.panels.stop( false, true );\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttab.removeClass( \"ui-tabs-loading\" );\r\n\t\t\t\tpanel.removeAttr( \"aria-busy\" );\r\n\r\n\t\t\t\tif ( jqXHR === that.xhr ) {\r\n\t\t\t\t\tdelete that.xhr;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t// not remote\r\n\t\tif ( this._isLocal( anchor[ 0 ] ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );\r\n\r\n\t\t// support: jQuery <1.8\r\n\t\t// jQuery <1.8 returns false if the request is canceled in beforeSend,\r\n\t\t// but as of 1.8, $.ajax() always returns a jqXHR object.\r\n\t\tif ( this.xhr && this.xhr.statusText !== \"canceled\" ) {\r\n\t\t\ttab.addClass( \"ui-tabs-loading\" );\r\n\t\t\tpanel.attr( \"aria-busy\", \"true\" );\r\n\r\n\t\t\tthis.xhr\r\n\t\t\t\t.done(function( response, status, jqXHR ) {\r\n\t\t\t\t\t// support: jQuery <1.8\r\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\r\n\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\tpanel.html( response );\r\n\t\t\t\t\t\tthat._trigger( \"load\", event, eventData );\r\n\r\n\t\t\t\t\t\tcomplete( jqXHR, status );\r\n\t\t\t\t\t}, 1 );\r\n\t\t\t\t})\r\n\t\t\t\t.fail(function( jqXHR, status ) {\r\n\t\t\t\t\t// support: jQuery <1.8\r\n\t\t\t\t\t// http://bugs.jquery.com/ticket/11778\r\n\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\tcomplete( jqXHR, status );\r\n\t\t\t\t\t}, 1 );\r\n\t\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t_ajaxSettings: function( anchor, event, eventData ) {\r\n\t\tvar that = this;\r\n\t\treturn {\r\n\t\t\turl: anchor.attr( \"href\" ),\r\n\t\t\tbeforeSend: function( jqXHR, settings ) {\r\n\t\t\t\treturn that._trigger( \"beforeLoad\", event,\r\n\t\t\t\t\t$.extend( { jqXHR: jqXHR, ajaxSettings: settings }, eventData ) );\r\n\t\t\t}\r\n\t\t};\r\n\t},\r\n\r\n\t_getPanelForTab: function( tab ) {\r\n\t\tvar id = $( tab ).attr( \"aria-controls\" );\r\n\t\treturn this.element.find( this._sanitizeSelector( \"#\" + id ) );\r\n\t}\r\n});\r\n\r\n\r\n/*!\r\n * jQuery UI Tooltip 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/tooltip/\r\n */\r\n\r\n\r\nvar tooltip = $.widget( \"ui.tooltip\", {\r\n\tversion: \"1.11.4\",\r\n\toptions: {\r\n\t\tcontent: function() {\r\n\t\t\t// support: IE<9, Opera in jQuery <1.7\r\n\t\t\t// .text() can't accept undefined, so coerce to a string\r\n\t\t\tvar title = $( this ).attr( \"title\" ) || \"\";\r\n\t\t\t// Escape title, since we're going from an attribute to raw HTML\r\n\t\t\treturn $( \"<a>\" ).text( title ).html();\r\n\t\t},\r\n\t\thide: true,\r\n\t\t// Disabled elements have inconsistent behavior across browsers (#8661)\r\n\t\titems: \"[title]:not([disabled])\",\r\n\t\tposition: {\r\n\t\t\tmy: \"left top+15\",\r\n\t\t\tat: \"left bottom\",\r\n\t\t\tcollision: \"flipfit flip\"\r\n\t\t},\r\n\t\tshow: true,\r\n\t\ttooltipClass: null,\r\n\t\ttrack: false,\r\n\r\n\t\t// callbacks\r\n\t\tclose: null,\r\n\t\topen: null\r\n\t},\r\n\r\n\t_addDescribedBy: function( elem, id ) {\r\n\t\tvar describedby = (elem.attr( \"aria-describedby\" ) || \"\").split( /\\s+/ );\r\n\t\tdescribedby.push( id );\r\n\t\telem\r\n\t\t\t.data( \"ui-tooltip-id\", id )\r\n\t\t\t.attr( \"aria-describedby\", $.trim( describedby.join( \" \" ) ) );\r\n\t},\r\n\r\n\t_removeDescribedBy: function( elem ) {\r\n\t\tvar id = elem.data( \"ui-tooltip-id\" ),\r\n\t\t\tdescribedby = (elem.attr( \"aria-describedby\" ) || \"\").split( /\\s+/ ),\r\n\t\t\tindex = $.inArray( id, describedby );\r\n\r\n\t\tif ( index !== -1 ) {\r\n\t\t\tdescribedby.splice( index, 1 );\r\n\t\t}\r\n\r\n\t\telem.removeData( \"ui-tooltip-id\" );\r\n\t\tdescribedby = $.trim( describedby.join( \" \" ) );\r\n\t\tif ( describedby ) {\r\n\t\t\telem.attr( \"aria-describedby\", describedby );\r\n\t\t} else {\r\n\t\t\telem.removeAttr( \"aria-describedby\" );\r\n\t\t}\r\n\t},\r\n\r\n\t_create: function() {\r\n\t\tthis._on({\r\n\t\t\tmouseover: \"open\",\r\n\t\t\tfocusin: \"open\"\r\n\t\t});\r\n\r\n\t\t// IDs of generated tooltips, needed for destroy\r\n\t\tthis.tooltips = {};\r\n\r\n\t\t// IDs of parent tooltips where we removed the title attribute\r\n\t\tthis.parents = {};\r\n\r\n\t\tif ( this.options.disabled ) {\r\n\t\t\tthis._disable();\r\n\t\t}\r\n\r\n\t\t// Append the aria-live region so tooltips announce correctly\r\n\t\tthis.liveRegion = $( \"<div>\" )\r\n\t\t\t.attr({\r\n\t\t\t\trole: \"log\",\r\n\t\t\t\t\"aria-live\": \"assertive\",\r\n\t\t\t\t\"aria-relevant\": \"additions\"\r\n\t\t\t})\r\n\t\t\t.addClass( \"ui-helper-hidden-accessible\" )\r\n\t\t\t.appendTo( this.document[ 0 ].body );\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tvar that = this;\r\n\r\n\t\tif ( key === \"disabled\" ) {\r\n\t\t\tthis[ value ? \"_disable\" : \"_enable\" ]();\r\n\t\t\tthis.options[ key ] = value;\r\n\t\t\t// disable element style changes\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._super( key, value );\r\n\r\n\t\tif ( key === \"content\" ) {\r\n\t\t\t$.each( this.tooltips, function( id, tooltipData ) {\r\n\t\t\t\tthat._updateContent( tooltipData.element );\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t_disable: function() {\r\n\t\tvar that = this;\r\n\r\n\t\t// close open tooltips\r\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\r\n\t\t\tvar event = $.Event( \"blur\" );\r\n\t\t\tevent.target = event.currentTarget = tooltipData.element[ 0 ];\r\n\t\t\tthat.close( event, true );\r\n\t\t});\r\n\r\n\t\t// remove title attributes to prevent native tooltips\r\n\t\tthis.element.find( this.options.items ).addBack().each(function() {\r\n\t\t\tvar element = $( this );\r\n\t\t\tif ( element.is( \"[title]\" ) ) {\r\n\t\t\t\telement\r\n\t\t\t\t\t.data( \"ui-tooltip-title\", element.attr( \"title\" ) )\r\n\t\t\t\t\t.removeAttr( \"title\" );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t_enable: function() {\r\n\t\t// restore title attributes\r\n\t\tthis.element.find( this.options.items ).addBack().each(function() {\r\n\t\t\tvar element = $( this );\r\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\r\n\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\topen: function( event ) {\r\n\t\tvar that = this,\r\n\t\t\ttarget = $( event ? event.target : this.element )\r\n\t\t\t\t// we need closest here due to mouseover bubbling,\r\n\t\t\t\t// but always pointing at the same event target\r\n\t\t\t\t.closest( this.options.items );\r\n\r\n\t\t// No element to show a tooltip for or the tooltip is already open\r\n\t\tif ( !target.length || target.data( \"ui-tooltip-id\" ) ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ( target.attr( \"title\" ) ) {\r\n\t\t\ttarget.data( \"ui-tooltip-title\", target.attr( \"title\" ) );\r\n\t\t}\r\n\r\n\t\ttarget.data( \"ui-tooltip-open\", true );\r\n\r\n\t\t// kill parent tooltips, custom or native, for hover\r\n\t\tif ( event && event.type === \"mouseover\" ) {\r\n\t\t\ttarget.parents().each(function() {\r\n\t\t\t\tvar parent = $( this ),\r\n\t\t\t\t\tblurEvent;\r\n\t\t\t\tif ( parent.data( \"ui-tooltip-open\" ) ) {\r\n\t\t\t\t\tblurEvent = $.Event( \"blur\" );\r\n\t\t\t\t\tblurEvent.target = blurEvent.currentTarget = this;\r\n\t\t\t\t\tthat.close( blurEvent, true );\r\n\t\t\t\t}\r\n\t\t\t\tif ( parent.attr( \"title\" ) ) {\r\n\t\t\t\t\tparent.uniqueId();\r\n\t\t\t\t\tthat.parents[ this.id ] = {\r\n\t\t\t\t\t\telement: this,\r\n\t\t\t\t\t\ttitle: parent.attr( \"title\" )\r\n\t\t\t\t\t};\r\n\t\t\t\t\tparent.attr( \"title\", \"\" );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tthis._registerCloseHandlers( event, target );\r\n\t\tthis._updateContent( target, event );\r\n\t},\r\n\r\n\t_updateContent: function( target, event ) {\r\n\t\tvar content,\r\n\t\t\tcontentOption = this.options.content,\r\n\t\t\tthat = this,\r\n\t\t\teventType = event ? event.type : null;\r\n\r\n\t\tif ( typeof contentOption === \"string\" ) {\r\n\t\t\treturn this._open( event, target, contentOption );\r\n\t\t}\r\n\r\n\t\tcontent = contentOption.call( target[0], function( response ) {\r\n\r\n\t\t\t// IE may instantly serve a cached response for ajax requests\r\n\t\t\t// delay this call to _open so the other call to _open runs first\r\n\t\t\tthat._delay(function() {\r\n\r\n\t\t\t\t// Ignore async response if tooltip was closed already\r\n\t\t\t\tif ( !target.data( \"ui-tooltip-open\" ) ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// jQuery creates a special event for focusin when it doesn't\r\n\t\t\t\t// exist natively. To improve performance, the native event\r\n\t\t\t\t// object is reused and the type is changed. Therefore, we can't\r\n\t\t\t\t// rely on the type being correct after the event finished\r\n\t\t\t\t// bubbling, so we set it back to the previous value. (#8740)\r\n\t\t\t\tif ( event ) {\r\n\t\t\t\t\tevent.type = eventType;\r\n\t\t\t\t}\r\n\t\t\t\tthis._open( event, target, response );\r\n\t\t\t});\r\n\t\t});\r\n\t\tif ( content ) {\r\n\t\t\tthis._open( event, target, content );\r\n\t\t}\r\n\t},\r\n\r\n\t_open: function( event, target, content ) {\r\n\t\tvar tooltipData, tooltip, delayedShow, a11yContent,\r\n\t\t\tpositionOption = $.extend( {}, this.options.position );\r\n\r\n\t\tif ( !content ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Content can be updated multiple times. If the tooltip already\r\n\t\t// exists, then just update the content and bail.\r\n\t\ttooltipData = this._find( target );\r\n\t\tif ( tooltipData ) {\r\n\t\t\ttooltipData.tooltip.find( \".ui-tooltip-content\" ).html( content );\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// if we have a title, clear it to prevent the native tooltip\r\n\t\t// we have to check first to avoid defining a title if none exists\r\n\t\t// (we don't want to cause an element to start matching [title])\r\n\t\t//\r\n\t\t// We use removeAttr only for key events, to allow IE to export the correct\r\n\t\t// accessible attributes. For mouse events, set to empty string to avoid\r\n\t\t// native tooltip showing up (happens only when removing inside mouseover).\r\n\t\tif ( target.is( \"[title]\" ) ) {\r\n\t\t\tif ( event && event.type === \"mouseover\" ) {\r\n\t\t\t\ttarget.attr( \"title\", \"\" );\r\n\t\t\t} else {\r\n\t\t\t\ttarget.removeAttr( \"title\" );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\ttooltipData = this._tooltip( target );\r\n\t\ttooltip = tooltipData.tooltip;\r\n\t\tthis._addDescribedBy( target, tooltip.attr( \"id\" ) );\r\n\t\ttooltip.find( \".ui-tooltip-content\" ).html( content );\r\n\r\n\t\t// Support: Voiceover on OS X, JAWS on IE <= 9\r\n\t\t// JAWS announces deletions even when aria-relevant=\"additions\"\r\n\t\t// Voiceover will sometimes re-read the entire log region's contents from the beginning\r\n\t\tthis.liveRegion.children().hide();\r\n\t\tif ( content.clone ) {\r\n\t\t\ta11yContent = content.clone();\r\n\t\t\ta11yContent.removeAttr( \"id\" ).find( \"[id]\" ).removeAttr( \"id\" );\r\n\t\t} else {\r\n\t\t\ta11yContent = content;\r\n\t\t}\r\n\t\t$( \"<div>\" ).html( a11yContent ).appendTo( this.liveRegion );\r\n\r\n\t\tfunction position( event ) {\r\n\t\t\tpositionOption.of = event;\r\n\t\t\tif ( tooltip.is( \":hidden\" ) ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\ttooltip.position( positionOption );\r\n\t\t}\r\n\t\tif ( this.options.track && event && /^mouse/.test( event.type ) ) {\r\n\t\t\tthis._on( this.document, {\r\n\t\t\t\tmousemove: position\r\n\t\t\t});\r\n\t\t\t// trigger once to override element-relative positioning\r\n\t\t\tposition( event );\r\n\t\t} else {\r\n\t\t\ttooltip.position( $.extend({\r\n\t\t\t\tof: target\r\n\t\t\t}, this.options.position ) );\r\n\t\t}\r\n\r\n\t\ttooltip.hide();\r\n\r\n\t\tthis._show( tooltip, this.options.show );\r\n\t\t// Handle tracking tooltips that are shown with a delay (#8644). As soon\r\n\t\t// as the tooltip is visible, position the tooltip using the most recent\r\n\t\t// event.\r\n\t\tif ( this.options.show && this.options.show.delay ) {\r\n\t\t\tdelayedShow = this.delayedShow = setInterval(function() {\r\n\t\t\t\tif ( tooltip.is( \":visible\" ) ) {\r\n\t\t\t\t\tposition( positionOption.of );\r\n\t\t\t\t\tclearInterval( delayedShow );\r\n\t\t\t\t}\r\n\t\t\t}, $.fx.interval );\r\n\t\t}\r\n\r\n\t\tthis._trigger( \"open\", event, { tooltip: tooltip } );\r\n\t},\r\n\r\n\t_registerCloseHandlers: function( event, target ) {\r\n\t\tvar events = {\r\n\t\t\tkeyup: function( event ) {\r\n\t\t\t\tif ( event.keyCode === $.ui.keyCode.ESCAPE ) {\r\n\t\t\t\t\tvar fakeEvent = $.Event(event);\r\n\t\t\t\t\tfakeEvent.currentTarget = target[0];\r\n\t\t\t\t\tthis.close( fakeEvent, true );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Only bind remove handler for delegated targets. Non-delegated\r\n\t\t// tooltips will handle this in destroy.\r\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\r\n\t\t\tevents.remove = function() {\r\n\t\t\t\tthis._removeTooltip( this._find( target ).tooltip );\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif ( !event || event.type === \"mouseover\" ) {\r\n\t\t\tevents.mouseleave = \"close\";\r\n\t\t}\r\n\t\tif ( !event || event.type === \"focusin\" ) {\r\n\t\t\tevents.focusout = \"close\";\r\n\t\t}\r\n\t\tthis._on( true, target, events );\r\n\t},\r\n\r\n\tclose: function( event ) {\r\n\t\tvar tooltip,\r\n\t\t\tthat = this,\r\n\t\t\ttarget = $( event ? event.currentTarget : this.element ),\r\n\t\t\ttooltipData = this._find( target );\r\n\r\n\t\t// The tooltip may already be closed\r\n\t\tif ( !tooltipData ) {\r\n\r\n\t\t\t// We set ui-tooltip-open immediately upon open (in open()), but only set the\r\n\t\t\t// additional data once there's actually content to show (in _open()). So even if the\r\n\t\t\t// tooltip doesn't have full data, we always remove ui-tooltip-open in case we're in\r\n\t\t\t// the period between open() and _open().\r\n\t\t\ttarget.removeData( \"ui-tooltip-open\" );\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttooltip = tooltipData.tooltip;\r\n\r\n\t\t// disabling closes the tooltip, so we need to track when we're closing\r\n\t\t// to avoid an infinite loop in case the tooltip becomes disabled on close\r\n\t\tif ( tooltipData.closing ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Clear the interval for delayed tracking tooltips\r\n\t\tclearInterval( this.delayedShow );\r\n\r\n\t\t// only set title if we had one before (see comment in _open())\r\n\t\t// If the title attribute has changed since open(), don't restore\r\n\t\tif ( target.data( \"ui-tooltip-title\" ) && !target.attr( \"title\" ) ) {\r\n\t\t\ttarget.attr( \"title\", target.data( \"ui-tooltip-title\" ) );\r\n\t\t}\r\n\r\n\t\tthis._removeDescribedBy( target );\r\n\r\n\t\ttooltipData.hiding = true;\r\n\t\ttooltip.stop( true );\r\n\t\tthis._hide( tooltip, this.options.hide, function() {\r\n\t\t\tthat._removeTooltip( $( this ) );\r\n\t\t});\r\n\r\n\t\ttarget.removeData( \"ui-tooltip-open\" );\r\n\t\tthis._off( target, \"mouseleave focusout keyup\" );\r\n\r\n\t\t// Remove 'remove' binding only on delegated targets\r\n\t\tif ( target[ 0 ] !== this.element[ 0 ] ) {\r\n\t\t\tthis._off( target, \"remove\" );\r\n\t\t}\r\n\t\tthis._off( this.document, \"mousemove\" );\r\n\r\n\t\tif ( event && event.type === \"mouseleave\" ) {\r\n\t\t\t$.each( this.parents, function( id, parent ) {\r\n\t\t\t\t$( parent.element ).attr( \"title\", parent.title );\r\n\t\t\t\tdelete that.parents[ id ];\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\ttooltipData.closing = true;\r\n\t\tthis._trigger( \"close\", event, { tooltip: tooltip } );\r\n\t\tif ( !tooltipData.hiding ) {\r\n\t\t\ttooltipData.closing = false;\r\n\t\t}\r\n\t},\r\n\r\n\t_tooltip: function( element ) {\r\n\t\tvar tooltip = $( \"<div>\" )\r\n\t\t\t\t.attr( \"role\", \"tooltip\" )\r\n\t\t\t\t.addClass( \"ui-tooltip ui-widget ui-corner-all ui-widget-content \" +\r\n\t\t\t\t\t( this.options.tooltipClass || \"\" ) ),\r\n\t\t\tid = tooltip.uniqueId().attr( \"id\" );\r\n\r\n\t\t$( \"<div>\" )\r\n\t\t\t.addClass( \"ui-tooltip-content\" )\r\n\t\t\t.appendTo( tooltip );\r\n\r\n\t\ttooltip.appendTo( this.document[0].body );\r\n\r\n\t\treturn this.tooltips[ id ] = {\r\n\t\t\telement: element,\r\n\t\t\ttooltip: tooltip\r\n\t\t};\r\n\t},\r\n\r\n\t_find: function( target ) {\r\n\t\tvar id = target.data( \"ui-tooltip-id\" );\r\n\t\treturn id ? this.tooltips[ id ] : null;\r\n\t},\r\n\r\n\t_removeTooltip: function( tooltip ) {\r\n\t\ttooltip.remove();\r\n\t\tdelete this.tooltips[ tooltip.attr( \"id\" ) ];\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tvar that = this;\r\n\r\n\t\t// close open tooltips\r\n\t\t$.each( this.tooltips, function( id, tooltipData ) {\r\n\t\t\t// Delegate to close method to handle common cleanup\r\n\t\t\tvar event = $.Event( \"blur\" ),\r\n\t\t\t\telement = tooltipData.element;\r\n\t\t\tevent.target = event.currentTarget = element[ 0 ];\r\n\t\t\tthat.close( event, true );\r\n\r\n\t\t\t// Remove immediately; destroying an open tooltip doesn't use the\r\n\t\t\t// hide animation\r\n\t\t\t$( \"#\" + id ).remove();\r\n\r\n\t\t\t// Restore the title\r\n\t\t\tif ( element.data( \"ui-tooltip-title\" ) ) {\r\n\t\t\t\t// If the title attribute has changed since open(), don't restore\r\n\t\t\t\tif ( !element.attr( \"title\" ) ) {\r\n\t\t\t\t\telement.attr( \"title\", element.data( \"ui-tooltip-title\" ) );\r\n\t\t\t\t}\r\n\t\t\t\telement.removeData( \"ui-tooltip-title\" );\r\n\t\t\t}\r\n\t\t});\r\n\t\tthis.liveRegion.remove();\r\n\t}\r\n});\r\n\r\n\r\n/*!\r\n * jQuery UI Effects 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/category/effects-core/\r\n */\r\n\r\n\r\nvar dataSpace = \"ui-effects-\",\r\n\r\n\t// Create a local jQuery because jQuery Color relies on it and the\r\n\t// global may not exist with AMD and a custom build (#10199)\r\n\tjQuery = $;\r\n\r\n$.effects = {\r\n\teffect: {}\r\n};\r\n\r\n/*!\r\n * jQuery Color Animations v2.1.2\r\n * https://github.com/jquery/jquery-color\r\n *\r\n * Copyright 2014 jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * Date: Wed Jan 16 08:47:09 2013 -0600\r\n */\r\n(function( jQuery, undefined ) {\r\n\r\n\tvar stepHooks = \"backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor\",\r\n\r\n\t// plusequals test for += 100 -= 100\r\n\trplusequals = /^([\\-+])=\\s*(\\d+\\.?\\d*)/,\r\n\t// a set of RE's that can match strings and generate color tuples.\r\n\tstringParsers = [ {\r\n\t\t\tre: /rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\r\n\t\t\tparse: function( execResult ) {\r\n\t\t\t\treturn [\r\n\t\t\t\t\texecResult[ 1 ],\r\n\t\t\t\t\texecResult[ 2 ],\r\n\t\t\t\t\texecResult[ 3 ],\r\n\t\t\t\t\texecResult[ 4 ]\r\n\t\t\t\t];\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tre: /rgba?\\(\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\r\n\t\t\tparse: function( execResult ) {\r\n\t\t\t\treturn [\r\n\t\t\t\t\texecResult[ 1 ] * 2.55,\r\n\t\t\t\t\texecResult[ 2 ] * 2.55,\r\n\t\t\t\t\texecResult[ 3 ] * 2.55,\r\n\t\t\t\t\texecResult[ 4 ]\r\n\t\t\t\t];\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\t// this regex ignores A-F because it's compared against an already lowercased string\r\n\t\t\tre: /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,\r\n\t\t\tparse: function( execResult ) {\r\n\t\t\t\treturn [\r\n\t\t\t\t\tparseInt( execResult[ 1 ], 16 ),\r\n\t\t\t\t\tparseInt( execResult[ 2 ], 16 ),\r\n\t\t\t\t\tparseInt( execResult[ 3 ], 16 )\r\n\t\t\t\t];\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\t// this regex ignores A-F because it's compared against an already lowercased string\r\n\t\t\tre: /#([a-f0-9])([a-f0-9])([a-f0-9])/,\r\n\t\t\tparse: function( execResult ) {\r\n\t\t\t\treturn [\r\n\t\t\t\t\tparseInt( execResult[ 1 ] + execResult[ 1 ], 16 ),\r\n\t\t\t\t\tparseInt( execResult[ 2 ] + execResult[ 2 ], 16 ),\r\n\t\t\t\t\tparseInt( execResult[ 3 ] + execResult[ 3 ], 16 )\r\n\t\t\t\t];\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tre: /hsla?\\(\\s*(\\d+(?:\\.\\d+)?)\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*,\\s*(\\d+(?:\\.\\d+)?)\\%\\s*(?:,\\s*(\\d?(?:\\.\\d+)?)\\s*)?\\)/,\r\n\t\t\tspace: \"hsla\",\r\n\t\t\tparse: function( execResult ) {\r\n\t\t\t\treturn [\r\n\t\t\t\t\texecResult[ 1 ],\r\n\t\t\t\t\texecResult[ 2 ] / 100,\r\n\t\t\t\t\texecResult[ 3 ] / 100,\r\n\t\t\t\t\texecResult[ 4 ]\r\n\t\t\t\t];\r\n\t\t\t}\r\n\t\t} ],\r\n\r\n\t// jQuery.Color( )\r\n\tcolor = jQuery.Color = function( color, green, blue, alpha ) {\r\n\t\treturn new jQuery.Color.fn.parse( color, green, blue, alpha );\r\n\t},\r\n\tspaces = {\r\n\t\trgba: {\r\n\t\t\tprops: {\r\n\t\t\t\tred: {\r\n\t\t\t\t\tidx: 0,\r\n\t\t\t\t\ttype: \"byte\"\r\n\t\t\t\t},\r\n\t\t\t\tgreen: {\r\n\t\t\t\t\tidx: 1,\r\n\t\t\t\t\ttype: \"byte\"\r\n\t\t\t\t},\r\n\t\t\t\tblue: {\r\n\t\t\t\t\tidx: 2,\r\n\t\t\t\t\ttype: \"byte\"\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\thsla: {\r\n\t\t\tprops: {\r\n\t\t\t\thue: {\r\n\t\t\t\t\tidx: 0,\r\n\t\t\t\t\ttype: \"degrees\"\r\n\t\t\t\t},\r\n\t\t\t\tsaturation: {\r\n\t\t\t\t\tidx: 1,\r\n\t\t\t\t\ttype: \"percent\"\r\n\t\t\t\t},\r\n\t\t\t\tlightness: {\r\n\t\t\t\t\tidx: 2,\r\n\t\t\t\t\ttype: \"percent\"\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tpropTypes = {\r\n\t\t\"byte\": {\r\n\t\t\tfloor: true,\r\n\t\t\tmax: 255\r\n\t\t},\r\n\t\t\"percent\": {\r\n\t\t\tmax: 1\r\n\t\t},\r\n\t\t\"degrees\": {\r\n\t\t\tmod: 360,\r\n\t\t\tfloor: true\r\n\t\t}\r\n\t},\r\n\tsupport = color.support = {},\r\n\r\n\t// element for support tests\r\n\tsupportElem = jQuery( \"<p>\" )[ 0 ],\r\n\r\n\t// colors = jQuery.Color.names\r\n\tcolors,\r\n\r\n\t// local aliases of functions called often\r\n\teach = jQuery.each;\r\n\r\n// determine rgba support immediately\r\nsupportElem.style.cssText = \"background-color:rgba(1,1,1,.5)\";\r\nsupport.rgba = supportElem.style.backgroundColor.indexOf( \"rgba\" ) > -1;\r\n\r\n// define cache name and alpha properties\r\n// for rgba and hsla spaces\r\neach( spaces, function( spaceName, space ) {\r\n\tspace.cache = \"_\" + spaceName;\r\n\tspace.props.alpha = {\r\n\t\tidx: 3,\r\n\t\ttype: \"percent\",\r\n\t\tdef: 1\r\n\t};\r\n});\r\n\r\nfunction clamp( value, prop, allowEmpty ) {\r\n\tvar type = propTypes[ prop.type ] || {};\r\n\r\n\tif ( value == null ) {\r\n\t\treturn (allowEmpty || !prop.def) ? null : prop.def;\r\n\t}\r\n\r\n\t// ~~ is an short way of doing floor for positive numbers\r\n\tvalue = type.floor ? ~~value : parseFloat( value );\r\n\r\n\t// IE will pass in empty strings as value for alpha,\r\n\t// which will hit this case\r\n\tif ( isNaN( value ) ) {\r\n\t\treturn prop.def;\r\n\t}\r\n\r\n\tif ( type.mod ) {\r\n\t\t// we add mod before modding to make sure that negatives values\r\n\t\t// get converted properly: -10 -> 350\r\n\t\treturn (value + type.mod) % type.mod;\r\n\t}\r\n\r\n\t// for now all property types without mod have min and max\r\n\treturn 0 > value ? 0 : type.max < value ? type.max : value;\r\n}\r\n\r\nfunction stringParse( string ) {\r\n\tvar inst = color(),\r\n\t\trgba = inst._rgba = [];\r\n\r\n\tstring = string.toLowerCase();\r\n\r\n\teach( stringParsers, function( i, parser ) {\r\n\t\tvar parsed,\r\n\t\t\tmatch = parser.re.exec( string ),\r\n\t\t\tvalues = match && parser.parse( match ),\r\n\t\t\tspaceName = parser.space || \"rgba\";\r\n\r\n\t\tif ( values ) {\r\n\t\t\tparsed = inst[ spaceName ]( values );\r\n\r\n\t\t\t// if this was an rgba parse the assignment might happen twice\r\n\t\t\t// oh well....\r\n\t\t\tinst[ spaces[ spaceName ].cache ] = parsed[ spaces[ spaceName ].cache ];\r\n\t\t\trgba = inst._rgba = parsed._rgba;\r\n\r\n\t\t\t// exit each( stringParsers ) here because we matched\r\n\t\t\treturn false;\r\n\t\t}\r\n\t});\r\n\r\n\t// Found a stringParser that handled it\r\n\tif ( rgba.length ) {\r\n\r\n\t\t// if this came from a parsed string, force \"transparent\" when alpha is 0\r\n\t\t// chrome, (and maybe others) return \"transparent\" as rgba(0,0,0,0)\r\n\t\tif ( rgba.join() === \"0,0,0,0\" ) {\r\n\t\t\tjQuery.extend( rgba, colors.transparent );\r\n\t\t}\r\n\t\treturn inst;\r\n\t}\r\n\r\n\t// named colors\r\n\treturn colors[ string ];\r\n}\r\n\r\ncolor.fn = jQuery.extend( color.prototype, {\r\n\tparse: function( red, green, blue, alpha ) {\r\n\t\tif ( red === undefined ) {\r\n\t\t\tthis._rgba = [ null, null, null, null ];\r\n\t\t\treturn this;\r\n\t\t}\r\n\t\tif ( red.jquery || red.nodeType ) {\r\n\t\t\tred = jQuery( red ).css( green );\r\n\t\t\tgreen = undefined;\r\n\t\t}\r\n\r\n\t\tvar inst = this,\r\n\t\t\ttype = jQuery.type( red ),\r\n\t\t\trgba = this._rgba = [];\r\n\r\n\t\t// more than 1 argument specified - assume ( red, green, blue, alpha )\r\n\t\tif ( green !== undefined ) {\r\n\t\t\tred = [ red, green, blue, alpha ];\r\n\t\t\ttype = \"array\";\r\n\t\t}\r\n\r\n\t\tif ( type === \"string\" ) {\r\n\t\t\treturn this.parse( stringParse( red ) || colors._default );\r\n\t\t}\r\n\r\n\t\tif ( type === \"array\" ) {\r\n\t\t\teach( spaces.rgba.props, function( key, prop ) {\r\n\t\t\t\trgba[ prop.idx ] = clamp( red[ prop.idx ], prop );\r\n\t\t\t});\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tif ( type === \"object\" ) {\r\n\t\t\tif ( red instanceof color ) {\r\n\t\t\t\teach( spaces, function( spaceName, space ) {\r\n\t\t\t\t\tif ( red[ space.cache ] ) {\r\n\t\t\t\t\t\tinst[ space.cache ] = red[ space.cache ].slice();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\teach( spaces, function( spaceName, space ) {\r\n\t\t\t\t\tvar cache = space.cache;\r\n\t\t\t\t\teach( space.props, function( key, prop ) {\r\n\r\n\t\t\t\t\t\t// if the cache doesn't exist, and we know how to convert\r\n\t\t\t\t\t\tif ( !inst[ cache ] && space.to ) {\r\n\r\n\t\t\t\t\t\t\t// if the value was null, we don't need to copy it\r\n\t\t\t\t\t\t\t// if the key was alpha, we don't need to copy it either\r\n\t\t\t\t\t\t\tif ( key === \"alpha\" || red[ key ] == null ) {\r\n\t\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tinst[ cache ] = space.to( inst._rgba );\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// this is the only case where we allow nulls for ALL properties.\r\n\t\t\t\t\t\t// call clamp with alwaysAllowEmpty\r\n\t\t\t\t\t\tinst[ cache ][ prop.idx ] = clamp( red[ key ], prop, true );\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t// everything defined but alpha?\r\n\t\t\t\t\tif ( inst[ cache ] && jQuery.inArray( null, inst[ cache ].slice( 0, 3 ) ) < 0 ) {\r\n\t\t\t\t\t\t// use the default of 1\r\n\t\t\t\t\t\tinst[ cache ][ 3 ] = 1;\r\n\t\t\t\t\t\tif ( space.from ) {\r\n\t\t\t\t\t\t\tinst._rgba = space.from( inst[ cache ] );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t}\r\n\t},\r\n\tis: function( compare ) {\r\n\t\tvar is = color( compare ),\r\n\t\t\tsame = true,\r\n\t\t\tinst = this;\r\n\r\n\t\teach( spaces, function( _, space ) {\r\n\t\t\tvar localCache,\r\n\t\t\t\tisCache = is[ space.cache ];\r\n\t\t\tif (isCache) {\r\n\t\t\t\tlocalCache = inst[ space.cache ] || space.to && space.to( inst._rgba ) || [];\r\n\t\t\t\teach( space.props, function( _, prop ) {\r\n\t\t\t\t\tif ( isCache[ prop.idx ] != null ) {\r\n\t\t\t\t\t\tsame = ( isCache[ prop.idx ] === localCache[ prop.idx ] );\r\n\t\t\t\t\t\treturn same;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\treturn same;\r\n\t\t});\r\n\t\treturn same;\r\n\t},\r\n\t_space: function() {\r\n\t\tvar used = [],\r\n\t\t\tinst = this;\r\n\t\teach( spaces, function( spaceName, space ) {\r\n\t\t\tif ( inst[ space.cache ] ) {\r\n\t\t\t\tused.push( spaceName );\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn used.pop();\r\n\t},\r\n\ttransition: function( other, distance ) {\r\n\t\tvar end = color( other ),\r\n\t\t\tspaceName = end._space(),\r\n\t\t\tspace = spaces[ spaceName ],\r\n\t\t\tstartColor = this.alpha() === 0 ? color( \"transparent\" ) : this,\r\n\t\t\tstart = startColor[ space.cache ] || space.to( startColor._rgba ),\r\n\t\t\tresult = start.slice();\r\n\r\n\t\tend = end[ space.cache ];\r\n\t\teach( space.props, function( key, prop ) {\r\n\t\t\tvar index = prop.idx,\r\n\t\t\t\tstartValue = start[ index ],\r\n\t\t\t\tendValue = end[ index ],\r\n\t\t\t\ttype = propTypes[ prop.type ] || {};\r\n\r\n\t\t\t// if null, don't override start value\r\n\t\t\tif ( endValue === null ) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\t// if null - use end\r\n\t\t\tif ( startValue === null ) {\r\n\t\t\t\tresult[ index ] = endValue;\r\n\t\t\t} else {\r\n\t\t\t\tif ( type.mod ) {\r\n\t\t\t\t\tif ( endValue - startValue > type.mod / 2 ) {\r\n\t\t\t\t\t\tstartValue += type.mod;\r\n\t\t\t\t\t} else if ( startValue - endValue > type.mod / 2 ) {\r\n\t\t\t\t\t\tstartValue -= type.mod;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tresult[ index ] = clamp( ( endValue - startValue ) * distance + startValue, prop );\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn this[ spaceName ]( result );\r\n\t},\r\n\tblend: function( opaque ) {\r\n\t\t// if we are already opaque - return ourself\r\n\t\tif ( this._rgba[ 3 ] === 1 ) {\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tvar rgb = this._rgba.slice(),\r\n\t\t\ta = rgb.pop(),\r\n\t\t\tblend = color( opaque )._rgba;\r\n\r\n\t\treturn color( jQuery.map( rgb, function( v, i ) {\r\n\t\t\treturn ( 1 - a ) * blend[ i ] + a * v;\r\n\t\t}));\r\n\t},\r\n\ttoRgbaString: function() {\r\n\t\tvar prefix = \"rgba(\",\r\n\t\t\trgba = jQuery.map( this._rgba, function( v, i ) {\r\n\t\t\t\treturn v == null ? ( i > 2 ? 1 : 0 ) : v;\r\n\t\t\t});\r\n\r\n\t\tif ( rgba[ 3 ] === 1 ) {\r\n\t\t\trgba.pop();\r\n\t\t\tprefix = \"rgb(\";\r\n\t\t}\r\n\r\n\t\treturn prefix + rgba.join() + \")\";\r\n\t},\r\n\ttoHslaString: function() {\r\n\t\tvar prefix = \"hsla(\",\r\n\t\t\thsla = jQuery.map( this.hsla(), function( v, i ) {\r\n\t\t\t\tif ( v == null ) {\r\n\t\t\t\t\tv = i > 2 ? 1 : 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// catch 1 and 2\r\n\t\t\t\tif ( i && i < 3 ) {\r\n\t\t\t\t\tv = Math.round( v * 100 ) + \"%\";\r\n\t\t\t\t}\r\n\t\t\t\treturn v;\r\n\t\t\t});\r\n\r\n\t\tif ( hsla[ 3 ] === 1 ) {\r\n\t\t\thsla.pop();\r\n\t\t\tprefix = \"hsl(\";\r\n\t\t}\r\n\t\treturn prefix + hsla.join() + \")\";\r\n\t},\r\n\ttoHexString: function( includeAlpha ) {\r\n\t\tvar rgba = this._rgba.slice(),\r\n\t\t\talpha = rgba.pop();\r\n\r\n\t\tif ( includeAlpha ) {\r\n\t\t\trgba.push( ~~( alpha * 255 ) );\r\n\t\t}\r\n\r\n\t\treturn \"#\" + jQuery.map( rgba, function( v ) {\r\n\r\n\t\t\t// default to 0 when nulls exist\r\n\t\t\tv = ( v || 0 ).toString( 16 );\r\n\t\t\treturn v.length === 1 ? \"0\" + v : v;\r\n\t\t}).join(\"\");\r\n\t},\r\n\ttoString: function() {\r\n\t\treturn this._rgba[ 3 ] === 0 ? \"transparent\" : this.toRgbaString();\r\n\t}\r\n});\r\ncolor.fn.parse.prototype = color.fn;\r\n\r\n// hsla conversions adapted from:\r\n// https://code.google.com/p/maashaack/source/browse/packages/graphics/trunk/src/graphics/colors/HUE2RGB.as?r=5021\r\n\r\nfunction hue2rgb( p, q, h ) {\r\n\th = ( h + 1 ) % 1;\r\n\tif ( h * 6 < 1 ) {\r\n\t\treturn p + ( q - p ) * h * 6;\r\n\t}\r\n\tif ( h * 2 < 1) {\r\n\t\treturn q;\r\n\t}\r\n\tif ( h * 3 < 2 ) {\r\n\t\treturn p + ( q - p ) * ( ( 2 / 3 ) - h ) * 6;\r\n\t}\r\n\treturn p;\r\n}\r\n\r\nspaces.hsla.to = function( rgba ) {\r\n\tif ( rgba[ 0 ] == null || rgba[ 1 ] == null || rgba[ 2 ] == null ) {\r\n\t\treturn [ null, null, null, rgba[ 3 ] ];\r\n\t}\r\n\tvar r = rgba[ 0 ] / 255,\r\n\t\tg = rgba[ 1 ] / 255,\r\n\t\tb = rgba[ 2 ] / 255,\r\n\t\ta = rgba[ 3 ],\r\n\t\tmax = Math.max( r, g, b ),\r\n\t\tmin = Math.min( r, g, b ),\r\n\t\tdiff = max - min,\r\n\t\tadd = max + min,\r\n\t\tl = add * 0.5,\r\n\t\th, s;\r\n\r\n\tif ( min === max ) {\r\n\t\th = 0;\r\n\t} else if ( r === max ) {\r\n\t\th = ( 60 * ( g - b ) / diff ) + 360;\r\n\t} else if ( g === max ) {\r\n\t\th = ( 60 * ( b - r ) / diff ) + 120;\r\n\t} else {\r\n\t\th = ( 60 * ( r - g ) / diff ) + 240;\r\n\t}\r\n\r\n\t// chroma (diff) == 0 means greyscale which, by definition, saturation = 0%\r\n\t// otherwise, saturation is based on the ratio of chroma (diff) to lightness (add)\r\n\tif ( diff === 0 ) {\r\n\t\ts = 0;\r\n\t} else if ( l <= 0.5 ) {\r\n\t\ts = diff / add;\r\n\t} else {\r\n\t\ts = diff / ( 2 - add );\r\n\t}\r\n\treturn [ Math.round(h) % 360, s, l, a == null ? 1 : a ];\r\n};\r\n\r\nspaces.hsla.from = function( hsla ) {\r\n\tif ( hsla[ 0 ] == null || hsla[ 1 ] == null || hsla[ 2 ] == null ) {\r\n\t\treturn [ null, null, null, hsla[ 3 ] ];\r\n\t}\r\n\tvar h = hsla[ 0 ] / 360,\r\n\t\ts = hsla[ 1 ],\r\n\t\tl = hsla[ 2 ],\r\n\t\ta = hsla[ 3 ],\r\n\t\tq = l <= 0.5 ? l * ( 1 + s ) : l + s - l * s,\r\n\t\tp = 2 * l - q;\r\n\r\n\treturn [\r\n\t\tMath.round( hue2rgb( p, q, h + ( 1 / 3 ) ) * 255 ),\r\n\t\tMath.round( hue2rgb( p, q, h ) * 255 ),\r\n\t\tMath.round( hue2rgb( p, q, h - ( 1 / 3 ) ) * 255 ),\r\n\t\ta\r\n\t];\r\n};\r\n\r\neach( spaces, function( spaceName, space ) {\r\n\tvar props = space.props,\r\n\t\tcache = space.cache,\r\n\t\tto = space.to,\r\n\t\tfrom = space.from;\r\n\r\n\t// makes rgba() and hsla()\r\n\tcolor.fn[ spaceName ] = function( value ) {\r\n\r\n\t\t// generate a cache for this space if it doesn't exist\r\n\t\tif ( to && !this[ cache ] ) {\r\n\t\t\tthis[ cache ] = to( this._rgba );\r\n\t\t}\r\n\t\tif ( value === undefined ) {\r\n\t\t\treturn this[ cache ].slice();\r\n\t\t}\r\n\r\n\t\tvar ret,\r\n\t\t\ttype = jQuery.type( value ),\r\n\t\t\tarr = ( type === \"array\" || type === \"object\" ) ? value : arguments,\r\n\t\t\tlocal = this[ cache ].slice();\r\n\r\n\t\teach( props, function( key, prop ) {\r\n\t\t\tvar val = arr[ type === \"object\" ? key : prop.idx ];\r\n\t\t\tif ( val == null ) {\r\n\t\t\t\tval = local[ prop.idx ];\r\n\t\t\t}\r\n\t\t\tlocal[ prop.idx ] = clamp( val, prop );\r\n\t\t});\r\n\r\n\t\tif ( from ) {\r\n\t\t\tret = color( from( local ) );\r\n\t\t\tret[ cache ] = local;\r\n\t\t\treturn ret;\r\n\t\t} else {\r\n\t\t\treturn color( local );\r\n\t\t}\r\n\t};\r\n\r\n\t// makes red() green() blue() alpha() hue() saturation() lightness()\r\n\teach( props, function( key, prop ) {\r\n\t\t// alpha is included in more than one space\r\n\t\tif ( color.fn[ key ] ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tcolor.fn[ key ] = function( value ) {\r\n\t\t\tvar vtype = jQuery.type( value ),\r\n\t\t\t\tfn = ( key === \"alpha\" ? ( this._hsla ? \"hsla\" : \"rgba\" ) : spaceName ),\r\n\t\t\t\tlocal = this[ fn ](),\r\n\t\t\t\tcur = local[ prop.idx ],\r\n\t\t\t\tmatch;\r\n\r\n\t\t\tif ( vtype === \"undefined\" ) {\r\n\t\t\t\treturn cur;\r\n\t\t\t}\r\n\r\n\t\t\tif ( vtype === \"function\" ) {\r\n\t\t\t\tvalue = value.call( this, cur );\r\n\t\t\t\tvtype = jQuery.type( value );\r\n\t\t\t}\r\n\t\t\tif ( value == null && prop.empty ) {\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\t\t\tif ( vtype === \"string\" ) {\r\n\t\t\t\tmatch = rplusequals.exec( value );\r\n\t\t\t\tif ( match ) {\r\n\t\t\t\t\tvalue = cur + parseFloat( match[ 2 ] ) * ( match[ 1 ] === \"+\" ? 1 : -1 );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tlocal[ prop.idx ] = value;\r\n\t\t\treturn this[ fn ]( local );\r\n\t\t};\r\n\t});\r\n});\r\n\r\n// add cssHook and .fx.step function for each named hook.\r\n// accept a space separated string of properties\r\ncolor.hook = function( hook ) {\r\n\tvar hooks = hook.split( \" \" );\r\n\teach( hooks, function( i, hook ) {\r\n\t\tjQuery.cssHooks[ hook ] = {\r\n\t\t\tset: function( elem, value ) {\r\n\t\t\t\tvar parsed, curElem,\r\n\t\t\t\t\tbackgroundColor = \"\";\r\n\r\n\t\t\t\tif ( value !== \"transparent\" && ( jQuery.type( value ) !== \"string\" || ( parsed = stringParse( value ) ) ) ) {\r\n\t\t\t\t\tvalue = color( parsed || value );\r\n\t\t\t\t\tif ( !support.rgba && value._rgba[ 3 ] !== 1 ) {\r\n\t\t\t\t\t\tcurElem = hook === \"backgroundColor\" ? elem.parentNode : elem;\r\n\t\t\t\t\t\twhile (\r\n\t\t\t\t\t\t\t(backgroundColor === \"\" || backgroundColor === \"transparent\") &&\r\n\t\t\t\t\t\t\tcurElem && curElem.style\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tbackgroundColor = jQuery.css( curElem, \"backgroundColor\" );\r\n\t\t\t\t\t\t\t\tcurElem = curElem.parentNode;\r\n\t\t\t\t\t\t\t} catch ( e ) {\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tvalue = value.blend( backgroundColor && backgroundColor !== \"transparent\" ?\r\n\t\t\t\t\t\t\tbackgroundColor :\r\n\t\t\t\t\t\t\t\"_default\" );\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvalue = value.toRgbaString();\r\n\t\t\t\t}\r\n\t\t\t\ttry {\r\n\t\t\t\t\telem.style[ hook ] = value;\r\n\t\t\t\t} catch ( e ) {\r\n\t\t\t\t\t// wrapped to prevent IE from throwing errors on \"invalid\" values like 'auto' or 'inherit'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\tjQuery.fx.step[ hook ] = function( fx ) {\r\n\t\t\tif ( !fx.colorInit ) {\r\n\t\t\t\tfx.start = color( fx.elem, hook );\r\n\t\t\t\tfx.end = color( fx.end );\r\n\t\t\t\tfx.colorInit = true;\r\n\t\t\t}\r\n\t\t\tjQuery.cssHooks[ hook ].set( fx.elem, fx.start.transition( fx.end, fx.pos ) );\r\n\t\t};\r\n\t});\r\n\r\n};\r\n\r\ncolor.hook( stepHooks );\r\n\r\njQuery.cssHooks.borderColor = {\r\n\texpand: function( value ) {\r\n\t\tvar expanded = {};\r\n\r\n\t\teach( [ \"Top\", \"Right\", \"Bottom\", \"Left\" ], function( i, part ) {\r\n\t\t\texpanded[ \"border\" + part + \"Color\" ] = value;\r\n\t\t});\r\n\t\treturn expanded;\r\n\t}\r\n};\r\n\r\n// Basic color names only.\r\n// Usage of any of the other color names requires adding yourself or including\r\n// jquery.color.svg-names.js.\r\ncolors = jQuery.Color.names = {\r\n\t// 4.1. Basic color keywords\r\n\taqua: \"#00ffff\",\r\n\tblack: \"#000000\",\r\n\tblue: \"#0000ff\",\r\n\tfuchsia: \"#ff00ff\",\r\n\tgray: \"#808080\",\r\n\tgreen: \"#008000\",\r\n\tlime: \"#00ff00\",\r\n\tmaroon: \"#800000\",\r\n\tnavy: \"#000080\",\r\n\tolive: \"#808000\",\r\n\tpurple: \"#800080\",\r\n\tred: \"#ff0000\",\r\n\tsilver: \"#c0c0c0\",\r\n\tteal: \"#008080\",\r\n\twhite: \"#ffffff\",\r\n\tyellow: \"#ffff00\",\r\n\r\n\t// 4.2.3. \"transparent\" color keyword\r\n\ttransparent: [ null, null, null, 0 ],\r\n\r\n\t_default: \"#ffffff\"\r\n};\r\n\r\n})( jQuery );\r\n\r\n/******************************************************************************/\r\n/****************************** CLASS ANIMATIONS ******************************/\r\n/******************************************************************************/\r\n(function() {\r\n\r\nvar classAnimationActions = [ \"add\", \"remove\", \"toggle\" ],\r\n\tshorthandStyles = {\r\n\t\tborder: 1,\r\n\t\tborderBottom: 1,\r\n\t\tborderColor: 1,\r\n\t\tborderLeft: 1,\r\n\t\tborderRight: 1,\r\n\t\tborderTop: 1,\r\n\t\tborderWidth: 1,\r\n\t\tmargin: 1,\r\n\t\tpadding: 1\r\n\t};\r\n\r\n$.each([ \"borderLeftStyle\", \"borderRightStyle\", \"borderBottomStyle\", \"borderTopStyle\" ], function( _, prop ) {\r\n\t$.fx.step[ prop ] = function( fx ) {\r\n\t\tif ( fx.end !== \"none\" && !fx.setAttr || fx.pos === 1 && !fx.setAttr ) {\r\n\t\t\tjQuery.style( fx.elem, prop, fx.end );\r\n\t\t\tfx.setAttr = true;\r\n\t\t}\r\n\t};\r\n});\r\n\r\nfunction getElementStyles( elem ) {\r\n\tvar key, len,\r\n\t\tstyle = elem.ownerDocument.defaultView ?\r\n\t\t\telem.ownerDocument.defaultView.getComputedStyle( elem, null ) :\r\n\t\t\telem.currentStyle,\r\n\t\tstyles = {};\r\n\r\n\tif ( style && style.length && style[ 0 ] && style[ style[ 0 ] ] ) {\r\n\t\tlen = style.length;\r\n\t\twhile ( len-- ) {\r\n\t\t\tkey = style[ len ];\r\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\r\n\t\t\t\tstyles[ $.camelCase( key ) ] = style[ key ];\r\n\t\t\t}\r\n\t\t}\r\n\t// support: Opera, IE <9\r\n\t} else {\r\n\t\tfor ( key in style ) {\r\n\t\t\tif ( typeof style[ key ] === \"string\" ) {\r\n\t\t\t\tstyles[ key ] = style[ key ];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn styles;\r\n}\r\n\r\nfunction styleDifference( oldStyle, newStyle ) {\r\n\tvar diff = {},\r\n\t\tname, value;\r\n\r\n\tfor ( name in newStyle ) {\r\n\t\tvalue = newStyle[ name ];\r\n\t\tif ( oldStyle[ name ] !== value ) {\r\n\t\t\tif ( !shorthandStyles[ name ] ) {\r\n\t\t\t\tif ( $.fx.step[ name ] || !isNaN( parseFloat( value ) ) ) {\r\n\t\t\t\t\tdiff[ name ] = value;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn diff;\r\n}\r\n\r\n// support: jQuery <1.8\r\nif ( !$.fn.addBack ) {\r\n\t$.fn.addBack = function( selector ) {\r\n\t\treturn this.add( selector == null ?\r\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\r\n\t\t);\r\n\t};\r\n}\r\n\r\n$.effects.animateClass = function( value, duration, easing, callback ) {\r\n\tvar o = $.speed( duration, easing, callback );\r\n\r\n\treturn this.queue( function() {\r\n\t\tvar animated = $( this ),\r\n\t\t\tbaseClass = animated.attr( \"class\" ) || \"\",\r\n\t\t\tapplyClassChange,\r\n\t\t\tallAnimations = o.children ? animated.find( \"*\" ).addBack() : animated;\r\n\r\n\t\t// map the animated objects to store the original styles.\r\n\t\tallAnimations = allAnimations.map(function() {\r\n\t\t\tvar el = $( this );\r\n\t\t\treturn {\r\n\t\t\t\tel: el,\r\n\t\t\t\tstart: getElementStyles( this )\r\n\t\t\t};\r\n\t\t});\r\n\r\n\t\t// apply class change\r\n\t\tapplyClassChange = function() {\r\n\t\t\t$.each( classAnimationActions, function(i, action) {\r\n\t\t\t\tif ( value[ action ] ) {\r\n\t\t\t\t\tanimated[ action + \"Class\" ]( value[ action ] );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\t\tapplyClassChange();\r\n\r\n\t\t// map all animated objects again - calculate new styles and diff\r\n\t\tallAnimations = allAnimations.map(function() {\r\n\t\t\tthis.end = getElementStyles( this.el[ 0 ] );\r\n\t\t\tthis.diff = styleDifference( this.start, this.end );\r\n\t\t\treturn this;\r\n\t\t});\r\n\r\n\t\t// apply original class\r\n\t\tanimated.attr( \"class\", baseClass );\r\n\r\n\t\t// map all animated objects again - this time collecting a promise\r\n\t\tallAnimations = allAnimations.map(function() {\r\n\t\t\tvar styleInfo = this,\r\n\t\t\t\tdfd = $.Deferred(),\r\n\t\t\t\topts = $.extend({}, o, {\r\n\t\t\t\t\tqueue: false,\r\n\t\t\t\t\tcomplete: function() {\r\n\t\t\t\t\t\tdfd.resolve( styleInfo );\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\tthis.el.animate( this.diff, opts );\r\n\t\t\treturn dfd.promise();\r\n\t\t});\r\n\r\n\t\t// once all animations have completed:\r\n\t\t$.when.apply( $, allAnimations.get() ).done(function() {\r\n\r\n\t\t\t// set the final class\r\n\t\t\tapplyClassChange();\r\n\r\n\t\t\t// for each animated element,\r\n\t\t\t// clear all css properties that were animated\r\n\t\t\t$.each( arguments, function() {\r\n\t\t\t\tvar el = this.el;\r\n\t\t\t\t$.each( this.diff, function(key) {\r\n\t\t\t\t\tel.css( key, \"\" );\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\t// this is guarnteed to be there if you use jQuery.speed()\r\n\t\t\t// it also handles dequeuing the next anim...\r\n\t\t\to.complete.call( animated[ 0 ] );\r\n\t\t});\r\n\t});\r\n};\r\n\r\n$.fn.extend({\r\n\taddClass: (function( orig ) {\r\n\t\treturn function( classNames, speed, easing, callback ) {\r\n\t\t\treturn speed ?\r\n\t\t\t\t$.effects.animateClass.call( this,\r\n\t\t\t\t\t{ add: classNames }, speed, easing, callback ) :\r\n\t\t\t\torig.apply( this, arguments );\r\n\t\t};\r\n\t})( $.fn.addClass ),\r\n\r\n\tremoveClass: (function( orig ) {\r\n\t\treturn function( classNames, speed, easing, callback ) {\r\n\t\t\treturn arguments.length > 1 ?\r\n\t\t\t\t$.effects.animateClass.call( this,\r\n\t\t\t\t\t{ remove: classNames }, speed, easing, callback ) :\r\n\t\t\t\torig.apply( this, arguments );\r\n\t\t};\r\n\t})( $.fn.removeClass ),\r\n\r\n\ttoggleClass: (function( orig ) {\r\n\t\treturn function( classNames, force, speed, easing, callback ) {\r\n\t\t\tif ( typeof force === \"boolean\" || force === undefined ) {\r\n\t\t\t\tif ( !speed ) {\r\n\t\t\t\t\t// without speed parameter\r\n\t\t\t\t\treturn orig.apply( this, arguments );\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn $.effects.animateClass.call( this,\r\n\t\t\t\t\t\t(force ? { add: classNames } : { remove: classNames }),\r\n\t\t\t\t\t\tspeed, easing, callback );\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// without force parameter\r\n\t\t\t\treturn $.effects.animateClass.call( this,\r\n\t\t\t\t\t{ toggle: classNames }, force, speed, easing );\r\n\t\t\t}\r\n\t\t};\r\n\t})( $.fn.toggleClass ),\r\n\r\n\tswitchClass: function( remove, add, speed, easing, callback) {\r\n\t\treturn $.effects.animateClass.call( this, {\r\n\t\t\tadd: add,\r\n\t\t\tremove: remove\r\n\t\t}, speed, easing, callback );\r\n\t}\r\n});\r\n\r\n})();\r\n\r\n/******************************************************************************/\r\n/*********************************** EFFECTS **********************************/\r\n/******************************************************************************/\r\n\r\n(function() {\r\n\r\n$.extend( $.effects, {\r\n\tversion: \"1.11.4\",\r\n\r\n\t// Saves a set of properties in a data storage\r\n\tsave: function( element, set ) {\r\n\t\tfor ( var i = 0; i < set.length; i++ ) {\r\n\t\t\tif ( set[ i ] !== null ) {\r\n\t\t\t\telement.data( dataSpace + set[ i ], element[ 0 ].style[ set[ i ] ] );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t// Restores a set of previously saved properties from a data storage\r\n\trestore: function( element, set ) {\r\n\t\tvar val, i;\r\n\t\tfor ( i = 0; i < set.length; i++ ) {\r\n\t\t\tif ( set[ i ] !== null ) {\r\n\t\t\t\tval = element.data( dataSpace + set[ i ] );\r\n\t\t\t\t// support: jQuery 1.6.2\r\n\t\t\t\t// http://bugs.jquery.com/ticket/9917\r\n\t\t\t\t// jQuery 1.6.2 incorrectly returns undefined for any falsy value.\r\n\t\t\t\t// We can't differentiate between \"\" and 0 here, so we just assume\r\n\t\t\t\t// empty string since it's likely to be a more common value...\r\n\t\t\t\tif ( val === undefined ) {\r\n\t\t\t\t\tval = \"\";\r\n\t\t\t\t}\r\n\t\t\t\telement.css( set[ i ], val );\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tsetMode: function( el, mode ) {\r\n\t\tif (mode === \"toggle\") {\r\n\t\t\tmode = el.is( \":hidden\" ) ? \"show\" : \"hide\";\r\n\t\t}\r\n\t\treturn mode;\r\n\t},\r\n\r\n\t// Translates a [top,left] array into a baseline value\r\n\t// this should be a little more flexible in the future to handle a string & hash\r\n\tgetBaseline: function( origin, original ) {\r\n\t\tvar y, x;\r\n\t\tswitch ( origin[ 0 ] ) {\r\n\t\t\tcase \"top\": y = 0; break;\r\n\t\t\tcase \"middle\": y = 0.5; break;\r\n\t\t\tcase \"bottom\": y = 1; break;\r\n\t\t\tdefault: y = origin[ 0 ] / original.height;\r\n\t\t}\r\n\t\tswitch ( origin[ 1 ] ) {\r\n\t\t\tcase \"left\": x = 0; break;\r\n\t\t\tcase \"center\": x = 0.5; break;\r\n\t\t\tcase \"right\": x = 1; break;\r\n\t\t\tdefault: x = origin[ 1 ] / original.width;\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tx: x,\r\n\t\t\ty: y\r\n\t\t};\r\n\t},\r\n\r\n\t// Wraps the element around a wrapper that copies position properties\r\n\tcreateWrapper: function( element ) {\r\n\r\n\t\t// if the element is already wrapped, return it\r\n\t\tif ( element.parent().is( \".ui-effects-wrapper\" )) {\r\n\t\t\treturn element.parent();\r\n\t\t}\r\n\r\n\t\t// wrap the element\r\n\t\tvar props = {\r\n\t\t\t\twidth: element.outerWidth(true),\r\n\t\t\t\theight: element.outerHeight(true),\r\n\t\t\t\t\"float\": element.css( \"float\" )\r\n\t\t\t},\r\n\t\t\twrapper = $( \"<div></div>\" )\r\n\t\t\t\t.addClass( \"ui-effects-wrapper\" )\r\n\t\t\t\t.css({\r\n\t\t\t\t\tfontSize: \"100%\",\r\n\t\t\t\t\tbackground: \"transparent\",\r\n\t\t\t\t\tborder: \"none\",\r\n\t\t\t\t\tmargin: 0,\r\n\t\t\t\t\tpadding: 0\r\n\t\t\t\t}),\r\n\t\t\t// Store the size in case width/height are defined in % - Fixes #5245\r\n\t\t\tsize = {\r\n\t\t\t\twidth: element.width(),\r\n\t\t\t\theight: element.height()\r\n\t\t\t},\r\n\t\t\tactive = document.activeElement;\r\n\r\n\t\t// support: Firefox\r\n\t\t// Firefox incorrectly exposes anonymous content\r\n\t\t// https://bugzilla.mozilla.org/show_bug.cgi?id=561664\r\n\t\ttry {\r\n\t\t\tactive.id;\r\n\t\t} catch ( e ) {\r\n\t\t\tactive = document.body;\r\n\t\t}\r\n\r\n\t\telement.wrap( wrapper );\r\n\r\n\t\t// Fixes #7595 - Elements lose focus when wrapped.\r\n\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\r\n\t\t\t$( active ).focus();\r\n\t\t}\r\n\r\n\t\twrapper = element.parent(); //Hotfix for jQuery 1.4 since some change in wrap() seems to actually lose the reference to the wrapped element\r\n\r\n\t\t// transfer positioning properties to the wrapper\r\n\t\tif ( element.css( \"position\" ) === \"static\" ) {\r\n\t\t\twrapper.css({ position: \"relative\" });\r\n\t\t\telement.css({ position: \"relative\" });\r\n\t\t} else {\r\n\t\t\t$.extend( props, {\r\n\t\t\t\tposition: element.css( \"position\" ),\r\n\t\t\t\tzIndex: element.css( \"z-index\" )\r\n\t\t\t});\r\n\t\t\t$.each([ \"top\", \"left\", \"bottom\", \"right\" ], function(i, pos) {\r\n\t\t\t\tprops[ pos ] = element.css( pos );\r\n\t\t\t\tif ( isNaN( parseInt( props[ pos ], 10 ) ) ) {\r\n\t\t\t\t\tprops[ pos ] = \"auto\";\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\telement.css({\r\n\t\t\t\tposition: \"relative\",\r\n\t\t\t\ttop: 0,\r\n\t\t\t\tleft: 0,\r\n\t\t\t\tright: \"auto\",\r\n\t\t\t\tbottom: \"auto\"\r\n\t\t\t});\r\n\t\t}\r\n\t\telement.css(size);\r\n\r\n\t\treturn wrapper.css( props ).show();\r\n\t},\r\n\r\n\tremoveWrapper: function( element ) {\r\n\t\tvar active = document.activeElement;\r\n\r\n\t\tif ( element.parent().is( \".ui-effects-wrapper\" ) ) {\r\n\t\t\telement.parent().replaceWith( element );\r\n\r\n\t\t\t// Fixes #7595 - Elements lose focus when wrapped.\r\n\t\t\tif ( element[ 0 ] === active || $.contains( element[ 0 ], active ) ) {\r\n\t\t\t\t$( active ).focus();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn element;\r\n\t},\r\n\r\n\tsetTransition: function( element, list, factor, value ) {\r\n\t\tvalue = value || {};\r\n\t\t$.each( list, function( i, x ) {\r\n\t\t\tvar unit = element.cssUnit( x );\r\n\t\t\tif ( unit[ 0 ] > 0 ) {\r\n\t\t\t\tvalue[ x ] = unit[ 0 ] * factor + unit[ 1 ];\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn value;\r\n\t}\r\n});\r\n\r\n// return an effect options object for the given parameters:\r\nfunction _normalizeArguments( effect, options, speed, callback ) {\r\n\r\n\t// allow passing all options as the first parameter\r\n\tif ( $.isPlainObject( effect ) ) {\r\n\t\toptions = effect;\r\n\t\teffect = effect.effect;\r\n\t}\r\n\r\n\t// convert to an object\r\n\teffect = { effect: effect };\r\n\r\n\t// catch (effect, null, ...)\r\n\tif ( options == null ) {\r\n\t\toptions = {};\r\n\t}\r\n\r\n\t// catch (effect, callback)\r\n\tif ( $.isFunction( options ) ) {\r\n\t\tcallback = options;\r\n\t\tspeed = null;\r\n\t\toptions = {};\r\n\t}\r\n\r\n\t// catch (effect, speed, ?)\r\n\tif ( typeof options === \"number\" || $.fx.speeds[ options ] ) {\r\n\t\tcallback = speed;\r\n\t\tspeed = options;\r\n\t\toptions = {};\r\n\t}\r\n\r\n\t// catch (effect, options, callback)\r\n\tif ( $.isFunction( speed ) ) {\r\n\t\tcallback = speed;\r\n\t\tspeed = null;\r\n\t}\r\n\r\n\t// add options to effect\r\n\tif ( options ) {\r\n\t\t$.extend( effect, options );\r\n\t}\r\n\r\n\tspeed = speed || options.duration;\r\n\teffect.duration = $.fx.off ? 0 :\r\n\t\ttypeof speed === \"number\" ? speed :\r\n\t\tspeed in $.fx.speeds ? $.fx.speeds[ speed ] :\r\n\t\t$.fx.speeds._default;\r\n\r\n\teffect.complete = callback || options.complete;\r\n\r\n\treturn effect;\r\n}\r\n\r\nfunction standardAnimationOption( option ) {\r\n\t// Valid standard speeds (nothing, number, named speed)\r\n\tif ( !option || typeof option === \"number\" || $.fx.speeds[ option ] ) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// Invalid strings - treat as \"normal\" speed\r\n\tif ( typeof option === \"string\" && !$.effects.effect[ option ] ) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// Complete callback\r\n\tif ( $.isFunction( option ) ) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// Options hash (but not naming an effect)\r\n\tif ( typeof option === \"object\" && !option.effect ) {\r\n\t\treturn true;\r\n\t}\r\n\r\n\t// Didn't match any standard API\r\n\treturn false;\r\n}\r\n\r\n$.fn.extend({\r\n\teffect: function( /* effect, options, speed, callback */ ) {\r\n\t\tvar args = _normalizeArguments.apply( this, arguments ),\r\n\t\t\tmode = args.mode,\r\n\t\t\tqueue = args.queue,\r\n\t\t\teffectMethod = $.effects.effect[ args.effect ];\r\n\r\n\t\tif ( $.fx.off || !effectMethod ) {\r\n\t\t\t// delegate to the original method (e.g., .show()) if possible\r\n\t\t\tif ( mode ) {\r\n\t\t\t\treturn this[ mode ]( args.duration, args.complete );\r\n\t\t\t} else {\r\n\t\t\t\treturn this.each( function() {\r\n\t\t\t\t\tif ( args.complete ) {\r\n\t\t\t\t\t\targs.complete.call( this );\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction run( next ) {\r\n\t\t\tvar elem = $( this ),\r\n\t\t\t\tcomplete = args.complete,\r\n\t\t\t\tmode = args.mode;\r\n\r\n\t\t\tfunction done() {\r\n\t\t\t\tif ( $.isFunction( complete ) ) {\r\n\t\t\t\t\tcomplete.call( elem[0] );\r\n\t\t\t\t}\r\n\t\t\t\tif ( $.isFunction( next ) ) {\r\n\t\t\t\t\tnext();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// If the element already has the correct final state, delegate to\r\n\t\t\t// the core methods so the internal tracking of \"olddisplay\" works.\r\n\t\t\tif ( elem.is( \":hidden\" ) ? mode === \"hide\" : mode === \"show\" ) {\r\n\t\t\t\telem[ mode ]();\r\n\t\t\t\tdone();\r\n\t\t\t} else {\r\n\t\t\t\teffectMethod.call( elem[0], args, done );\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn queue === false ? this.each( run ) : this.queue( queue || \"fx\", run );\r\n\t},\r\n\r\n\tshow: (function( orig ) {\r\n\t\treturn function( option ) {\r\n\t\t\tif ( standardAnimationOption( option ) ) {\r\n\t\t\t\treturn orig.apply( this, arguments );\r\n\t\t\t} else {\r\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\r\n\t\t\t\targs.mode = \"show\";\r\n\t\t\t\treturn this.effect.call( this, args );\r\n\t\t\t}\r\n\t\t};\r\n\t})( $.fn.show ),\r\n\r\n\thide: (function( orig ) {\r\n\t\treturn function( option ) {\r\n\t\t\tif ( standardAnimationOption( option ) ) {\r\n\t\t\t\treturn orig.apply( this, arguments );\r\n\t\t\t} else {\r\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\r\n\t\t\t\targs.mode = \"hide\";\r\n\t\t\t\treturn this.effect.call( this, args );\r\n\t\t\t}\r\n\t\t};\r\n\t})( $.fn.hide ),\r\n\r\n\ttoggle: (function( orig ) {\r\n\t\treturn function( option ) {\r\n\t\t\tif ( standardAnimationOption( option ) || typeof option === \"boolean\" ) {\r\n\t\t\t\treturn orig.apply( this, arguments );\r\n\t\t\t} else {\r\n\t\t\t\tvar args = _normalizeArguments.apply( this, arguments );\r\n\t\t\t\targs.mode = \"toggle\";\r\n\t\t\t\treturn this.effect.call( this, args );\r\n\t\t\t}\r\n\t\t};\r\n\t})( $.fn.toggle ),\r\n\r\n\t// helper functions\r\n\tcssUnit: function(key) {\r\n\t\tvar style = this.css( key ),\r\n\t\t\tval = [];\r\n\r\n\t\t$.each( [ \"em\", \"px\", \"%\", \"pt\" ], function( i, unit ) {\r\n\t\t\tif ( style.indexOf( unit ) > 0 ) {\r\n\t\t\t\tval = [ parseFloat( style ), unit ];\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn val;\r\n\t}\r\n});\r\n\r\n})();\r\n\r\n/******************************************************************************/\r\n/*********************************** EASING ***********************************/\r\n/******************************************************************************/\r\n\r\n(function() {\r\n\r\n// based on easing equations from Robert Penner (http://www.robertpenner.com/easing)\r\n\r\nvar baseEasings = {};\r\n\r\n$.each( [ \"Quad\", \"Cubic\", \"Quart\", \"Quint\", \"Expo\" ], function( i, name ) {\r\n\tbaseEasings[ name ] = function( p ) {\r\n\t\treturn Math.pow( p, i + 2 );\r\n\t};\r\n});\r\n\r\n$.extend( baseEasings, {\r\n\tSine: function( p ) {\r\n\t\treturn 1 - Math.cos( p * Math.PI / 2 );\r\n\t},\r\n\tCirc: function( p ) {\r\n\t\treturn 1 - Math.sqrt( 1 - p * p );\r\n\t},\r\n\tElastic: function( p ) {\r\n\t\treturn p === 0 || p === 1 ? p :\r\n\t\t\t-Math.pow( 2, 8 * (p - 1) ) * Math.sin( ( (p - 1) * 80 - 7.5 ) * Math.PI / 15 );\r\n\t},\r\n\tBack: function( p ) {\r\n\t\treturn p * p * ( 3 * p - 2 );\r\n\t},\r\n\tBounce: function( p ) {\r\n\t\tvar pow2,\r\n\t\t\tbounce = 4;\r\n\r\n\t\twhile ( p < ( ( pow2 = Math.pow( 2, --bounce ) ) - 1 ) / 11 ) {}\r\n\t\treturn 1 / Math.pow( 4, 3 - bounce ) - 7.5625 * Math.pow( ( pow2 * 3 - 2 ) / 22 - p, 2 );\r\n\t}\r\n});\r\n\r\n$.each( baseEasings, function( name, easeIn ) {\r\n\t$.easing[ \"easeIn\" + name ] = easeIn;\r\n\t$.easing[ \"easeOut\" + name ] = function( p ) {\r\n\t\treturn 1 - easeIn( 1 - p );\r\n\t};\r\n\t$.easing[ \"easeInOut\" + name ] = function( p ) {\r\n\t\treturn p < 0.5 ?\r\n\t\t\teaseIn( p * 2 ) / 2 :\r\n\t\t\t1 - easeIn( p * -2 + 2 ) / 2;\r\n\t};\r\n});\r\n\r\n})();\r\n\r\nvar effect = $.effects;\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Blind 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/blind-effect/\r\n */\r\n\r\n\r\nvar effectBlind = $.effects.effect.blind = function( o, done ) {\r\n\t// Create element\r\n\tvar el = $( this ),\r\n\t\trvertical = /up|down|vertical/,\r\n\t\trpositivemotion = /up|left|vertical|horizontal/,\r\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\r\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\r\n\t\tdirection = o.direction || \"up\",\r\n\t\tvertical = rvertical.test( direction ),\r\n\t\tref = vertical ? \"height\" : \"width\",\r\n\t\tref2 = vertical ? \"top\" : \"left\",\r\n\t\tmotion = rpositivemotion.test( direction ),\r\n\t\tanimation = {},\r\n\t\tshow = mode === \"show\",\r\n\t\twrapper, distance, margin;\r\n\r\n\t// if already wrapped, the wrapper's properties are my property. #6245\r\n\tif ( el.parent().is( \".ui-effects-wrapper\" ) ) {\r\n\t\t$.effects.save( el.parent(), props );\r\n\t} else {\r\n\t\t$.effects.save( el, props );\r\n\t}\r\n\tel.show();\r\n\twrapper = $.effects.createWrapper( el ).css({\r\n\t\toverflow: \"hidden\"\r\n\t});\r\n\r\n\tdistance = wrapper[ ref ]();\r\n\tmargin = parseFloat( wrapper.css( ref2 ) ) || 0;\r\n\r\n\tanimation[ ref ] = show ? distance : 0;\r\n\tif ( !motion ) {\r\n\t\tel\r\n\t\t\t.css( vertical ? \"bottom\" : \"right\", 0 )\r\n\t\t\t.css( vertical ? \"top\" : \"left\", \"auto\" )\r\n\t\t\t.css({ position: \"absolute\" });\r\n\r\n\t\tanimation[ ref2 ] = show ? margin : distance + margin;\r\n\t}\r\n\r\n\t// start at 0 if we are showing\r\n\tif ( show ) {\r\n\t\twrapper.css( ref, 0 );\r\n\t\tif ( !motion ) {\r\n\t\t\twrapper.css( ref2, margin + distance );\r\n\t\t}\r\n\t}\r\n\r\n\t// Animate\r\n\twrapper.animate( animation, {\r\n\t\tduration: o.duration,\r\n\t\teasing: o.easing,\r\n\t\tqueue: false,\r\n\t\tcomplete: function() {\r\n\t\t\tif ( mode === \"hide\" ) {\r\n\t\t\t\tel.hide();\r\n\t\t\t}\r\n\t\t\t$.effects.restore( el, props );\r\n\t\t\t$.effects.removeWrapper( el );\r\n\t\t\tdone();\r\n\t\t}\r\n\t});\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Bounce 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/bounce-effect/\r\n */\r\n\r\n\r\nvar effectBounce = $.effects.effect.bounce = function( o, done ) {\r\n\tvar el = $( this ),\r\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\r\n\r\n\t\t// defaults:\r\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\r\n\t\thide = mode === \"hide\",\r\n\t\tshow = mode === \"show\",\r\n\t\tdirection = o.direction || \"up\",\r\n\t\tdistance = o.distance,\r\n\t\ttimes = o.times || 5,\r\n\r\n\t\t// number of internal animations\r\n\t\tanims = times * 2 + ( show || hide ? 1 : 0 ),\r\n\t\tspeed = o.duration / anims,\r\n\t\teasing = o.easing,\r\n\r\n\t\t// utility:\r\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\r\n\t\tmotion = ( direction === \"up\" || direction === \"left\" ),\r\n\t\ti,\r\n\t\tupAnim,\r\n\t\tdownAnim,\r\n\r\n\t\t// we will need to re-assemble the queue to stack our animations in place\r\n\t\tqueue = el.queue(),\r\n\t\tqueuelen = queue.length;\r\n\r\n\t// Avoid touching opacity to prevent clearType and PNG issues in IE\r\n\tif ( show || hide ) {\r\n\t\tprops.push( \"opacity\" );\r\n\t}\r\n\r\n\t$.effects.save( el, props );\r\n\tel.show();\r\n\t$.effects.createWrapper( el ); // Create Wrapper\r\n\r\n\t// default distance for the BIGGEST bounce is the outer Distance / 3\r\n\tif ( !distance ) {\r\n\t\tdistance = el[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]() / 3;\r\n\t}\r\n\r\n\tif ( show ) {\r\n\t\tdownAnim = { opacity: 1 };\r\n\t\tdownAnim[ ref ] = 0;\r\n\r\n\t\t// if we are showing, force opacity 0 and set the initial position\r\n\t\t// then do the \"first\" animation\r\n\t\tel.css( \"opacity\", 0 )\r\n\t\t\t.css( ref, motion ? -distance * 2 : distance * 2 )\r\n\t\t\t.animate( downAnim, speed, easing );\r\n\t}\r\n\r\n\t// start at the smallest distance if we are hiding\r\n\tif ( hide ) {\r\n\t\tdistance = distance / Math.pow( 2, times - 1 );\r\n\t}\r\n\r\n\tdownAnim = {};\r\n\tdownAnim[ ref ] = 0;\r\n\t// Bounces up/down/left/right then back to 0 -- times * 2 animations happen here\r\n\tfor ( i = 0; i < times; i++ ) {\r\n\t\tupAnim = {};\r\n\t\tupAnim[ ref ] = ( motion ? \"-=\" : \"+=\" ) + distance;\r\n\r\n\t\tel.animate( upAnim, speed, easing )\r\n\t\t\t.animate( downAnim, speed, easing );\r\n\r\n\t\tdistance = hide ? distance * 2 : distance / 2;\r\n\t}\r\n\r\n\t// Last Bounce when Hiding\r\n\tif ( hide ) {\r\n\t\tupAnim = { opacity: 0 };\r\n\t\tupAnim[ ref ] = ( motion ? \"-=\" : \"+=\" ) + distance;\r\n\r\n\t\tel.animate( upAnim, speed, easing );\r\n\t}\r\n\r\n\tel.queue(function() {\r\n\t\tif ( hide ) {\r\n\t\t\tel.hide();\r\n\t\t}\r\n\t\t$.effects.restore( el, props );\r\n\t\t$.effects.removeWrapper( el );\r\n\t\tdone();\r\n\t});\r\n\r\n\t// inject all the animations we just queued to be first in line (after \"inprogress\")\r\n\tif ( queuelen > 1) {\r\n\t\tqueue.splice.apply( queue,\r\n\t\t\t[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );\r\n\t}\r\n\tel.dequeue();\r\n\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Clip 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/clip-effect/\r\n */\r\n\r\n\r\nvar effectClip = $.effects.effect.clip = function( o, done ) {\r\n\t// Create element\r\n\tvar el = $( this ),\r\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\r\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\r\n\t\tshow = mode === \"show\",\r\n\t\tdirection = o.direction || \"vertical\",\r\n\t\tvert = direction === \"vertical\",\r\n\t\tsize = vert ? \"height\" : \"width\",\r\n\t\tposition = vert ? \"top\" : \"left\",\r\n\t\tanimation = {},\r\n\t\twrapper, animate, distance;\r\n\r\n\t// Save & Show\r\n\t$.effects.save( el, props );\r\n\tel.show();\r\n\r\n\t// Create Wrapper\r\n\twrapper = $.effects.createWrapper( el ).css({\r\n\t\toverflow: \"hidden\"\r\n\t});\r\n\tanimate = ( el[0].tagName === \"IMG\" ) ? wrapper : el;\r\n\tdistance = animate[ size ]();\r\n\r\n\t// Shift\r\n\tif ( show ) {\r\n\t\tanimate.css( size, 0 );\r\n\t\tanimate.css( position, distance / 2 );\r\n\t}\r\n\r\n\t// Create Animation Object:\r\n\tanimation[ size ] = show ? distance : 0;\r\n\tanimation[ position ] = show ? 0 : distance / 2;\r\n\r\n\t// Animate\r\n\tanimate.animate( animation, {\r\n\t\tqueue: false,\r\n\t\tduration: o.duration,\r\n\t\teasing: o.easing,\r\n\t\tcomplete: function() {\r\n\t\t\tif ( !show ) {\r\n\t\t\t\tel.hide();\r\n\t\t\t}\r\n\t\t\t$.effects.restore( el, props );\r\n\t\t\t$.effects.removeWrapper( el );\r\n\t\t\tdone();\r\n\t\t}\r\n\t});\r\n\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Drop 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/drop-effect/\r\n */\r\n\r\n\r\nvar effectDrop = $.effects.effect.drop = function( o, done ) {\r\n\r\n\tvar el = $( this ),\r\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"opacity\", \"height\", \"width\" ],\r\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\r\n\t\tshow = mode === \"show\",\r\n\t\tdirection = o.direction || \"left\",\r\n\t\tref = ( direction === \"up\" || direction === \"down\" ) ? \"top\" : \"left\",\r\n\t\tmotion = ( direction === \"up\" || direction === \"left\" ) ? \"pos\" : \"neg\",\r\n\t\tanimation = {\r\n\t\t\topacity: show ? 1 : 0\r\n\t\t},\r\n\t\tdistance;\r\n\r\n\t// Adjust\r\n\t$.effects.save( el, props );\r\n\tel.show();\r\n\t$.effects.createWrapper( el );\r\n\r\n\tdistance = o.distance || el[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]( true ) / 2;\r\n\r\n\tif ( show ) {\r\n\t\tel\r\n\t\t\t.css( \"opacity\", 0 )\r\n\t\t\t.css( ref, motion === \"pos\" ? -distance : distance );\r\n\t}\r\n\r\n\t// Animation\r\n\tanimation[ ref ] = ( show ?\r\n\t\t( motion === \"pos\" ? \"+=\" : \"-=\" ) :\r\n\t\t( motion === \"pos\" ? \"-=\" : \"+=\" ) ) +\r\n\t\tdistance;\r\n\r\n\t// Animate\r\n\tel.animate( animation, {\r\n\t\tqueue: false,\r\n\t\tduration: o.duration,\r\n\t\teasing: o.easing,\r\n\t\tcomplete: function() {\r\n\t\t\tif ( mode === \"hide\" ) {\r\n\t\t\t\tel.hide();\r\n\t\t\t}\r\n\t\t\t$.effects.restore( el, props );\r\n\t\t\t$.effects.removeWrapper( el );\r\n\t\t\tdone();\r\n\t\t}\r\n\t});\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Explode 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/explode-effect/\r\n */\r\n\r\n\r\nvar effectExplode = $.effects.effect.explode = function( o, done ) {\r\n\r\n\tvar rows = o.pieces ? Math.round( Math.sqrt( o.pieces ) ) : 3,\r\n\t\tcells = rows,\r\n\t\tel = $( this ),\r\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\r\n\t\tshow = mode === \"show\",\r\n\r\n\t\t// show and then visibility:hidden the element before calculating offset\r\n\t\toffset = el.show().css( \"visibility\", \"hidden\" ).offset(),\r\n\r\n\t\t// width and height of a piece\r\n\t\twidth = Math.ceil( el.outerWidth() / cells ),\r\n\t\theight = Math.ceil( el.outerHeight() / rows ),\r\n\t\tpieces = [],\r\n\r\n\t\t// loop\r\n\t\ti, j, left, top, mx, my;\r\n\r\n\t// children animate complete:\r\n\tfunction childComplete() {\r\n\t\tpieces.push( this );\r\n\t\tif ( pieces.length === rows * cells ) {\r\n\t\t\tanimComplete();\r\n\t\t}\r\n\t}\r\n\r\n\t// clone the element for each row and cell.\r\n\tfor ( i = 0; i < rows ; i++ ) { // ===>\r\n\t\ttop = offset.top + i * height;\r\n\t\tmy = i - ( rows - 1 ) / 2 ;\r\n\r\n\t\tfor ( j = 0; j < cells ; j++ ) { // |||\r\n\t\t\tleft = offset.left + j * width;\r\n\t\t\tmx = j - ( cells - 1 ) / 2 ;\r\n\r\n\t\t\t// Create a clone of the now hidden main element that will be absolute positioned\r\n\t\t\t// within a wrapper div off the -left and -top equal to size of our pieces\r\n\t\t\tel\r\n\t\t\t\t.clone()\r\n\t\t\t\t.appendTo( \"body\" )\r\n\t\t\t\t.wrap( \"<div></div>\" )\r\n\t\t\t\t.css({\r\n\t\t\t\t\tposition: \"absolute\",\r\n\t\t\t\t\tvisibility: \"visible\",\r\n\t\t\t\t\tleft: -j * width,\r\n\t\t\t\t\ttop: -i * height\r\n\t\t\t\t})\r\n\r\n\t\t\t// select the wrapper - make it overflow: hidden and absolute positioned based on\r\n\t\t\t// where the original was located +left and +top equal to the size of pieces\r\n\t\t\t\t.parent()\r\n\t\t\t\t.addClass( \"ui-effects-explode\" )\r\n\t\t\t\t.css({\r\n\t\t\t\t\tposition: \"absolute\",\r\n\t\t\t\t\toverflow: \"hidden\",\r\n\t\t\t\t\twidth: width,\r\n\t\t\t\t\theight: height,\r\n\t\t\t\t\tleft: left + ( show ? mx * width : 0 ),\r\n\t\t\t\t\ttop: top + ( show ? my * height : 0 ),\r\n\t\t\t\t\topacity: show ? 0 : 1\r\n\t\t\t\t}).animate({\r\n\t\t\t\t\tleft: left + ( show ? 0 : mx * width ),\r\n\t\t\t\t\ttop: top + ( show ? 0 : my * height ),\r\n\t\t\t\t\topacity: show ? 1 : 0\r\n\t\t\t\t}, o.duration || 500, o.easing, childComplete );\r\n\t\t}\r\n\t}\r\n\r\n\tfunction animComplete() {\r\n\t\tel.css({\r\n\t\t\tvisibility: \"visible\"\r\n\t\t});\r\n\t\t$( pieces ).remove();\r\n\t\tif ( !show ) {\r\n\t\t\tel.hide();\r\n\t\t}\r\n\t\tdone();\r\n\t}\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Fade 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/fade-effect/\r\n */\r\n\r\n\r\nvar effectFade = $.effects.effect.fade = function( o, done ) {\r\n\tvar el = $( this ),\r\n\t\tmode = $.effects.setMode( el, o.mode || \"toggle\" );\r\n\r\n\tel.animate({\r\n\t\topacity: mode\r\n\t}, {\r\n\t\tqueue: false,\r\n\t\tduration: o.duration,\r\n\t\teasing: o.easing,\r\n\t\tcomplete: done\r\n\t});\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Fold 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/fold-effect/\r\n */\r\n\r\n\r\nvar effectFold = $.effects.effect.fold = function( o, done ) {\r\n\r\n\t// Create element\r\n\tvar el = $( this ),\r\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\r\n\t\tmode = $.effects.setMode( el, o.mode || \"hide\" ),\r\n\t\tshow = mode === \"show\",\r\n\t\thide = mode === \"hide\",\r\n\t\tsize = o.size || 15,\r\n\t\tpercent = /([0-9]+)%/.exec( size ),\r\n\t\thorizFirst = !!o.horizFirst,\r\n\t\twidthFirst = show !== horizFirst,\r\n\t\tref = widthFirst ? [ \"width\", \"height\" ] : [ \"height\", \"width\" ],\r\n\t\tduration = o.duration / 2,\r\n\t\twrapper, distance,\r\n\t\tanimation1 = {},\r\n\t\tanimation2 = {};\r\n\r\n\t$.effects.save( el, props );\r\n\tel.show();\r\n\r\n\t// Create Wrapper\r\n\twrapper = $.effects.createWrapper( el ).css({\r\n\t\toverflow: \"hidden\"\r\n\t});\r\n\tdistance = widthFirst ?\r\n\t\t[ wrapper.width(), wrapper.height() ] :\r\n\t\t[ wrapper.height(), wrapper.width() ];\r\n\r\n\tif ( percent ) {\r\n\t\tsize = parseInt( percent[ 1 ], 10 ) / 100 * distance[ hide ? 0 : 1 ];\r\n\t}\r\n\tif ( show ) {\r\n\t\twrapper.css( horizFirst ? {\r\n\t\t\theight: 0,\r\n\t\t\twidth: size\r\n\t\t} : {\r\n\t\t\theight: size,\r\n\t\t\twidth: 0\r\n\t\t});\r\n\t}\r\n\r\n\t// Animation\r\n\tanimation1[ ref[ 0 ] ] = show ? distance[ 0 ] : size;\r\n\tanimation2[ ref[ 1 ] ] = show ? distance[ 1 ] : 0;\r\n\r\n\t// Animate\r\n\twrapper\r\n\t\t.animate( animation1, duration, o.easing )\r\n\t\t.animate( animation2, duration, o.easing, function() {\r\n\t\t\tif ( hide ) {\r\n\t\t\t\tel.hide();\r\n\t\t\t}\r\n\t\t\t$.effects.restore( el, props );\r\n\t\t\t$.effects.removeWrapper( el );\r\n\t\t\tdone();\r\n\t\t});\r\n\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Highlight 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/highlight-effect/\r\n */\r\n\r\n\r\nvar effectHighlight = $.effects.effect.highlight = function( o, done ) {\r\n\tvar elem = $( this ),\r\n\t\tprops = [ \"backgroundImage\", \"backgroundColor\", \"opacity\" ],\r\n\t\tmode = $.effects.setMode( elem, o.mode || \"show\" ),\r\n\t\tanimation = {\r\n\t\t\tbackgroundColor: elem.css( \"backgroundColor\" )\r\n\t\t};\r\n\r\n\tif (mode === \"hide\") {\r\n\t\tanimation.opacity = 0;\r\n\t}\r\n\r\n\t$.effects.save( elem, props );\r\n\r\n\telem\r\n\t\t.show()\r\n\t\t.css({\r\n\t\t\tbackgroundImage: \"none\",\r\n\t\t\tbackgroundColor: o.color || \"#ffff99\"\r\n\t\t})\r\n\t\t.animate( animation, {\r\n\t\t\tqueue: false,\r\n\t\t\tduration: o.duration,\r\n\t\t\teasing: o.easing,\r\n\t\t\tcomplete: function() {\r\n\t\t\t\tif ( mode === \"hide\" ) {\r\n\t\t\t\t\telem.hide();\r\n\t\t\t\t}\r\n\t\t\t\t$.effects.restore( elem, props );\r\n\t\t\t\tdone();\r\n\t\t\t}\r\n\t\t});\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Size 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/size-effect/\r\n */\r\n\r\n\r\nvar effectSize = $.effects.effect.size = function( o, done ) {\r\n\r\n\t// Create element\r\n\tvar original, baseline, factor,\r\n\t\tel = $( this ),\r\n\t\tprops0 = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"width\", \"height\", \"overflow\", \"opacity\" ],\r\n\r\n\t\t// Always restore\r\n\t\tprops1 = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"overflow\", \"opacity\" ],\r\n\r\n\t\t// Copy for children\r\n\t\tprops2 = [ \"width\", \"height\", \"overflow\" ],\r\n\t\tcProps = [ \"fontSize\" ],\r\n\t\tvProps = [ \"borderTopWidth\", \"borderBottomWidth\", \"paddingTop\", \"paddingBottom\" ],\r\n\t\thProps = [ \"borderLeftWidth\", \"borderRightWidth\", \"paddingLeft\", \"paddingRight\" ],\r\n\r\n\t\t// Set options\r\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\r\n\t\trestore = o.restore || mode !== \"effect\",\r\n\t\tscale = o.scale || \"both\",\r\n\t\torigin = o.origin || [ \"middle\", \"center\" ],\r\n\t\tposition = el.css( \"position\" ),\r\n\t\tprops = restore ? props0 : props1,\r\n\t\tzero = {\r\n\t\t\theight: 0,\r\n\t\t\twidth: 0,\r\n\t\t\touterHeight: 0,\r\n\t\t\touterWidth: 0\r\n\t\t};\r\n\r\n\tif ( mode === \"show\" ) {\r\n\t\tel.show();\r\n\t}\r\n\toriginal = {\r\n\t\theight: el.height(),\r\n\t\twidth: el.width(),\r\n\t\touterHeight: el.outerHeight(),\r\n\t\touterWidth: el.outerWidth()\r\n\t};\r\n\r\n\tif ( o.mode === \"toggle\" && mode === \"show\" ) {\r\n\t\tel.from = o.to || zero;\r\n\t\tel.to = o.from || original;\r\n\t} else {\r\n\t\tel.from = o.from || ( mode === \"show\" ? zero : original );\r\n\t\tel.to = o.to || ( mode === \"hide\" ? zero : original );\r\n\t}\r\n\r\n\t// Set scaling factor\r\n\tfactor = {\r\n\t\tfrom: {\r\n\t\t\ty: el.from.height / original.height,\r\n\t\t\tx: el.from.width / original.width\r\n\t\t},\r\n\t\tto: {\r\n\t\t\ty: el.to.height / original.height,\r\n\t\t\tx: el.to.width / original.width\r\n\t\t}\r\n\t};\r\n\r\n\t// Scale the css box\r\n\tif ( scale === \"box\" || scale === \"both\" ) {\r\n\r\n\t\t// Vertical props scaling\r\n\t\tif ( factor.from.y !== factor.to.y ) {\r\n\t\t\tprops = props.concat( vProps );\r\n\t\t\tel.from = $.effects.setTransition( el, vProps, factor.from.y, el.from );\r\n\t\t\tel.to = $.effects.setTransition( el, vProps, factor.to.y, el.to );\r\n\t\t}\r\n\r\n\t\t// Horizontal props scaling\r\n\t\tif ( factor.from.x !== factor.to.x ) {\r\n\t\t\tprops = props.concat( hProps );\r\n\t\t\tel.from = $.effects.setTransition( el, hProps, factor.from.x, el.from );\r\n\t\t\tel.to = $.effects.setTransition( el, hProps, factor.to.x, el.to );\r\n\t\t}\r\n\t}\r\n\r\n\t// Scale the content\r\n\tif ( scale === \"content\" || scale === \"both\" ) {\r\n\r\n\t\t// Vertical props scaling\r\n\t\tif ( factor.from.y !== factor.to.y ) {\r\n\t\t\tprops = props.concat( cProps ).concat( props2 );\r\n\t\t\tel.from = $.effects.setTransition( el, cProps, factor.from.y, el.from );\r\n\t\t\tel.to = $.effects.setTransition( el, cProps, factor.to.y, el.to );\r\n\t\t}\r\n\t}\r\n\r\n\t$.effects.save( el, props );\r\n\tel.show();\r\n\t$.effects.createWrapper( el );\r\n\tel.css( \"overflow\", \"hidden\" ).css( el.from );\r\n\r\n\t// Adjust\r\n\tif (origin) { // Calculate baseline shifts\r\n\t\tbaseline = $.effects.getBaseline( origin, original );\r\n\t\tel.from.top = ( original.outerHeight - el.outerHeight() ) * baseline.y;\r\n\t\tel.from.left = ( original.outerWidth - el.outerWidth() ) * baseline.x;\r\n\t\tel.to.top = ( original.outerHeight - el.to.outerHeight ) * baseline.y;\r\n\t\tel.to.left = ( original.outerWidth - el.to.outerWidth ) * baseline.x;\r\n\t}\r\n\tel.css( el.from ); // set top & left\r\n\r\n\t// Animate\r\n\tif ( scale === \"content\" || scale === \"both\" ) { // Scale the children\r\n\r\n\t\t// Add margins/font-size\r\n\t\tvProps = vProps.concat([ \"marginTop\", \"marginBottom\" ]).concat(cProps);\r\n\t\thProps = hProps.concat([ \"marginLeft\", \"marginRight\" ]);\r\n\t\tprops2 = props0.concat(vProps).concat(hProps);\r\n\r\n\t\tel.find( \"*[width]\" ).each( function() {\r\n\t\t\tvar child = $( this ),\r\n\t\t\t\tc_original = {\r\n\t\t\t\t\theight: child.height(),\r\n\t\t\t\t\twidth: child.width(),\r\n\t\t\t\t\touterHeight: child.outerHeight(),\r\n\t\t\t\t\touterWidth: child.outerWidth()\r\n\t\t\t\t};\r\n\t\t\tif (restore) {\r\n\t\t\t\t$.effects.save(child, props2);\r\n\t\t\t}\r\n\r\n\t\t\tchild.from = {\r\n\t\t\t\theight: c_original.height * factor.from.y,\r\n\t\t\t\twidth: c_original.width * factor.from.x,\r\n\t\t\t\touterHeight: c_original.outerHeight * factor.from.y,\r\n\t\t\t\touterWidth: c_original.outerWidth * factor.from.x\r\n\t\t\t};\r\n\t\t\tchild.to = {\r\n\t\t\t\theight: c_original.height * factor.to.y,\r\n\t\t\t\twidth: c_original.width * factor.to.x,\r\n\t\t\t\touterHeight: c_original.height * factor.to.y,\r\n\t\t\t\touterWidth: c_original.width * factor.to.x\r\n\t\t\t};\r\n\r\n\t\t\t// Vertical props scaling\r\n\t\t\tif ( factor.from.y !== factor.to.y ) {\r\n\t\t\t\tchild.from = $.effects.setTransition( child, vProps, factor.from.y, child.from );\r\n\t\t\t\tchild.to = $.effects.setTransition( child, vProps, factor.to.y, child.to );\r\n\t\t\t}\r\n\r\n\t\t\t// Horizontal props scaling\r\n\t\t\tif ( factor.from.x !== factor.to.x ) {\r\n\t\t\t\tchild.from = $.effects.setTransition( child, hProps, factor.from.x, child.from );\r\n\t\t\t\tchild.to = $.effects.setTransition( child, hProps, factor.to.x, child.to );\r\n\t\t\t}\r\n\r\n\t\t\t// Animate children\r\n\t\t\tchild.css( child.from );\r\n\t\t\tchild.animate( child.to, o.duration, o.easing, function() {\r\n\r\n\t\t\t\t// Restore children\r\n\t\t\t\tif ( restore ) {\r\n\t\t\t\t\t$.effects.restore( child, props2 );\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\t// Animate\r\n\tel.animate( el.to, {\r\n\t\tqueue: false,\r\n\t\tduration: o.duration,\r\n\t\teasing: o.easing,\r\n\t\tcomplete: function() {\r\n\t\t\tif ( el.to.opacity === 0 ) {\r\n\t\t\t\tel.css( \"opacity\", el.from.opacity );\r\n\t\t\t}\r\n\t\t\tif ( mode === \"hide\" ) {\r\n\t\t\t\tel.hide();\r\n\t\t\t}\r\n\t\t\t$.effects.restore( el, props );\r\n\t\t\tif ( !restore ) {\r\n\r\n\t\t\t\t// we need to calculate our new positioning based on the scaling\r\n\t\t\t\tif ( position === \"static\" ) {\r\n\t\t\t\t\tel.css({\r\n\t\t\t\t\t\tposition: \"relative\",\r\n\t\t\t\t\t\ttop: el.to.top,\r\n\t\t\t\t\t\tleft: el.to.left\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$.each([ \"top\", \"left\" ], function( idx, pos ) {\r\n\t\t\t\t\t\tel.css( pos, function( _, str ) {\r\n\t\t\t\t\t\t\tvar val = parseInt( str, 10 ),\r\n\t\t\t\t\t\t\t\ttoRef = idx ? el.to.left : el.to.top;\r\n\r\n\t\t\t\t\t\t\t// if original was \"auto\", recalculate the new value from wrapper\r\n\t\t\t\t\t\t\tif ( str === \"auto\" ) {\r\n\t\t\t\t\t\t\t\treturn toRef + \"px\";\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\treturn val + toRef + \"px\";\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t$.effects.removeWrapper( el );\r\n\t\t\tdone();\r\n\t\t}\r\n\t});\r\n\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Scale 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/scale-effect/\r\n */\r\n\r\n\r\nvar effectScale = $.effects.effect.scale = function( o, done ) {\r\n\r\n\t// Create element\r\n\tvar el = $( this ),\r\n\t\toptions = $.extend( true, {}, o ),\r\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\r\n\t\tpercent = parseInt( o.percent, 10 ) ||\r\n\t\t\t( parseInt( o.percent, 10 ) === 0 ? 0 : ( mode === \"hide\" ? 0 : 100 ) ),\r\n\t\tdirection = o.direction || \"both\",\r\n\t\torigin = o.origin,\r\n\t\toriginal = {\r\n\t\t\theight: el.height(),\r\n\t\t\twidth: el.width(),\r\n\t\t\touterHeight: el.outerHeight(),\r\n\t\t\touterWidth: el.outerWidth()\r\n\t\t},\r\n\t\tfactor = {\r\n\t\t\ty: direction !== \"horizontal\" ? (percent / 100) : 1,\r\n\t\t\tx: direction !== \"vertical\" ? (percent / 100) : 1\r\n\t\t};\r\n\r\n\t// We are going to pass this effect to the size effect:\r\n\toptions.effect = \"size\";\r\n\toptions.queue = false;\r\n\toptions.complete = done;\r\n\r\n\t// Set default origin and restore for show/hide\r\n\tif ( mode !== \"effect\" ) {\r\n\t\toptions.origin = origin || [ \"middle\", \"center\" ];\r\n\t\toptions.restore = true;\r\n\t}\r\n\r\n\toptions.from = o.from || ( mode === \"show\" ? {\r\n\t\theight: 0,\r\n\t\twidth: 0,\r\n\t\touterHeight: 0,\r\n\t\touterWidth: 0\r\n\t} : original );\r\n\toptions.to = {\r\n\t\theight: original.height * factor.y,\r\n\t\twidth: original.width * factor.x,\r\n\t\touterHeight: original.outerHeight * factor.y,\r\n\t\touterWidth: original.outerWidth * factor.x\r\n\t};\r\n\r\n\t// Fade option to support puff\r\n\tif ( options.fade ) {\r\n\t\tif ( mode === \"show\" ) {\r\n\t\t\toptions.from.opacity = 0;\r\n\t\t\toptions.to.opacity = 1;\r\n\t\t}\r\n\t\tif ( mode === \"hide\" ) {\r\n\t\t\toptions.from.opacity = 1;\r\n\t\t\toptions.to.opacity = 0;\r\n\t\t}\r\n\t}\r\n\r\n\t// Animate\r\n\tel.effect( options );\r\n\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Puff 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/puff-effect/\r\n */\r\n\r\n\r\nvar effectPuff = $.effects.effect.puff = function( o, done ) {\r\n\tvar elem = $( this ),\r\n\t\tmode = $.effects.setMode( elem, o.mode || \"hide\" ),\r\n\t\thide = mode === \"hide\",\r\n\t\tpercent = parseInt( o.percent, 10 ) || 150,\r\n\t\tfactor = percent / 100,\r\n\t\toriginal = {\r\n\t\t\theight: elem.height(),\r\n\t\t\twidth: elem.width(),\r\n\t\t\touterHeight: elem.outerHeight(),\r\n\t\t\touterWidth: elem.outerWidth()\r\n\t\t};\r\n\r\n\t$.extend( o, {\r\n\t\teffect: \"scale\",\r\n\t\tqueue: false,\r\n\t\tfade: true,\r\n\t\tmode: mode,\r\n\t\tcomplete: done,\r\n\t\tpercent: hide ? percent : 100,\r\n\t\tfrom: hide ?\r\n\t\t\toriginal :\r\n\t\t\t{\r\n\t\t\t\theight: original.height * factor,\r\n\t\t\t\twidth: original.width * factor,\r\n\t\t\t\touterHeight: original.outerHeight * factor,\r\n\t\t\t\touterWidth: original.outerWidth * factor\r\n\t\t\t}\r\n\t});\r\n\r\n\telem.effect( o );\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Pulsate 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/pulsate-effect/\r\n */\r\n\r\n\r\nvar effectPulsate = $.effects.effect.pulsate = function( o, done ) {\r\n\tvar elem = $( this ),\r\n\t\tmode = $.effects.setMode( elem, o.mode || \"show\" ),\r\n\t\tshow = mode === \"show\",\r\n\t\thide = mode === \"hide\",\r\n\t\tshowhide = ( show || mode === \"hide\" ),\r\n\r\n\t\t// showing or hiding leaves of the \"last\" animation\r\n\t\tanims = ( ( o.times || 5 ) * 2 ) + ( showhide ? 1 : 0 ),\r\n\t\tduration = o.duration / anims,\r\n\t\tanimateTo = 0,\r\n\t\tqueue = elem.queue(),\r\n\t\tqueuelen = queue.length,\r\n\t\ti;\r\n\r\n\tif ( show || !elem.is(\":visible\")) {\r\n\t\telem.css( \"opacity\", 0 ).show();\r\n\t\tanimateTo = 1;\r\n\t}\r\n\r\n\t// anims - 1 opacity \"toggles\"\r\n\tfor ( i = 1; i < anims; i++ ) {\r\n\t\telem.animate({\r\n\t\t\topacity: animateTo\r\n\t\t}, duration, o.easing );\r\n\t\tanimateTo = 1 - animateTo;\r\n\t}\r\n\r\n\telem.animate({\r\n\t\topacity: animateTo\r\n\t}, duration, o.easing);\r\n\r\n\telem.queue(function() {\r\n\t\tif ( hide ) {\r\n\t\t\telem.hide();\r\n\t\t}\r\n\t\tdone();\r\n\t});\r\n\r\n\t// We just queued up \"anims\" animations, we need to put them next in the queue\r\n\tif ( queuelen > 1 ) {\r\n\t\tqueue.splice.apply( queue,\r\n\t\t\t[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );\r\n\t}\r\n\telem.dequeue();\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Shake 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/shake-effect/\r\n */\r\n\r\n\r\nvar effectShake = $.effects.effect.shake = function( o, done ) {\r\n\r\n\tvar el = $( this ),\r\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"height\", \"width\" ],\r\n\t\tmode = $.effects.setMode( el, o.mode || \"effect\" ),\r\n\t\tdirection = o.direction || \"left\",\r\n\t\tdistance = o.distance || 20,\r\n\t\ttimes = o.times || 3,\r\n\t\tanims = times * 2 + 1,\r\n\t\tspeed = Math.round( o.duration / anims ),\r\n\t\tref = (direction === \"up\" || direction === \"down\") ? \"top\" : \"left\",\r\n\t\tpositiveMotion = (direction === \"up\" || direction === \"left\"),\r\n\t\tanimation = {},\r\n\t\tanimation1 = {},\r\n\t\tanimation2 = {},\r\n\t\ti,\r\n\r\n\t\t// we will need to re-assemble the queue to stack our animations in place\r\n\t\tqueue = el.queue(),\r\n\t\tqueuelen = queue.length;\r\n\r\n\t$.effects.save( el, props );\r\n\tel.show();\r\n\t$.effects.createWrapper( el );\r\n\r\n\t// Animation\r\n\tanimation[ ref ] = ( positiveMotion ? \"-=\" : \"+=\" ) + distance;\r\n\tanimation1[ ref ] = ( positiveMotion ? \"+=\" : \"-=\" ) + distance * 2;\r\n\tanimation2[ ref ] = ( positiveMotion ? \"-=\" : \"+=\" ) + distance * 2;\r\n\r\n\t// Animate\r\n\tel.animate( animation, speed, o.easing );\r\n\r\n\t// Shakes\r\n\tfor ( i = 1; i < times; i++ ) {\r\n\t\tel.animate( animation1, speed, o.easing ).animate( animation2, speed, o.easing );\r\n\t}\r\n\tel\r\n\t\t.animate( animation1, speed, o.easing )\r\n\t\t.animate( animation, speed / 2, o.easing )\r\n\t\t.queue(function() {\r\n\t\t\tif ( mode === \"hide\" ) {\r\n\t\t\t\tel.hide();\r\n\t\t\t}\r\n\t\t\t$.effects.restore( el, props );\r\n\t\t\t$.effects.removeWrapper( el );\r\n\t\t\tdone();\r\n\t\t});\r\n\r\n\t// inject all the animations we just queued to be first in line (after \"inprogress\")\r\n\tif ( queuelen > 1) {\r\n\t\tqueue.splice.apply( queue,\r\n\t\t\t[ 1, 0 ].concat( queue.splice( queuelen, anims + 1 ) ) );\r\n\t}\r\n\tel.dequeue();\r\n\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Slide 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/slide-effect/\r\n */\r\n\r\n\r\nvar effectSlide = $.effects.effect.slide = function( o, done ) {\r\n\r\n\t// Create element\r\n\tvar el = $( this ),\r\n\t\tprops = [ \"position\", \"top\", \"bottom\", \"left\", \"right\", \"width\", \"height\" ],\r\n\t\tmode = $.effects.setMode( el, o.mode || \"show\" ),\r\n\t\tshow = mode === \"show\",\r\n\t\tdirection = o.direction || \"left\",\r\n\t\tref = (direction === \"up\" || direction === \"down\") ? \"top\" : \"left\",\r\n\t\tpositiveMotion = (direction === \"up\" || direction === \"left\"),\r\n\t\tdistance,\r\n\t\tanimation = {};\r\n\r\n\t// Adjust\r\n\t$.effects.save( el, props );\r\n\tel.show();\r\n\tdistance = o.distance || el[ ref === \"top\" ? \"outerHeight\" : \"outerWidth\" ]( true );\r\n\r\n\t$.effects.createWrapper( el ).css({\r\n\t\toverflow: \"hidden\"\r\n\t});\r\n\r\n\tif ( show ) {\r\n\t\tel.css( ref, positiveMotion ? (isNaN(distance) ? \"-\" + distance : -distance) : distance );\r\n\t}\r\n\r\n\t// Animation\r\n\tanimation[ ref ] = ( show ?\r\n\t\t( positiveMotion ? \"+=\" : \"-=\") :\r\n\t\t( positiveMotion ? \"-=\" : \"+=\")) +\r\n\t\tdistance;\r\n\r\n\t// Animate\r\n\tel.animate( animation, {\r\n\t\tqueue: false,\r\n\t\tduration: o.duration,\r\n\t\teasing: o.easing,\r\n\t\tcomplete: function() {\r\n\t\t\tif ( mode === \"hide\" ) {\r\n\t\t\t\tel.hide();\r\n\t\t\t}\r\n\t\t\t$.effects.restore( el, props );\r\n\t\t\t$.effects.removeWrapper( el );\r\n\t\t\tdone();\r\n\t\t}\r\n\t});\r\n};\r\n\r\n\r\n/*!\r\n * jQuery UI Effects Transfer 1.11.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/transfer-effect/\r\n */\r\n\r\n\r\nvar effectTransfer = $.effects.effect.transfer = function( o, done ) {\r\n\tvar elem = $( this ),\r\n\t\ttarget = $( o.to ),\r\n\t\ttargetFixed = target.css( \"position\" ) === \"fixed\",\r\n\t\tbody = $(\"body\"),\r\n\t\tfixTop = targetFixed ? body.scrollTop() : 0,\r\n\t\tfixLeft = targetFixed ? body.scrollLeft() : 0,\r\n\t\tendPosition = target.offset(),\r\n\t\tanimation = {\r\n\t\t\ttop: endPosition.top - fixTop,\r\n\t\t\tleft: endPosition.left - fixLeft,\r\n\t\t\theight: target.innerHeight(),\r\n\t\t\twidth: target.innerWidth()\r\n\t\t},\r\n\t\tstartPosition = elem.offset(),\r\n\t\ttransfer = $( \"<div class='ui-effects-transfer'></div>\" )\r\n\t\t\t.appendTo( document.body )\r\n\t\t\t.addClass( o.className )\r\n\t\t\t.css({\r\n\t\t\t\ttop: startPosition.top - fixTop,\r\n\t\t\t\tleft: startPosition.left - fixLeft,\r\n\t\t\t\theight: elem.innerHeight(),\r\n\t\t\t\twidth: elem.innerWidth(),\r\n\t\t\t\tposition: targetFixed ? \"fixed\" : \"absolute\"\r\n\t\t\t})\r\n\t\t\t.animate( animation, o.duration, o.easing, function() {\r\n\t\t\t\ttransfer.remove();\r\n\t\t\t\tdone();\r\n\t\t\t});\r\n};\r\n\r\n\r\n\r\n}));","/*!\r\n * jQuery UI Autocomplete 1.10.4\r\n * http://jqueryui.com\r\n *\r\n * Copyright 2014 jQuery Foundation and other contributors\r\n * Released under the MIT license.\r\n * http://jquery.org/license\r\n *\r\n * http://api.jqueryui.com/autocomplete/\r\n *\r\n * Depends:\r\n *\tjquery.ui.core.js\r\n *\tjquery.ui.widget.js\r\n *\tjquery.ui.position.js\r\n *\tjquery.ui.menu.js\r\n */\r\n(function( $, undefined ) {\r\n\r\n$.widget( \"ui.autocomplete\", {\r\n\tversion: \"1.10.4\",\r\n\tdefaultElement: \"<input>\",\r\n\toptions: {\r\n\t\tappendTo: null,\r\n\t\tautoFocus: false,\r\n\t\tdelay: 300,\r\n\t\tminLength: 1,\r\n\t\tposition: {\r\n\t\t\tmy: \"left top\",\r\n\t\t\tat: \"left bottom\",\r\n\t\t\tcollision: \"none\"\r\n\t\t},\r\n\t\tsource: null,\r\n\r\n\t\t// callbacks\r\n\t\tchange: null,\r\n\t\tclose: null,\r\n\t\tfocus: null,\r\n\t\topen: null,\r\n\t\tresponse: null,\r\n\t\tsearch: null,\r\n\t\tselect: null\r\n\t},\r\n\r\n\trequestIndex: 0,\r\n\tpending: 0,\r\n\r\n\t_create: function() {\r\n\t\t// Some browsers only repeat keydown events, not keypress events,\r\n\t\t// so we use the suppressKeyPress flag to determine if we've already\r\n\t\t// handled the keydown event. #7269\r\n\t\t// Unfortunately the code for & in keypress is the same as the up arrow,\r\n\t\t// so we use the suppressKeyPressRepeat flag to avoid handling keypress\r\n\t\t// events when we know the keydown event was used to modify the\r\n\t\t// search term. #7799\r\n\t\tvar suppressKeyPress, suppressKeyPressRepeat, suppressInput,\r\n\t\t\tnodeName = this.element[0].nodeName.toLowerCase(),\r\n\t\t\tisTextarea = nodeName === \"textarea\",\r\n\t\t\tisInput = nodeName === \"input\";\r\n\r\n\t\tthis.isMultiLine =\r\n\t\t\t// Textareas are always multi-line\r\n\t\t\tisTextarea ? true :\r\n\t\t\t// Inputs are always single-line, even if inside a contentEditable element\r\n\t\t\t// IE also treats inputs as contentEditable\r\n\t\t\tisInput ? false :\r\n\t\t\t// All other element types are determined by whether or not they're contentEditable\r\n\t\t\tthis.element.prop( \"isContentEditable\" );\r\n\r\n\t\tthis.valueMethod = this.element[ isTextarea || isInput ? \"val\" : \"text\" ];\r\n\t\tthis.isNewMenu = true;\r\n\r\n\t\tthis.element\r\n\t\t\t.addClass( \"ui-autocomplete-input\" )\r\n\t\t\t.attr( \"autocomplete\", \"off\" );\r\n\r\n\t\tthis._on( this.element, {\r\n\t\t\tkeydown: function( event ) {\r\n\t\t\t\tif ( this.element.prop( \"readOnly\" ) ) {\r\n\t\t\t\t\tsuppressKeyPress = true;\r\n\t\t\t\t\tsuppressInput = true;\r\n\t\t\t\t\tsuppressKeyPressRepeat = true;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tsuppressKeyPress = false;\r\n\t\t\t\tsuppressInput = false;\r\n\t\t\t\tsuppressKeyPressRepeat = false;\r\n\t\t\t\tvar keyCode = $.ui.keyCode;\r\n\t\t\t\tswitch( event.keyCode ) {\r\n\t\t\t\tcase keyCode.PAGE_UP:\r\n\t\t\t\t\tsuppressKeyPress = true;\r\n\t\t\t\t\tthis._move( \"previousPage\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.PAGE_DOWN:\r\n\t\t\t\t\tsuppressKeyPress = true;\r\n\t\t\t\t\tthis._move( \"nextPage\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.UP:\r\n\t\t\t\t\tsuppressKeyPress = true;\r\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.DOWN:\r\n\t\t\t\t\tsuppressKeyPress = true;\r\n\t\t\t\t\tthis._keyEvent( \"next\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.ENTER:\r\n\t\t\t\tcase keyCode.NUMPAD_ENTER:\r\n\t\t\t\t\t// when menu is open and has focus\r\n\t\t\t\t\tif ( this.menu.active ) {\r\n\t\t\t\t\t\t// #6055 - Opera still allows the keypress to occur\r\n\t\t\t\t\t\t// which causes forms to submit\r\n\t\t\t\t\t\tsuppressKeyPress = true;\r\n\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\tthis.menu.select( event );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.TAB:\r\n\t\t\t\t\tif ( this.menu.active ) {\r\n\t\t\t\t\t\tthis.menu.select( event );\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.ESCAPE:\r\n\t\t\t\t\tif ( this.menu.element.is( \":visible\" ) ) {\r\n\t\t\t\t\t\tthis._value( this.term );\r\n\t\t\t\t\t\tthis.close( event );\r\n\t\t\t\t\t\t// Different browsers have different default behavior for escape\r\n\t\t\t\t\t\t// Single press can mean undo or clear\r\n\t\t\t\t\t\t// Double press in IE means clear the whole form\r\n\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tsuppressKeyPressRepeat = true;\r\n\t\t\t\t\t// search timeout should be triggered before the input value is changed\r\n\t\t\t\t\tthis._searchTimeout( event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tkeypress: function( event ) {\r\n\t\t\t\tif ( suppressKeyPress ) {\r\n\t\t\t\t\tsuppressKeyPress = false;\r\n\t\t\t\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\r\n\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tif ( suppressKeyPressRepeat ) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// replicate some key handlers to allow them to repeat in Firefox and Opera\r\n\t\t\t\tvar keyCode = $.ui.keyCode;\r\n\t\t\t\tswitch( event.keyCode ) {\r\n\t\t\t\tcase keyCode.PAGE_UP:\r\n\t\t\t\t\tthis._move( \"previousPage\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.PAGE_DOWN:\r\n\t\t\t\t\tthis._move( \"nextPage\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.UP:\r\n\t\t\t\t\tthis._keyEvent( \"previous\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase keyCode.DOWN:\r\n\t\t\t\t\tthis._keyEvent( \"next\", event );\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tinput: function( event ) {\r\n\t\t\t\tif ( suppressInput ) {\r\n\t\t\t\t\tsuppressInput = false;\r\n\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tthis._searchTimeout( event );\r\n\t\t\t},\r\n\t\t\tfocus: function() {\r\n\t\t\t\tthis.selectedItem = null;\r\n\t\t\t\tthis.previous = this._value();\r\n\t\t\t},\r\n\t\t\tblur: function( event ) {\r\n\t\t\t\tif ( this.cancelBlur ) {\r\n\t\t\t\t\tdelete this.cancelBlur;\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tclearTimeout( this.searching );\r\n\t\t\t\tthis.close( event );\r\n\t\t\t\tthis._change( event );\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis._initSource();\r\n\t\tthis.menu = $( \"<ul>\" )\r\n\t\t\t.addClass( \"ui-autocomplete ui-front\" )\r\n\t\t\t.appendTo( this._appendTo() )\r\n\t\t\t.menu({\r\n\t\t\t\t// disable ARIA support, the live region takes care of that\r\n\t\t\t\trole: null\r\n\t\t\t})\r\n\t\t\t.hide()\r\n\t\t\t.data( \"ui-menu\" );\r\n\r\n\t\tthis._on( this.menu.element, {\r\n\t\t\tmousedown: function( event ) {\r\n\t\t\t\t// prevent moving focus out of the text field\r\n\t\t\t\tevent.preventDefault();\r\n\r\n\t\t\t\t// IE doesn't prevent moving focus even with event.preventDefault()\r\n\t\t\t\t// so we set a flag to know when we should ignore the blur event\r\n\t\t\t\tthis.cancelBlur = true;\r\n\t\t\t\tthis._delay(function() {\r\n\t\t\t\t\tdelete this.cancelBlur;\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// clicking on the scrollbar causes focus to shift to the body\r\n\t\t\t\t// but we can't detect a mouseup or a click immediately afterward\r\n\t\t\t\t// so we have to track the next mousedown and close the menu if\r\n\t\t\t\t// the user clicks somewhere outside of the autocomplete\r\n\t\t\t\tvar menuElement = this.menu.element[ 0 ];\r\n\t\t\t\tif ( !$( event.target ).closest( \".ui-menu-item\" ).length ) {\r\n\t\t\t\t\tthis._delay(function() {\r\n\t\t\t\t\t\tvar that = this;\r\n\t\t\t\t\t\tthis.document.one( \"mousedown\", function( event ) {\r\n\t\t\t\t\t\t\tif ( event.target !== that.element[ 0 ] &&\r\n\t\t\t\t\t\t\t\t\tevent.target !== menuElement &&\r\n\t\t\t\t\t\t\t\t\t!$.contains( menuElement, event.target ) ) {\r\n\t\t\t\t\t\t\t\tthat.close();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tmenufocus: function( event, ui ) {\r\n\t\t\t\t// support: Firefox\r\n\t\t\t\t// Prevent accidental activation of menu items in Firefox (#7024 #9118)\r\n\t\t\t\tif ( this.isNewMenu ) {\r\n\t\t\t\t\tthis.isNewMenu = false;\r\n\t\t\t\t\tif ( event.originalEvent && /^mouse/.test( event.originalEvent.type ) ) {\r\n\t\t\t\t\t\tthis.menu.blur();\r\n\r\n\t\t\t\t\t\tthis.document.one( \"mousemove\", function() {\r\n\t\t\t\t\t\t\t$( event.target ).trigger( event.originalEvent );\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar item = ui.item.data( \"ui-autocomplete-item\" );\r\n\t\t\t\tif ( false !== this._trigger( \"focus\", event, { item: item } ) ) {\r\n\t\t\t\t\t// use value to match what will end up in the input, if it was a key event\r\n\t\t\t\t\tif ( event.originalEvent && /^key/.test( event.originalEvent.type ) ) {\r\n\t\t\t\t\t\tthis._value( item.value );\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Normally the input is populated with the item's value as the\r\n\t\t\t\t\t// menu is navigated, causing screen readers to notice a change and\r\n\t\t\t\t\t// announce the item. Since the focus event was canceled, this doesn't\r\n\t\t\t\t\t// happen, so we update the live region so that screen readers can\r\n\t\t\t\t\t// still notice the change and announce it.\r\n\t\t\t\t\tthis.liveRegion.text( item.value );\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tmenuselect: function( event, ui ) {\r\n\t\t\t\tvar item = ui.item.data( \"ui-autocomplete-item\" ),\r\n\t\t\t\t\tprevious = this.previous;\r\n\r\n\t\t\t\t// only trigger when focus was lost (click on menu)\r\n\t\t\t\tif ( this.element[0] !== this.document[0].activeElement ) {\r\n\t\t\t\t\tthis.element.focus();\r\n\t\t\t\t\tthis.previous = previous;\r\n\t\t\t\t\t// #6109 - IE triggers two focus events and the second\r\n\t\t\t\t\t// is asynchronous, so we need to reset the previous\r\n\t\t\t\t\t// term synchronously and asynchronously :-(\r\n\t\t\t\t\tthis._delay(function() {\r\n\t\t\t\t\t\tthis.previous = previous;\r\n\t\t\t\t\t\tthis.selectedItem = item;\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ( false !== this._trigger( \"select\", event, { item: item } ) ) {\r\n\t\t\t\t\tthis._value( item.value );\r\n\t\t\t\t}\r\n\t\t\t\t// reset the term after the select event\r\n\t\t\t\t// this allows custom select handling to work properly\r\n\t\t\t\tthis.term = this._value();\r\n\r\n\t\t\t\tthis.close( event );\r\n\t\t\t\tthis.selectedItem = item;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis.liveRegion = $( \"<span>\", {\r\n\t\t\t\trole: \"status\",\r\n\t\t\t\t\"aria-live\": \"polite\"\r\n\t\t\t})\r\n\t\t\t.addClass( \"ui-helper-hidden-accessible\" )\r\n\t\t\t.insertBefore( this.element );\r\n\r\n\t\t// turning off autocomplete prevents the browser from remembering the\r\n\t\t// value when navigating through history, so we re-enable autocomplete\r\n\t\t// if the page is unloaded before the widget is destroyed. #7790\r\n\t\tthis._on( this.window, {\r\n\t\t\tbeforeunload: function() {\r\n\t\t\t\tthis.element.removeAttr( \"autocomplete\" );\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t_destroy: function() {\r\n\t\tclearTimeout( this.searching );\r\n\t\tthis.element\r\n\t\t\t.removeClass( \"ui-autocomplete-input\" )\r\n\t\t\t.removeAttr( \"autocomplete\" );\r\n\t\tthis.menu.element.remove();\r\n\t\tthis.liveRegion.remove();\r\n\t},\r\n\r\n\t_setOption: function( key, value ) {\r\n\t\tthis._super( key, value );\r\n\t\tif ( key === \"source\" ) {\r\n\t\t\tthis._initSource();\r\n\t\t}\r\n\t\tif ( key === \"appendTo\" ) {\r\n\t\t\tthis.menu.element.appendTo( this._appendTo() );\r\n\t\t}\r\n\t\tif ( key === \"disabled\" && value && this.xhr ) {\r\n\t\t\tthis.xhr.abort();\r\n\t\t}\r\n\t},\r\n\r\n\t_appendTo: function() {\r\n\t\tvar element = this.options.appendTo;\r\n\r\n\t\tif ( element ) {\r\n\t\t\telement = element.jquery || element.nodeType ?\r\n\t\t\t\t$( element ) :\r\n\t\t\t\tthis.document.find( element ).eq( 0 );\r\n\t\t}\r\n\r\n\t\tif ( !element ) {\r\n\t\t\telement = this.element.closest( \".ui-front\" );\r\n\t\t}\r\n\r\n\t\tif ( !element.length ) {\r\n\t\t\telement = this.document[0].body;\r\n\t\t}\r\n\r\n\t\treturn element;\r\n\t},\r\n\r\n\t_initSource: function() {\r\n\t\tvar array, url,\r\n\t\t\tthat = this;\r\n\t\tif ( $.isArray(this.options.source) ) {\r\n\t\t\tarray = this.options.source;\r\n\t\t\tthis.source = function( request, response ) {\r\n\t\t\t\tresponse( $.ui.autocomplete.filter( array, request.term ) );\r\n\t\t\t};\r\n\t\t} else if ( typeof this.options.source === \"string\" ) {\r\n\t\t\turl = this.options.source;\r\n\t\t\tthis.source = function( request, response ) {\r\n\t\t\t\tif ( that.xhr ) {\r\n\t\t\t\t\tthat.xhr.abort();\r\n\t\t\t\t}\r\n\t\t\t\tthat.xhr = $.ajax({\r\n\t\t\t\t\turl: url,\r\n\t\t\t\t\tdata: request,\r\n\t\t\t\t\tdataType: \"json\",\r\n\t\t\t\t\tsuccess: function( data ) {\r\n\t\t\t\t\t\tresponse( data );\r\n\t\t\t\t\t},\r\n\t\t\t\t\terror: function() {\r\n\t\t\t\t\t\tresponse( [] );\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\tthis.source = this.options.source;\r\n\t\t}\r\n\t},\r\n\r\n\t_searchTimeout: function( event ) {\r\n\t\tclearTimeout( this.searching );\r\n\t\tthis.searching = this._delay(function() {\r\n\t\t\t// only search if the value has changed\r\n\t\t\tif ( this.term !== this._value() ) {\r\n\t\t\t\tthis.selectedItem = null;\r\n\t\t\t\tthis.search( null, event );\r\n\t\t\t}\r\n\t\t}, this.options.delay );\r\n\t},\r\n\r\n\tsearch: function( value, event ) {\r\n\t\tvalue = value != null ? value : this._value();\r\n\r\n\t\t// always save the actual value, not the one passed as an argument\r\n\t\tthis.term = this._value();\r\n\r\n\t\tif ( value.length < this.options.minLength ) {\r\n\t\t\treturn this.close( event );\r\n\t\t}\r\n\r\n\t\tif ( this._trigger( \"search\", event ) === false ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\treturn this._search( value );\r\n\t},\r\n\r\n\t_search: function( value ) {\r\n\t\tthis.pending++;\r\n\t\tthis.element.addClass( \"ui-autocomplete-loading\" );\r\n\t\tthis.cancelSearch = false;\r\n\r\n\t\tthis.source( { term: value }, this._response() );\r\n\t},\r\n\r\n\t_response: function() {\r\n\t\tvar index = ++this.requestIndex;\r\n\r\n\t\treturn $.proxy(function( content ) {\r\n\t\t\tif ( index === this.requestIndex ) {\r\n\t\t\t\tthis.__response( content );\r\n\t\t\t}\r\n\r\n\t\t\tthis.pending--;\r\n\t\t\tif ( !this.pending ) {\r\n\t\t\t\tthis.element.removeClass( \"ui-autocomplete-loading\" );\r\n\t\t\t}\r\n\t\t}, this );\r\n\t},\r\n\r\n\t__response: function( content ) {\r\n\t\tif ( content ) {\r\n\t\t\tcontent = this._normalize( content );\r\n\t\t}\r\n\t\tthis._trigger( \"response\", null, { content: content } );\r\n\t\tif ( !this.options.disabled && content && content.length && !this.cancelSearch ) {\r\n\t\t\tthis._suggest( content );\r\n\t\t\tthis._trigger( \"open\" );\r\n\t\t} else {\r\n\t\t\t// use ._close() instead of .close() so we don't cancel future searches\r\n\t\t\tthis._close();\r\n\t\t}\r\n\t},\r\n\r\n\tclose: function( event ) {\r\n\t\tthis.cancelSearch = true;\r\n\t\tthis._close( event );\r\n\t},\r\n\r\n\t_close: function( event ) {\r\n\t\tif ( this.menu.element.is( \":visible\" ) ) {\r\n\t\t\tthis.menu.element.hide();\r\n\t\t\tthis.menu.blur();\r\n\t\t\tthis.isNewMenu = true;\r\n\t\t\tthis._trigger( \"close\", event );\r\n\t\t}\r\n\t},\r\n\r\n\t_change: function( event ) {\r\n\t\tif ( this.previous !== this._value() ) {\r\n\t\t\tthis._trigger( \"change\", event, { item: this.selectedItem } );\r\n\t\t}\r\n\t},\r\n\r\n\t_normalize: function( items ) {\r\n\t\t// assume all items have the right format when the first item is complete\r\n\t\tif ( items.length && items[0].label && items[0].value ) {\r\n\t\t\treturn items;\r\n\t\t}\r\n\t\treturn $.map( items, function( item ) {\r\n\t\t\tif ( typeof item === \"string\" ) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tlabel: item,\r\n\t\t\t\t\tvalue: item\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\treturn $.extend({\r\n\t\t\t\tlabel: item.label || item.value,\r\n\t\t\t\tvalue: item.value || item.label\r\n\t\t\t}, item );\r\n\t\t});\r\n\t},\r\n\r\n\t_suggest: function( items ) {\r\n\t\tvar ul = this.menu.element.empty();\r\n\t\tthis._renderMenu( ul, items );\r\n\t\tthis.isNewMenu = true;\r\n\t\tthis.menu.refresh();\r\n\r\n\t\t// size and position menu\r\n\t\tul.show();\r\n\t\tthis._resizeMenu();\r\n\t\tul.position( $.extend({\r\n\t\t\tof: this.element\r\n\t\t}, this.options.position ));\r\n\r\n\t\tif ( this.options.autoFocus ) {\r\n\t\t\tthis.menu.next();\r\n\t\t}\r\n\t},\r\n\r\n\t_resizeMenu: function() {\r\n\t\tvar ul = this.menu.element;\r\n\t\tul.outerWidth( Math.max(\r\n\t\t\t// Firefox wraps long text (possibly a rounding bug)\r\n\t\t\t// so we add 1px to avoid the wrapping (#7513)\r\n\t\t\tul.width( \"\" ).outerWidth() + 1,\r\n\t\t\tthis.element.outerWidth()\r\n\t\t) );\r\n\t},\r\n\r\n\t_renderMenu: function( ul, items ) {\r\n\t\tvar that = this;\r\n\t\t$.each( items, function( index, item ) {\r\n\t\t\tthat._renderItemData( ul, item );\r\n\t\t});\r\n\t},\r\n\r\n\t_renderItemData: function( ul, item ) {\r\n\t\treturn this._renderItem( ul, item ).data( \"ui-autocomplete-item\", item );\r\n\t},\r\n\r\n\t_renderItem: function( ul, item ) {\r\n\t\treturn $( \"<li>\" )\r\n\t\t\t.append( $( \"<a>\" ).text( item.label ) )\r\n\t\t\t.appendTo( ul );\r\n\t},\r\n\r\n\t_move: function( direction, event ) {\r\n\t\tif ( !this.menu.element.is( \":visible\" ) ) {\r\n\t\t\tthis.search( null, event );\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif ( this.menu.isFirstItem() && /^previous/.test( direction ) ||\r\n\t\t\t\tthis.menu.isLastItem() && /^next/.test( direction ) ) {\r\n\t\t\tthis._value( this.term );\r\n\t\t\tthis.menu.blur();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.menu[ direction ]( event );\r\n\t},\r\n\r\n\twidget: function() {\r\n\t\treturn this.menu.element;\r\n\t},\r\n\r\n\t_value: function() {\r\n\t\treturn this.valueMethod.apply( this.element, arguments );\r\n\t},\r\n\r\n\t_keyEvent: function( keyEvent, event ) {\r\n\t\tif ( !this.isMultiLine || this.menu.element.is( \":visible\" ) ) {\r\n\t\t\tthis._move( keyEvent, event );\r\n\r\n\t\t\t// prevents moving cursor to beginning/end of the text field in some browsers\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t}\r\n});\r\n\r\n$.extend( $.ui.autocomplete, {\r\n\tescapeRegex: function( value ) {\r\n\t\treturn value.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#\\s]/g, \"\\\\$&\");\r\n\t},\r\n\tfilter: function(array, term) {\r\n\t\tvar matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), \"i\" );\r\n\t\treturn $.grep( array, function(value) {\r\n\t\t\treturn matcher.test( value.label || value.value || value );\r\n\t\t});\r\n\t}\r\n});\r\n\r\n\r\n// live region extension, adding a `messages` option\r\n// NOTE: This is an experimental API. We are still investigating\r\n// a full solution for string manipulation and internationalization.\r\n$.widget( \"ui.autocomplete\", $.ui.autocomplete, {\r\n\toptions: {\r\n\t\tmessages: {\r\n\t\t\tnoResults: \"No search results.\",\r\n\t\t\tresults: function( amount ) {\r\n\t\t\t\treturn amount + ( amount > 1 ? \" results are\" : \" result is\" ) +\r\n\t\t\t\t\t\" available, use up and down arrow keys to navigate.\";\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t__response: function( content ) {\r\n\t\tvar message;\r\n\t\tthis._superApply( arguments );\r\n\t\tif ( this.options.disabled || this.cancelSearch ) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif ( content && content.length ) {\r\n\t\t\tmessage = this.options.messages.results( content.length );\r\n\t\t} else {\r\n\t\t\tmessage = this.options.messages.noResults;\r\n\t\t}\r\n\t\tthis.liveRegion.text( message );\r\n\t}\r\n});\r\n\r\n}( jQuery ));\r\n","/*\r\n* jQuery timepicker addon\r\n* By: Trent Richardson [http://trentrichardson.com]\r\n* Version 0.9.7\r\n* Last Modified: 10/02/2011\r\n* \r\n* Copyright 2011 Trent Richardson\r\n* Dual licensed under the MIT and GPL licenses.\r\n* http://trentrichardson.com/Impromptu/GPL-LICENSE.txt\r\n* http://trentrichardson.com/Impromptu/MIT-LICENSE.txt\r\n* \r\n* HERES THE CSS:\r\n* .ui-timepicker-div .ui-widget-header { margin-bottom: 8px; }\r\n* .ui-timepicker-div dl { text-align: left; }\r\n* .ui-timepicker-div dl dt { height: 25px; }\r\n* .ui-timepicker-div dl dd { margin: -25px 10px 10px 65px; }\r\n* .ui-timepicker-div td { font-size: 90%; }\r\n* .ui-tpicker-grid-label { background: none; border: none; margin: 0; padding: 0; }\r\n*/\r\n\r\n(function($) {\r\n\r\n$.extend($.ui, { timepicker: { version: \"0.9.7\" } });\r\n\r\n/* Time picker manager.\r\n Use the singleton instance of this class, $.timepicker, to interact with the time picker.\r\n Settings for (groups of) time pickers are maintained in an instance object,\r\n allowing multiple different settings on the same page. */\r\n\r\nfunction Timepicker() {\r\n\tthis.regional = []; // Available regional settings, indexed by language code\r\n\tthis.regional[''] = { // Default regional settings\r\n\t\tcurrentText: 'Now',\r\n\t\tcloseText: 'Done',\r\n\t\tampm: false,\r\n\t\tamNames: ['AM', 'A'],\r\n\t\tpmNames: ['PM', 'P'],\r\n\t\ttimeFormat: 'mm:ss',\r\n\t\ttimeSuffix: '',\r\n\t\ttimeOnlyTitle: 'Choix du délai',\r\n\t\ttimeText: 'Time',\r\n\t\thourText: 'Hour',\r\n\t\tminuteText: 'Minute',\r\n\t\tsecondText: 'Second',\r\n\t\tmillisecText: 'Millisecond',\r\n\t\ttimezoneText: 'Time Zone'\r\n\t};\r\n\tthis._defaults = { // Global defaults for all the datetime picker instances\r\n\t\tshowButtonPanel: false,\r\n\t\ttimeOnly: true,\r\n\t\tshowHour: false,\r\n\t\tshowMinute: true,\r\n\t\tshowSecond: true,\r\n\t\tshowMillisec: false,\r\n\t\tshowTimezone: false,\r\n\t\tshowTime: false,\r\n\t\tstepHour: 0.05,\r\n\t\tstepMinute: 0.05,\r\n\t\tstepSecond: 0.05,\r\n\t\tstepMillisec: 0.5,\r\n\t\thour: 0,\r\n\t\tminute: 0,\r\n\t\tsecond: 0,\r\n\t\tmillisec: 0,\r\n\t\ttimezone: '+0000',\r\n\t\thourMin: 0,\r\n\t\tminuteMin: 0,\r\n\t\tsecondMin: 0,\r\n\t\tmillisecMin: 0,\r\n\t\thourMax: 23,\r\n\t\tminuteMax: 59,\r\n\t\tsecondMax: 59,\r\n\t\tmillisecMax: 999,\r\n\t\tminDateTime: null,\r\n\t\tmaxDateTime: null,\r\n\t\tonSelect: null,\r\n\t\thourGrid: 0,\r\n\t\tminuteGrid: 0,\r\n\t\tsecondGrid: 0,\r\n\t\tmillisecGrid: 0,\r\n\t\talwaysSetTime: true,\r\n\t\tseparator: ' ',\r\n\t\taltFieldTimeOnly: true,\r\n\t\tshowTimepicker: true,\r\n\t\ttimezoneIso8609: false,\r\n\t\ttimezoneList: null\r\n\t};\r\n\t$.extend(this._defaults, this.regional['']);\r\n}\r\n\r\n$.extend(Timepicker.prototype, {\r\n\t$input: null,\r\n\t$altInput: null,\r\n\t$timeObj: null,\r\n\tinst: null,\r\n\thour_slider: null,\r\n\tminute_slider: null,\r\n\tsecond_slider: null,\r\n\tmillisec_slider: null,\r\n\ttimezone_select: null,\r\n\thour: 0,\r\n\tminute: 0,\r\n\tsecond: 0,\r\n\tmillisec: 0,\r\n\ttimezone: '+0000',\r\n\thourMinOriginal: null,\r\n\tminuteMinOriginal: null,\r\n\tsecondMinOriginal: null,\r\n\tmillisecMinOriginal: null,\r\n\thourMaxOriginal: null,\r\n\tminuteMaxOriginal: null,\r\n\tsecondMaxOriginal: null,\r\n\tmillisecMaxOriginal: null,\r\n\tampm: '',\r\n\tformattedDate: '',\r\n\tformattedTime: '',\r\n\tformattedDateTime: '',\r\n\ttimezoneList: null,\r\n\r\n\t/* Override the default settings for all instances of the time picker.\r\n\t @param settings object - the new settings to use as defaults (anonymous object)\r\n\t @return the manager object */\r\n\tsetDefaults: function(settings) {\r\n\t\textendRemove(this._defaults, settings || {});\r\n\t\treturn this;\r\n\t},\r\n\r\n\t//########################################################################\r\n\t// Create a new Timepicker instance\r\n\t//########################################################################\r\n\t_newInst: function($input, o) {\r\n\t\tvar tp_inst = new Timepicker(),\r\n\t\t\tinlineSettings = {};\r\n\t\t\t\r\n\t\tfor (var attrName in this._defaults) {\r\n\t\t\tvar attrValue = $input.attr('time:' + attrName);\r\n\t\t\tif (attrValue) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tinlineSettings[attrName] = eval(attrValue);\r\n\t\t\t\t} catch (err) {\r\n\t\t\t\t\tinlineSettings[attrName] = attrValue;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\ttp_inst._defaults = $.extend({}, this._defaults, inlineSettings, o, {\r\n\t\t\tbeforeShow: function(input, dp_inst) {\r\n\t\t\t\tif ($.isFunction(o.beforeShow))\r\n\t\t\t\t\to.beforeShow(input, dp_inst, tp_inst);\r\n\t\t\t},\r\n\t\t\tonChangeMonthYear: function(year, month, dp_inst) {\r\n\t\t\t\t// Update the time as well : this prevents the time from disappearing from the $input field.\r\n\t\t\t\ttp_inst._updateDateTime(dp_inst);\r\n\t\t\t\tif ($.isFunction(o.onChangeMonthYear))\r\n\t\t\t\t\to.onChangeMonthYear.call($input[0], year, month, dp_inst, tp_inst);\r\n\t\t\t},\r\n\t\t\tonClose: function(dateText, dp_inst) {\r\n\t\t\t\tif (tp_inst.timeDefined === true && $input.val() != '')\r\n\t\t\t\t\ttp_inst._updateDateTime(dp_inst);\r\n\t\t\t\tif ($.isFunction(o.onClose))\r\n\t\t\t\t\to.onClose.call($input[0], dateText, dp_inst, tp_inst);\r\n\t\t\t},\r\n\t\t\ttimepicker: tp_inst // add timepicker as a property of datepicker: $.datepicker._get(dp_inst, 'timepicker');\r\n\t\t});\r\n\t\ttp_inst.amNames = $.map(tp_inst._defaults.amNames, function(val) { return val.toUpperCase() });\r\n\t\ttp_inst.pmNames = $.map(tp_inst._defaults.pmNames, function(val) { return val.toUpperCase() });\r\n\r\n\t\tif (tp_inst._defaults.timezoneList === null) {\r\n\t\t\tvar timezoneList = [];\r\n\t\t\tfor (var i = -11; i <= 12; i++)\r\n\t\t\t\ttimezoneList.push((i >= 0 ? '+' : '-') + ('0' + Math.abs(i).toString()).slice(-2) + '00');\r\n\t\t\tif (tp_inst._defaults.timezoneIso8609)\r\n\t\t\t\ttimezoneList = $.map(timezoneList, function(val) {\r\n\t\t\t\t\treturn val == '+0000' ? 'Z' : (val.substring(0, 3) + ':' + val.substring(3));\r\n\t\t\t\t});\r\n\t\t\ttp_inst._defaults.timezoneList = timezoneList;\r\n\t\t}\r\n\r\n\t\ttp_inst.hour = tp_inst._defaults.hour;\r\n\t\ttp_inst.minute = tp_inst._defaults.minute;\r\n\t\ttp_inst.second = tp_inst._defaults.second;\r\n\t\ttp_inst.millisec = tp_inst._defaults.millisec;\r\n\t\ttp_inst.ampm = '';\r\n\t\ttp_inst.$input = $input;\r\n\r\n\t\tif (o.altField)\r\n\t\t\ttp_inst.$altInput = $(o.altField)\r\n\t\t\t\t.css({ cursor: 'pointer' })\r\n\t\t\t\t.focus(function(){ $input.trigger(\"focus\"); });\r\n\t\t\r\n\t\tif(tp_inst._defaults.minDate==0 || tp_inst._defaults.minDateTime==0)\r\n\t\t{\r\n\t\t\ttp_inst._defaults.minDate=new Date();\r\n\t\t}\r\n\t\tif(tp_inst._defaults.maxDate==0 || tp_inst._defaults.maxDateTime==0)\r\n\t\t{\r\n\t\t\ttp_inst._defaults.maxDate=new Date();\r\n\t\t}\r\n\t\t\r\n\t\t// datepicker needs minDate/maxDate, timepicker needs minDateTime/maxDateTime..\r\n\t\tif(tp_inst._defaults.minDate !== undefined && tp_inst._defaults.minDate instanceof Date)\r\n\t\t\ttp_inst._defaults.minDateTime = new Date(tp_inst._defaults.minDate.getTime());\r\n\t\tif(tp_inst._defaults.minDateTime !== undefined && tp_inst._defaults.minDateTime instanceof Date)\r\n\t\t\ttp_inst._defaults.minDate = new Date(tp_inst._defaults.minDateTime.getTime());\r\n\t\tif(tp_inst._defaults.maxDate !== undefined && tp_inst._defaults.maxDate instanceof Date)\r\n\t\t\ttp_inst._defaults.maxDateTime = new Date(tp_inst._defaults.maxDate.getTime());\r\n\t\tif(tp_inst._defaults.maxDateTime !== undefined && tp_inst._defaults.maxDateTime instanceof Date)\r\n\t\t\ttp_inst._defaults.maxDate = new Date(tp_inst._defaults.maxDateTime.getTime());\r\n\t\treturn tp_inst;\r\n\t},\r\n\r\n\t//########################################################################\r\n\t// add our sliders to the calendar\r\n\t//########################################################################\r\n\t_addTimePicker: function(dp_inst) {\r\n\t\tvar currDT = (this.$altInput && this._defaults.altFieldTimeOnly) ?\r\n\t\t\t\tthis.$input.val() + ' ' + this.$altInput.val() : \r\n\t\t\t\tthis.$input.val();\r\n\r\n\t\tthis.timeDefined = this._parseTime(currDT);\r\n\t\tthis._limitMinMaxDateTime(dp_inst, false);\r\n\t\tthis._injectTimePicker();\r\n\t},\r\n\r\n\t//########################################################################\r\n\t// parse the time string from input value or _setTime\r\n\t//########################################################################\r\n\t_parseTime: function(timeString, withDate) {\r\n\t\tvar regstr = this._defaults.timeFormat.toString()\r\n\t\t\t\t.replace(/h{1,2}/ig, '(\\\\d?\\\\d)')\r\n\t\t\t\t.replace(/m{1,2}/ig, '(\\\\d?\\\\d)')\r\n\t\t\t\t.replace(/s{1,2}/ig, '(\\\\d?\\\\d)')\r\n\t\t\t\t.replace(/l{1}/ig, '(\\\\d?\\\\d?\\\\d)')\r\n\t\t\t\t.replace(/t{1,2}/ig, this._getPatternAmpm())\r\n\t\t\t\t.replace(/z{1}/ig, '(z|[-+]\\\\d\\\\d:?\\\\d\\\\d)?')\r\n\t\t\t\t.replace(/\\s/g, '\\\\s?') + this._defaults.timeSuffix + '$',\r\n\t\t\torder = this._getFormatPositions(),\r\n\t\t\tampm = '',\r\n\t\t\ttreg;\r\n\r\n\t\tif (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]);\r\n\r\n\t\tif (withDate || !this._defaults.timeOnly) {\r\n\t\t\t// the time should come after x number of characters and a space.\r\n\t\t\t// x = at least the length of text specified by the date format\r\n\t\t\tvar dp_dateFormat = $.datepicker._get(this.inst, 'dateFormat');\r\n\t\t\t// escape special regex characters in the seperator\r\n\t\t\tvar specials = new RegExp(\"[.*+?|()\\\\[\\\\]{}\\\\\\\\]\", \"g\");\r\n\t\t\tregstr = '.{' + dp_dateFormat.length + ',}' + this._defaults.separator.replace(specials, \"\\\\$&\") + regstr;\r\n\t\t}\r\n\t\t\r\n\t\ttreg = timeString.match(new RegExp(regstr, 'i'));\r\n\r\n\t\tif (treg) {\r\n\t\t\tif (order.t !== -1) {\r\n\t\t\t\tif (treg[order.t] === undefined || treg[order.t].length === 0) {\r\n\t\t\t\t\tampm = '';\r\n\t\t\t\t\tthis.ampm = '';\r\n\t\t\t\t} else {\r\n\t\t\t\t\tampm = $.inArray(treg[order.t].toUpperCase(), this.amNames) !== -1 ? 'AM' : 'PM';\r\n\t\t\t\t\tthis.ampm = this._defaults[ampm == 'AM' ? 'amNames' : 'pmNames'][0];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (order.h !== -1) {\r\n\t\t\t\tif (ampm == 'AM' && treg[order.h] == '12')\r\n\t\t\t\t\tthis.hour = 0; // 12am = 0 hour\r\n\t\t\t\telse if (ampm == 'PM' && treg[order.h] != '12')\r\n\t\t\t\t\tthis.hour = (parseFloat(treg[order.h]) + 12).toFixed(0); // 12pm = 12 hour, any other pm = hour + 12\r\n\t\t\t\telse this.hour = Number(treg[order.h]);\r\n\t\t\t}\r\n\r\n\t\t\tif (order.m !== -1) this.minute = Number(treg[order.m]);\r\n\t\t\tif (order.s !== -1) this.second = Number(treg[order.s]);\r\n\t\t\tif (order.l !== -1) this.millisec = Number(treg[order.l]);\r\n\t\t\tif (order.z !== -1 && treg[order.z] !== undefined) {\r\n\t\t\t\tvar tz = treg[order.z].toUpperCase();\r\n\t\t\t\tswitch (tz.length) {\r\n\t\t\t\tcase 1:\t// Z\r\n\t\t\t\t\ttz = this._defaults.timezoneIso8609 ? 'Z' : '+0000';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 5:\t// +hhmm\r\n\t\t\t\t\tif (this._defaults.timezoneIso8609)\r\n\t\t\t\t\t\ttz = tz.substring(1) == '0000'\r\n\t\t\t\t\t\t ? 'Z'\r\n\t\t\t\t\t\t : tz.substring(0, 3) + ':' + tz.substring(3);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 6:\t// +hh:mm\r\n\t\t\t\t\tif (!this._defaults.timezoneIso8609)\r\n\t\t\t\t\t\ttz = tz == 'Z' || tz.substring(1) == '00:00'\r\n\t\t\t\t\t\t ? '+0000'\r\n\t\t\t\t\t\t : tz.replace(/:/, '');\r\n\t\t\t\t\telse if (tz.substring(1) == '00:00')\r\n\t\t\t\t\t\ttz = 'Z';\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tthis.timezone = tz;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn true;\r\n\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\t//########################################################################\r\n\t// pattern for standard and localized AM/PM markers\r\n\t//########################################################################\r\n\t_getPatternAmpm: function() {\r\n\t\tvar markers = [];\r\n\t\t\to = this._defaults;\r\n\t\tif (o.amNames)\r\n\t\t\t$.merge(markers, o.amNames);\r\n\t\tif (o.pmNames)\r\n\t\t\t$.merge(markers, o.pmNames);\r\n\t\tmarkers = $.map(markers, function(val) { return val.replace(/[.*+?|()\\[\\]{}\\\\]/g, '\\\\$&') });\r\n\t\treturn '(' + markers.join('|') + ')?';\r\n\t},\r\n\r\n\t//########################################################################\r\n\t// figure out position of time elements.. cause js cant do named captures\r\n\t//########################################################################\r\n\t_getFormatPositions: function() {\r\n\t\tvar finds = this._defaults.timeFormat.toLowerCase().match(/(h{1,2}|m{1,2}|s{1,2}|l{1}|t{1,2}|z)/g),\r\n\t\t\torders = { h: -1, m: -1, s: -1, l: -1, t: -1, z: -1 };\r\n\r\n\t\tif (finds)\r\n\t\t\tfor (var i = 0; i < finds.length; i++)\r\n\t\t\t\tif (orders[finds[i].toString().charAt(0)] == -1)\r\n\t\t\t\t\torders[finds[i].toString().charAt(0)] = i + 1;\r\n\r\n\t\treturn orders;\r\n\t},\r\n\r\n\t//########################################################################\r\n\t// generate and inject html for timepicker into ui datepicker\r\n\t//########################################################################\r\n\t_injectTimePicker: function() {\r\n\t\tvar $dp = this.inst.dpDiv,\r\n\t\t\to = this._defaults,\r\n\t\t\ttp_inst = this,\r\n\t\t\t// Added by Peter Medeiros:\r\n\t\t\t// - Figure out what the hour/minute/second max should be based on the step values.\r\n\t\t\t// - Example: if stepMinute is 15, then minMax is 45.\r\n\t\t\thourMax = (o.hourMax - ((o.hourMax - o.hourMin) % o.stepHour)).toFixed(0),\r\n minMax = (o.minuteMax - ((o.minuteMax - o.minuteMin) % o.stepMinute)).toFixed(0),\r\n secMax = (o.secondMax - ((o.secondMax - o.secondMin) % o.stepSecond)).toFixed(0),\r\n\t\t\tmillisecMax = (o.millisecMax - ((o.millisecMax - o.millisecMin) % o.stepMillisec)).toFixed(0),\r\n\t\t\tdp_id = this.inst.id.toString().replace(/([^A-Za-z0-9_])/g, '');\r\n\r\n\t\t// Prevent displaying twice\r\n\t\t//if ($dp.find(\"div#ui-timepicker-div-\"+ dp_id).length === 0) {\r\n\t\tif ($dp.find(\"div#ui-timepicker-div-\"+ dp_id).length === 0 && o.showTimepicker) {\r\n\t\t\tvar noDisplay = ' style=\"display:none;\"',\r\n\t\t\t\thtml =\t'<div class=\"ui-timepicker-div\" id=\"ui-timepicker-div-' + dp_id + '\"><dl>' +\r\n\t\t\t\t\t\t'<dt class=\"ui_tpicker_time_label\" id=\"ui_tpicker_time_label_' + dp_id + '\"' +\r\n\t\t\t\t\t\t((o.showTime) ? '' : noDisplay) + '>' + o.timeText + '</dt>' +\r\n\t\t\t\t\t\t'<dd class=\"ui_tpicker_time\" id=\"ui_tpicker_time_' + dp_id + '\"' +\r\n\t\t\t\t\t\t((o.showTime) ? '' : noDisplay) + '></dd>' +\r\n\t\t\t\t\t\t'<dt class=\"ui_tpicker_hour_label\" id=\"ui_tpicker_hour_label_' + dp_id + '\"' +\r\n\t\t\t\t\t\t((o.showHour) ? '' : noDisplay) + '>' + o.hourText + '</dt>',\r\n\t\t\t\thourGridSize = 0,\r\n\t\t\t\tminuteGridSize = 0,\r\n\t\t\t\tsecondGridSize = 0,\r\n\t\t\t\tmillisecGridSize = 0,\r\n\t\t\t\tsize;\r\n\r\n \t\t\t// Hours\r\n\t\t\tif (o.showHour && o.hourGrid > 0) {\r\n\t\t\t\thtml += '<dd class=\"ui_tpicker_hour\">' +\r\n\t\t\t\t\t\t'<div id=\"ui_tpicker_hour_' + dp_id + '\"' + ((o.showHour) ? '' : noDisplay) + '></div>' +\r\n\t\t\t\t\t\t'<div style=\"padding-left: 1px\"><table class=\"ui-tpicker-grid-label\"><tr>';\r\n\r\n\t\t\t\tfor (var h = o.hourMin; h <= hourMax; h += parseInt(o.hourGrid,10)) {\r\n\t\t\t\t\thourGridSize++;\r\n\t\t\t\t\tvar tmph = (o.ampm && h > 12) ? h-12 : h;\r\n\t\t\t\t\tif (tmph < 10) tmph = '0' + tmph;\r\n\t\t\t\t\tif (o.ampm) {\r\n\t\t\t\t\t\tif (h == 0) tmph = 12 +'a';\r\n\t\t\t\t\t\telse if (h < 12) tmph += 'a';\r\n\t\t\t\t\t\telse tmph += 'p';\r\n\t\t\t\t\t}\r\n\t\t\t\t\thtml += '<td>' + tmph + '</td>';\r\n\t\t\t\t}\r\n\r\n\t\t\t\thtml += '</tr></table></div>' +\r\n\t\t\t\t\t\t'</dd>';\r\n\t\t\t} else html += '<dd class=\"ui_tpicker_hour\" id=\"ui_tpicker_hour_' + dp_id + '\"' +\r\n\t\t\t\t\t\t\t((o.showHour) ? '' : noDisplay) + '></dd>';\r\n\r\n\t\t\thtml += '<dt class=\"ui_tpicker_minute_label\" id=\"ui_tpicker_minute_label_' + dp_id + '\"' +\r\n\t\t\t\t\t((o.showMinute) ? '' : noDisplay) + '>' + o.minuteText + '</dt>';\r\n\r\n\t\t\t// Minutes\r\n\t\t\tif (o.showMinute && o.minuteGrid > 0) {\r\n\t\t\t\thtml += '<dd class=\"ui_tpicker_minute ui_tpicker_minute_' + o.minuteGrid + '\">' +\r\n\t\t\t\t\t\t'<div id=\"ui_tpicker_minute_' + dp_id + '\"' +\r\n\t\t\t\t\t\t((o.showMinute) ? '' : noDisplay) + '></div>' +\r\n\t\t\t\t\t\t'<div style=\"padding-left: 1px\"><table class=\"ui-tpicker-grid-label\"><tr>';\r\n\r\n\t\t\t\tfor (var m = o.minuteMin; m <= minMax; m += parseInt(o.minuteGrid,10)) {\r\n\t\t\t\t\tminuteGridSize++;\r\n\t\t\t\t\thtml += '<td>' + ((m < 10) ? '0' : '') + m + '</td>';\r\n\t\t\t\t}\r\n\r\n\t\t\t\thtml += '</tr></table></div>' +\r\n\t\t\t\t\t\t'</dd>';\r\n\t\t\t} else html += '<dd class=\"ui_tpicker_minute\" id=\"ui_tpicker_minute_' + dp_id + '\"' +\r\n\t\t\t\t\t\t\t((o.showMinute) ? '' : noDisplay) + '></dd>';\r\n\r\n\t\t\t// Seconds\r\n\t\t\thtml += '<dt class=\"ui_tpicker_second_label\" id=\"ui_tpicker_second_label_' + dp_id + '\"' +\r\n\t\t\t\t\t((o.showSecond) ? '' : noDisplay) + '>' + o.secondText + '</dt>';\r\n\r\n\t\t\tif (o.showSecond && o.secondGrid > 0) {\r\n\t\t\t\thtml += '<dd class=\"ui_tpicker_second ui_tpicker_second_' + o.secondGrid + '\">' +\r\n\t\t\t\t\t\t'<div id=\"ui_tpicker_second_' + dp_id + '\"' +\r\n\t\t\t\t\t\t((o.showSecond) ? '' : noDisplay) + '></div>' +\r\n\t\t\t\t\t\t'<div style=\"padding-left: 1px\"><table><tr>';\r\n\r\n\t\t\t\tfor (var s = o.secondMin; s <= secMax; s += parseInt(o.secondGrid,10)) {\r\n\t\t\t\t\tsecondGridSize++;\r\n\t\t\t\t\thtml += '<td>' + ((s < 10) ? '0' : '') + s + '</td>';\r\n\t\t\t\t}\r\n\r\n\t\t\t\thtml += '</tr></table></div>' +\r\n\t\t\t\t\t\t'</dd>';\r\n\t\t\t} else html += '<dd class=\"ui_tpicker_second\" id=\"ui_tpicker_second_' + dp_id + '\"'\t+\r\n\t\t\t\t\t\t\t((o.showSecond) ? '' : noDisplay) + '></dd>';\r\n\r\n\t\t\t// Milliseconds\r\n\t\t\thtml += '<dt class=\"ui_tpicker_millisec_label\" id=\"ui_tpicker_millisec_label_' + dp_id + '\"' +\r\n\t\t\t\t\t((o.showMillisec) ? '' : noDisplay) + '>' + o.millisecText + '</dt>';\r\n\r\n\t\t\tif (o.showMillisec && o.millisecGrid > 0) {\r\n\t\t\t\thtml += '<dd class=\"ui_tpicker_millisec ui_tpicker_millisec_' + o.millisecGrid + '\">' +\r\n\t\t\t\t\t\t'<div id=\"ui_tpicker_millisec_' + dp_id + '\"' +\r\n\t\t\t\t\t\t((o.showMillisec) ? '' : noDisplay) + '></div>' +\r\n\t\t\t\t\t\t'<div style=\"padding-left: 1px\"><table><tr>';\r\n\r\n\t\t\t\tfor (var l = o.millisecMin; l <= millisecMax; l += parseInt(o.millisecGrid,10)) {\r\n\t\t\t\t\tmillisecGridSize++;\r\n\t\t\t\t\thtml += '<td>' + ((l < 10) ? '0' : '') + s + '</td>';\r\n\t\t\t\t}\r\n\r\n\t\t\t\thtml += '</tr></table></div>' +\r\n\t\t\t\t\t\t'</dd>';\r\n\t\t\t} else html += '<dd class=\"ui_tpicker_millisec\" id=\"ui_tpicker_millisec_' + dp_id + '\"'\t+\r\n\t\t\t\t\t\t\t((o.showMillisec) ? '' : noDisplay) + '></dd>';\r\n\r\n\t\t\t// Timezone\r\n\t\t\thtml += '<dt class=\"ui_tpicker_timezone_label\" id=\"ui_tpicker_timezone_label_' + dp_id + '\"' +\r\n\t\t\t\t\t((o.showTimezone) ? '' : noDisplay) + '>' + o.timezoneText + '</dt>';\r\n\t\t\thtml += '<dd class=\"ui_tpicker_timezone\" id=\"ui_tpicker_timezone_' + dp_id + '\"'\t+\r\n\t\t\t\t\t\t\t((o.showTimezone) ? '' : noDisplay) + '></dd>';\r\n\r\n\t\t\thtml += '</dl></div>';\r\n\t\t\t$tp = $(html);\r\n\r\n\t\t\t\t// if we only want time picker...\r\n\t\t\tif (o.timeOnly === true) {\r\n\t\t\t\t$tp.prepend(\r\n\t\t\t\t\t'<div class=\"ui-widget-header ui-helper-clearfix ui-corner-all\">' +\r\n\t\t\t\t\t\t'<div class=\"ui-datepicker-title\">' + o.timeOnlyTitle + '</div>' +\r\n\t\t\t\t\t'</div>');\r\n\t\t\t\t$dp.find('.ui-datepicker-header, .ui-datepicker-calendar').hide();\r\n\t\t\t}\r\n\r\n\t\t\tthis.hour_slider = $tp.find('#ui_tpicker_hour_'+ dp_id).slider({\r\n\t\t\t\torientation: \"horizontal\",\r\n\t\t\t\tvalue: this.hour,\r\n\t\t\t\tmin: o.hourMin,\r\n\t\t\t\tmax: hourMax,\r\n\t\t\t\tstep: o.stepHour,\r\n\t\t\t\tslide: function(event, ui) {\r\n\t\t\t\t\ttp_inst.hour_slider.slider( \"option\", \"value\", ui.value);\r\n\t\t\t\t\ttp_inst._onTimeChange();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// Updated by Peter Medeiros:\r\n\t\t\t// - Pass in Event and UI instance into slide function\r\n\t\t\tthis.minute_slider = $tp.find('#ui_tpicker_minute_'+ dp_id).slider({\r\n\t\t\t\torientation: \"horizontal\",\r\n\t\t\t\tvalue: this.minute,\r\n\t\t\t\tmin: o.minuteMin,\r\n\t\t\t\tmax: minMax,\r\n\t\t\t\tstep: o.stepMinute,\r\n\t\t\t\tslide: function(event, ui) {\r\n\t\t\t\t\t// update the global minute slider instance value with the current slider value\r\n\t\t\t\t\ttp_inst.minute_slider.slider( \"option\", \"value\", ui.value);\r\n\t\t\t\t\ttp_inst._onTimeChange();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tthis.second_slider = $tp.find('#ui_tpicker_second_'+ dp_id).slider({\r\n\t\t\t\torientation: \"horizontal\",\r\n\t\t\t\tvalue: this.second,\r\n\t\t\t\tmin: o.secondMin,\r\n\t\t\t\tmax: secMax,\r\n\t\t\t\tstep: o.stepSecond,\r\n\t\t\t\tslide: function(event, ui) {\r\n\t\t\t\t\ttp_inst.second_slider.slider( \"option\", \"value\", ui.value);\r\n\t\t\t\t\ttp_inst._onTimeChange();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tthis.millisec_slider = $tp.find('#ui_tpicker_millisec_'+ dp_id).slider({\r\n\t\t\t\torientation: \"horizontal\",\r\n\t\t\t\tvalue: this.millisec,\r\n\t\t\t\tmin: o.millisecMin,\r\n\t\t\t\tmax: millisecMax,\r\n\t\t\t\tstep: o.stepMillisec,\r\n\t\t\t\tslide: function(event, ui) {\r\n\t\t\t\t\ttp_inst.millisec_slider.slider( \"option\", \"value\", ui.value);\r\n\t\t\t\t\ttp_inst._onTimeChange();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tthis.timezone_select = $tp.find('#ui_tpicker_timezone_'+ dp_id).append('<select></select>').find(\"select\");\r\n\t\t\t$.fn.append.apply(this.timezone_select,\r\n\t\t\t\t$.map(o.timezoneList, function(val, idx) {\r\n\t\t\t\t\treturn $(\"<option />\")\r\n\t\t\t\t\t\t.val(typeof val == \"object\" ? val.value : val)\r\n\t\t\t\t\t\t.text(typeof val == \"object\" ? val.label : val);\r\n\t\t\t\t})\r\n\t\t\t);\r\n\t\t\tthis.timezone_select.val((typeof this.timezone != \"undefined\" && this.timezone != null && this.timezone != \"\") ? this.timezone : o.timezone);\r\n\t\t\tthis.timezone_select.change(function() {\r\n\t\t\t\ttp_inst._onTimeChange();\r\n\t\t\t});\r\n\r\n\t\t\t// Add grid functionality\r\n\t\t\tif (o.showHour && o.hourGrid > 0) {\r\n\t\t\t\tsize = 100 * hourGridSize * o.hourGrid / (hourMax - o.hourMin);\r\n\r\n\t\t\t\t$tp.find(\".ui_tpicker_hour table\").css({\r\n\t\t\t\t\twidth: size + \"%\",\r\n\t\t\t\t\tmarginLeft: (size / (-2 * hourGridSize)) + \"%\",\r\n\t\t\t\t\tborderCollapse: 'collapse'\r\n\t\t\t\t}).find(\"td\").each( function(index) {\r\n\t\t\t\t\t$(this).click(function() {\r\n\t\t\t\t\t\tvar h = $(this).html();\r\n\t\t\t\t\t\tif(o.ampm)\t{\r\n\t\t\t\t\t\t\tvar ap = h.substring(2).toLowerCase(),\r\n\t\t\t\t\t\t\t\taph = parseInt(h.substring(0,2), 10);\r\n\t\t\t\t\t\t\tif (ap == 'a') {\r\n\t\t\t\t\t\t\t\tif (aph == 12) h = 0;\r\n\t\t\t\t\t\t\t\telse h = aph;\r\n\t\t\t\t\t\t\t} else if (aph == 12) h = 12;\r\n\t\t\t\t\t\t\telse h = aph + 12;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ttp_inst.hour_slider.slider(\"option\", \"value\", h);\r\n\t\t\t\t\t\ttp_inst._onTimeChange();\r\n\t\t\t\t\t\ttp_inst._onSelectHandler();\r\n\t\t\t\t\t}).css({\r\n\t\t\t\t\t\tcursor: 'pointer',\r\n\t\t\t\t\t\twidth: (100 / hourGridSize) + '%',\r\n\t\t\t\t\t\ttextAlign: 'center',\r\n\t\t\t\t\t\toverflow: 'hidden'\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tif (o.showMinute && o.minuteGrid > 0) {\r\n\t\t\t\tsize = 100 * minuteGridSize * o.minuteGrid / (minMax - o.minuteMin);\r\n\t\t\t\t$tp.find(\".ui_tpicker_minute table\").css({\r\n\t\t\t\t\twidth: size + \"%\",\r\n\t\t\t\t\tmarginLeft: (size / (-2 * minuteGridSize)) + \"%\",\r\n\t\t\t\t\tborderCollapse: 'collapse'\r\n\t\t\t\t}).find(\"td\").each(function(index) {\r\n\t\t\t\t\t$(this).click(function() {\r\n\t\t\t\t\t\ttp_inst.minute_slider.slider(\"option\", \"value\", $(this).html());\r\n\t\t\t\t\t\ttp_inst._onTimeChange();\r\n\t\t\t\t\t\ttp_inst._onSelectHandler();\r\n\t\t\t\t\t}).css({\r\n\t\t\t\t\t\tcursor: 'pointer',\r\n\t\t\t\t\t\twidth: (100 / minuteGridSize) + '%',\r\n\t\t\t\t\t\ttextAlign: 'center',\r\n\t\t\t\t\t\toverflow: 'hidden'\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tif (o.showSecond && o.secondGrid > 0) {\r\n\t\t\t\t$tp.find(\".ui_tpicker_second table\").css({\r\n\t\t\t\t\twidth: size + \"%\",\r\n\t\t\t\t\tmarginLeft: (size / (-2 * secondGridSize)) + \"%\",\r\n\t\t\t\t\tborderCollapse: 'collapse'\r\n\t\t\t\t}).find(\"td\").each(function(index) {\r\n\t\t\t\t\t$(this).click(function() {\r\n\t\t\t\t\t\ttp_inst.second_slider.slider(\"option\", \"value\", $(this).html());\r\n\t\t\t\t\t\ttp_inst._onTimeChange();\r\n\t\t\t\t\t\ttp_inst._onSelectHandler();\r\n\t\t\t\t\t}).css({\r\n\t\t\t\t\t\tcursor: 'pointer',\r\n\t\t\t\t\t\twidth: (100 / secondGridSize) + '%',\r\n\t\t\t\t\t\ttextAlign: 'center',\r\n\t\t\t\t\t\toverflow: 'hidden'\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tif (o.showMillisec && o.millisecGrid > 0) {\r\n\t\t\t\t$tp.find(\".ui_tpicker_millisec table\").css({\r\n\t\t\t\t\twidth: size + \"%\",\r\n\t\t\t\t\tmarginLeft: (size / (-2 * millisecGridSize)) + \"%\",\r\n\t\t\t\t\tborderCollapse: 'collapse'\r\n\t\t\t\t}).find(\"td\").each(function(index) {\r\n\t\t\t\t\t$(this).click(function() {\r\n\t\t\t\t\t\ttp_inst.millisec_slider.slider(\"option\", \"value\", $(this).html());\r\n\t\t\t\t\t\ttp_inst._onTimeChange();\r\n\t\t\t\t\t\ttp_inst._onSelectHandler();\r\n\t\t\t\t\t}).css({\r\n\t\t\t\t\t\tcursor: 'pointer',\r\n\t\t\t\t\t\twidth: (100 / millisecGridSize) + '%',\r\n\t\t\t\t\t\ttextAlign: 'center',\r\n\t\t\t\t\t\toverflow: 'hidden'\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tvar $buttonPanel = $dp.find('.ui-datepicker-buttonpane');\r\n\t\t\tif ($buttonPanel.length) $buttonPanel.before($tp);\r\n\t\t\telse $dp.append($tp);\r\n\r\n\t\t\tthis.$timeObj = $tp.find('#ui_tpicker_time_'+ dp_id);\r\n\r\n\t\t\tif (this.inst !== null) {\r\n\t\t\t\tvar timeDefined = this.timeDefined;\r\n\t\t\t\tthis._onTimeChange();\r\n\t\t\t\tthis.timeDefined = timeDefined;\r\n\t\t\t}\r\n\r\n\t\t\t//Emulate datepicker onSelect behavior. Call on slidestop.\r\n\t\t\tvar onSelectDelegate = function() {\r\n\t\t\t\ttp_inst._onSelectHandler();\r\n\t\t\t};\r\n\t\t\tthis.hour_slider.bind('slidestop',onSelectDelegate);\r\n\t\t\tthis.minute_slider.bind('slidestop',onSelectDelegate);\r\n\t\t\tthis.second_slider.bind('slidestop',onSelectDelegate);\r\n\t\t\tthis.millisec_slider.bind('slidestop',onSelectDelegate);\r\n\t\t}\r\n\t},\r\n\r\n\t//########################################################################\r\n\t// This function tries to limit the ability to go outside the\r\n\t// min/max date range\r\n\t//########################################################################\r\n\t_limitMinMaxDateTime: function(dp_inst, adjustSliders){\r\n\t\tvar o = this._defaults,\r\n\t\t\tdp_date = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay);\r\n\r\n\t\tif(!this._defaults.showTimepicker) return; // No time so nothing to check here\r\n\r\n\t\tif($.datepicker._get(dp_inst, 'minDateTime') !== null && $.datepicker._get(dp_inst, 'minDateTime') !== undefined && dp_date){\r\n\t\t\tvar minDateTime = $.datepicker._get(dp_inst, 'minDateTime'),\r\n\t\t\t\tminDateTimeDate = new Date(minDateTime.getFullYear(), minDateTime.getMonth(), minDateTime.getDate(), 0, 0, 0, 0);\r\n\r\n\t\t\tif(this.hourMinOriginal === null || this.minuteMinOriginal === null || this.secondMinOriginal === null || this.millisecMinOriginal === null){\r\n\t\t\t\tthis.hourMinOriginal = o.hourMin;\r\n\t\t\t\tthis.minuteMinOriginal = o.minuteMin;\r\n\t\t\t\tthis.secondMinOriginal = o.secondMin;\r\n\t\t\t\tthis.millisecMinOriginal = o.millisecMin;\r\n\t\t\t}\r\n\r\n\t\t\tif(dp_inst.settings.timeOnly || minDateTimeDate.getTime() == dp_date.getTime()) {\r\n\t\t\t\tthis._defaults.hourMin = minDateTime.getHours();\r\n\t\t\t\tif (this.hour <= this._defaults.hourMin) {\r\n\t\t\t\t\tthis.hour = this._defaults.hourMin;\r\n\t\t\t\t\tthis._defaults.minuteMin = minDateTime.getMinutes();\r\n\t\t\t\t\tif (this.minute <= this._defaults.minuteMin) {\r\n\t\t\t\t\t\tthis.minute = this._defaults.minuteMin;\r\n\t\t\t\t\t\tthis._defaults.secondMin = minDateTime.getSeconds();\r\n\t\t\t\t\t} else if (this.second <= this._defaults.secondMin){\r\n\t\t\t\t\t\tthis.second = this._defaults.secondMin;\r\n\t\t\t\t\t\tthis._defaults.millisecMin = minDateTime.getMilliseconds();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif(this.millisec < this._defaults.millisecMin)\r\n\t\t\t\t\t\t\tthis.millisec = this._defaults.millisecMin;\r\n\t\t\t\t\t\tthis._defaults.millisecMin = this.millisecMinOriginal;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._defaults.minuteMin = this.minuteMinOriginal;\r\n\t\t\t\t\tthis._defaults.secondMin = this.secondMinOriginal;\r\n\t\t\t\t\tthis._defaults.millisecMin = this.millisecMinOriginal;\r\n\t\t\t\t}\r\n\t\t\t}else{\r\n\t\t\t\tthis._defaults.hourMin = this.hourMinOriginal;\r\n\t\t\t\tthis._defaults.minuteMin = this.minuteMinOriginal;\r\n\t\t\t\tthis._defaults.secondMin = this.secondMinOriginal;\r\n\t\t\t\tthis._defaults.millisecMin = this.millisecMinOriginal;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif($.datepicker._get(dp_inst, 'maxDateTime') !== null && $.datepicker._get(dp_inst, 'maxDateTime') !== undefined && dp_date){\r\n\t\t\tvar maxDateTime = $.datepicker._get(dp_inst, 'maxDateTime'),\r\n\t\t\t\tmaxDateTimeDate = new Date(maxDateTime.getFullYear(), maxDateTime.getMonth(), maxDateTime.getDate(), 0, 0, 0, 0);\r\n\r\n\t\t\tif(this.hourMaxOriginal === null || this.minuteMaxOriginal === null || this.secondMaxOriginal === null){\r\n\t\t\t\tthis.hourMaxOriginal = o.hourMax;\r\n\t\t\t\tthis.minuteMaxOriginal = o.minuteMax;\r\n\t\t\t\tthis.secondMaxOriginal = o.secondMax;\r\n\t\t\t\tthis.millisecMaxOriginal = o.millisecMax;\r\n\t\t\t}\r\n\r\n\t\t\tif(dp_inst.settings.timeOnly || maxDateTimeDate.getTime() == dp_date.getTime()){\r\n\t\t\t\tthis._defaults.hourMax = maxDateTime.getHours();\r\n\t\t\t\tif (this.hour >= this._defaults.hourMax) {\r\n\t\t\t\t\tthis.hour = this._defaults.hourMax;\r\n\t\t\t\t\tthis._defaults.minuteMax = maxDateTime.getMinutes();\r\n\t\t\t\t\tif (this.minute >= this._defaults.minuteMax) {\r\n\t\t\t\t\t\tthis.minute = this._defaults.minuteMax;\r\n\t\t\t\t\t\tthis._defaults.secondMax = maxDateTime.getSeconds();\r\n\t\t\t\t\t} else if (this.second >= this._defaults.secondMax) {\r\n\t\t\t\t\t\tthis.second = this._defaults.secondMax;\r\n\t\t\t\t\t\tthis._defaults.millisecMax = maxDateTime.getMilliseconds();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif(this.millisec > this._defaults.millisecMax) this.millisec = this._defaults.millisecMax;\r\n\t\t\t\t\t\tthis._defaults.millisecMax = this.millisecMaxOriginal;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis._defaults.minuteMax = this.minuteMaxOriginal;\r\n\t\t\t\t\tthis._defaults.secondMax = this.secondMaxOriginal;\r\n\t\t\t\t\tthis._defaults.millisecMax = this.millisecMaxOriginal;\r\n\t\t\t\t}\r\n\t\t\t}else{\r\n\t\t\t\tthis._defaults.hourMax = this.hourMaxOriginal;\r\n\t\t\t\tthis._defaults.minuteMax = this.minuteMaxOriginal;\r\n\t\t\t\tthis._defaults.secondMax = this.secondMaxOriginal;\r\n\t\t\t\tthis._defaults.millisecMax = this.millisecMaxOriginal;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif(adjustSliders !== undefined && adjustSliders === true){\r\n\t\t\tvar hourMax = (this._defaults.hourMax - ((this._defaults.hourMax - this._defaults.hourMin) % this._defaults.stepHour)).toFixed(0),\r\n minMax = (this._defaults.minuteMax - ((this._defaults.minuteMax - this._defaults.minuteMin) % this._defaults.stepMinute)).toFixed(0),\r\n secMax = (this._defaults.secondMax - ((this._defaults.secondMax - this._defaults.secondMin) % this._defaults.stepSecond)).toFixed(0),\r\n\t\t\t\tmillisecMax = (this._defaults.millisecMax - ((this._defaults.millisecMax - this._defaults.millisecMin) % this._defaults.stepMillisec)).toFixed(0);\r\n\r\n\t\t\tif(this.hour_slider)\r\n\t\t\t\tthis.hour_slider.slider(\"option\", { min: this._defaults.hourMin, max: hourMax }).slider('value', this.hour);\r\n\t\t\tif(this.minute_slider)\r\n\t\t\t\tthis.minute_slider.slider(\"option\", { min: this._defaults.minuteMin, max: minMax }).slider('value', this.minute);\r\n\t\t\tif(this.second_slider)\r\n\t\t\t\tthis.second_slider.slider(\"option\", { min: this._defaults.secondMin, max: secMax }).slider('value', this.second);\r\n\t\t\tif(this.millisec_slider)\r\n\t\t\t\tthis.millisec_slider.slider(\"option\", { min: this._defaults.millisecMin, max: millisecMax }).slider('value', this.millisec);\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t\r\n\t//########################################################################\r\n\t// when a slider moves, set the internal time...\r\n\t// on time change is also called when the time is updated in the text field\r\n\t//########################################################################\r\n\t_onTimeChange: function() {\r\n\t\tvar hour = (this.hour_slider) ? this.hour_slider.slider('value') : false,\r\n\t\t\tminute = (this.minute_slider) ? this.minute_slider.slider('value') : false,\r\n\t\t\tsecond = (this.second_slider) ? this.second_slider.slider('value') : false,\r\n\t\t\tmillisec = (this.millisec_slider) ? this.millisec_slider.slider('value') : false,\r\n\t\t\ttimezone = (this.timezone_select) ? this.timezone_select.val() : false,\r\n\t\t\to = this._defaults;\r\n\r\n\t\tif (typeof(hour) == 'object') hour = false;\r\n\t\tif (typeof(minute) == 'object') minute = false;\r\n\t\tif (typeof(second) == 'object') second = false;\r\n\t\tif (typeof(millisec) == 'object') millisec = false;\r\n\t\tif (typeof(timezone) == 'object') timezone = false;\r\n\r\n\t\tif (hour !== false) hour = parseInt(hour,10);\r\n\t\tif (minute !== false) minute = parseInt(minute,10);\r\n\t\tif (second !== false) second = parseInt(second,10);\r\n\t\tif (millisec !== false) millisec = parseInt(millisec,10);\r\n\r\n\t\tvar ampm = o[hour < 12 ? 'amNames' : 'pmNames'][0];\r\n\r\n\t\t// If the update was done in the input field, the input field should not be updated.\r\n\t\t// If the update was done using the sliders, update the input field.\r\n\t\tvar hasChanged = (hour != this.hour || minute != this.minute\r\n\t\t\t\t|| second != this.second || millisec != this.millisec\r\n\t\t\t\t|| (this.ampm.length > 0\r\n\t\t\t\t && (hour < 12) != ($.inArray(this.ampm.toUpperCase(), this.amNames) !== -1))\r\n\t\t\t\t|| timezone != this.timezone);\r\n\t\t\r\n\t\tif (hasChanged) {\r\n\r\n\t\t\tif (hour !== false)this.hour = hour;\r\n\t\t\tif (minute !== false) this.minute = minute;\r\n\t\t\tif (second !== false) this.second = second;\r\n\t\t\tif (millisec !== false) this.millisec = millisec;\r\n\t\t\tif (timezone !== false) this.timezone = timezone;\r\n\t\t\t\r\n\t\t\tif (!this.inst) this.inst = $.datepicker._getInst(this.$input[0]);\r\n\t\t\t\r\n\t\t\tthis._limitMinMaxDateTime(this.inst, true);\r\n\t\t}\r\n\t\tif (o.ampm) this.ampm = ampm;\r\n\t\t\r\n\t\tthis._formatTime();\r\n\t\tif (this.$timeObj) this.$timeObj.text(this.formattedTime + o.timeSuffix);\r\n\t\tthis.timeDefined = true;\r\n\t\tif (hasChanged) this._updateDateTime();\r\n\t},\r\n \r\n\t//########################################################################\r\n\t// call custom onSelect. \r\n\t// bind to sliders slidestop, and grid click.\r\n\t//########################################################################\r\n\t_onSelectHandler: function() {\r\n\t\tvar onSelect = this._defaults.onSelect;\r\n\t\tvar inputEl = this.$input ? this.$input[0] : null;\r\n\t\tif (onSelect && inputEl) {\r\n\t\t\tonSelect.apply(inputEl, [this.formattedDateTime, this]);\r\n\t\t}\r\n\t},\r\n\r\n\t//########################################################################\r\n\t// format the time all pretty...\r\n\t//########################################################################\r\n\t_formatTime: function(time, format, ampm) {\r\n\t\tif (ampm == undefined) ampm = this._defaults.ampm;\r\n\t\ttime = time || { hour: this.hour, minute: this.minute, second: this.second, millisec: this.millisec, ampm: this.ampm, timezone: this.timezone };\r\n\t\tvar tmptime = (format || this._defaults.timeFormat).toString();\r\n\r\n\t\tvar hour = parseInt(time.hour, 10);\r\n\t\tif (ampm) {\r\n\t\t\tif (!$.inArray(time.ampm.toUpperCase(), this.amNames) !== -1)\r\n\t\t\t\thour = hour % 12;\r\n\t\t\tif (hour === 0)\r\n\t\t\t\thour = 12;\r\n\t\t}\r\n\t\ttmptime = tmptime.replace(/(?:hh?|mm?|ss?|[tT]{1,2}|[lz])/g, function(match) {\r\n\t\t\tswitch (match.toLowerCase()) {\r\n\t\t\t\tcase 'hh': return ('0' + hour).slice(-2);\r\n\t\t\t\tcase 'h': return hour;\r\n\t\t\t\tcase 'mm': return ('0' + time.minute).slice(-2);\r\n\t\t\t\tcase 'm': return time.minute;\r\n\t\t\t\tcase 'ss': return ('0' + time.second).slice(-2);\r\n\t\t\t\tcase 's': return time.second;\r\n\t\t\t\tcase 'l': return ('00' + time.millisec).slice(-3);\r\n\t\t\t\tcase 'z': return time.timezone;\r\n\t\t\t\tcase 't': case 'tt':\r\n\t\t\t\t\tif (ampm) {\r\n\t\t\t\t\t\tvar _ampm = time.ampm;\r\n\t\t\t\t\t\tif (match.length == 1)\r\n\t\t\t\t\t\t\t_ampm = _ampm.charAt(0);\r\n\t\t\t\t\t\treturn match.charAt(0) == 'T' ? _ampm.toUpperCase() : _ampm.toLowerCase();\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn '';\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (arguments.length) return tmptime;\r\n\t\telse this.formattedTime = tmptime;\r\n\t},\r\n\r\n\t//########################################################################\r\n\t// update our input with the new date time..\r\n\t//########################################################################\r\n\t_updateDateTime: function(dp_inst) {\r\n\t\tdp_inst = this.inst || dp_inst,\r\n\t\t\tdt = new Date(dp_inst.selectedYear, dp_inst.selectedMonth, dp_inst.selectedDay),\r\n\t\t\tdateFmt = $.datepicker._get(dp_inst, 'dateFormat'),\r\n\t\t\tformatCfg = $.datepicker._getFormatConfig(dp_inst),\r\n\t\t\ttimeAvailable = dt !== null && this.timeDefined;\r\n\t\tthis.formattedDate = $.datepicker.formatDate(dateFmt, (dt === null ? new Date() : dt), formatCfg);\r\n\t\tvar formattedDateTime = this.formattedDate;\r\n\t\tif (dp_inst.lastVal !== undefined && (dp_inst.lastVal.length > 0 && this.$input.val().length === 0))\r\n\t\t\treturn;\r\n\r\n\t\tif (this._defaults.timeOnly === true) {\r\n\t\t\tformattedDateTime = this.formattedTime;\r\n\t\t} else if (this._defaults.timeOnly !== true && (this._defaults.alwaysSetTime || timeAvailable)) {\r\n\t\t\tformattedDateTime += this._defaults.separator + this.formattedTime + this._defaults.timeSuffix;\r\n\t\t}\r\n\r\n\t\tthis.formattedDateTime = formattedDateTime;\r\n\r\n\t\tif(!this._defaults.showTimepicker) {\r\n\t\t\tthis.$input.val(this.formattedDate);\r\n\t\t} else if (this.$altInput && this._defaults.altFieldTimeOnly === true) {\r\n\t\t\tthis.$altInput.val(this.formattedTime);\r\n\t\t\tthis.$input.val(this.formattedDate);\r\n\t\t} else if(this.$altInput) {\r\n\t\t\tthis.$altInput.val(formattedDateTime);\r\n\t\t\tthis.$input.val(formattedDateTime);\r\n\t\t} else {\r\n\t\t\tthis.$input.val(formattedDateTime);\r\n\t\t}\r\n\t\t\r\n\t\tthis.$input.trigger(\"change\");\r\n\t}\r\n\r\n});\r\n\r\n$.fn.extend({\r\n\t//########################################################################\r\n\t// shorthand just to use timepicker..\r\n\t//########################################################################\r\n\ttimepicker: function(o) {\r\n\t\to = o || {};\r\n\t\tvar tmp_args = arguments;\r\n\r\n\t\tif (typeof o == 'object') tmp_args[0] = $.extend(o, { timeOnly: true });\r\n\r\n\t\treturn $(this).each(function() {\r\n\t\t\t$.fn.datetimepicker.apply($(this), tmp_args);\r\n\t\t});\r\n\t},\r\n\r\n\t//########################################################################\r\n\t// extend timepicker to datepicker\r\n\t//########################################################################\r\n\tdatetimepicker: function(o) {\r\n\t\to = o || {};\r\n\t\tvar $input = this,\r\n\t\ttmp_args = arguments;\r\n\r\n\t\tif (typeof(o) == 'string'){\r\n\t\t\tif(o == 'getDate') \r\n\t\t\t\treturn $.fn.datepicker.apply($(this[0]), tmp_args);\r\n\t\t\telse \r\n\t\t\t\treturn this.each(function() {\r\n\t\t\t\t\tvar $t = $(this);\r\n\t\t\t\t\t$t.datepicker.apply($t, tmp_args);\r\n\t\t\t\t});\r\n\t\t}\r\n\t\telse\r\n\t\t\treturn this.each(function() {\r\n\t\t\t\tvar $t = $(this);\r\n\t\t\t\t$t.datepicker($.timepicker._newInst($t, o)._defaults);\r\n\t\t\t});\r\n\t}\r\n});\r\n\r\n//########################################################################\r\n// the bad hack :/ override datepicker so it doesnt close on select\r\n// inspired: http://stackoverflow.com/questions/1252512/jquery-datepicker-prevent-closing-picker-when-clicking-a-date/1762378#1762378\r\n//########################################################################\r\n$.datepicker._base_selectDate = $.datepicker._selectDate;\r\n$.datepicker._selectDate = function (id, dateStr) {\r\n\tvar inst = this._getInst($(id)[0]),\r\n\t\ttp_inst = this._get(inst, 'timepicker');\r\n\r\n\tif (tp_inst) {\r\n\t\ttp_inst._limitMinMaxDateTime(inst, true);\r\n\t\tinst.inline = inst.stay_open = true;\r\n\t\t//This way the onSelect handler called from calendarpicker get the full dateTime\r\n\t\tthis._base_selectDate(id, dateStr);\r\n\t\tinst.inline = inst.stay_open = false;\r\n\t\tthis._notifyChange(inst);\r\n\t\tthis._updateDatepicker(inst);\r\n\t}\r\n\telse this._base_selectDate(id, dateStr);\r\n};\r\n\r\n//#############################################################################################\r\n// second bad hack :/ override datepicker so it triggers an event when changing the input field\r\n// and does not redraw the datepicker on every selectDate event\r\n//#############################################################################################\r\n$.datepicker._base_updateDatepicker = $.datepicker._updateDatepicker;\r\n$.datepicker._updateDatepicker = function(inst) {\r\n\r\n\t// don't popup the datepicker if there is another instance already opened\r\n\tvar input = inst.input[0];\r\n\tif($.datepicker._curInst &&\r\n\t $.datepicker._curInst != inst &&\r\n\t $.datepicker._datepickerShowing &&\r\n\t $.datepicker._lastInput != input) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (typeof(inst.stay_open) !== 'boolean' || inst.stay_open === false) {\r\n\t\t\t\t\r\n\t\tthis._base_updateDatepicker(inst);\r\n\t\t\r\n\t\t// Reload the time control when changing something in the input text field.\r\n\t\tvar tp_inst = this._get(inst, 'timepicker');\r\n\t\tif(tp_inst) tp_inst._addTimePicker(inst);\r\n\t}\r\n};\r\n\r\n//#######################################################################################\r\n// third bad hack :/ override datepicker so it allows spaces and colon in the input field\r\n//#######################################################################################\r\n$.datepicker._base_doKeyPress = $.datepicker._doKeyPress;\r\n$.datepicker._doKeyPress = function(event) {\r\n\tvar inst = $.datepicker._getInst(event.target),\r\n\t\ttp_inst = $.datepicker._get(inst, 'timepicker');\r\n\r\n\tif (tp_inst) {\r\n\t\tif ($.datepicker._get(inst, 'constrainInput')) {\r\n\t\t\tvar ampm = tp_inst._defaults.ampm,\r\n\t\t\t\tdateChars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat')),\r\n\t\t\t\tdatetimeChars = tp_inst._defaults.timeFormat.toString()\r\n\t\t\t\t\t\t\t\t.replace(/[hms]/g, '')\r\n\t\t\t\t\t\t\t\t.replace(/TT/g, ampm ? 'APM' : '')\r\n\t\t\t\t\t\t\t\t.replace(/Tt/g, ampm ? 'AaPpMm' : '')\r\n\t\t\t\t\t\t\t\t.replace(/tT/g, ampm ? 'AaPpMm' : '')\r\n\t\t\t\t\t\t\t\t.replace(/T/g, ampm ? 'AP' : '')\r\n\t\t\t\t\t\t\t\t.replace(/tt/g, ampm ? 'apm' : '')\r\n\t\t\t\t\t\t\t\t.replace(/t/g, ampm ? 'ap' : '') +\r\n\t\t\t\t\t\t\t\t\" \" +\r\n\t\t\t\t\t\t\t\ttp_inst._defaults.separator +\r\n\t\t\t\t\t\t\t\ttp_inst._defaults.timeSuffix +\r\n\t\t\t\t\t\t\t\t(tp_inst._defaults.showTimezone ? tp_inst._defaults.timezoneList.join('') : '') +\r\n\t\t\t\t\t\t\t\t(tp_inst._defaults.amNames.join('')) +\r\n\t\t\t\t\t\t\t\t(tp_inst._defaults.pmNames.join('')) +\r\n\t\t\t\t\t\t\t\tdateChars,\r\n\t\t\t\tchr = String.fromCharCode(event.charCode === undefined ? event.keyCode : event.charCode);\r\n\t\t\treturn event.ctrlKey || (chr < ' ' || !dateChars || datetimeChars.indexOf(chr) > -1);\r\n\t\t}\r\n\t}\r\n\t\r\n\treturn $.datepicker._base_doKeyPress(event);\r\n};\r\n\r\n//#######################################################################################\r\n// Override key up event to sync manual input changes.\r\n//#######################################################################################\r\n$.datepicker._base_doKeyUp = $.datepicker._doKeyUp;\r\n$.datepicker._doKeyUp = function (event) {\r\n\tvar inst = $.datepicker._getInst(event.target),\r\n\t\ttp_inst = $.datepicker._get(inst, 'timepicker');\r\n\r\n\tif (tp_inst) {\r\n\t\tif (tp_inst._defaults.timeOnly && (inst.input.val() != inst.lastVal)) {\r\n\t\t\ttry {\r\n\t\t\t\t$.datepicker._updateDatepicker(inst);\r\n\t\t\t}\r\n\t\t\tcatch (err) {\r\n\t\t\t\t$.datepicker.log(err);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn $.datepicker._base_doKeyUp(event);\r\n};\r\n\r\n//#######################################################################################\r\n// override \"Today\" button to also grab the time.\r\n//#######################################################################################\r\n/*$.datepicker._base_gotoToday = $.datepicker._gotoToday;\r\n$.datepicker._gotoToday = function(id) {\r\n\tvar inst = this._getInst($(id)[0]),\r\n\t\t$dp = inst.dpDiv;\r\n\tthis._base_gotoToday(id);\r\n\t//var now = new Date();\r\n\tvar now = $ServerDate != null ? $ServerDate : new Date() ;\r\n\tvar tp_inst = this._get(inst, 'timepicker');\r\n\tif (tp_inst._defaults.showTimezone && tp_inst.timezone_select) {\r\n\t\tvar tzoffset = now.getTimezoneOffset(); // If +0100, returns -60\r\n\t\tvar tzsign = tzoffset > 0 ? '-' : '+';\r\n\t\ttzoffset = Math.abs(tzoffset);\r\n\t\tvar tzmin = tzoffset % 60\r\n\t\ttzoffset = tzsign + ('0' + (tzoffset - tzmin) / 60).slice(-2) + ('0' + tzmin).slice(-2);\r\n\t\tif (tp_inst._defaults.timezoneIso8609)\r\n\t\t\ttzoffset = tzoffset.substring(0, 3) + ':' + tzoffset.substring(3);\r\n\t\ttp_inst.timezone_select.val(tzoffset);\r\n\t}\r\n\tthis._setTime(inst, now);\r\n\t$( '.ui-datepicker-today', $dp).click(); \r\n};*/\r\n\r\n//#######################################################################################\r\n// Disable & enable the Time in the datetimepicker\r\n//#######################################################################################\r\n$.datepicker._disableTimepickerDatepicker = function(target, date, withDate) {\r\n\tvar inst = this._getInst(target),\r\n\ttp_inst = this._get(inst, 'timepicker');\r\n\t$(target).datepicker('getDate'); // Init selected[Year|Month|Day]\r\n\tif (tp_inst) {\r\n\t\ttp_inst._defaults.showTimepicker = false;\r\n\t\ttp_inst._updateDateTime(inst);\r\n\t}\r\n};\r\n\r\n$.datepicker._enableTimepickerDatepicker = function(target, date, withDate) {\r\n\tvar inst = this._getInst(target),\r\n\ttp_inst = this._get(inst, 'timepicker');\r\n\t$(target).datepicker('getDate'); // Init selected[Year|Month|Day]\r\n\tif (tp_inst) {\r\n\t\ttp_inst._defaults.showTimepicker = true;\r\n\t\ttp_inst._addTimePicker(inst); // Could be disabled on page load\r\n\t\ttp_inst._updateDateTime(inst);\r\n\t}\r\n};\r\n\r\n//#######################################################################################\r\n// Create our own set time function\r\n//#######################################################################################\r\n$.datepicker._setTime = function(inst, date) {\r\n\tvar tp_inst = this._get(inst, 'timepicker');\r\n\tif (tp_inst) {\r\n\t\tvar defaults = tp_inst._defaults,\r\n\t\t\t// calling _setTime with no date sets time to defaults\r\n\t\t\thour = date ? date.getHours() : defaults.hour,\r\n\t\t\tminute = date ? date.getMinutes() : defaults.minute,\r\n\t\t\tsecond = date ? date.getSeconds() : defaults.second,\r\n\t\t\tmillisec = date ? date.getMilliseconds() : defaults.millisec;\r\n\r\n\t\t//check if within min/max times..\r\n\t\tif ((hour < defaults.hourMin || hour > defaults.hourMax) || (minute < defaults.minuteMin || minute > defaults.minuteMax) || (second < defaults.secondMin || second > defaults.secondMax) || (millisec < defaults.millisecMin || millisec > defaults.millisecMax)) {\r\n\t\t\thour = defaults.hourMin;\r\n\t\t\tminute = defaults.minuteMin;\r\n\t\t\tsecond = defaults.secondMin;\r\n\t\t\tmillisec = defaults.millisecMin;\r\n\t\t}\r\n\r\n\t\ttp_inst.hour = hour;\r\n\t\ttp_inst.minute = minute;\r\n\t\ttp_inst.second = second;\r\n\t\ttp_inst.millisec = millisec;\r\n\r\n\t\tif (tp_inst.hour_slider) tp_inst.hour_slider.slider('value', hour);\r\n\t\tif (tp_inst.minute_slider) tp_inst.minute_slider.slider('value', minute);\r\n\t\tif (tp_inst.second_slider) tp_inst.second_slider.slider('value', second);\r\n\t\tif (tp_inst.millisec_slider) tp_inst.millisec_slider.slider('value', millisec);\r\n\r\n\t\ttp_inst._onTimeChange();\r\n\t\ttp_inst._updateDateTime(inst);\r\n\t}\r\n};\r\n\r\n//#######################################################################################\r\n// Create new public method to set only time, callable as $().datepicker('setTime', date)\r\n//#######################################################################################\r\n$.datepicker._setTimeDatepicker = function(target, date, withDate) {\r\n\tvar inst = this._getInst(target),\r\n\t\ttp_inst = this._get(inst, 'timepicker');\r\n\r\n\tif (tp_inst) {\r\n\t\tthis._setDateFromField(inst);\r\n\t\tvar tp_date;\r\n\t\tif (date) {\r\n\t\t\tif (typeof date == \"string\") {\r\n\t\t\t\ttp_inst._parseTime(date, withDate);\r\n\t\t\t\ttp_date = new Date();\r\n\t\t\t\ttp_date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);\r\n\t\t\t}\r\n\t\t\telse tp_date = new Date(date.getTime());\r\n\t\t\tif (tp_date.toString() == 'Invalid Date') tp_date = undefined;\r\n\t\t\tthis._setTime(inst, tp_date);\r\n\t\t}\r\n\t}\r\n\r\n};\r\n\r\n//#######################################################################################\r\n// override setDate() to allow setting time too within Date object\r\n//#######################################################################################\r\n$.datepicker._base_setDateDatepicker = $.datepicker._setDateDatepicker;\r\n$.datepicker._setDateDatepicker = function(target, date) {\r\n\tvar inst = this._getInst(target),\r\n\ttp_date = (date instanceof Date) ? new Date(date.getTime()) : date;\r\n\r\n\tthis._updateDatepicker(inst);\r\n\tthis._base_setDateDatepicker.apply(this, arguments);\r\n\tthis._setTimeDatepicker(target, tp_date, true);\r\n};\r\n\r\n//#######################################################################################\r\n// override getDate() to allow getting time too within Date object\r\n//#######################################################################################\r\n$.datepicker._base_getDateDatepicker = $.datepicker._getDateDatepicker;\r\n$.datepicker._getDateDatepicker = function(target, noDefault) {\r\n\tvar inst = this._getInst(target),\r\n\t\ttp_inst = this._get(inst, 'timepicker');\r\n\r\n\tif (tp_inst) {\r\n\t\tthis._setDateFromField(inst, noDefault);\r\n\t\tvar date = this._getDate(inst);\r\n\t\tif (date && tp_inst._parseTime($(target).val(), tp_inst.timeOnly)) date.setHours(tp_inst.hour, tp_inst.minute, tp_inst.second, tp_inst.millisec);\r\n\t\treturn date;\r\n\t}\r\n\treturn this._base_getDateDatepicker(target, noDefault);\r\n};\r\n\r\n//#######################################################################################\r\n// override parseDate() because UI 1.8.14 throws an error about \"Extra characters\"\r\n// An option in datapicker to ignore extra format characters would be nicer.\r\n//#######################################################################################\r\n$.datepicker._base_parseDate = $.datepicker.parseDate;\r\n$.datepicker.parseDate = function(format, value, settings) {\r\n\tvar date;\r\n\ttry {\r\n\t\tdate = this._base_parseDate(format, value, settings);\r\n\t} catch (err) {\r\n\t\t// Hack! The error message ends with a colon, a space, and\r\n\t\t// the \"extra\" characters. We rely on that instead of\r\n\t\t// attempting to perfectly reproduce the parsing algorithm.\r\n\t\tdate = this._base_parseDate(format, value.substring(0,value.length-(err.length-err.indexOf(':')-2)), settings);\r\n\t}\r\n\treturn date;\r\n};\r\n\r\n//#######################################################################################\r\n// override formatDate to set date with time to the input\r\n//#######################################################################################\r\n$.datepicker._base_formatDate=$.datepicker._formatDate;\r\n$.datepicker._formatDate = function(inst, day, month, year){\r\n\tvar tp_inst = this._get(inst, 'timepicker');\r\n\tif(tp_inst)\r\n\t{\r\n\t\tif(day)\r\n\t\t\tvar b = this._base_formatDate(inst, day, month, year);\r\n\t\ttp_inst._updateDateTime();\t\r\n\t\treturn tp_inst.$input.val();\r\n\t}\r\n\treturn this._base_formatDate(inst);\r\n}\r\n\r\n//#######################################################################################\r\n// override options setter to add time to maxDate(Time) and minDate(Time). MaxDate\r\n//#######################################################################################\r\n$.datepicker._base_optionDatepicker = $.datepicker._optionDatepicker;\r\n$.datepicker._optionDatepicker = function(target, name, value) {\r\n\tvar inst = this._getInst(target),\r\n\t\ttp_inst = this._get(inst, 'timepicker');\r\n\tif (tp_inst) {\r\n\t\tvar min,max,onselect;\r\n\t\tif (typeof name == 'string') { // if min/max was set with the string\r\n\t\t\tif (name==='minDate' || name==='minDateTime' )\r\n\t\t\t\tmin = value;\r\n\t\t\telse if (name==='maxDate' || name==='maxDateTime')\r\n\t\t\t\tmax = value;\r\n\t\t\telse if (name==='onSelect')\r\n\t\t\t\tonselect=value;\r\n\t\t} else if (typeof name == 'object') { //if min/max was set with the JSON\r\n\t\t\tif(name.minDate)\r\n\t\t\t\tmin = name.minDate;\r\n\t\t\telse if (name.minDateTime)\r\n\t\t\t\tmin = name.minDateTime;\r\n\t\t\telse if (name.maxDate)\r\n\t\t\t\tmax = name.maxDate;\r\n\t\t\telse if (name.maxDateTime)\r\n\t\t\t\tmax = name.maxDateTime;\r\n\t\t}\r\n\t\tif(min){ //if min was set\r\n\t\t\tif(min==0)\r\n\t\t\t\tmin=new Date();\r\n\t\t\telse\r\n\t\t\t\tmin= new Date(min);\r\n\t\t\t\r\n\t\t\ttp_inst._defaults.minDate = min;\r\n\t\t\ttp_inst._defaults.minDateTime = min;\r\n\t\t} else if (max){ //if max was set\r\n\t\t\tif(max==0)\r\n\t\t\t\tmax=new Date();\r\n\t\t\telse\r\n\t\t\t\tmax= new Date(max);\r\n\t\t\ttp_inst._defaults.maxDate = max;\r\n\t\t\ttp_inst._defaults.maxDateTime = max;\r\n\t\t}\r\n\t\telse if (onselect)\r\n\t\t\ttp_inst._defaults.onSelect=onselect;\r\n\t}\r\n\tthis._base_optionDatepicker(target, name, value);\r\n};\r\n\r\n//#######################################################################################\r\n// jQuery extend now ignores nulls!\r\n//#######################################################################################\r\nfunction extendRemove(target, props) {\r\n\t$.extend(target, props);\r\n\tfor (var name in props)\r\n\t\tif (props[name] === null || props[name] === undefined)\r\n\t\t\ttarget[name] = props[name];\r\n\treturn target;\r\n}\r\n\r\n$.timepicker = new Timepicker(); // singleton instance\r\n$.timepicker.version = \"0.9.7\";\r\n\r\n})(jQuery);\r\n\r\n","//! moment.js\r\n//! version : 2.7.0\r\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\r\n//! license : MIT\r\n//! momentjs.com\r\n(function(a){function b(a,b,c){switch(arguments.length){case 2:return null!=a?a:b;case 3:return null!=a?a:null!=b?b:c;default:throw new Error(\"Implement me\")}}function c(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function d(a,b){function c(){mb.suppressDeprecationWarnings===!1&&\"undefined\"!=typeof console&&console.warn&&console.warn(\"Deprecation warning: \"+a)}var d=!0;return j(function(){return d&&(c(),d=!1),b.apply(this,arguments)},b)}function e(a,b){return function(c){return m(a.call(this,c),b)}}function f(a,b){return function(c){return this.lang().ordinal(a.call(this,c),b)}}function g(){}function h(a){z(a),j(this,a)}function i(a){var b=s(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._bubble()}function j(a,b){for(var c in b)b.hasOwnProperty(c)&&(a[c]=b[c]);return b.hasOwnProperty(\"toString\")&&(a.toString=b.toString),b.hasOwnProperty(\"valueOf\")&&(a.valueOf=b.valueOf),a}function k(a){var b,c={};for(b in a)a.hasOwnProperty(b)&&Ab.hasOwnProperty(b)&&(c[b]=a[b]);return c}function l(a){return 0>a?Math.ceil(a):Math.floor(a)}function m(a,b,c){for(var d=\"\"+Math.abs(a),e=a>=0;d.length<b;)d=\"0\"+d;return(e?c?\"+\":\"\":\"-\")+d}function n(a,b,c,d){var e=b._milliseconds,f=b._days,g=b._months;d=null==d?!0:d,e&&a._d.setTime(+a._d+e*c),f&&hb(a,\"Date\",gb(a,\"Date\")+f*c),g&&fb(a,gb(a,\"Month\")+g*c),d&&mb.updateOffset(a,f||g)}function o(a){return\"[object Array]\"===Object.prototype.toString.call(a)}function p(a){return\"[object Date]\"===Object.prototype.toString.call(a)||a instanceof Date}function q(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;e>d;d++)(c&&a[d]!==b[d]||!c&&u(a[d])!==u(b[d]))&&g++;return g+f}function r(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,\"$1\");a=bc[a]||cc[b]||b}return a}function s(a){var b,c,d={};for(c in a)a.hasOwnProperty(c)&&(b=r(c),b&&(d[b]=a[c]));return d}function t(b){var c,d;if(0===b.indexOf(\"week\"))c=7,d=\"day\";else{if(0!==b.indexOf(\"month\"))return;c=12,d=\"month\"}mb[b]=function(e,f){var g,h,i=mb.fn._lang[b],j=[];if(\"number\"==typeof e&&(f=e,e=a),h=function(a){var b=mb().utc().set(d,a);return i.call(mb.fn._lang,b,e||\"\")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function u(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function v(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function w(a,b,c){return bb(mb([a,11,31+b-c]),b,c).week}function x(a){return y(a)?366:365}function y(a){return a%4===0&&a%100!==0||a%400===0}function z(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[tb]<0||a._a[tb]>11?tb:a._a[ub]<1||a._a[ub]>v(a._a[sb],a._a[tb])?ub:a._a[vb]<0||a._a[vb]>23?vb:a._a[wb]<0||a._a[wb]>59?wb:a._a[xb]<0||a._a[xb]>59?xb:a._a[yb]<0||a._a[yb]>999?yb:-1,a._pf._overflowDayOfYear&&(sb>b||b>ub)&&(b=ub),a._pf.overflow=b)}function A(a){return null==a._isValid&&(a._isValid=!isNaN(a._d.getTime())&&a._pf.overflow<0&&!a._pf.empty&&!a._pf.invalidMonth&&!a._pf.nullInput&&!a._pf.invalidFormat&&!a._pf.userInvalidated,a._strict&&(a._isValid=a._isValid&&0===a._pf.charsLeftOver&&0===a._pf.unusedTokens.length)),a._isValid}function B(a){return a?a.toLowerCase().replace(\"_\",\"-\"):a}function C(a,b){return b._isUTC?mb(a).zone(b._offset||0):mb(a).local()}function D(a,b){return b.abbr=a,zb[a]||(zb[a]=new g),zb[a].set(b),zb[a]}function E(a){delete zb[a]}function F(a){var b,c,d,e,f=0,g=function(a){if(!zb[a]&&Bb)try{require(\"./lang/\"+a)}catch(b){}return zb[a]};if(!a)return mb.fn._lang;if(!o(a)){if(c=g(a))return c;a=[a]}for(;f<a.length;){for(e=B(a[f]).split(\"-\"),b=e.length,d=B(a[f+1]),d=d?d.split(\"-\"):null;b>0;){if(c=g(e.slice(0,b).join(\"-\")))return c;if(d&&d.length>=b&&q(e,d,!0)>=b-1)break;b--}f++}return mb.fn._lang}function G(a){return a.match(/\\[[\\s\\S]/)?a.replace(/^\\[|\\]$/g,\"\"):a.replace(/\\\\/g,\"\")}function H(a){var b,c,d=a.match(Fb);for(b=0,c=d.length;c>b;b++)d[b]=hc[d[b]]?hc[d[b]]:G(d[b]);return function(e){var f=\"\";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function I(a,b){return a.isValid()?(b=J(b,a.lang()),dc[b]||(dc[b]=H(b)),dc[b](a)):a.lang().invalidDate()}function J(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Gb.lastIndex=0;d>=0&&Gb.test(a);)a=a.replace(Gb,c),Gb.lastIndex=0,d-=1;return a}function K(a,b){var c,d=b._strict;switch(a){case\"Q\":return Rb;case\"DDDD\":return Tb;case\"YYYY\":case\"GGGG\":case\"gggg\":return d?Ub:Jb;case\"Y\":case\"G\":case\"g\":return Wb;case\"YYYYYY\":case\"YYYYY\":case\"GGGGG\":case\"ggggg\":return d?Vb:Kb;case\"S\":if(d)return Rb;case\"SS\":if(d)return Sb;case\"SSS\":if(d)return Tb;case\"DDD\":return Ib;case\"MMM\":case\"MMMM\":case\"dd\":case\"ddd\":case\"dddd\":return Mb;case\"a\":case\"A\":return F(b._l)._meridiemParse;case\"X\":return Pb;case\"Z\":case\"ZZ\":return Nb;case\"T\":return Ob;case\"SSSS\":return Lb;case\"MM\":case\"DD\":case\"YY\":case\"GG\":case\"gg\":case\"HH\":case\"hh\":case\"mm\":case\"ss\":case\"ww\":case\"WW\":return d?Sb:Hb;case\"M\":case\"D\":case\"d\":case\"H\":case\"h\":case\"m\":case\"s\":case\"w\":case\"W\":case\"e\":case\"E\":return Hb;case\"Do\":return Qb;default:return c=new RegExp(T(S(a.replace(\"\\\\\",\"\")),\"i\"))}}function L(a){a=a||\"\";var b=a.match(Nb)||[],c=b[b.length-1]||[],d=(c+\"\").match(_b)||[\"-\",0,0],e=+(60*d[1])+u(d[2]);return\"+\"===d[0]?-e:e}function M(a,b,c){var d,e=c._a;switch(a){case\"Q\":null!=b&&(e[tb]=3*(u(b)-1));break;case\"M\":case\"MM\":null!=b&&(e[tb]=u(b)-1);break;case\"MMM\":case\"MMMM\":d=F(c._l).monthsParse(b),null!=d?e[tb]=d:c._pf.invalidMonth=b;break;case\"D\":case\"DD\":null!=b&&(e[ub]=u(b));break;case\"Do\":null!=b&&(e[ub]=u(parseInt(b,10)));break;case\"DDD\":case\"DDDD\":null!=b&&(c._dayOfYear=u(b));break;case\"YY\":e[sb]=mb.parseTwoDigitYear(b);break;case\"YYYY\":case\"YYYYY\":case\"YYYYYY\":e[sb]=u(b);break;case\"a\":case\"A\":c._isPm=F(c._l).isPM(b);break;case\"H\":case\"HH\":case\"h\":case\"hh\":e[vb]=u(b);break;case\"m\":case\"mm\":e[wb]=u(b);break;case\"s\":case\"ss\":e[xb]=u(b);break;case\"S\":case\"SS\":case\"SSS\":case\"SSSS\":e[yb]=u(1e3*(\"0.\"+b));break;case\"X\":c._d=new Date(1e3*parseFloat(b));break;case\"Z\":case\"ZZ\":c._useUTC=!0,c._tzm=L(b);break;case\"dd\":case\"ddd\":case\"dddd\":d=F(c._l).weekdaysParse(b),null!=d?(c._w=c._w||{},c._w.d=d):c._pf.invalidWeekday=b;break;case\"w\":case\"ww\":case\"W\":case\"WW\":case\"d\":case\"e\":case\"E\":a=a.substr(0,1);case\"gggg\":case\"GGGG\":case\"GGGGG\":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=u(b));break;case\"gg\":case\"GG\":c._w=c._w||{},c._w[a]=mb.parseTwoDigitYear(b)}}function N(a){var c,d,e,f,g,h,i,j;c=a._w,null!=c.GG||null!=c.W||null!=c.E?(g=1,h=4,d=b(c.GG,a._a[sb],bb(mb(),1,4).year),e=b(c.W,1),f=b(c.E,1)):(j=F(a._l),g=j._week.dow,h=j._week.doy,d=b(c.gg,a._a[sb],bb(mb(),g,h).year),e=b(c.w,1),null!=c.d?(f=c.d,g>f&&++e):f=null!=c.e?c.e+g:g),i=cb(d,e,f,h,g),a._a[sb]=i.year,a._dayOfYear=i.dayOfYear}function O(a){var c,d,e,f,g=[];if(!a._d){for(e=Q(a),a._w&&null==a._a[ub]&&null==a._a[tb]&&N(a),a._dayOfYear&&(f=b(a._a[sb],e[sb]),a._dayOfYear>x(f)&&(a._pf._overflowDayOfYear=!0),d=Z(f,0,a._dayOfYear),a._a[tb]=d.getUTCMonth(),a._a[ub]=d.getUTCDate()),c=0;3>c&&null==a._a[c];++c)a._a[c]=g[c]=e[c];for(;7>c;c++)a._a[c]=g[c]=null==a._a[c]?2===c?1:0:a._a[c];a._d=(a._useUTC?Z:Y).apply(null,g),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()+a._tzm)}}function P(a){var b;a._d||(b=s(a._i),a._a=[b.year,b.month,b.day,b.hour,b.minute,b.second,b.millisecond],O(a))}function Q(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function R(a){if(a._f===mb.ISO_8601)return void V(a);a._a=[],a._pf.empty=!0;var b,c,d,e,f,g=F(a._l),h=\"\"+a._i,i=h.length,j=0;for(d=J(a._f,g).match(Fb)||[],b=0;b<d.length;b++)e=d[b],c=(h.match(K(e,a))||[])[0],c&&(f=h.substr(0,h.indexOf(c)),f.length>0&&a._pf.unusedInput.push(f),h=h.slice(h.indexOf(c)+c.length),j+=c.length),hc[e]?(c?a._pf.empty=!1:a._pf.unusedTokens.push(e),M(e,c,a)):a._strict&&!c&&a._pf.unusedTokens.push(e);a._pf.charsLeftOver=i-j,h.length>0&&a._pf.unusedInput.push(h),a._isPm&&a._a[vb]<12&&(a._a[vb]+=12),a._isPm===!1&&12===a._a[vb]&&(a._a[vb]=0),O(a),z(a)}function S(a){return a.replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function T(a){return a.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\")}function U(a){var b,d,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;f<a._f.length;f++)g=0,b=j({},a),b._pf=c(),b._f=a._f[f],R(b),A(b)&&(g+=b._pf.charsLeftOver,g+=10*b._pf.unusedTokens.length,b._pf.score=g,(null==e||e>g)&&(e=g,d=b));j(a,d||b)}function V(a){var b,c,d=a._i,e=Xb.exec(d);if(e){for(a._pf.iso=!0,b=0,c=Zb.length;c>b;b++)if(Zb[b][1].exec(d)){a._f=Zb[b][0]+(e[6]||\" \");break}for(b=0,c=$b.length;c>b;b++)if($b[b][1].exec(d)){a._f+=$b[b][0];break}d.match(Nb)&&(a._f+=\"Z\"),R(a)}else a._isValid=!1}function W(a){V(a),a._isValid===!1&&(delete a._isValid,mb.createFromInputFallback(a))}function X(b){var c=b._i,d=Cb.exec(c);c===a?b._d=new Date:d?b._d=new Date(+d[1]):\"string\"==typeof c?W(b):o(c)?(b._a=c.slice(0),O(b)):p(c)?b._d=new Date(+c):\"object\"==typeof c?P(b):\"number\"==typeof c?b._d=new Date(c):mb.createFromInputFallback(b)}function Y(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return 1970>a&&h.setFullYear(a),h}function Z(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function $(a,b){if(\"string\"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),\"number\"!=typeof a)return null}else a=parseInt(a,10);return a}function _(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function ab(a,b,c){var d=rb(Math.abs(a)/1e3),e=rb(d/60),f=rb(e/60),g=rb(f/24),h=rb(g/365),i=d<ec.s&&[\"s\",d]||1===e&&[\"m\"]||e<ec.m&&[\"mm\",e]||1===f&&[\"h\"]||f<ec.h&&[\"hh\",f]||1===g&&[\"d\"]||g<=ec.dd&&[\"dd\",g]||g<=ec.dm&&[\"M\"]||g<ec.dy&&[\"MM\",rb(g/30)]||1===h&&[\"y\"]||[\"yy\",h];return i[2]=b,i[3]=a>0,i[4]=c,_.apply({},i)}function bb(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=mb(a).add(\"d\",f),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function cb(a,b,c,d,e){var f,g,h=Z(a,0,1).getUTCDay();return h=0===h?7:h,c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:x(a-1)+g}}function db(b){var c=b._i,d=b._f;return null===c||d===a&&\"\"===c?mb.invalid({nullInput:!0}):(\"string\"==typeof c&&(b._i=c=F().preparse(c)),mb.isMoment(c)?(b=k(c),b._d=new Date(+c._d)):d?o(d)?U(b):R(b):X(b),new h(b))}function eb(a,b){var c,d;if(1===b.length&&o(b[0])&&(b=b[0]),!b.length)return mb();for(c=b[0],d=1;d<b.length;++d)b[d][a](c)&&(c=b[d]);return c}function fb(a,b){var c;return\"string\"==typeof b&&(b=a.lang().monthsParse(b),\"number\"!=typeof b)?a:(c=Math.min(a.date(),v(a.year(),b)),a._d[\"set\"+(a._isUTC?\"UTC\":\"\")+\"Month\"](b,c),a)}function gb(a,b){return a._d[\"get\"+(a._isUTC?\"UTC\":\"\")+b]()}function hb(a,b,c){return\"Month\"===b?fb(a,c):a._d[\"set\"+(a._isUTC?\"UTC\":\"\")+b](c)}function ib(a,b){return function(c){return null!=c?(hb(this,a,c),mb.updateOffset(this,b),this):gb(this,a)}}function jb(a){mb.duration.fn[a]=function(){return this._data[a]}}function kb(a,b){mb.duration.fn[\"as\"+a]=function(){return+this/b}}function lb(a){\"undefined\"==typeof ender&&(nb=qb.moment,qb.moment=a?d(\"Accessing Moment through the global scope is deprecated, and will be removed in an upcoming release.\",mb):mb)}for(var mb,nb,ob,pb=\"2.7.0\",qb=\"undefined\"!=typeof global?global:this,rb=Math.round,sb=0,tb=1,ub=2,vb=3,wb=4,xb=5,yb=6,zb={},Ab={_isAMomentObject:null,_i:null,_f:null,_l:null,_strict:null,_tzm:null,_isUTC:null,_offset:null,_pf:null,_lang:null},Bb=\"undefined\"!=typeof module&&module.exports,Cb=/^\\/?Date\\((\\-?\\d+)/i,Db=/(\\-)?(?:(\\d*)\\.)?(\\d+)\\:(\\d+)(?:\\:(\\d+)\\.?(\\d{3})?)?/,Eb=/^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,Fb=/(\\[[^\\[]*\\])|(\\\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,Gb=/(\\[[^\\[]*\\])|(\\\\)?(LT|LL?L?L?|l{1,4})/g,Hb=/\\d\\d?/,Ib=/\\d{1,3}/,Jb=/\\d{1,4}/,Kb=/[+\\-]?\\d{1,6}/,Lb=/\\d+/,Mb=/[0-9]*['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]+|[\\u0600-\\u06FF\\/]+(\\s*?[\\u0600-\\u06FF]+){1,2}/i,Nb=/Z|[\\+\\-]\\d\\d:?\\d\\d/gi,Ob=/T/i,Pb=/[\\+\\-]?\\d+(\\.\\d{1,3})?/,Qb=/\\d{1,2}/,Rb=/\\d/,Sb=/\\d\\d/,Tb=/\\d{3}/,Ub=/\\d{4}/,Vb=/[+-]?\\d{6}/,Wb=/[+-]?\\d+/,Xb=/^\\s*(?:[+-]\\d{6}|\\d{4})-(?:(\\d\\d-\\d\\d)|(W\\d\\d$)|(W\\d\\d-\\d)|(\\d\\d\\d))((T| )(\\d\\d(:\\d\\d(:\\d\\d(\\.\\d+)?)?)?)?([\\+\\-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,Yb=\"YYYY-MM-DDTHH:mm:ssZ\",Zb=[[\"YYYYYY-MM-DD\",/[+-]\\d{6}-\\d{2}-\\d{2}/],[\"YYYY-MM-DD\",/\\d{4}-\\d{2}-\\d{2}/],[\"GGGG-[W]WW-E\",/\\d{4}-W\\d{2}-\\d/],[\"GGGG-[W]WW\",/\\d{4}-W\\d{2}/],[\"YYYY-DDD\",/\\d{4}-\\d{3}/]],$b=[[\"HH:mm:ss.SSSS\",/(T| )\\d\\d:\\d\\d:\\d\\d\\.\\d+/],[\"HH:mm:ss\",/(T| )\\d\\d:\\d\\d:\\d\\d/],[\"HH:mm\",/(T| )\\d\\d:\\d\\d/],[\"HH\",/(T| )\\d\\d/]],_b=/([\\+\\-]|\\d\\d)/gi,ac=(\"Date|Hours|Minutes|Seconds|Milliseconds\".split(\"|\"),{Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6}),bc={ms:\"millisecond\",s:\"second\",m:\"minute\",h:\"hour\",d:\"day\",D:\"date\",w:\"week\",W:\"isoWeek\",M:\"month\",Q:\"quarter\",y:\"year\",DDD:\"dayOfYear\",e:\"weekday\",E:\"isoWeekday\",gg:\"weekYear\",GG:\"isoWeekYear\"},cc={dayofyear:\"dayOfYear\",isoweekday:\"isoWeekday\",isoweek:\"isoWeek\",weekyear:\"weekYear\",isoweekyear:\"isoWeekYear\"},dc={},ec={s:45,m:45,h:22,dd:25,dm:45,dy:345},fc=\"DDD w W M D d\".split(\" \"),gc=\"M D H h m s w W\".split(\" \"),hc={M:function(){return this.month()+1},MMM:function(a){return this.lang().monthsShort(this,a)},MMMM:function(a){return this.lang().months(this,a)},D:function(){return this.date()},DDD:function(){return this.dayOfYear()},d:function(){return this.day()},dd:function(a){return this.lang().weekdaysMin(this,a)},ddd:function(a){return this.lang().weekdaysShort(this,a)},dddd:function(a){return this.lang().weekdays(this,a)},w:function(){return this.week()},W:function(){return this.isoWeek()},YY:function(){return m(this.year()%100,2)},YYYY:function(){return m(this.year(),4)},YYYYY:function(){return m(this.year(),5)},YYYYYY:function(){var a=this.year(),b=a>=0?\"+\":\"-\";return b+m(Math.abs(a),6)},gg:function(){return m(this.weekYear()%100,2)},gggg:function(){return m(this.weekYear(),4)},ggggg:function(){return m(this.weekYear(),5)},GG:function(){return m(this.isoWeekYear()%100,2)},GGGG:function(){return m(this.isoWeekYear(),4)},GGGGG:function(){return m(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.lang().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.lang().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return u(this.milliseconds()/100)},SS:function(){return m(u(this.milliseconds()/10),2)},SSS:function(){return m(this.milliseconds(),3)},SSSS:function(){return m(this.milliseconds(),3)},Z:function(){var a=-this.zone(),b=\"+\";return 0>a&&(a=-a,b=\"-\"),b+m(u(a/60),2)+\":\"+m(u(a)%60,2)},ZZ:function(){var a=-this.zone(),b=\"+\";return 0>a&&(a=-a,b=\"-\"),b+m(u(a/60),2)+m(u(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},X:function(){return this.unix()},Q:function(){return this.quarter()}},ic=[\"months\",\"monthsShort\",\"weekdays\",\"weekdaysShort\",\"weekdaysMin\"];fc.length;)ob=fc.pop(),hc[ob+\"o\"]=f(hc[ob],ob);for(;gc.length;)ob=gc.pop(),hc[ob+ob]=e(hc[ob],2);for(hc.DDDD=e(hc.DDD,3),j(g.prototype,{set:function(a){var b,c;for(c in a)b=a[c],\"function\"==typeof b?this[c]=b:this[\"_\"+c]=b},_months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),months:function(a){return this._months[a.month()]},_monthsShort:\"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec\".split(\"_\"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a){var b,c,d;for(this._monthsParse||(this._monthsParse=[]),b=0;12>b;b++)if(this._monthsParse[b]||(c=mb.utc([2e3,b]),d=\"^\"+this.months(c,\"\")+\"|^\"+this.monthsShort(c,\"\"),this._monthsParse[b]=new RegExp(d.replace(\".\",\"\"),\"i\")),this._monthsParse[b].test(a))return b},_weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\".split(\"_\"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:\"Su_Mo_Tu_We_Th_Fr_Sa\".split(\"_\"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=mb([2e3,1]).day(b),d=\"^\"+this.weekdays(c,\"\")+\"|^\"+this.weekdaysShort(c,\"\")+\"|^\"+this.weekdaysMin(c,\"\"),this._weekdaysParse[b]=new RegExp(d.replace(\".\",\"\"),\"i\")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D YYYY\",LLL:\"MMMM D YYYY LT\",LLLL:\"dddd, MMMM D YYYY LT\"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return\"p\"===(a+\"\").toLowerCase().charAt(0)},_meridiemParse:/[ap]\\.?m?\\.?/i,meridiem:function(a,b,c){return a>11?c?\"pm\":\"PM\":c?\"am\":\"AM\"},_calendar:{sameDay:\"[Today at] LT\",nextDay:\"[Tomorrow at] LT\",nextWeek:\"dddd [at] LT\",lastDay:\"[Yesterday at] LT\",lastWeek:\"[Last] dddd [at] LT\",sameElse:\"L\"},calendar:function(a,b){var c=this._calendar[a];return\"function\"==typeof c?c.apply(b):c},_relativeTime:{future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return\"function\"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?\"future\":\"past\"];return\"function\"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace(\"%d\",a)},_ordinal:\"%d\",preparse:function(a){return a},postformat:function(a){return a},week:function(a){return bb(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},_invalidDate:\"Invalid date\",invalidDate:function(){return this._invalidDate}}),mb=function(b,d,e,f){var g;return\"boolean\"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=b,g._f=d,g._l=e,g._strict=f,g._isUTC=!1,g._pf=c(),db(g)},mb.suppressDeprecationWarnings=!1,mb.createFromInputFallback=d(\"moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.\",function(a){a._d=new Date(a._i)}),mb.min=function(){var a=[].slice.call(arguments,0);return eb(\"isBefore\",a)},mb.max=function(){var a=[].slice.call(arguments,0);return eb(\"isAfter\",a)},mb.utc=function(b,d,e,f){var g;return\"boolean\"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._useUTC=!0,g._isUTC=!0,g._l=e,g._i=b,g._f=d,g._strict=f,g._pf=c(),db(g).utc()},mb.unix=function(a){return mb(1e3*a)},mb.duration=function(a,b){var c,d,e,f=a,g=null;return mb.isDuration(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:\"number\"==typeof a?(f={},b?f[b]=a:f.milliseconds=a):(g=Db.exec(a))?(c=\"-\"===g[1]?-1:1,f={y:0,d:u(g[ub])*c,h:u(g[vb])*c,m:u(g[wb])*c,s:u(g[xb])*c,ms:u(g[yb])*c}):(g=Eb.exec(a))&&(c=\"-\"===g[1]?-1:1,e=function(a){var b=a&&parseFloat(a.replace(\",\",\".\"));return(isNaN(b)?0:b)*c},f={y:e(g[2]),M:e(g[3]),d:e(g[4]),h:e(g[5]),m:e(g[6]),s:e(g[7]),w:e(g[8])}),d=new i(f),mb.isDuration(a)&&a.hasOwnProperty(\"_lang\")&&(d._lang=a._lang),d},mb.version=pb,mb.defaultFormat=Yb,mb.ISO_8601=function(){},mb.momentProperties=Ab,mb.updateOffset=function(){},mb.relativeTimeThreshold=function(b,c){return ec[b]===a?!1:(ec[b]=c,!0)},mb.lang=function(a,b){var c;return a?(b?D(B(a),b):null===b?(E(a),a=\"en\"):zb[a]||F(a),c=mb.duration.fn._lang=mb.fn._lang=F(a),c._abbr):mb.fn._lang._abbr},mb.langData=function(a){return a&&a._lang&&a._lang._abbr&&(a=a._lang._abbr),F(a)},mb.isMoment=function(a){return a instanceof h||null!=a&&a.hasOwnProperty(\"_isAMomentObject\")},mb.isDuration=function(a){return a instanceof i},ob=ic.length-1;ob>=0;--ob)t(ic[ob]);mb.normalizeUnits=function(a){return r(a)},mb.invalid=function(a){var b=mb.utc(0/0);return null!=a?j(b._pf,a):b._pf.userInvalidated=!0,b},mb.parseZone=function(){return mb.apply(null,arguments).parseZone()},mb.parseTwoDigitYear=function(a){return u(a)+(u(a)>68?1900:2e3)},j(mb.fn=h.prototype,{clone:function(){return mb(this)},valueOf:function(){return+this._d+6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().lang(\"en\").format(\"ddd MMM DD YYYY HH:mm:ss [GMT]ZZ\")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var a=mb(this).utc();return 0<a.year()&&a.year()<=9999?I(a,\"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]\"):I(a,\"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]\")},toArray:function(){var a=this;return[a.year(),a.month(),a.date(),a.hours(),a.minutes(),a.seconds(),a.milliseconds()]},isValid:function(){return A(this)},isDSTShifted:function(){return this._a?this.isValid()&&q(this._a,(this._isUTC?mb.utc(this._a):mb(this._a)).toArray())>0:!1},parsingFlags:function(){return j({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(){return this.zone(0)},local:function(){return this.zone(0),this._isUTC=!1,this},format:function(a){var b=I(this,a||mb.defaultFormat);return this.lang().postformat(b)},add:function(a,b){var c;return c=\"string\"==typeof a&&\"string\"==typeof b?mb.duration(isNaN(+b)?+a:+b,isNaN(+b)?b:a):\"string\"==typeof a?mb.duration(+b,a):mb.duration(a,b),n(this,c,1),this},subtract:function(a,b){var c;return c=\"string\"==typeof a&&\"string\"==typeof b?mb.duration(isNaN(+b)?+a:+b,isNaN(+b)?b:a):\"string\"==typeof a?mb.duration(+b,a):mb.duration(a,b),n(this,c,-1),this},diff:function(a,b,c){var d,e,f=C(a,this),g=6e4*(this.zone()-f.zone());return b=r(b),\"year\"===b||\"month\"===b?(d=432e5*(this.daysInMonth()+f.daysInMonth()),e=12*(this.year()-f.year())+(this.month()-f.month()),e+=(this-mb(this).startOf(\"month\")-(f-mb(f).startOf(\"month\")))/d,e-=6e4*(this.zone()-mb(this).startOf(\"month\").zone()-(f.zone()-mb(f).startOf(\"month\").zone()))/d,\"year\"===b&&(e/=12)):(d=this-f,e=\"second\"===b?d/1e3:\"minute\"===b?d/6e4:\"hour\"===b?d/36e5:\"day\"===b?(d-g)/864e5:\"week\"===b?(d-g)/6048e5:d),c?e:l(e)},from:function(a,b){return mb.duration(this.diff(a)).lang(this.lang()._abbr).humanize(!b)},fromNow:function(a){return this.from(mb(),a)},calendar:function(a){var b=a||mb(),c=C(b,this).startOf(\"day\"),d=this.diff(c,\"days\",!0),e=-6>d?\"sameElse\":-1>d?\"lastWeek\":0>d?\"lastDay\":1>d?\"sameDay\":2>d?\"nextDay\":7>d?\"nextWeek\":\"sameElse\";return this.format(this.lang().calendar(e,this))},isLeapYear:function(){return y(this.year())},isDST:function(){return this.zone()<this.clone().month(0).zone()||this.zone()<this.clone().month(5).zone()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=$(a,this.lang()),this.add({d:a-b})):b},month:ib(\"Month\",!0),startOf:function(a){switch(a=r(a)){case\"year\":this.month(0);case\"quarter\":case\"month\":this.date(1);case\"week\":case\"isoWeek\":case\"day\":this.hours(0);case\"hour\":this.minutes(0);case\"minute\":this.seconds(0);case\"second\":this.milliseconds(0)}return\"week\"===a?this.weekday(0):\"isoWeek\"===a&&this.isoWeekday(1),\"quarter\"===a&&this.month(3*Math.floor(this.month()/3)),this},endOf:function(a){return a=r(a),this.startOf(a).add(\"isoWeek\"===a?\"week\":a,1).subtract(\"ms\",1)},isAfter:function(a,b){return b=\"undefined\"!=typeof b?b:\"millisecond\",+this.clone().startOf(b)>+mb(a).startOf(b)},isBefore:function(a,b){return b=\"undefined\"!=typeof b?b:\"millisecond\",+this.clone().startOf(b)<+mb(a).startOf(b)},isSame:function(a,b){return b=b||\"ms\",+this.clone().startOf(b)===+C(a,this).startOf(b)},min:d(\"moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548\",function(a){return a=mb.apply(null,arguments),this>a?this:a}),max:d(\"moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548\",function(a){return a=mb.apply(null,arguments),a>this?this:a}),zone:function(a,b){var c=this._offset||0;return null==a?this._isUTC?c:this._d.getTimezoneOffset():(\"string\"==typeof a&&(a=L(a)),Math.abs(a)<16&&(a=60*a),this._offset=a,this._isUTC=!0,c!==a&&(!b||this._changeInProgress?n(this,mb.duration(c-a,\"m\"),1,!1):this._changeInProgress||(this._changeInProgress=!0,mb.updateOffset(this,!0),this._changeInProgress=null)),this)},zoneAbbr:function(){return this._isUTC?\"UTC\":\"\"},zoneName:function(){return this._isUTC?\"Coordinated Universal Time\":\"\"},parseZone:function(){return this._tzm?this.zone(this._tzm):\"string\"==typeof this._i&&this.zone(this._i),this},hasAlignedHourOffset:function(a){return a=a?mb(a).zone():0,(this.zone()-a)%60===0},daysInMonth:function(){return v(this.year(),this.month())},dayOfYear:function(a){var b=rb((mb(this).startOf(\"day\")-mb(this).startOf(\"year\"))/864e5)+1;return null==a?b:this.add(\"d\",a-b)},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=bb(this,this.lang()._week.dow,this.lang()._week.doy).year;return null==a?b:this.add(\"y\",a-b)},isoWeekYear:function(a){var b=bb(this,1,4).year;return null==a?b:this.add(\"y\",a-b)},week:function(a){var b=this.lang().week(this);return null==a?b:this.add(\"d\",7*(a-b))},isoWeek:function(a){var b=bb(this,1,4).week;return null==a?b:this.add(\"d\",7*(a-b))},weekday:function(a){var b=(this.day()+7-this.lang()._week.dow)%7;return null==a?b:this.add(\"d\",a-b)},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return w(this.year(),1,4)},weeksInYear:function(){var a=this._lang._week;return w(this.year(),a.dow,a.doy)},get:function(a){return a=r(a),this[a]()},set:function(a,b){return a=r(a),\"function\"==typeof this[a]&&this[a](b),this},lang:function(b){return b===a?this._lang:(this._lang=F(b),this)}}),mb.fn.millisecond=mb.fn.milliseconds=ib(\"Milliseconds\",!1),mb.fn.second=mb.fn.seconds=ib(\"Seconds\",!1),mb.fn.minute=mb.fn.minutes=ib(\"Minutes\",!1),mb.fn.hour=mb.fn.hours=ib(\"Hours\",!0),mb.fn.date=ib(\"Date\",!0),mb.fn.dates=d(\"dates accessor is deprecated. Use date instead.\",ib(\"Date\",!0)),mb.fn.year=ib(\"FullYear\",!0),mb.fn.years=d(\"years accessor is deprecated. Use year instead.\",ib(\"FullYear\",!0)),mb.fn.days=mb.fn.day,mb.fn.months=mb.fn.month,mb.fn.weeks=mb.fn.week,mb.fn.isoWeeks=mb.fn.isoWeek,mb.fn.quarters=mb.fn.quarter,mb.fn.toJSON=mb.fn.toISOString,j(mb.duration.fn=i.prototype,{_bubble:function(){var a,b,c,d,e=this._milliseconds,f=this._days,g=this._months,h=this._data;h.milliseconds=e%1e3,a=l(e/1e3),h.seconds=a%60,b=l(a/60),h.minutes=b%60,c=l(b/60),h.hours=c%24,f+=l(c/24),h.days=f%30,g+=l(f/30),h.months=g%12,d=l(g/12),h.years=d},weeks:function(){return l(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*u(this._months/12)},humanize:function(a){var b=+this,c=ab(b,!a,this.lang());return a&&(c=this.lang().pastFuture(b,c)),this.lang().postformat(c)},add:function(a,b){var c=mb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=mb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=r(a),this[a.toLowerCase()+\"s\"]()},as:function(a){return a=r(a),this[\"as\"+a.charAt(0).toUpperCase()+a.slice(1)+\"s\"]()},lang:mb.fn.lang,toIsoString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?\"-\":\"\")+\"P\"+(a?a+\"Y\":\"\")+(b?b+\"M\":\"\")+(c?c+\"D\":\"\")+(d||e||f?\"T\":\"\")+(d?d+\"H\":\"\")+(e?e+\"M\":\"\")+(f?f+\"S\":\"\"):\"P0D\"}});for(ob in ac)ac.hasOwnProperty(ob)&&(kb(ob,ac[ob]),jb(ob.toLowerCase()));kb(\"Weeks\",6048e5),mb.duration.fn.asMonths=function(){return(+this-31536e6*this.years())/2592e6+12*this.years()},mb.lang(\"en\",{ordinal:function(a){var b=a%10,c=1===u(a%100/10)?\"th\":1===b?\"st\":2===b?\"nd\":3===b?\"rd\":\"th\";return a+c}}),function(a){a(mb)}(function(a){return a.lang(\"ar-ma\",{months:\"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر\".split(\"_\"),monthsShort:\"يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر\".split(\"_\"),weekdays:\"الأØد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت\".split(\"_\"),weekdaysShort:\"اØد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت\".split(\"_\"),weekdaysMin:\"Ø_Ù†_Ø«_ر_Ø®_ج_س\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd D MMMM YYYY LT\"},calendar:{sameDay:\"[اليوم على الساعة] LT\",nextDay:\"[غدا على الساعة] LT\",nextWeek:\"dddd [على الساعة] LT\",lastDay:\"[أمس على الساعة] LT\",lastWeek:\"dddd [على الساعة] LT\",sameElse:\"L\"},relativeTime:{future:\"ÙÙŠ %s\",past:\"منذ %s\",s:\"ثوان\",m:\"دقيقة\",mm:\"%d دقائق\",h:\"ساعة\",hh:\"%d ساعات\",d:\"يوم\",dd:\"%d أيام\",M:\"شهر\",MM:\"%d أشهر\",y:\"سنة\",yy:\"%d سنوات\"},week:{dow:6,doy:12}})}),function(a){a(mb)}(function(a){var b={1:\"Ù¡\",2:\"Ù¢\",3:\"Ù£\",4:\"Ù¤\",5:\"Ù¥\",6:\"Ù¦\",7:\"Ù§\",8:\"Ù¨\",9:\"Ù©\",0:\"Ù \"},c={\"Ù¡\":\"1\",\"Ù¢\":\"2\",\"Ù£\":\"3\",\"Ù¤\":\"4\",\"Ù¥\":\"5\",\"Ù¦\":\"6\",\"Ù§\":\"7\",\"Ù¨\":\"8\",\"Ù©\":\"9\",\"Ù \":\"0\"};return a.lang(\"ar-sa\",{months:\"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر\".split(\"_\"),monthsShort:\"يناير_Ùبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوÙمبر_ديسمبر\".split(\"_\"),weekdays:\"الأØد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت\".split(\"_\"),weekdaysShort:\"Ø£Øد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت\".split(\"_\"),weekdaysMin:\"Ø_Ù†_Ø«_ر_Ø®_ج_س\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd D MMMM YYYY LT\"},meridiem:function(a){return 12>a?\"ص\":\"Ù…\"},calendar:{sameDay:\"[اليوم على الساعة] LT\",nextDay:\"[غدا على الساعة] LT\",nextWeek:\"dddd [على الساعة] LT\",lastDay:\"[أمس على الساعة] LT\",lastWeek:\"dddd [على الساعة] LT\",sameElse:\"L\"},relativeTime:{future:\"ÙÙŠ %s\",past:\"منذ %s\",s:\"ثوان\",m:\"دقيقة\",mm:\"%d دقائق\",h:\"ساعة\",hh:\"%d ساعات\",d:\"يوم\",dd:\"%d أيام\",M:\"شهر\",MM:\"%d أشهر\",y:\"سنة\",yy:\"%d سنوات\"},preparse:function(a){return a.replace(/[Û°-Û¹]/g,function(a){return c[a]}).replace(/ØŒ/g,\",\")},postformat:function(a){return a.replace(/\\d/g,function(a){return b[a]}).replace(/,/g,\"ØŒ\")},week:{dow:6,doy:12}})}),function(a){a(mb)}(function(a){var b={1:\"Ù¡\",2:\"Ù¢\",3:\"Ù£\",4:\"Ù¤\",5:\"Ù¥\",6:\"Ù¦\",7:\"Ù§\",8:\"Ù¨\",9:\"Ù©\",0:\"Ù \"},c={\"Ù¡\":\"1\",\"Ù¢\":\"2\",\"Ù£\":\"3\",\"Ù¤\":\"4\",\"Ù¥\":\"5\",\"Ù¦\":\"6\",\"Ù§\":\"7\",\"Ù¨\":\"8\",\"Ù©\":\"9\",\"Ù \":\"0\"};return a.lang(\"ar\",{months:\"يناير/ كانون الثاني_Ùبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ Øزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوÙمبر/ تشرين الثاني_ديسمبر/ كانون الأول\".split(\"_\"),monthsShort:\"يناير/ كانون الثاني_Ùبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ Øزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوÙمبر/ تشرين الثاني_ديسمبر/ كانون الأول\".split(\"_\"),weekdays:\"الأØد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت\".split(\"_\"),weekdaysShort:\"Ø£Øد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت\".split(\"_\"),weekdaysMin:\"Ø_Ù†_Ø«_ر_Ø®_ج_س\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd D MMMM YYYY LT\"},meridiem:function(a){return 12>a?\"ص\":\"Ù…\"},calendar:{sameDay:\"[اليوم على الساعة] LT\",nextDay:\"[غدا على الساعة] LT\",nextWeek:\"dddd [على الساعة] LT\",lastDay:\"[أمس على الساعة] LT\",lastWeek:\"dddd [على الساعة] LT\",sameElse:\"L\"},relativeTime:{future:\"ÙÙŠ %s\",past:\"منذ %s\",s:\"ثوان\",m:\"دقيقة\",mm:\"%d دقائق\",h:\"ساعة\",hh:\"%d ساعات\",d:\"يوم\",dd:\"%d أيام\",M:\"شهر\",MM:\"%d أشهر\",y:\"سنة\",yy:\"%d سنوات\"},preparse:function(a){return a.replace(/[Û°-Û¹]/g,function(a){return c[a]}).replace(/ØŒ/g,\",\")},postformat:function(a){return a.replace(/\\d/g,function(a){return b[a]}).replace(/,/g,\"ØŒ\")\r\n},week:{dow:6,doy:12}})}),function(a){a(mb)}(function(a){var b={1:\"-inci\",5:\"-inci\",8:\"-inci\",70:\"-inci\",80:\"-inci\",2:\"-nci\",7:\"-nci\",20:\"-nci\",50:\"-nci\",3:\"-üncü\",4:\"-üncü\",100:\"-üncü\",6:\"-ncı\",9:\"-uncu\",10:\"-uncu\",30:\"-uncu\",60:\"-ıncı\",90:\"-ıncı\"};return a.lang(\"az\",{months:\"yanvar_fevral_mart_aprel_may_iyun_iyul_avqust_sentyabr_oktyabr_noyabr_dekabr\".split(\"_\"),monthsShort:\"yan_fev_mar_apr_may_iyn_iyl_avq_sen_okt_noy_dek\".split(\"_\"),weekdays:\"Bazar_Bazar ertÉ™si_ÇərÅŸÉ™nbÉ™ axÅŸamı_ÇərÅŸÉ™nbÉ™_CümÉ™ axÅŸamı_CümÉ™_ŞənbÉ™\".split(\"_\"),weekdaysShort:\"Baz_BzE_ÇAx_Çər_CAx_Cüm_Şən\".split(\"_\"),weekdaysMin:\"Bz_BE_ÇA_Çə_CA_Cü_Şə\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD.MM.YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd, D MMMM YYYY LT\"},calendar:{sameDay:\"[bugün saat] LT\",nextDay:\"[sabah saat] LT\",nextWeek:\"[gÉ™lÉ™n hÉ™ftÉ™] dddd [saat] LT\",lastDay:\"[dünÉ™n] LT\",lastWeek:\"[keçən hÉ™ftÉ™] dddd [saat] LT\",sameElse:\"L\"},relativeTime:{future:\"%s sonra\",past:\"%s É™vvÉ™l\",s:\"birneçə saniyyÉ™\",m:\"bir dÉ™qiqÉ™\",mm:\"%d dÉ™qiqÉ™\",h:\"bir saat\",hh:\"%d saat\",d:\"bir gün\",dd:\"%d gün\",M:\"bir ay\",MM:\"%d ay\",y:\"bir il\",yy:\"%d il\"},meridiem:function(a){return 4>a?\"gecÉ™\":12>a?\"sÉ™hÉ™r\":17>a?\"gündüz\":\"axÅŸam\"},ordinal:function(a){if(0===a)return a+\"-ıncı\";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){return a.lang(\"bg\",{months:\"Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември\".split(\"_\"),monthsShort:\"Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек\".split(\"_\"),weekdays:\"неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота\".split(\"_\"),weekdaysShort:\"нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб\".split(\"_\"),weekdaysMin:\"нд_пн_вт_ÑÑ€_чт_пт_Ñб\".split(\"_\"),longDateFormat:{LT:\"H:mm\",L:\"D.MM.YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd, D MMMM YYYY LT\"},calendar:{sameDay:\"[Ð”Ð½ÐµÑ Ð²] LT\",nextDay:\"[Утре в] LT\",nextWeek:\"dddd [в] LT\",lastDay:\"[Вчера в] LT\",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return\"[Ð’ изминалата] dddd [в] LT\";case 1:case 2:case 4:case 5:return\"[Ð’ изминалиÑ] dddd [в] LT\"}},sameElse:\"L\"},relativeTime:{future:\"Ñлед %s\",past:\"преди %s\",s:\"нÑколко Ñекунди\",m:\"минута\",mm:\"%d минути\",h:\"чаÑ\",hh:\"%d чаÑа\",d:\"ден\",dd:\"%d дни\",M:\"меÑец\",MM:\"%d меÑеца\",y:\"година\",yy:\"%d години\"},ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+\"-ев\":0===c?a+\"-ен\":c>10&&20>c?a+\"-ти\":1===b?a+\"-ви\":2===b?a+\"-ри\":7===b||8===b?a+\"-ми\":a+\"-ти\"},week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){var b={1:\"১\",2:\"২\",3:\"৩\",4:\"৪\",5:\"৫\",6:\"৬\",7:\"à§\",8:\"৮\",9:\"৯\",0:\"০\"},c={\"১\":\"1\",\"২\":\"2\",\"৩\":\"3\",\"৪\":\"4\",\"৫\":\"5\",\"৬\":\"6\",\"à§\":\"7\",\"৮\":\"8\",\"৯\":\"9\",\"০\":\"0\"};return a.lang(\"bn\",{months:\"জানà§à§Ÿà¦¾à¦°à§€_ফেবà§à§Ÿà¦¾à¦°à§€_মারà§à¦š_à¦à¦ªà§à¦°à¦¿à¦²_মে_জà§à¦¨_জà§à¦²à¦¾à¦‡_অগাসà§à¦Ÿ_সেপà§à¦Ÿà§‡à¦®à§à¦¬à¦°_অকà§à¦Ÿà§‹à¦¬à¦°_নà¦à§‡à¦®à§à¦¬à¦°_ডিসেমà§à¦¬à¦°\".split(\"_\"),monthsShort:\"জানà§_ফেব_মারà§à¦š_à¦à¦ªà¦°_মে_জà§à¦¨_জà§à¦²_অগ_সেপà§à¦Ÿ_অকà§à¦Ÿà§‹_নà¦_ডিসেমà§\".split(\"_\"),weekdays:\"রবিবার_সোমবার_মঙà§à¦—লবার_বà§à¦§à¦¬à¦¾à¦°_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿à¦¬à¦¾à¦°_শà§à¦•à§à¦°à§à¦¬à¦¾à¦°_শনিবার\".split(\"_\"),weekdaysShort:\"রবি_সোম_মঙà§à¦—ল_বà§à¦§_বৃহসà§à¦ªà¦¤à§à¦¤à¦¿_শà§à¦•à§à¦°à§_শনি\".split(\"_\"),weekdaysMin:\"রব_সম_মঙà§à¦—_বà§_বà§à¦°à¦¿à¦¹_শà§_শনি\".split(\"_\"),longDateFormat:{LT:\"A h:mm সময়\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY, LT\",LLLL:\"dddd, D MMMM YYYY, LT\"},calendar:{sameDay:\"[আজ] LT\",nextDay:\"[আগামীকাল] LT\",nextWeek:\"dddd, LT\",lastDay:\"[গতকাল] LT\",lastWeek:\"[গত] dddd, LT\",sameElse:\"L\"},relativeTime:{future:\"%s পরে\",past:\"%s আগে\",s:\"কà¦à¦• সেকেনà§à¦¡\",m:\"à¦à¦• মিনিট\",mm:\"%d মিনিট\",h:\"à¦à¦• ঘনà§à¦Ÿà¦¾\",hh:\"%d ঘনà§à¦Ÿà¦¾\",d:\"à¦à¦• দিন\",dd:\"%d দিন\",M:\"à¦à¦• মাস\",MM:\"%d মাস\",y:\"à¦à¦• বছর\",yy:\"%d বছর\"},preparse:function(a){return a.replace(/[১২৩৪৫৬à§à§®à§¯à§¦]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\\d/g,function(a){return b[a]})},meridiem:function(a){return 4>a?\"রাত\":10>a?\"শকাল\":17>a?\"দà§à¦ªà§à¦°\":20>a?\"বিকেল\":\"রাত\"},week:{dow:0,doy:6}})}),function(a){a(mb)}(function(b){function c(a,b,c){var d={mm:\"munutenn\",MM:\"miz\",dd:\"devezh\"};return a+\" \"+f(d[c],a)}function d(a){switch(e(a)){case 1:case 3:case 4:case 5:case 9:return a+\" bloaz\";default:return a+\" vloaz\"}}function e(a){return a>9?e(a%10):a}function f(a,b){return 2===b?g(a):a}function g(b){var c={m:\"v\",b:\"v\",d:\"z\"};return c[b.charAt(0)]===a?b:c[b.charAt(0)]+b.substring(1)}return b.lang(\"br\",{months:\"Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu\".split(\"_\"),monthsShort:\"Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker\".split(\"_\"),weekdays:\"Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn\".split(\"_\"),weekdaysShort:\"Sul_Lun_Meu_Mer_Yao_Gwe_Sad\".split(\"_\"),weekdaysMin:\"Su_Lu_Me_Mer_Ya_Gw_Sa\".split(\"_\"),longDateFormat:{LT:\"h[e]mm A\",L:\"DD/MM/YYYY\",LL:\"D [a viz] MMMM YYYY\",LLL:\"D [a viz] MMMM YYYY LT\",LLLL:\"dddd, D [a viz] MMMM YYYY LT\"},calendar:{sameDay:\"[Hiziv da] LT\",nextDay:\"[Warc'hoazh da] LT\",nextWeek:\"dddd [da] LT\",lastDay:\"[Dec'h da] LT\",lastWeek:\"dddd [paset da] LT\",sameElse:\"L\"},relativeTime:{future:\"a-benn %s\",past:\"%s 'zo\",s:\"un nebeud segondennoù\",m:\"ur vunutenn\",mm:c,h:\"un eur\",hh:\"%d eur\",d:\"un devezh\",dd:c,M:\"ur miz\",MM:c,y:\"ur bloaz\",yy:d},ordinal:function(a){var b=1===a?\"añ\":\"vet\";return a+b},week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){function b(a,b,c){var d=a+\" \";switch(c){case\"m\":return b?\"jedna minuta\":\"jedne minute\";case\"mm\":return d+=1===a?\"minuta\":2===a||3===a||4===a?\"minute\":\"minuta\";case\"h\":return b?\"jedan sat\":\"jednog sata\";case\"hh\":return d+=1===a?\"sat\":2===a||3===a||4===a?\"sata\":\"sati\";case\"dd\":return d+=1===a?\"dan\":\"dana\";case\"MM\":return d+=1===a?\"mjesec\":2===a||3===a||4===a?\"mjeseca\":\"mjeseci\";case\"yy\":return d+=1===a?\"godina\":2===a||3===a||4===a?\"godine\":\"godina\"}}return a.lang(\"bs\",{months:\"januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar\".split(\"_\"),monthsShort:\"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.\".split(\"_\"),weekdays:\"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota\".split(\"_\"),weekdaysShort:\"ned._pon._uto._sri._Äet._pet._sub.\".split(\"_\"),weekdaysMin:\"ne_po_ut_sr_Äe_pe_su\".split(\"_\"),longDateFormat:{LT:\"H:mm\",L:\"DD. MM. YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY LT\",LLLL:\"dddd, D. MMMM YYYY LT\"},calendar:{sameDay:\"[danas u] LT\",nextDay:\"[sutra u] LT\",nextWeek:function(){switch(this.day()){case 0:return\"[u] [nedjelju] [u] LT\";case 3:return\"[u] [srijedu] [u] LT\";case 6:return\"[u] [subotu] [u] LT\";case 1:case 2:case 4:case 5:return\"[u] dddd [u] LT\"}},lastDay:\"[juÄer u] LT\",lastWeek:function(){switch(this.day()){case 0:case 3:return\"[proÅ¡lu] dddd [u] LT\";case 6:return\"[proÅ¡le] [subote] [u] LT\";case 1:case 2:case 4:case 5:return\"[proÅ¡li] dddd [u] LT\"}},sameElse:\"L\"},relativeTime:{future:\"za %s\",past:\"prije %s\",s:\"par sekundi\",m:b,mm:b,h:b,hh:b,d:\"dan\",dd:b,M:\"mjesec\",MM:b,y:\"godinu\",yy:b},ordinal:\"%d.\",week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){return a.lang(\"ca\",{months:\"gener_febrer_març_abril_maig_juny_juliol_agost_setembre_octubre_novembre_desembre\".split(\"_\"),monthsShort:\"gen._febr._mar._abr._mai._jun._jul._ag._set._oct._nov._des.\".split(\"_\"),weekdays:\"diumenge_dilluns_dimarts_dimecres_dijous_divendres_dissabte\".split(\"_\"),weekdaysShort:\"dg._dl._dt._dc._dj._dv._ds.\".split(\"_\"),weekdaysMin:\"Dg_Dl_Dt_Dc_Dj_Dv_Ds\".split(\"_\"),longDateFormat:{LT:\"H:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd D MMMM YYYY LT\"},calendar:{sameDay:function(){return\"[avui a \"+(1!==this.hours()?\"les\":\"la\")+\"] LT\"},nextDay:function(){return\"[demà a \"+(1!==this.hours()?\"les\":\"la\")+\"] LT\"},nextWeek:function(){return\"dddd [a \"+(1!==this.hours()?\"les\":\"la\")+\"] LT\"},lastDay:function(){return\"[ahir a \"+(1!==this.hours()?\"les\":\"la\")+\"] LT\"},lastWeek:function(){return\"[el] dddd [passat a \"+(1!==this.hours()?\"les\":\"la\")+\"] LT\"},sameElse:\"L\"},relativeTime:{future:\"en %s\",past:\"fa %s\",s:\"uns segons\",m:\"un minut\",mm:\"%d minuts\",h:\"una hora\",hh:\"%d hores\",d:\"un dia\",dd:\"%d dies\",M:\"un mes\",MM:\"%d mesos\",y:\"un any\",yy:\"%d anys\"},ordinal:\"%dº\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){function b(a){return a>1&&5>a&&1!==~~(a/10)}function c(a,c,d,e){var f=a+\" \";switch(d){case\"s\":return c||e?\"pár sekund\":\"pár sekundami\";case\"m\":return c?\"minuta\":e?\"minutu\":\"minutou\";case\"mm\":return c||e?f+(b(a)?\"minuty\":\"minut\"):f+\"minutami\";break;case\"h\":return c?\"hodina\":e?\"hodinu\":\"hodinou\";case\"hh\":return c||e?f+(b(a)?\"hodiny\":\"hodin\"):f+\"hodinami\";break;case\"d\":return c||e?\"den\":\"dnem\";case\"dd\":return c||e?f+(b(a)?\"dny\":\"dnÃ\"):f+\"dny\";break;case\"M\":return c||e?\"mÄ›sÃc\":\"mÄ›sÃcem\";case\"MM\":return c||e?f+(b(a)?\"mÄ›sÃce\":\"mÄ›sÃců\"):f+\"mÄ›sÃci\";break;case\"y\":return c||e?\"rok\":\"rokem\";case\"yy\":return c||e?f+(b(a)?\"roky\":\"let\"):f+\"lety\"}}var d=\"leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_zářÃ_Å™Ãjen_listopad_prosinec\".split(\"_\"),e=\"led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_Å™Ãj_lis_pro\".split(\"_\");return a.lang(\"cs\",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp(\"^\"+a[c]+\"$|^\"+b[c]+\"$\",\"i\");return d}(d,e),weekdays:\"nedÄ›le_pondÄ›lÃ_úterý_stÅ™eda_Ätvrtek_pátek_sobota\".split(\"_\"),weekdaysShort:\"ne_po_út_st_Ät_pá_so\".split(\"_\"),weekdaysMin:\"ne_po_út_st_Ät_pá_so\".split(\"_\"),longDateFormat:{LT:\"H.mm\",L:\"DD. MM. YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY LT\",LLLL:\"dddd D. MMMM YYYY LT\"},calendar:{sameDay:\"[dnes v] LT\",nextDay:\"[zÃtra v] LT\",nextWeek:function(){switch(this.day()){case 0:return\"[v nedÄ›li v] LT\";case 1:case 2:return\"[v] dddd [v] LT\";case 3:return\"[ve stÅ™edu v] LT\";case 4:return\"[ve Ätvrtek v] LT\";case 5:return\"[v pátek v] LT\";case 6:return\"[v sobotu v] LT\"}},lastDay:\"[vÄera v] LT\",lastWeek:function(){switch(this.day()){case 0:return\"[minulou nedÄ›li v] LT\";case 1:case 2:return\"[minulé] dddd [v] LT\";case 3:return\"[minulou stÅ™edu v] LT\";case 4:case 5:return\"[minulý] dddd [v] LT\";case 6:return\"[minulou sobotu v] LT\"}},sameElse:\"L\"},relativeTime:{future:\"za %s\",past:\"pÅ™ed %s\",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"cv\",{months:\"кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав\".split(\"_\"),monthsShort:\"кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш\".split(\"_\"),weekdays:\"вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун\".split(\"_\"),weekdaysShort:\"выр_тун_ытл_юн_кĕç_Ñрн_шăм\".split(\"_\"),weekdaysMin:\"вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD-MM-YYYY\",LL:\"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]\",LLL:\"YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT\",LLLL:\"dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT\"},calendar:{sameDay:\"[ПаÑн] LT [Ñехетре]\",nextDay:\"[Ыран] LT [Ñехетре]\",lastDay:\"[Ĕнер] LT [Ñехетре]\",nextWeek:\"[ÇитеÑ] dddd LT [Ñехетре]\",lastWeek:\"[Иртнĕ] dddd LT [Ñехетре]\",sameElse:\"L\"},relativeTime:{future:function(a){var b=/Ñехет$/i.exec(a)?\"рен\":/çул$/i.exec(a)?\"тан\":\"ран\";return a+b},past:\"%s каÑлла\",s:\"пĕр-ик çеккунт\",m:\"пĕр минут\",mm:\"%d минут\",h:\"пĕр Ñехет\",hh:\"%d Ñехет\",d:\"пĕр кун\",dd:\"%d кун\",M:\"пĕр уйăх\",MM:\"%d уйăх\",y:\"пĕр çул\",yy:\"%d çул\"},ordinal:\"%d-мĕш\",week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){return a.lang(\"cy\",{months:\"Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr\".split(\"_\"),monthsShort:\"Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag\".split(\"_\"),weekdays:\"Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn\".split(\"_\"),weekdaysShort:\"Sul_Llun_Maw_Mer_Iau_Gwe_Sad\".split(\"_\"),weekdaysMin:\"Su_Ll_Ma_Me_Ia_Gw_Sa\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd, D MMMM YYYY LT\"},calendar:{sameDay:\"[Heddiw am] LT\",nextDay:\"[Yfory am] LT\",nextWeek:\"dddd [am] LT\",lastDay:\"[Ddoe am] LT\",lastWeek:\"dddd [diwethaf am] LT\",sameElse:\"L\"},relativeTime:{future:\"mewn %s\",past:\"%s yn ôl\",s:\"ychydig eiliadau\",m:\"munud\",mm:\"%d munud\",h:\"awr\",hh:\"%d awr\",d:\"diwrnod\",dd:\"%d diwrnod\",M:\"mis\",MM:\"%d mis\",y:\"blwyddyn\",yy:\"%d flynedd\"},ordinal:function(a){var b=a,c=\"\",d=[\"\",\"af\",\"il\",\"ydd\",\"ydd\",\"ed\",\"ed\",\"ed\",\"fed\",\"fed\",\"fed\",\"eg\",\"fed\",\"eg\",\"eg\",\"fed\",\"eg\",\"eg\",\"fed\",\"eg\",\"fed\"];return b>20?c=40===b||50===b||60===b||80===b||100===b?\"fed\":\"ain\":b>0&&(c=d[b]),a+c},week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"da\",{months:\"januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december\".split(\"_\"),monthsShort:\"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec\".split(\"_\"),weekdays:\"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag\".split(\"_\"),weekdaysShort:\"søn_man_tir_ons_tor_fre_lør\".split(\"_\"),weekdaysMin:\"sø_ma_ti_on_to_fr_lø\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY LT\",LLLL:\"dddd [d.] D. MMMM YYYY LT\"},calendar:{sameDay:\"[I dag kl.] LT\",nextDay:\"[I morgen kl.] LT\",nextWeek:\"dddd [kl.] LT\",lastDay:\"[I gÃ¥r kl.] LT\",lastWeek:\"[sidste] dddd [kl] LT\",sameElse:\"L\"},relativeTime:{future:\"om %s\",past:\"%s siden\",s:\"fÃ¥ sekunder\",m:\"et minut\",mm:\"%d minutter\",h:\"en time\",hh:\"%d timer\",d:\"en dag\",dd:\"%d dage\",M:\"en mÃ¥ned\",MM:\"%d mÃ¥neder\",y:\"et Ã¥r\",yy:\"%d Ã¥r\"},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){function b(a,b,c){var d={m:[\"eine Minute\",\"einer Minute\"],h:[\"eine Stunde\",\"einer Stunde\"],d:[\"ein Tag\",\"einem Tag\"],dd:[a+\" Tage\",a+\" Tagen\"],M:[\"ein Monat\",\"einem Monat\"],MM:[a+\" Monate\",a+\" Monaten\"],y:[\"ein Jahr\",\"einem Jahr\"],yy:[a+\" Jahre\",a+\" Jahren\"]};return b?d[c][0]:d[c][1]}return a.lang(\"de-at\",{months:\"Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember\".split(\"_\"),monthsShort:\"Jän._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.\".split(\"_\"),weekdays:\"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag\".split(\"_\"),weekdaysShort:\"So._Mo._Di._Mi._Do._Fr._Sa.\".split(\"_\"),weekdaysMin:\"So_Mo_Di_Mi_Do_Fr_Sa\".split(\"_\"),longDateFormat:{LT:\"HH:mm [Uhr]\",L:\"DD.MM.YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY LT\",LLLL:\"dddd, D. MMMM YYYY LT\"},calendar:{sameDay:\"[Heute um] LT\",sameElse:\"L\",nextDay:\"[Morgen um] LT\",nextWeek:\"dddd [um] LT\",lastDay:\"[Gestern um] LT\",lastWeek:\"[letzten] dddd [um] LT\"},relativeTime:{future:\"in %s\",past:\"vor %s\",s:\"ein paar Sekunden\",m:b,mm:\"%d Minuten\",h:b,hh:\"%d Stunden\",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){function b(a,b,c){var d={m:[\"eine Minute\",\"einer Minute\"],h:[\"eine Stunde\",\"einer Stunde\"],d:[\"ein Tag\",\"einem Tag\"],dd:[a+\" Tage\",a+\" Tagen\"],M:[\"ein Monat\",\"einem Monat\"],MM:[a+\" Monate\",a+\" Monaten\"],y:[\"ein Jahr\",\"einem Jahr\"],yy:[a+\" Jahre\",a+\" Jahren\"]};return b?d[c][0]:d[c][1]}return a.lang(\"de\",{months:\"Januar_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember\".split(\"_\"),monthsShort:\"Jan._Febr._Mrz._Apr._Mai_Jun._Jul._Aug._Sept._Okt._Nov._Dez.\".split(\"_\"),weekdays:\"Sonntag_Montag_Dienstag_Mittwoch_Donnerstag_Freitag_Samstag\".split(\"_\"),weekdaysShort:\"So._Mo._Di._Mi._Do._Fr._Sa.\".split(\"_\"),weekdaysMin:\"So_Mo_Di_Mi_Do_Fr_Sa\".split(\"_\"),longDateFormat:{LT:\"HH:mm [Uhr]\",L:\"DD.MM.YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY LT\",LLLL:\"dddd, D. MMMM YYYY LT\"},calendar:{sameDay:\"[Heute um] LT\",sameElse:\"L\",nextDay:\"[Morgen um] LT\",nextWeek:\"dddd [um] LT\",lastDay:\"[Gestern um] LT\",lastWeek:\"[letzten] dddd [um] LT\"},relativeTime:{future:\"in %s\",past:\"vor %s\",s:\"ein paar Sekunden\",m:b,mm:\"%d Minuten\",h:b,hh:\"%d Stunden\",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"el\",{monthsNominativeEl:\"ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτÎμβÏιος_ΟκτώβÏιος_ÎοÎμβÏιος_ΔεκÎμβÏιος\".split(\"_\"),monthsGenitiveEl:\"ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου\".split(\"_\"),months:function(a,b){return/D/.test(b.substring(0,b.indexOf(\"MMMM\")))?this._monthsGenitiveEl[a.month()]:this._monthsNominativeEl[a.month()]},monthsShort:\"Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ\".split(\"_\"),weekdays:\"ΚυÏιακή_ΔευτÎÏα_ΤÏίτη_ΤετάÏτη_Î Îμπτη_ΠαÏασκευή_Σάββατο\".split(\"_\"),weekdaysShort:\"ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ\".split(\"_\"),weekdaysMin:\"Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα\".split(\"_\"),meridiem:function(a,b,c){return a>11?c?\"μμ\":\"ΜΜ\":c?\"πμ\":\"Î Îœ\"},longDateFormat:{LT:\"h:mm A\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd, D MMMM YYYY LT\"},calendarEl:{sameDay:\"[ΣήμεÏα {}] LT\",nextDay:\"[ΑÏÏιο {}] LT\",nextWeek:\"dddd [{}] LT\",lastDay:\"[Χθες {}] LT\",lastWeek:function(){switch(this.day()){case 6:return\"[το Ï€ÏοηγοÏμενο] dddd [{}] LT\";default:return\"[την Ï€ÏοηγοÏμενη] dddd [{}] LT\"}},sameElse:\"L\"},calendar:function(a,b){var c=this._calendarEl[a],d=b&&b.hours();return\"function\"==typeof c&&(c=c.apply(b)),c.replace(\"{}\",d%12===1?\"στη\":\"στις\")},relativeTime:{future:\"σε %s\",past:\"%s Ï€Ïιν\",s:\"δευτεÏόλεπτα\",m:\"Îνα λεπτό\",mm:\"%d λεπτά\",h:\"μία ÏŽÏα\",hh:\"%d ÏŽÏες\",d:\"μία μÎÏα\",dd:\"%d μÎÏες\",M:\"Îνας μήνας\",MM:\"%d μήνες\",y:\"Îνας χÏόνος\",yy:\"%d χÏόνια\"},ordinal:function(a){return a+\"η\"},week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"en-au\",{months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),monthsShort:\"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec\".split(\"_\"),weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),weekdaysShort:\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\".split(\"_\"),weekdaysMin:\"Su_Mo_Tu_We_Th_Fr_Sa\".split(\"_\"),longDateFormat:{LT:\"h:mm A\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd, D MMMM YYYY LT\"},calendar:{sameDay:\"[Today at] LT\",nextDay:\"[Tomorrow at] LT\",nextWeek:\"dddd [at] LT\",lastDay:\"[Yesterday at] LT\",lastWeek:\"[Last] dddd [at] LT\",sameElse:\"L\"},relativeTime:{future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"},ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?\"th\":1===b?\"st\":2===b?\"nd\":3===b?\"rd\":\"th\";return a+c},week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"en-ca\",{months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),monthsShort:\"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec\".split(\"_\"),weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),weekdaysShort:\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\".split(\"_\"),weekdaysMin:\"Su_Mo_Tu_We_Th_Fr_Sa\".split(\"_\"),longDateFormat:{LT:\"h:mm A\",L:\"YYYY-MM-DD\",LL:\"D MMMM, YYYY\",LLL:\"D MMMM, YYYY LT\",LLLL:\"dddd, D MMMM, YYYY LT\"},calendar:{sameDay:\"[Today at] LT\",nextDay:\"[Tomorrow at] LT\",nextWeek:\"dddd [at] LT\",lastDay:\"[Yesterday at] LT\",lastWeek:\"[Last] dddd [at] LT\",sameElse:\"L\"},relativeTime:{future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"},ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?\"th\":1===b?\"st\":2===b?\"nd\":3===b?\"rd\":\"th\";return a+c}})}),function(a){a(mb)}(function(a){return a.lang(\"en-gb\",{months:\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),monthsShort:\"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec\".split(\"_\"),weekdays:\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),weekdaysShort:\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\".split(\"_\"),weekdaysMin:\"Su_Mo_Tu_We_Th_Fr_Sa\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd, D MMMM YYYY LT\"},calendar:{sameDay:\"[Today at] LT\",nextDay:\"[Tomorrow at] LT\",nextWeek:\"dddd [at] LT\",lastDay:\"[Yesterday at] LT\",lastWeek:\"[Last] dddd [at] LT\",sameElse:\"L\"},relativeTime:{future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"},ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?\"th\":1===b?\"st\":2===b?\"nd\":3===b?\"rd\":\"th\";return a+c},week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"eo\",{months:\"januaro_februaro_marto_aprilo_majo_junio_julio_aÅgusto_septembro_oktobro_novembro_decembro\".split(\"_\"),monthsShort:\"jan_feb_mar_apr_maj_jun_jul_aÅg_sep_okt_nov_dec\".split(\"_\"),weekdays:\"Dimanĉo_Lundo_Mardo_Merkredo_Ä´aÅdo_Vendredo_Sabato\".split(\"_\"),weekdaysShort:\"Dim_Lun_Mard_Merk_Ä´aÅ_Ven_Sab\".split(\"_\"),weekdaysMin:\"Di_Lu_Ma_Me_Ä´a_Ve_Sa\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"YYYY-MM-DD\",LL:\"D[-an de] MMMM, YYYY\",LLL:\"D[-an de] MMMM, YYYY LT\",LLLL:\"dddd, [la] D[-an de] MMMM, YYYY LT\"},meridiem:function(a,b,c){return a>11?c?\"p.t.m.\":\"P.T.M.\":c?\"a.t.m.\":\"A.T.M.\"},calendar:{sameDay:\"[HodiaÅ je] LT\",nextDay:\"[MorgaÅ je] LT\",nextWeek:\"dddd [je] LT\",lastDay:\"[HieraÅ je] LT\",lastWeek:\"[pasinta] dddd [je] LT\",sameElse:\"L\"},relativeTime:{future:\"je %s\",past:\"antaÅ %s\",s:\"sekundoj\",m:\"minuto\",mm:\"%d minutoj\",h:\"horo\",hh:\"%d horoj\",d:\"tago\",dd:\"%d tagoj\",M:\"monato\",MM:\"%d monatoj\",y:\"jaro\",yy:\"%d jaroj\"},ordinal:\"%da\",week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){var b=\"ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.\".split(\"_\"),c=\"ene_feb_mar_abr_may_jun_jul_ago_sep_oct_nov_dic\".split(\"_\");return a.lang(\"es\",{months:\"enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre\".split(\"_\"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:\"domingo_lunes_martes_miércoles_jueves_viernes_sábado\".split(\"_\"),weekdaysShort:\"dom._lun._mar._mié._jue._vie._sáb.\".split(\"_\"),weekdaysMin:\"Do_Lu_Ma_Mi_Ju_Vi_Sá\".split(\"_\"),longDateFormat:{LT:\"H:mm\",L:\"DD/MM/YYYY\",LL:\"D [de] MMMM [del] YYYY\",LLL:\"D [de] MMMM [del] YYYY LT\",LLLL:\"dddd, D [de] MMMM [del] YYYY LT\"},calendar:{sameDay:function(){return\"[hoy a la\"+(1!==this.hours()?\"s\":\"\")+\"] LT\"},nextDay:function(){return\"[mañana a la\"+(1!==this.hours()?\"s\":\"\")+\"] LT\"},nextWeek:function(){return\"dddd [a la\"+(1!==this.hours()?\"s\":\"\")+\"] LT\"},lastDay:function(){return\"[ayer a la\"+(1!==this.hours()?\"s\":\"\")+\"] LT\"},lastWeek:function(){return\"[el] dddd [pasado a la\"+(1!==this.hours()?\"s\":\"\")+\"] LT\"},sameElse:\"L\"},relativeTime:{future:\"en %s\",past:\"hace %s\",s:\"unos segundos\",m:\"un minuto\",mm:\"%d minutos\",h:\"una hora\",hh:\"%d horas\",d:\"un dÃa\",dd:\"%d dÃas\",M:\"un mes\",MM:\"%d meses\",y:\"un año\",yy:\"%d años\"},ordinal:\"%dº\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){function b(a,b,c,d){var e={s:[\"mõne sekundi\",\"mõni sekund\",\"paar sekundit\"],m:[\"ühe minuti\",\"üks minut\"],mm:[a+\" minuti\",a+\" minutit\"],h:[\"ühe tunni\",\"tund aega\",\"üks tund\"],hh:[a+\" tunni\",a+\" tundi\"],d:[\"ühe päeva\",\"üks päev\"],M:[\"kuu aja\",\"kuu aega\",\"üks kuu\"],MM:[a+\" kuu\",a+\" kuud\"],y:[\"ühe aasta\",\"aasta\",\"üks aasta\"],yy:[a+\" aasta\",a+\" aastat\"]};return b?e[c][2]?e[c][2]:e[c][1]:d?e[c][0]:e[c][1]}return a.lang(\"et\",{months:\"jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember\".split(\"_\"),monthsShort:\"jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets\".split(\"_\"),weekdays:\"pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev\".split(\"_\"),weekdaysShort:\"P_E_T_K_N_R_L\".split(\"_\"),weekdaysMin:\"P_E_T_K_N_R_L\".split(\"_\"),longDateFormat:{LT:\"H:mm\",L:\"DD.MM.YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY LT\",LLLL:\"dddd, D. MMMM YYYY LT\"},calendar:{sameDay:\"[Täna,] LT\",nextDay:\"[Homme,] LT\",nextWeek:\"[Järgmine] dddd LT\",lastDay:\"[Eile,] LT\",lastWeek:\"[Eelmine] dddd LT\",sameElse:\"L\"},relativeTime:{future:\"%s pärast\",past:\"%s tagasi\",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:\"%d päeva\",M:b,MM:b,y:b,yy:b},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"eu\",{months:\"urtarrila_otsaila_martxoa_apirila_maiatza_ekaina_uztaila_abuztua_iraila_urria_azaroa_abendua\".split(\"_\"),monthsShort:\"urt._ots._mar._api._mai._eka._uzt._abu._ira._urr._aza._abe.\".split(\"_\"),weekdays:\"igandea_astelehena_asteartea_asteazkena_osteguna_ostirala_larunbata\".split(\"_\"),weekdaysShort:\"ig._al._ar._az._og._ol._lr.\".split(\"_\"),weekdaysMin:\"ig_al_ar_az_og_ol_lr\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"YYYY-MM-DD\",LL:\"YYYY[ko] MMMM[ren] D[a]\",LLL:\"YYYY[ko] MMMM[ren] D[a] LT\",LLLL:\"dddd, YYYY[ko] MMMM[ren] D[a] LT\",l:\"YYYY-M-D\",ll:\"YYYY[ko] MMM D[a]\",lll:\"YYYY[ko] MMM D[a] LT\",llll:\"ddd, YYYY[ko] MMM D[a] LT\"},calendar:{sameDay:\"[gaur] LT[etan]\",nextDay:\"[bihar] LT[etan]\",nextWeek:\"dddd LT[etan]\",lastDay:\"[atzo] LT[etan]\",lastWeek:\"[aurreko] dddd LT[etan]\",sameElse:\"L\"},relativeTime:{future:\"%s barru\",past:\"duela %s\",s:\"segundo batzuk\",m:\"minutu bat\",mm:\"%d minutu\",h:\"ordu bat\",hh:\"%d ordu\",d:\"egun bat\",dd:\"%d egun\",M:\"hilabete bat\",MM:\"%d hilabete\",y:\"urte bat\",yy:\"%d urte\"},ordinal:\"%d.\",week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){var b={1:\"Û±\",2:\"Û²\",3:\"Û³\",4:\"Û´\",5:\"Ûµ\",6:\"Û¶\",7:\"Û·\",8:\"Û¸\",9:\"Û¹\",0:\"Û°\"},c={\"Û±\":\"1\",\"Û²\":\"2\",\"Û³\":\"3\",\"Û´\":\"4\",\"Ûµ\":\"5\",\"Û¶\":\"6\",\"Û·\":\"7\",\"Û¸\":\"8\",\"Û¹\":\"9\",\"Û°\":\"0\"};return a.lang(\"fa\",{months:\"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر\".split(\"_\"),monthsShort:\"ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر\".split(\"_\"),weekdays:\"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه\".split(\"_\"),weekdaysShort:\"یک‌شنبه_دوشنبه_سه‌شنبه_چهارشنبه_پنج‌شنبه_جمعه_شنبه\".split(\"_\"),weekdaysMin:\"ÛŒ_د_س_Ú†_Ù¾_ج_Ø´\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd, D MMMM YYYY LT\"},meridiem:function(a){return 12>a?\"قبل از ظهر\":\"بعد از ظهر\"},calendar:{sameDay:\"[امروز ساعت] LT\",nextDay:\"[Ùردا ساعت] LT\",nextWeek:\"dddd [ساعت] LT\",lastDay:\"[دیروز ساعت] LT\",lastWeek:\"dddd [پیش] [ساعت] LT\",sameElse:\"L\"},relativeTime:{future:\"در %s\",past:\"%s پیش\",s:\"چندین ثانیه\",m:\"یک دقیقه\",mm:\"%d دقیقه\",h:\"یک ساعت\",hh:\"%d ساعت\",d:\"یک روز\",dd:\"%d روز\",M:\"یک ماه\",MM:\"%d ماه\",y:\"یک سال\",yy:\"%d سال\"},preparse:function(a){return a.replace(/[Û°-Û¹]/g,function(a){return c[a]}).replace(/ØŒ/g,\",\")},postformat:function(a){return a.replace(/\\d/g,function(a){return b[a]}).replace(/,/g,\"ØŒ\")},ordinal:\"%dÙ…\",week:{dow:6,doy:12}})}),function(a){a(mb)}(function(a){function b(a,b,d,e){var f=\"\";switch(d){case\"s\":return e?\"muutaman sekunnin\":\"muutama sekunti\";case\"m\":return e?\"minuutin\":\"minuutti\";case\"mm\":f=e?\"minuutin\":\"minuuttia\";break;case\"h\":return e?\"tunnin\":\"tunti\";case\"hh\":f=e?\"tunnin\":\"tuntia\";break;case\"d\":return e?\"päivän\":\"päivä\";case\"dd\":f=e?\"päivän\":\"päivää\";break;case\"M\":return e?\"kuukauden\":\"kuukausi\";case\"MM\":f=e?\"kuukauden\":\"kuukautta\";break;case\"y\":return e?\"vuoden\":\"vuosi\";case\"yy\":f=e?\"vuoden\":\"vuotta\"}return f=c(a,e)+\" \"+f}function c(a,b){return 10>a?b?e[a]:d[a]:a}var d=\"nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän\".split(\" \"),e=[\"nolla\",\"yhden\",\"kahden\",\"kolmen\",\"neljän\",\"viiden\",\"kuuden\",d[7],d[8],d[9]];return a.lang(\"fi\",{months:\"tammikuu_helmikuu_maaliskuu_huhtikuu_toukokuu_kesäkuu_heinäkuu_elokuu_syyskuu_lokakuu_marraskuu_joulukuu\".split(\"_\"),monthsShort:\"tammi_helmi_maalis_huhti_touko_kesä_heinä_elo_syys_loka_marras_joulu\".split(\"_\"),weekdays:\"sunnuntai_maanantai_tiistai_keskiviikko_torstai_perjantai_lauantai\".split(\"_\"),weekdaysShort:\"su_ma_ti_ke_to_pe_la\".split(\"_\"),weekdaysMin:\"su_ma_ti_ke_to_pe_la\".split(\"_\"),longDateFormat:{LT:\"HH.mm\",L:\"DD.MM.YYYY\",LL:\"Do MMMM[ta] YYYY\",LLL:\"Do MMMM[ta] YYYY, [klo] LT\",LLLL:\"dddd, Do MMMM[ta] YYYY, [klo] LT\",l:\"D.M.YYYY\",ll:\"Do MMM YYYY\",lll:\"Do MMM YYYY, [klo] LT\",llll:\"ddd, Do MMM YYYY, [klo] LT\"},calendar:{sameDay:\"[tänään] [klo] LT\",nextDay:\"[huomenna] [klo] LT\",nextWeek:\"dddd [klo] LT\",lastDay:\"[eilen] [klo] LT\",lastWeek:\"[viime] dddd[na] [klo] LT\",sameElse:\"L\"},relativeTime:{future:\"%s päästä\",past:\"%s sitten\",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"fo\",{months:\"januar_februar_mars_aprÃl_mai_juni_juli_august_september_oktober_november_desember\".split(\"_\"),monthsShort:\"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des\".split(\"_\"),weekdays:\"sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_frÃggjadagur_leygardagur\".split(\"_\"),weekdaysShort:\"sun_mán_týs_mik_hós_frÃ_ley\".split(\"_\"),weekdaysMin:\"su_má_tý_mi_hó_fr_le\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd D. MMMM, YYYY LT\"},calendar:{sameDay:\"[à dag kl.] LT\",nextDay:\"[à morgin kl.] LT\",nextWeek:\"dddd [kl.] LT\",lastDay:\"[à gjár kl.] LT\",lastWeek:\"[sÃðstu] dddd [kl] LT\",sameElse:\"L\"},relativeTime:{future:\"um %s\",past:\"%s sÃðani\",s:\"fá sekund\",m:\"ein minutt\",mm:\"%d minuttir\",h:\"ein tÃmi\",hh:\"%d tÃmar\",d:\"ein dagur\",dd:\"%d dagar\",M:\"ein mánaði\",MM:\"%d mánaðir\",y:\"eitt ár\",yy:\"%d ár\"},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"fr-ca\",{months:\"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre\".split(\"_\"),monthsShort:\"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.\".split(\"_\"),weekdays:\"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi\".split(\"_\"),weekdaysShort:\"dim._lun._mar._mer._jeu._ven._sam.\".split(\"_\"),weekdaysMin:\"Di_Lu_Ma_Me_Je_Ve_Sa\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"YYYY-MM-DD\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd D MMMM YYYY LT\"},calendar:{sameDay:\"[Aujourd'hui à ] LT\",nextDay:\"[Demain à ] LT\",nextWeek:\"dddd [à ] LT\",lastDay:\"[Hier à ] LT\",lastWeek:\"dddd [dernier à ] LT\",sameElse:\"L\"},relativeTime:{future:\"dans %s\",past:\"il y a %s\",s:\"quelques secondes\",m:\"une minute\",mm:\"%d minutes\",h:\"une heure\",hh:\"%d heures\",d:\"un jour\",dd:\"%d jours\",M:\"un mois\",MM:\"%d mois\",y:\"un an\",yy:\"%d ans\"},ordinal:function(a){return a+(1===a?\"er\":\"\")}})}),function(a){a(mb)}(function(a){return a.lang(\"fr\",{months:\"janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre\".split(\"_\"),monthsShort:\"janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.\".split(\"_\"),weekdays:\"dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi\".split(\"_\"),weekdaysShort:\"dim._lun._mar._mer._jeu._ven._sam.\".split(\"_\"),weekdaysMin:\"Di_Lu_Ma_Me_Je_Ve_Sa\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd D MMMM YYYY LT\"},calendar:{sameDay:\"[Aujourd'hui à ] LT\",nextDay:\"[Demain à ] LT\",nextWeek:\"dddd [à ] LT\",lastDay:\"[Hier à ] LT\",lastWeek:\"dddd [dernier à ] LT\",sameElse:\"L\"},relativeTime:{future:\"dans %s\",past:\"il y a %s\",s:\"quelques secondes\",m:\"une minute\",mm:\"%d minutes\",h:\"une heure\",hh:\"%d heures\",d:\"un jour\",dd:\"%d jours\",M:\"un mois\",MM:\"%d mois\",y:\"un an\",yy:\"%d ans\"},ordinal:function(a){return a+(1===a?\"er\":\"\")},week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"gl\",{months:\"Xaneiro_Febreiro_Marzo_Abril_Maio_Xuño_Xullo_Agosto_Setembro_Outubro_Novembro_Decembro\".split(\"_\"),monthsShort:\"Xan._Feb._Mar._Abr._Mai._Xuñ._Xul._Ago._Set._Out._Nov._Dec.\".split(\"_\"),weekdays:\"Domingo_Luns_Martes_Mércores_Xoves_Venres_Sábado\".split(\"_\"),weekdaysShort:\"Dom._Lun._Mar._Mér._Xov._Ven._Sáb.\".split(\"_\"),weekdaysMin:\"Do_Lu_Ma_Mé_Xo_Ve_Sá\".split(\"_\"),longDateFormat:{LT:\"H:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd D MMMM YYYY LT\"},calendar:{sameDay:function(){return\"[hoxe \"+(1!==this.hours()?\"ás\":\"á\")+\"] LT\"},nextDay:function(){return\"[mañá \"+(1!==this.hours()?\"ás\":\"á\")+\"] LT\"},nextWeek:function(){return\"dddd [\"+(1!==this.hours()?\"ás\":\"a\")+\"] LT\"},lastDay:function(){return\"[onte \"+(1!==this.hours()?\"á\":\"a\")+\"] LT\"},lastWeek:function(){return\"[o] dddd [pasado \"+(1!==this.hours()?\"ás\":\"a\")+\"] LT\"},sameElse:\"L\"},relativeTime:{future:function(a){return\"uns segundos\"===a?\"nuns segundos\":\"en \"+a},past:\"hai %s\",s:\"uns segundos\",m:\"un minuto\",mm:\"%d minutos\",h:\"unha hora\",hh:\"%d horas\",d:\"un dÃa\",dd:\"%d dÃas\",M:\"un mes\",MM:\"%d meses\",y:\"un ano\",yy:\"%d anos\"},ordinal:\"%dº\",week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){return a.lang(\"he\",{months:\"×™× ×•×ר_פברו×ר_מרץ_×פריל_מ××™_×™×•× ×™_יולי_×וגוסט_ספטמבר_×וקטובר_× ×•×‘×ž×‘×¨_דצמבר\".split(\"_\"),monthsShort:\"×™× ×•×³_פבר׳_מרץ_×פר׳_מ××™_×™×•× ×™_יולי_×וג׳_ספט׳_×וק׳_× ×•×‘×³_דצמ׳\".split(\"_\"),weekdays:\"ר×שון_×©× ×™_שלישי_רביעי_חמישי_שישי_שבת\".split(\"_\"),weekdaysShort:\"×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳\".split(\"_\"),weekdaysMin:\"×_ב_×’_ד_×”_ו_ש\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D [ב]MMMM YYYY\",LLL:\"D [ב]MMMM YYYY LT\",LLLL:\"dddd, D [ב]MMMM YYYY LT\",l:\"D/M/YYYY\",ll:\"D MMM YYYY\",lll:\"D MMM YYYY LT\",llll:\"ddd, D MMM YYYY LT\"},calendar:{sameDay:\"[×”×™×•× ×‘Ö¾]LT\",nextDay:\"[מחר ב־]LT\",nextWeek:\"dddd [בשעה] LT\",lastDay:\"[×תמול ב־]LT\",lastWeek:\"[ביו×] dddd [×”×חרון בשעה] LT\",sameElse:\"L\"},relativeTime:{future:\"בעוד %s\",past:\"×œ×¤× ×™ %s\",s:\"מספר ×©× ×™×•×ª\",m:\"דקה\",mm:\"%d דקות\",h:\"שעה\",hh:function(a){return 2===a?\"שעתיי×\":a+\" שעות\"\r\n},d:\"יו×\",dd:function(a){return 2===a?\"יומיי×\":a+\" ימי×\"},M:\"חודש\",MM:function(a){return 2===a?\"חודשיי×\":a+\" חודשי×\"},y:\"×©× ×”\",yy:function(a){return 2===a?\"×©× ×ª×™×™×\":a+\" ×©× ×™×\"}}})}),function(a){a(mb)}(function(a){var b={1:\"१\",2:\"२\",3:\"३\",4:\"४\",5:\"५\",6:\"६\",7:\"à¥\",8:\"८\",9:\"९\",0:\"०\"},c={\"१\":\"1\",\"२\":\"2\",\"३\":\"3\",\"४\":\"4\",\"५\":\"5\",\"६\":\"6\",\"à¥\":\"7\",\"८\":\"8\",\"९\":\"9\",\"०\":\"0\"};return a.lang(\"hi\",{months:\"जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°\".split(\"_\"),monthsShort:\"जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.\".split(\"_\"),weekdays:\"रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार\".split(\"_\"),weekdaysShort:\"रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि\".split(\"_\"),weekdaysMin:\"र_सो_मं_बà¥_गà¥_शà¥_श\".split(\"_\"),longDateFormat:{LT:\"A h:mm बजे\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY, LT\",LLLL:\"dddd, D MMMM YYYY, LT\"},calendar:{sameDay:\"[आज] LT\",nextDay:\"[कल] LT\",nextWeek:\"dddd, LT\",lastDay:\"[कल] LT\",lastWeek:\"[पिछले] dddd, LT\",sameElse:\"L\"},relativeTime:{future:\"%s में\",past:\"%s पहले\",s:\"कà¥à¤› ही कà¥à¤·à¤£\",m:\"à¤à¤• मिनट\",mm:\"%d मिनट\",h:\"à¤à¤• घंटा\",hh:\"%d घंटे\",d:\"à¤à¤• दिन\",dd:\"%d दिन\",M:\"à¤à¤• महीने\",MM:\"%d महीने\",y:\"à¤à¤• वरà¥à¤·\",yy:\"%d वरà¥à¤·\"},preparse:function(a){return a.replace(/[१२३४५६à¥à¥®à¥¯à¥¦]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\\d/g,function(a){return b[a]})},meridiem:function(a){return 4>a?\"रात\":10>a?\"सà¥à¤¬à¤¹\":17>a?\"दोपहर\":20>a?\"शाम\":\"रात\"},week:{dow:0,doy:6}})}),function(a){a(mb)}(function(a){function b(a,b,c){var d=a+\" \";switch(c){case\"m\":return b?\"jedna minuta\":\"jedne minute\";case\"mm\":return d+=1===a?\"minuta\":2===a||3===a||4===a?\"minute\":\"minuta\";case\"h\":return b?\"jedan sat\":\"jednog sata\";case\"hh\":return d+=1===a?\"sat\":2===a||3===a||4===a?\"sata\":\"sati\";case\"dd\":return d+=1===a?\"dan\":\"dana\";case\"MM\":return d+=1===a?\"mjesec\":2===a||3===a||4===a?\"mjeseca\":\"mjeseci\";case\"yy\":return d+=1===a?\"godina\":2===a||3===a||4===a?\"godine\":\"godina\"}}return a.lang(\"hr\",{months:\"sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac\".split(\"_\"),monthsShort:\"sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.\".split(\"_\"),weekdays:\"nedjelja_ponedjeljak_utorak_srijeda_Äetvrtak_petak_subota\".split(\"_\"),weekdaysShort:\"ned._pon._uto._sri._Äet._pet._sub.\".split(\"_\"),weekdaysMin:\"ne_po_ut_sr_Äe_pe_su\".split(\"_\"),longDateFormat:{LT:\"H:mm\",L:\"DD. MM. YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY LT\",LLLL:\"dddd, D. MMMM YYYY LT\"},calendar:{sameDay:\"[danas u] LT\",nextDay:\"[sutra u] LT\",nextWeek:function(){switch(this.day()){case 0:return\"[u] [nedjelju] [u] LT\";case 3:return\"[u] [srijedu] [u] LT\";case 6:return\"[u] [subotu] [u] LT\";case 1:case 2:case 4:case 5:return\"[u] dddd [u] LT\"}},lastDay:\"[juÄer u] LT\",lastWeek:function(){switch(this.day()){case 0:case 3:return\"[proÅ¡lu] dddd [u] LT\";case 6:return\"[proÅ¡le] [subote] [u] LT\";case 1:case 2:case 4:case 5:return\"[proÅ¡li] dddd [u] LT\"}},sameElse:\"L\"},relativeTime:{future:\"za %s\",past:\"prije %s\",s:\"par sekundi\",m:b,mm:b,h:b,hh:b,d:\"dan\",dd:b,M:\"mjesec\",MM:b,y:\"godinu\",yy:b},ordinal:\"%d.\",week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){function b(a,b,c,d){var e=a;switch(c){case\"s\":return d||b?\"néhány másodperc\":\"néhány másodperce\";case\"m\":return\"egy\"+(d||b?\" perc\":\" perce\");case\"mm\":return e+(d||b?\" perc\":\" perce\");case\"h\":return\"egy\"+(d||b?\" óra\":\" órája\");case\"hh\":return e+(d||b?\" óra\":\" órája\");case\"d\":return\"egy\"+(d||b?\" nap\":\" napja\");case\"dd\":return e+(d||b?\" nap\":\" napja\");case\"M\":return\"egy\"+(d||b?\" hónap\":\" hónapja\");case\"MM\":return e+(d||b?\" hónap\":\" hónapja\");case\"y\":return\"egy\"+(d||b?\" év\":\" éve\");case\"yy\":return e+(d||b?\" év\":\" éve\")}return\"\"}function c(a){return(a?\"\":\"[múlt] \")+\"[\"+d[this.day()]+\"] LT[-kor]\"}var d=\"vasárnap hétfÅ‘n kedden szerdán csütörtökön pénteken szombaton\".split(\" \");return a.lang(\"hu\",{months:\"január_február_március_április_május_június_július_augusztus_szeptember_október_november_december\".split(\"_\"),monthsShort:\"jan_feb_márc_ápr_máj_jún_júl_aug_szept_okt_nov_dec\".split(\"_\"),weekdays:\"vasárnap_hétfÅ‘_kedd_szerda_csütörtök_péntek_szombat\".split(\"_\"),weekdaysShort:\"vas_hét_kedd_sze_csüt_pén_szo\".split(\"_\"),weekdaysMin:\"v_h_k_sze_cs_p_szo\".split(\"_\"),longDateFormat:{LT:\"H:mm\",L:\"YYYY.MM.DD.\",LL:\"YYYY. MMMM D.\",LLL:\"YYYY. MMMM D., LT\",LLLL:\"YYYY. MMMM D., dddd LT\"},meridiem:function(a,b,c){return 12>a?c===!0?\"de\":\"DE\":c===!0?\"du\":\"DU\"},calendar:{sameDay:\"[ma] LT[-kor]\",nextDay:\"[holnap] LT[-kor]\",nextWeek:function(){return c.call(this,!0)},lastDay:\"[tegnap] LT[-kor]\",lastWeek:function(){return c.call(this,!1)},sameElse:\"L\"},relativeTime:{future:\"%s múlva\",past:\"%s\",s:b,m:b,mm:b,h:b,hh:b,d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinal:\"%d.\",week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){function b(a,b){var c={nominative:\"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€_Õ´Õ¡Ö€Õ¿_Õ¡ÕºÖ€Õ«Õ¬_Õ´Õ¡ÕµÕ«Õ½_Õ°Õ¸Ö‚Õ¶Õ«Õ½_Õ°Õ¸Ö‚Õ¬Õ«Õ½_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€\".split(\"_\"),accusative:\"Õ°Õ¸Ö‚Õ¶Õ¾Õ¡Ö€Õ«_ÖƒÕ¥Õ¿Ö€Õ¾Õ¡Ö€Õ«_Õ´Õ¡Ö€Õ¿Õ«_Õ¡ÕºÖ€Õ«Õ¬Õ«_Õ´Õ¡ÕµÕ«Õ½Õ«_Õ°Õ¸Ö‚Õ¶Õ«Õ½Õ«_Õ°Õ¸Ö‚Õ¬Õ«Õ½Õ«_Ö…Õ£Õ¸Õ½Õ¿Õ¸Õ½Õ«_Õ½Õ¥ÕºÕ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ°Õ¸Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¶Õ¸ÕµÕ¥Õ´Õ¢Õ¥Ö€Õ«_Õ¤Õ¥Õ¯Õ¿Õ¥Õ´Õ¢Õ¥Ö€Õ«\".split(\"_\")},d=/D[oD]?(\\[[^\\[\\]]*\\]|\\s+)+MMMM?/.test(b)?\"accusative\":\"nominative\";return c[d][a.month()]}function c(a){var b=\"Õ°Õ¶Õ¾_ÖƒÕ¿Ö€_Õ´Ö€Õ¿_Õ¡ÕºÖ€_Õ´ÕµÕ½_Õ°Õ¶Õ½_Õ°Õ¬Õ½_Ö…Õ£Õ½_Õ½ÕºÕ¿_Õ°Õ¯Õ¿_Õ¶Õ´Õ¢_Õ¤Õ¯Õ¿\".split(\"_\");return b[a.month()]}function d(a){var b=\"Õ¯Õ«Ö€Õ¡Õ¯Õ«_Õ¥Ö€Õ¯Õ¸Ö‚Õ·Õ¡Õ¢Õ©Õ«_Õ¥Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ¹Õ¸Ö€Õ¥Ö„Õ·Õ¡Õ¢Õ©Õ«_Õ°Õ«Õ¶Õ£Õ·Õ¡Õ¢Õ©Õ«_Õ¸Ö‚Ö€Õ¢Õ¡Õ©_Õ·Õ¡Õ¢Õ¡Õ©\".split(\"_\");return b[a.day()]}return a.lang(\"hy-am\",{months:b,monthsShort:c,weekdays:d,weekdaysShort:\"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©\".split(\"_\"),weekdaysMin:\"Õ¯Ö€Õ¯_Õ¥Ö€Õ¯_Õ¥Ö€Ö„_Õ¹Ö€Ö„_Õ°Õ¶Õ£_Õ¸Ö‚Ö€Õ¢_Õ·Õ¢Õ©\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD.MM.YYYY\",LL:\"D MMMM YYYY Õ©.\",LLL:\"D MMMM YYYY Õ©., LT\",LLLL:\"dddd, D MMMM YYYY Õ©., LT\"},calendar:{sameDay:\"[Õ¡ÕµÕ½Ö…Ö€] LT\",nextDay:\"[Õ¾Õ¡Õ²Õ¨] LT\",lastDay:\"[Õ¥Ö€Õ¥Õ¯] LT\",nextWeek:function(){return\"dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT\"},lastWeek:function(){return\"[Õ¡Õ¶ÖÕ¡Õ®] dddd [Ö…Ö€Õ¨ ÕªÕ¡Õ´Õ¨] LT\"},sameElse:\"L\"},relativeTime:{future:\"%s Õ°Õ¥Õ¿Õ¸\",past:\"%s Õ¡Õ¼Õ¡Õ»\",s:\"Õ´Õ« Ö„Õ¡Õ¶Õ« Õ¾Õ¡ÕµÖ€Õ¯ÕµÕ¡Õ¶\",m:\"Ö€Õ¸ÕºÕ¥\",mm:\"%d Ö€Õ¸ÕºÕ¥\",h:\"ÕªÕ¡Õ´\",hh:\"%d ÕªÕ¡Õ´\",d:\"Ö…Ö€\",dd:\"%d Ö…Ö€\",M:\"Õ¡Õ´Õ«Õ½\",MM:\"%d Õ¡Õ´Õ«Õ½\",y:\"Õ¿Õ¡Ö€Õ«\",yy:\"%d Õ¿Õ¡Ö€Õ«\"},meridiem:function(a){return 4>a?\"Õ£Õ«Õ·Õ¥Ö€Õ¾Õ¡\":12>a?\"Õ¡Õ¼Õ¡Õ¾Õ¸Õ¿Õ¾Õ¡\":17>a?\"ÖÕ¥Ö€Õ¥Õ¯Õ¾Õ¡\":\"Õ¥Ö€Õ¥Õ¯Õ¸ÕµÕ¡Õ¶\"},ordinal:function(a,b){switch(b){case\"DDD\":case\"w\":case\"W\":case\"DDDo\":return 1===a?a+\"-Õ«Õ¶\":a+\"-Ö€Õ¤\";default:return a}},week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){return a.lang(\"id\",{months:\"Januari_Februari_Maret_April_Mei_Juni_Juli_Agustus_September_Oktober_November_Desember\".split(\"_\"),monthsShort:\"Jan_Feb_Mar_Apr_Mei_Jun_Jul_Ags_Sep_Okt_Nov_Des\".split(\"_\"),weekdays:\"Minggu_Senin_Selasa_Rabu_Kamis_Jumat_Sabtu\".split(\"_\"),weekdaysShort:\"Min_Sen_Sel_Rab_Kam_Jum_Sab\".split(\"_\"),weekdaysMin:\"Mg_Sn_Sl_Rb_Km_Jm_Sb\".split(\"_\"),longDateFormat:{LT:\"HH.mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY [pukul] LT\",LLLL:\"dddd, D MMMM YYYY [pukul] LT\"},meridiem:function(a){return 11>a?\"pagi\":15>a?\"siang\":19>a?\"sore\":\"malam\"},calendar:{sameDay:\"[Hari ini pukul] LT\",nextDay:\"[Besok pukul] LT\",nextWeek:\"dddd [pukul] LT\",lastDay:\"[Kemarin pukul] LT\",lastWeek:\"dddd [lalu pukul] LT\",sameElse:\"L\"},relativeTime:{future:\"dalam %s\",past:\"%s yang lalu\",s:\"beberapa detik\",m:\"semenit\",mm:\"%d menit\",h:\"sejam\",hh:\"%d jam\",d:\"sehari\",dd:\"%d hari\",M:\"sebulan\",MM:\"%d bulan\",y:\"setahun\",yy:\"%d tahun\"},week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){function b(a){return a%100===11?!0:a%10===1?!1:!0}function c(a,c,d,e){var f=a+\" \";switch(d){case\"s\":return c||e?\"nokkrar sekúndur\":\"nokkrum sekúndum\";case\"m\":return c?\"mÃnúta\":\"mÃnútu\";case\"mm\":return b(a)?f+(c||e?\"mÃnútur\":\"mÃnútum\"):c?f+\"mÃnúta\":f+\"mÃnútu\";case\"hh\":return b(a)?f+(c||e?\"klukkustundir\":\"klukkustundum\"):f+\"klukkustund\";case\"d\":return c?\"dagur\":e?\"dag\":\"degi\";case\"dd\":return b(a)?c?f+\"dagar\":f+(e?\"daga\":\"dögum\"):c?f+\"dagur\":f+(e?\"dag\":\"degi\");case\"M\":return c?\"mánuður\":e?\"mánuð\":\"mánuði\";case\"MM\":return b(a)?c?f+\"mánuðir\":f+(e?\"mánuði\":\"mánuðum\"):c?f+\"mánuður\":f+(e?\"mánuð\":\"mánuði\");case\"y\":return c||e?\"ár\":\"ári\";case\"yy\":return b(a)?f+(c||e?\"ár\":\"árum\"):f+(c||e?\"ár\":\"ári\")}}return a.lang(\"is\",{months:\"janúar_febrúar_mars_aprÃl_maÃ_júnÃ_júlÃ_ágúst_september_október_nóvember_desember\".split(\"_\"),monthsShort:\"jan_feb_mar_apr_maÃ_jún_júl_ágú_sep_okt_nóv_des\".split(\"_\"),weekdays:\"sunnudagur_mánudagur_þriðjudagur_miðvikudagur_fimmtudagur_föstudagur_laugardagur\".split(\"_\"),weekdaysShort:\"sun_mán_þri_mið_fim_fös_lau\".split(\"_\"),weekdaysMin:\"Su_Má_Þr_Mi_Fi_Fö_La\".split(\"_\"),longDateFormat:{LT:\"H:mm\",L:\"DD/MM/YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY [kl.] LT\",LLLL:\"dddd, D. MMMM YYYY [kl.] LT\"},calendar:{sameDay:\"[à dag kl.] LT\",nextDay:\"[á morgun kl.] LT\",nextWeek:\"dddd [kl.] LT\",lastDay:\"[à gær kl.] LT\",lastWeek:\"[sÃðasta] dddd [kl.] LT\",sameElse:\"L\"},relativeTime:{future:\"eftir %s\",past:\"fyrir %s sÃðan\",s:c,m:c,mm:c,h:\"klukkustund\",hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"it\",{months:\"gennaio_febbraio_marzo_aprile_maggio_giugno_luglio_agosto_settembre_ottobre_novembre_dicembre\".split(\"_\"),monthsShort:\"gen_feb_mar_apr_mag_giu_lug_ago_set_ott_nov_dic\".split(\"_\"),weekdays:\"Domenica_Lunedì_Martedì_Mercoledì_Giovedì_Venerdì_Sabato\".split(\"_\"),weekdaysShort:\"Dom_Lun_Mar_Mer_Gio_Ven_Sab\".split(\"_\"),weekdaysMin:\"D_L_Ma_Me_G_V_S\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd, D MMMM YYYY LT\"},calendar:{sameDay:\"[Oggi alle] LT\",nextDay:\"[Domani alle] LT\",nextWeek:\"dddd [alle] LT\",lastDay:\"[Ieri alle] LT\",lastWeek:\"[lo scorso] dddd [alle] LT\",sameElse:\"L\"},relativeTime:{future:function(a){return(/^[0-9].+$/.test(a)?\"tra\":\"in\")+\" \"+a},past:\"%s fa\",s:\"alcuni secondi\",m:\"un minuto\",mm:\"%d minuti\",h:\"un'ora\",hh:\"%d ore\",d:\"un giorno\",dd:\"%d giorni\",M:\"un mese\",MM:\"%d mesi\",y:\"un anno\",yy:\"%d anni\"},ordinal:\"%dº\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"ja\",{months:\"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月\".split(\"_\"),monthsShort:\"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月\".split(\"_\"),weekdays:\"日曜日_月曜日_ç«æ›œæ—¥_水曜日_木曜日_金曜日_土曜日\".split(\"_\"),weekdaysShort:\"æ—¥_月_ç«_æ°´_木_金_土\".split(\"_\"),weekdaysMin:\"æ—¥_月_ç«_æ°´_木_金_土\".split(\"_\"),longDateFormat:{LT:\"Ah時m分\",L:\"YYYY/MM/DD\",LL:\"YYYYå¹´M月Dæ—¥\",LLL:\"YYYYå¹´M月Dæ—¥LT\",LLLL:\"YYYYå¹´M月Dæ—¥LT dddd\"},meridiem:function(a){return 12>a?\"åˆå‰\":\"åˆå¾Œ\"},calendar:{sameDay:\"[今日] LT\",nextDay:\"[明日] LT\",nextWeek:\"[æ¥é€±]dddd LT\",lastDay:\"[昨日] LT\",lastWeek:\"[å‰é€±]dddd LT\",sameElse:\"L\"},relativeTime:{future:\"%s後\",past:\"%så‰\",s:\"数秒\",m:\"1分\",mm:\"%d分\",h:\"1時間\",hh:\"%d時間\",d:\"1æ—¥\",dd:\"%dæ—¥\",M:\"1ヶ月\",MM:\"%dヶ月\",y:\"1å¹´\",yy:\"%då¹´\"}})}),function(a){a(mb)}(function(a){function b(a,b){var c={nominative:\"იáƒáƒœáƒ•áƒáƒ ი_თებერვáƒáƒšáƒ˜_მáƒáƒ ტი_áƒáƒžáƒ ილი_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი\".split(\"_\"),accusative:\"იáƒáƒœáƒ•áƒáƒ ს_თებერვáƒáƒšáƒ¡_მáƒáƒ ტს_áƒáƒžáƒ ილის_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს\".split(\"_\")},d=/D[oD] *MMMM?/.test(b)?\"accusative\":\"nominative\";return c[d][a.month()]}function c(a,b){var c={nominative:\"კვირáƒ_áƒáƒ შáƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი\".split(\"_\"),accusative:\"კვირáƒáƒ¡_áƒáƒ შáƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს\".split(\"_\")},d=/(წინáƒ|შემდეგ)/.test(b)?\"accusative\":\"nominative\";return c[d][a.day()]}return a.lang(\"ka\",{months:b,monthsShort:\"იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ\".split(\"_\"),weekdays:c,weekdaysShort:\"კვი_áƒáƒ შ_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘\".split(\"_\"),weekdaysMin:\"კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ\".split(\"_\"),longDateFormat:{LT:\"h:mm A\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd, D MMMM YYYY LT\"},calendar:{sameDay:\"[დღეს] LT[-ზე]\",nextDay:\"[ხვáƒáƒš] LT[-ზე]\",lastDay:\"[გუშინ] LT[-ზე]\",nextWeek:\"[შემდეგ] dddd LT[-ზე]\",lastWeek:\"[წინáƒ] dddd LT-ზე\",sameElse:\"L\"},relativeTime:{future:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/.test(a)?a.replace(/ი$/,\"ში\"):a+\"ში\"},past:function(a){return/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/.test(a)?a.replace(/(ი|ე)$/,\"ის წინ\"):/წელი/.test(a)?a.replace(/წელი$/,\"წლის წინ\"):void 0},s:\"რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜\",m:\"წუთი\",mm:\"%d წუთი\",h:\"სáƒáƒáƒ—ი\",hh:\"%d სáƒáƒáƒ—ი\",d:\"დღე\",dd:\"%d დღე\",M:\"თვე\",MM:\"%d თვე\",y:\"წელი\",yy:\"%d წელი\"},ordinal:function(a){return 0===a?a:1===a?a+\"-ლი\":20>a||100>=a&&a%20===0||a%100===0?\"მე-\"+a:a+\"-ე\"},week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){return a.lang(\"km\",{months:\"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ\".split(\"_\"),monthsShort:\"មករា_កុម្ភៈ_មិនា_មáŸážŸáž¶_ឧសភា_មិážáž»áž“ា_កក្កដា_សីហា_កញ្ញា_ážáž»áž›áž¶_វិច្ឆិកា_ធ្នូ\".split(\"_\"),weekdays:\"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ\".split(\"_\"),weekdaysShort:\"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ\".split(\"_\"),weekdaysMin:\"អាទិážáŸ’áž™_áž…áŸáž“្ទ_អង្គារ_ពុធ_ព្រហស្បážáž·áŸ_សុក្រ_សៅរáŸ\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd, D MMMM YYYY LT\"},calendar:{sameDay:\"[ážáŸ’ងៃនៈ ម៉ោង] LT\",nextDay:\"[ស្អែក ម៉ោង] LT\",nextWeek:\"dddd [ម៉ោង] LT\",lastDay:\"[ម្សិលមិញ ម៉ោង] LT\",lastWeek:\"dddd [សប្ážáž¶áž áŸáž˜áž»áž“] [ម៉ោង] LT\",sameElse:\"L\"},relativeTime:{future:\"%sទៀáž\",past:\"%sមុន\",s:\"ប៉ុន្មានវិនាទី\",m:\"មួយនាទី\",mm:\"%d នាទី\",h:\"មួយម៉ោង\",hh:\"%d ម៉ោង\",d:\"មួយážáŸ’ងៃ\",dd:\"%d ážáŸ’ងៃ\",M:\"មួយážáŸ‚\",MM:\"%d ážáŸ‚\",y:\"មួយឆ្នាំ\",yy:\"%d ឆ្នាំ\"},week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"ko\",{months:\"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”\".split(\"_\"),monthsShort:\"1ì›”_2ì›”_3ì›”_4ì›”_5ì›”_6ì›”_7ì›”_8ì›”_9ì›”_10ì›”_11ì›”_12ì›”\".split(\"_\"),weekdays:\"ì¼ìš”ì¼_월요ì¼_화요ì¼_수요ì¼_목요ì¼_금요ì¼_í† ìš”ì¼\".split(\"_\"),weekdaysShort:\"ì¼_ì›”_í™”_수_목_금_í† \".split(\"_\"),weekdaysMin:\"ì¼_ì›”_í™”_수_목_금_í† \".split(\"_\"),longDateFormat:{LT:\"A hì‹œ mm분\",L:\"YYYY.MM.DD\",LL:\"YYYYë…„ MMMM Dì¼\",LLL:\"YYYYë…„ MMMM Dì¼ LT\",LLLL:\"YYYYë…„ MMMM Dì¼ dddd LT\"},meridiem:function(a){return 12>a?\"ì˜¤ì „\":\"오후\"},calendar:{sameDay:\"오늘 LT\",nextDay:\"ë‚´ì¼ LT\",nextWeek:\"dddd LT\",lastDay:\"ì–´ì œ LT\",lastWeek:\"지난주 dddd LT\",sameElse:\"L\"},relativeTime:{future:\"%s 후\",past:\"%s ì „\",s:\"몇초\",ss:\"%dì´ˆ\",m:\"ì¼ë¶„\",mm:\"%d분\",h:\"한시간\",hh:\"%d시간\",d:\"하루\",dd:\"%dì¼\",M:\"한달\",MM:\"%d달\",y:\"ì¼ë…„\",yy:\"%dë…„\"},ordinal:\"%dì¼\",meridiemParse:/(ì˜¤ì „|오후)/,isPM:function(a){return\"오후\"===a}})}),function(a){a(mb)}(function(a){function b(a,b,c){var d={m:[\"eng Minutt\",\"enger Minutt\"],h:[\"eng Stonn\",\"enger Stonn\"],d:[\"een Dag\",\"engem Dag\"],dd:[a+\" Deeg\",a+\" Deeg\"],M:[\"ee Mount\",\"engem Mount\"],MM:[a+\" Méint\",a+\" Méint\"],y:[\"ee Joer\",\"engem Joer\"],yy:[a+\" Joer\",a+\" Joer\"]};return b?d[c][0]:d[c][1]}function c(a){var b=a.substr(0,a.indexOf(\" \"));return g(b)?\"a \"+a:\"an \"+a}function d(a){var b=a.substr(0,a.indexOf(\" \"));return g(b)?\"viru \"+a:\"virun \"+a}function e(){var a=this.format(\"d\");return f(a)?\"[Leschte] dddd [um] LT\":\"[Leschten] dddd [um] LT\"}function f(a){switch(a=parseInt(a,10)){case 0:case 1:case 3:case 5:case 6:return!0;default:return!1}}function g(a){if(a=parseInt(a,10),isNaN(a))return!1;if(0>a)return!0;if(10>a)return a>=4&&7>=a?!0:!1;if(100>a){var b=a%10,c=a/10;return g(0===b?c:b)}if(1e4>a){for(;a>=10;)a/=10;return g(a)}return a/=1e3,g(a)}return a.lang(\"lb\",{months:\"Januar_Februar_Mäerz_Abrëll_Mee_Juni_Juli_August_September_Oktober_November_Dezember\".split(\"_\"),monthsShort:\"Jan._Febr._Mrz._Abr._Mee_Jun._Jul._Aug._Sept._Okt._Nov._Dez.\".split(\"_\"),weekdays:\"Sonndeg_Méindeg_Dënschdeg_Mëttwoch_Donneschdeg_Freideg_Samschdeg\".split(\"_\"),weekdaysShort:\"So._Mé._Dë._Më._Do._Fr._Sa.\".split(\"_\"),weekdaysMin:\"So_Mé_Dë_Më_Do_Fr_Sa\".split(\"_\"),longDateFormat:{LT:\"H:mm [Auer]\",L:\"DD.MM.YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY LT\",LLLL:\"dddd, D. MMMM YYYY LT\"},calendar:{sameDay:\"[Haut um] LT\",sameElse:\"L\",nextDay:\"[Muer um] LT\",nextWeek:\"dddd [um] LT\",lastDay:\"[Gëschter um] LT\",lastWeek:e},relativeTime:{future:c,past:d,s:\"e puer Sekonnen\",m:b,mm:\"%d Minutten\",h:b,hh:\"%d Stonnen\",d:b,dd:b,M:b,MM:b,y:b,yy:b},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){function b(a,b,c,d){return b?\"kelios sekundÄ—s\":d?\"kelių sekundžių\":\"kelias sekundes\"}function c(a,b,c,d){return b?e(c)[0]:d?e(c)[1]:e(c)[2]}function d(a){return a%10===0||a>10&&20>a}function e(a){return h[a].split(\"_\")}function f(a,b,f,g){var h=a+\" \";return 1===a?h+c(a,b,f[0],g):b?h+(d(a)?e(f)[1]:e(f)[0]):g?h+e(f)[1]:h+(d(a)?e(f)[1]:e(f)[2])}function g(a,b){var c=-1===b.indexOf(\"dddd HH:mm\"),d=i[a.day()];return c?d:d.substring(0,d.length-2)+\"į\"}var h={m:\"minutÄ—_minutÄ—s_minutÄ™\",mm:\"minutÄ—s_minuÄių_minutes\",h:\"valanda_valandos_valandÄ…\",hh:\"valandos_valandų_valandas\",d:\"diena_dienos_dienÄ…\",dd:\"dienos_dienų_dienas\",M:\"mÄ—nuo_mÄ—nesio_mÄ—nesį\",MM:\"mÄ—nesiai_mÄ—nesių_mÄ—nesius\",y:\"metai_metų_metus\",yy:\"metai_metų_metus\"},i=\"sekmadienis_pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis\".split(\"_\");return a.lang(\"lt\",{months:\"sausio_vasario_kovo_balandžio_gegužės_biržėlio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio\".split(\"_\"),monthsShort:\"sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd\".split(\"_\"),weekdays:g,weekdaysShort:\"Sek_Pir_Ant_Tre_Ket_Pen_Å eÅ¡\".split(\"_\"),weekdaysMin:\"S_P_A_T_K_Pn_Å \".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"YYYY-MM-DD\",LL:\"YYYY [m.] MMMM D [d.]\",LLL:\"YYYY [m.] MMMM D [d.], LT [val.]\",LLLL:\"YYYY [m.] MMMM D [d.], dddd, LT [val.]\",l:\"YYYY-MM-DD\",ll:\"YYYY [m.] MMMM D [d.]\",lll:\"YYYY [m.] MMMM D [d.], LT [val.]\",llll:\"YYYY [m.] MMMM D [d.], ddd, LT [val.]\"},calendar:{sameDay:\"[Å iandien] LT\",nextDay:\"[Rytoj] LT\",nextWeek:\"dddd LT\",lastDay:\"[Vakar] LT\",lastWeek:\"[PraÄ—jusį] dddd LT\",sameElse:\"L\"},relativeTime:{future:\"po %s\",past:\"prieÅ¡ %s\",s:b,m:c,mm:f,h:c,hh:f,d:c,dd:f,M:c,MM:f,y:c,yy:f},ordinal:function(a){return a+\"-oji\"},week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){function b(a,b,c){var d=a.split(\"_\");return c?b%10===1&&11!==b?d[2]:d[3]:b%10===1&&11!==b?d[0]:d[1]}function c(a,c,e){return a+\" \"+b(d[e],a,c)}var d={mm:\"minÅ«ti_minÅ«tes_minÅ«te_minÅ«tes\",hh:\"stundu_stundas_stunda_stundas\",dd:\"dienu_dienas_diena_dienas\",MM:\"mÄ“nesi_mÄ“neÅ¡us_mÄ“nesis_mÄ“neÅ¡i\",yy:\"gadu_gadus_gads_gadi\"};return a.lang(\"lv\",{months:\"janvÄris_februÄris_marts_aprÄ«lis_maijs_jÅ«nijs_jÅ«lijs_augusts_septembris_oktobris_novembris_decembris\".split(\"_\"),monthsShort:\"jan_feb_mar_apr_mai_jÅ«n_jÅ«l_aug_sep_okt_nov_dec\".split(\"_\"),weekdays:\"svÄ“tdiena_pirmdiena_otrdiena_treÅ¡diena_ceturtdiena_piektdiena_sestdiena\".split(\"_\"),weekdaysShort:\"Sv_P_O_T_C_Pk_S\".split(\"_\"),weekdaysMin:\"Sv_P_O_T_C_Pk_S\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD.MM.YYYY\",LL:\"YYYY. [gada] D. MMMM\",LLL:\"YYYY. [gada] D. MMMM, LT\",LLLL:\"YYYY. [gada] D. MMMM, dddd, LT\"},calendar:{sameDay:\"[Å odien pulksten] LT\",nextDay:\"[RÄ«t pulksten] LT\",nextWeek:\"dddd [pulksten] LT\",lastDay:\"[Vakar pulksten] LT\",lastWeek:\"[PagÄjuÅ¡Ä] dddd [pulksten] LT\",sameElse:\"L\"},relativeTime:{future:\"%s vÄ“lÄk\",past:\"%s agrÄk\",s:\"dažas sekundes\",m:\"minÅ«ti\",mm:c,h:\"stundu\",hh:c,d:\"dienu\",dd:c,M:\"mÄ“nesi\",MM:c,y:\"gadu\",yy:c},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"mk\",{months:\"јануари_февруари_март_април_мај_јуни_јули_авгуÑÑ‚_Ñептември_октомври_ноември_декември\".split(\"_\"),monthsShort:\"јан_фев_мар_апр_мај_јун_јул_авг_Ñеп_окт_ное_дек\".split(\"_\"),weekdays:\"недела_понеделник_вторник_Ñреда_четврток_петок_Ñабота\".split(\"_\"),weekdaysShort:\"нед_пон_вто_Ñре_чет_пет_Ñаб\".split(\"_\"),weekdaysMin:\"нe_пo_вт_ÑÑ€_че_пе_Ña\".split(\"_\"),longDateFormat:{LT:\"H:mm\",L:\"D.MM.YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd, D MMMM YYYY LT\"},calendar:{sameDay:\"[Ð”ÐµÐ½ÐµÑ Ð²Ð¾] LT\",nextDay:\"[Утре во] LT\",nextWeek:\"dddd [во] LT\",lastDay:\"[Вчера во] LT\",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return\"[Во изминатата] dddd [во] LT\";case 1:case 2:case 4:case 5:return\"[Во изминатиот] dddd [во] LT\"}},sameElse:\"L\"},relativeTime:{future:\"поÑле %s\",past:\"пред %s\",s:\"неколку Ñекунди\",m:\"минута\",mm:\"%d минути\",h:\"чаÑ\",hh:\"%d чаÑа\",d:\"ден\",dd:\"%d дена\",M:\"меÑец\",MM:\"%d меÑеци\",y:\"година\",yy:\"%d години\"},ordinal:function(a){var b=a%10,c=a%100;return 0===a?a+\"-ев\":0===c?a+\"-ен\":c>10&&20>c?a+\"-ти\":1===b?a+\"-ви\":2===b?a+\"-ри\":7===b||8===b?a+\"-ми\":a+\"-ти\"},week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){return a.lang(\"ml\",{months:\"ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ\".split(\"_\"),monthsShort:\"ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.\".split(\"_\"),weekdays:\"ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š\".split(\"_\"),weekdaysShort:\"ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി\".split(\"_\"),weekdaysMin:\"à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶\".split(\"_\"),longDateFormat:{LT:\"A h:mm -à´¨àµ\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY, LT\",LLLL:\"dddd, D MMMM YYYY, LT\"},calendar:{sameDay:\"[ഇനàµà´¨àµ] LT\",nextDay:\"[നാളെ] LT\",nextWeek:\"dddd, LT\",lastDay:\"[ഇനàµà´¨à´²àµ†] LT\",lastWeek:\"[à´•à´´à´¿à´žàµà´ž] dddd, LT\",sameElse:\"L\"},relativeTime:{future:\"%s à´•à´´à´¿à´žàµà´žàµ\",past:\"%s à´®àµàµ»à´ªàµ\",s:\"അൽപ നിമിഷങàµà´™àµ¾\",m:\"ഒരൠമിനിറàµà´±àµ\",mm:\"%d മിനിറàµà´±àµ\",h:\"ഒരൠമണികàµà´•àµ‚ർ\",hh:\"%d മണികàµà´•àµ‚ർ\",d:\"ഒരൠദിവസം\",dd:\"%d ദിവസം\",M:\"ഒരൠമാസം\",MM:\"%d മാസം\",y:\"ഒരൠവർഷം\",yy:\"%d വർഷം\"},meridiem:function(a){return 4>a?\"രാതàµà´°à´¿\":12>a?\"രാവിലെ\":17>a?\"ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ\":20>a?\"വൈകàµà´¨àµà´¨àµ‡à´°à´‚\":\"രാതàµà´°à´¿\"}})}),function(a){a(mb)}(function(a){var b={1:\"१\",2:\"२\",3:\"३\",4:\"४\",5:\"५\",6:\"६\",7:\"à¥\",8:\"८\",9:\"९\",0:\"०\"},c={\"१\":\"1\",\"२\":\"2\",\"३\":\"3\",\"४\":\"4\",\"५\":\"5\",\"६\":\"6\",\"à¥\":\"7\",\"८\":\"8\",\"९\":\"9\",\"०\":\"0\"};return a.lang(\"mr\",{months:\"जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर\".split(\"_\"),monthsShort:\"जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.\".split(\"_\"),weekdays:\"रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार\".split(\"_\"),weekdaysShort:\"रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि\".split(\"_\"),weekdaysMin:\"र_सो_मं_बà¥_गà¥_शà¥_श\".split(\"_\"),longDateFormat:{LT:\"A h:mm वाजता\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY, LT\",LLLL:\"dddd, D MMMM YYYY, LT\"},calendar:{sameDay:\"[आज] LT\",nextDay:\"[उदà¥à¤¯à¤¾] LT\",nextWeek:\"dddd, LT\",lastDay:\"[काल] LT\",lastWeek:\"[मागील] dddd, LT\",sameElse:\"L\"},relativeTime:{future:\"%s नंतर\",past:\"%s पूरà¥à¤µà¥€\",s:\"सेकंद\",m:\"à¤à¤• मिनिट\",mm:\"%d मिनिटे\",h:\"à¤à¤• तास\",hh:\"%d तास\",d:\"à¤à¤• दिवस\",dd:\"%d दिवस\",M:\"à¤à¤• महिना\",MM:\"%d महिने\",y:\"à¤à¤• वरà¥à¤·\",yy:\"%d वरà¥à¤·à¥‡\"},preparse:function(a){return a.replace(/[१२३४५६à¥à¥®à¥¯à¥¦]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\\d/g,function(a){return b[a]})},meridiem:function(a){return 4>a?\"रातà¥à¤°à¥€\":10>a?\"सकाळी\":17>a?\"दà¥à¤ªà¤¾à¤°à¥€\":20>a?\"सायंकाळी\":\"रातà¥à¤°à¥€\"},week:{dow:0,doy:6}})}),function(a){a(mb)}(function(a){return a.lang(\"ms-my\",{months:\"Januari_Februari_Mac_April_Mei_Jun_Julai_Ogos_September_Oktober_November_Disember\".split(\"_\"),monthsShort:\"Jan_Feb_Mac_Apr_Mei_Jun_Jul_Ogs_Sep_Okt_Nov_Dis\".split(\"_\"),weekdays:\"Ahad_Isnin_Selasa_Rabu_Khamis_Jumaat_Sabtu\".split(\"_\"),weekdaysShort:\"Ahd_Isn_Sel_Rab_Kha_Jum_Sab\".split(\"_\"),weekdaysMin:\"Ah_Is_Sl_Rb_Km_Jm_Sb\".split(\"_\"),longDateFormat:{LT:\"HH.mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY [pukul] LT\",LLLL:\"dddd, D MMMM YYYY [pukul] LT\"},meridiem:function(a){return 11>a?\"pagi\":15>a?\"tengahari\":19>a?\"petang\":\"malam\"},calendar:{sameDay:\"[Hari ini pukul] LT\",nextDay:\"[Esok pukul] LT\",nextWeek:\"dddd [pukul] LT\",lastDay:\"[Kelmarin pukul] LT\",lastWeek:\"dddd [lepas pukul] LT\",sameElse:\"L\"},relativeTime:{future:\"dalam %s\",past:\"%s yang lepas\",s:\"beberapa saat\",m:\"seminit\",mm:\"%d minit\",h:\"sejam\",hh:\"%d jam\",d:\"sehari\",dd:\"%d hari\",M:\"sebulan\",MM:\"%d bulan\",y:\"setahun\",yy:\"%d tahun\"},week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){return a.lang(\"nb\",{months:\"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember\".split(\"_\"),monthsShort:\"jan._feb._mars_april_mai_juni_juli_aug._sep._okt._nov._des.\".split(\"_\"),weekdays:\"søndag_mandag_tirsdag_onsdag_torsdag_fredag_lørdag\".split(\"_\"),weekdaysShort:\"sø._ma._ti._on._to._fr._lø.\".split(\"_\"),weekdaysMin:\"sø_ma_ti_on_to_fr_lø\".split(\"_\"),longDateFormat:{LT:\"H.mm\",L:\"DD.MM.YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY [kl.] LT\",LLLL:\"dddd D. MMMM YYYY [kl.] LT\"},calendar:{sameDay:\"[i dag kl.] LT\",nextDay:\"[i morgen kl.] LT\",nextWeek:\"dddd [kl.] LT\",lastDay:\"[i gÃ¥r kl.] LT\",lastWeek:\"[forrige] dddd [kl.] LT\",sameElse:\"L\"},relativeTime:{future:\"om %s\",past:\"for %s siden\",s:\"noen sekunder\",m:\"ett minutt\",mm:\"%d minutter\",h:\"en time\",hh:\"%d timer\",d:\"en dag\",dd:\"%d dager\",M:\"en mÃ¥ned\",MM:\"%d mÃ¥neder\",y:\"ett Ã¥r\",yy:\"%d Ã¥r\"},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){var b={1:\"१\",2:\"२\",3:\"३\",4:\"४\",5:\"५\",6:\"६\",7:\"à¥\",8:\"८\",9:\"९\",0:\"०\"},c={\"१\":\"1\",\"२\":\"2\",\"३\":\"3\",\"४\":\"4\",\"५\":\"5\",\"६\":\"6\",\"à¥\":\"7\",\"८\":\"8\",\"९\":\"9\",\"०\":\"0\"};return a.lang(\"ne\",{months:\"जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोà¤à¥‡à¤®à¥à¤¬à¤°_डिसेमà¥à¤¬à¤°\".split(\"_\"),monthsShort:\"जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोà¤à¥‡._डिसे.\".split(\"_\"),weekdays:\"आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार\".split(\"_\"),weekdaysShort:\"आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.\".split(\"_\"),weekdaysMin:\"आइ._सो._मङà¥_बà¥._बि._शà¥._श.\".split(\"_\"),longDateFormat:{LT:\"Aको h:mm बजे\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY, LT\",LLLL:\"dddd, D MMMM YYYY, LT\"},preparse:function(a){return a.replace(/[१२३४५६à¥à¥®à¥¯à¥¦]/g,function(a){return c[a]})},postformat:function(a){return a.replace(/\\d/g,function(a){return b[a]})},meridiem:function(a){return 3>a?\"राती\":10>a?\"बिहान\":15>a?\"दिउà¤à¤¸à¥‹\":18>a?\"बेलà¥à¤•à¤¾\":20>a?\"साà¤à¤\":\"राती\"},calendar:{sameDay:\"[आज] LT\",nextDay:\"[à¤à¥‹à¤²à¥€] LT\",nextWeek:\"[आउà¤à¤¦à¥‹] dddd[,] LT\",lastDay:\"[हिजो] LT\",lastWeek:\"[गà¤à¤•à¥‹] dddd[,] LT\",sameElse:\"L\"},relativeTime:{future:\"%sमा\",past:\"%s अगाडी\",s:\"केही समय\",m:\"à¤à¤• मिनेट\",mm:\"%d मिनेट\",h:\"à¤à¤• घणà¥à¤Ÿà¤¾\",hh:\"%d घणà¥à¤Ÿà¤¾\",d:\"à¤à¤• दिन\",dd:\"%d दिन\",M:\"à¤à¤• महिना\",MM:\"%d महिना\",y:\"à¤à¤• बरà¥à¤·\",yy:\"%d बरà¥à¤·\"},week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){var b=\"jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.\".split(\"_\"),c=\"jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec\".split(\"_\");return a.lang(\"nl\",{months:\"januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december\".split(\"_\"),monthsShort:function(a,d){return/-MMM-/.test(d)?c[a.month()]:b[a.month()]},weekdays:\"zondag_maandag_dinsdag_woensdag_donderdag_vrijdag_zaterdag\".split(\"_\"),weekdaysShort:\"zo._ma._di._wo._do._vr._za.\".split(\"_\"),weekdaysMin:\"Zo_Ma_Di_Wo_Do_Vr_Za\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD-MM-YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd D MMMM YYYY LT\"},calendar:{sameDay:\"[vandaag om] LT\",nextDay:\"[morgen om] LT\",nextWeek:\"dddd [om] LT\",lastDay:\"[gisteren om] LT\",lastWeek:\"[afgelopen] dddd [om] LT\",sameElse:\"L\"},relativeTime:{future:\"over %s\",past:\"%s geleden\",s:\"een paar seconden\",m:\"één minuut\",mm:\"%d minuten\",h:\"één uur\",hh:\"%d uur\",d:\"één dag\",dd:\"%d dagen\",M:\"één maand\",MM:\"%d maanden\",y:\"één jaar\",yy:\"%d jaar\"},ordinal:function(a){return a+(1===a||8===a||a>=20?\"ste\":\"de\")},week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"nn\",{months:\"januar_februar_mars_april_mai_juni_juli_august_september_oktober_november_desember\".split(\"_\"),monthsShort:\"jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des\".split(\"_\"),weekdays:\"sundag_mÃ¥ndag_tysdag_onsdag_torsdag_fredag_laurdag\".split(\"_\"),weekdaysShort:\"sun_mÃ¥n_tys_ons_tor_fre_lau\".split(\"_\"),weekdaysMin:\"su_mÃ¥_ty_on_to_fr_lø\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD.MM.YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd D MMMM YYYY LT\"},calendar:{sameDay:\"[I dag klokka] LT\",nextDay:\"[I morgon klokka] LT\",nextWeek:\"dddd [klokka] LT\",lastDay:\"[I gÃ¥r klokka] LT\",lastWeek:\"[FøregÃ¥ande] dddd [klokka] LT\",sameElse:\"L\"},relativeTime:{future:\"om %s\",past:\"for %s sidan\",s:\"nokre sekund\",m:\"eit minutt\",mm:\"%d minutt\",h:\"ein time\",hh:\"%d timar\",d:\"ein dag\",dd:\"%d dagar\",M:\"ein mÃ¥nad\",MM:\"%d mÃ¥nader\",y:\"eit Ã¥r\",yy:\"%d Ã¥r\"},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){function b(a){return 5>a%10&&a%10>1&&~~(a/10)%10!==1}function c(a,c,d){var e=a+\" \";switch(d){case\"m\":return c?\"minuta\":\"minutÄ™\";case\"mm\":return e+(b(a)?\"minuty\":\"minut\");case\"h\":return c?\"godzina\":\"godzinÄ™\";case\"hh\":return e+(b(a)?\"godziny\":\"godzin\");case\"MM\":return e+(b(a)?\"miesiÄ…ce\":\"miesiÄ™cy\");case\"yy\":return e+(b(a)?\"lata\":\"lat\")}}var d=\"styczeÅ„_luty_marzec_kwiecieÅ„_maj_czerwiec_lipiec_sierpieÅ„_wrzesieÅ„_październik_listopad_grudzieÅ„\".split(\"_\"),e=\"stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_wrzeÅ›nia_października_listopada_grudnia\".split(\"_\");return a.lang(\"pl\",{months:function(a,b){return/D MMMM/.test(b)?e[a.month()]:d[a.month()]},monthsShort:\"sty_lut_mar_kwi_maj_cze_lip_sie_wrz_paź_lis_gru\".split(\"_\"),weekdays:\"niedziela_poniedziaÅ‚ek_wtorek_Å›roda_czwartek_piÄ…tek_sobota\".split(\"_\"),weekdaysShort:\"nie_pon_wt_Å›r_czw_pt_sb\".split(\"_\"),weekdaysMin:\"N_Pn_Wt_Åšr_Cz_Pt_So\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD.MM.YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd, D MMMM YYYY LT\"},calendar:{sameDay:\"[DziÅ› o] LT\",nextDay:\"[Jutro o] LT\",nextWeek:\"[W] dddd [o] LT\",lastDay:\"[Wczoraj o] LT\",lastWeek:function(){switch(this.day()){case 0:return\"[W zeszÅ‚Ä… niedzielÄ™ o] LT\";case 3:return\"[W zeszÅ‚Ä… Å›rodÄ™ o] LT\";case 6:return\"[W zeszÅ‚Ä… sobotÄ™ o] LT\";default:return\"[W zeszÅ‚y] dddd [o] LT\"}},sameElse:\"L\"},relativeTime:{future:\"za %s\",past:\"%s temu\",s:\"kilka sekund\",m:c,mm:c,h:c,hh:c,d:\"1 dzieÅ„\",dd:\"%d dni\",M:\"miesiÄ…c\",MM:c,y:\"rok\",yy:c},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"pt-br\",{months:\"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro\".split(\"_\"),monthsShort:\"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez\".split(\"_\"),weekdays:\"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado\".split(\"_\"),weekdaysShort:\"dom_seg_ter_qua_qui_sex_sáb\".split(\"_\"),weekdaysMin:\"dom_2ª_3ª_4ª_5ª_6ª_sáb\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D [de] MMMM [de] YYYY\",LLL:\"D [de] MMMM [de] YYYY [à s] LT\",LLLL:\"dddd, D [de] MMMM [de] YYYY [à s] LT\"},calendar:{sameDay:\"[Hoje à s] LT\",nextDay:\"[Amanhã à s] LT\",nextWeek:\"dddd [à s] LT\",lastDay:\"[Ontem à s] LT\",lastWeek:function(){return 0===this.day()||6===this.day()?\"[Último] dddd [à s] LT\":\"[Última] dddd [à s] LT\"},sameElse:\"L\"},relativeTime:{future:\"em %s\",past:\"%s atrás\",s:\"segundos\",m:\"um minuto\",mm:\"%d minutos\",h:\"uma hora\",hh:\"%d horas\",d:\"um dia\",dd:\"%d dias\",M:\"um mês\",MM:\"%d meses\",y:\"um ano\",yy:\"%d anos\"},ordinal:\"%dº\"})}),function(a){a(mb)}(function(a){return a.lang(\"pt\",{months:\"janeiro_fevereiro_março_abril_maio_junho_julho_agosto_setembro_outubro_novembro_dezembro\".split(\"_\"),monthsShort:\"jan_fev_mar_abr_mai_jun_jul_ago_set_out_nov_dez\".split(\"_\"),weekdays:\"domingo_segunda-feira_terça-feira_quarta-feira_quinta-feira_sexta-feira_sábado\".split(\"_\"),weekdaysShort:\"dom_seg_ter_qua_qui_sex_sáb\".split(\"_\"),weekdaysMin:\"dom_2ª_3ª_4ª_5ª_6ª_sáb\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D [de] MMMM [de] YYYY\",LLL:\"D [de] MMMM [de] YYYY LT\",LLLL:\"dddd, D [de] MMMM [de] YYYY LT\"},calendar:{sameDay:\"[Hoje à s] LT\",nextDay:\"[Amanhã à s] LT\",nextWeek:\"dddd [à s] LT\",lastDay:\"[Ontem à s] LT\",lastWeek:function(){return 0===this.day()||6===this.day()?\"[Último] dddd [à s] LT\":\"[Última] dddd [à s] LT\"},sameElse:\"L\"},relativeTime:{future:\"em %s\",past:\"há %s\",s:\"segundos\",m:\"um minuto\",mm:\"%d minutos\",h:\"uma hora\",hh:\"%d horas\",d:\"um dia\",dd:\"%d dias\",M:\"um mês\",MM:\"%d meses\",y:\"um ano\",yy:\"%d anos\"},ordinal:\"%dº\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){function b(a,b,c){var d={mm:\"minute\",hh:\"ore\",dd:\"zile\",MM:\"luni\",yy:\"ani\"},e=\" \";return(a%100>=20||a>=100&&a%100===0)&&(e=\" de \"),a+e+d[c]}return a.lang(\"ro\",{months:\"ianuarie_februarie_martie_aprilie_mai_iunie_iulie_august_septembrie_octombrie_noiembrie_decembrie\".split(\"_\"),monthsShort:\"ian._febr._mart._apr._mai_iun._iul._aug._sept._oct._nov._dec.\".split(\"_\"),weekdays:\"duminică_luni_marÈ›i_miercuri_joi_vineri_sâmbătă\".split(\"_\"),weekdaysShort:\"Dum_Lun_Mar_Mie_Joi_Vin_Sâm\".split(\"_\"),weekdaysMin:\"Du_Lu_Ma_Mi_Jo_Vi_Sâ\".split(\"_\"),longDateFormat:{LT:\"H:mm\",L:\"DD.MM.YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY H:mm\",LLLL:\"dddd, D MMMM YYYY H:mm\"},calendar:{sameDay:\"[azi la] LT\",nextDay:\"[mâine la] LT\",nextWeek:\"dddd [la] LT\",lastDay:\"[ieri la] LT\",lastWeek:\"[fosta] dddd [la] LT\",sameElse:\"L\"},relativeTime:{future:\"peste %s\",past:\"%s în urmă\",s:\"câteva secunde\",m:\"un minut\",mm:b,h:\"o oră\",hh:b,d:\"o zi\",dd:b,M:\"o lună\",MM:b,y:\"un an\",yy:b},week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){function b(a,b){var c=a.split(\"_\");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:c?\"минута_минуты_минут\":\"минуту_минуты_минут\",hh:\"чаÑ_чаÑа_чаÑов\",dd:\"день_днÑ_дней\",MM:\"меÑÑц_меÑÑца_меÑÑцев\",yy:\"год_года_лет\"};\r\nreturn\"m\"===d?c?\"минута\":\"минуту\":a+\" \"+b(e[d],+a)}function d(a,b){var c={nominative:\"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь\".split(\"_\"),accusative:\"ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ\".split(\"_\")},d=/D[oD]?(\\[[^\\[\\]]*\\]|\\s+)+MMMM?/.test(b)?\"accusative\":\"nominative\";return c[d][a.month()]}function e(a,b){var c={nominative:\"Ñнв_фев_мар_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек\".split(\"_\"),accusative:\"Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек\".split(\"_\")},d=/D[oD]?(\\[[^\\[\\]]*\\]|\\s+)+MMMM?/.test(b)?\"accusative\":\"nominative\";return c[d][a.month()]}function f(a,b){var c={nominative:\"воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота\".split(\"_\"),accusative:\"воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу\".split(\"_\")},d=/\\[ ?[Вв] ?(?:прошлую|Ñледующую)? ?\\] ?dddd/.test(b)?\"accusative\":\"nominative\";return c[d][a.day()]}return a.lang(\"ru\",{months:d,monthsShort:e,weekdays:f,weekdaysShort:\"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб\".split(\"_\"),weekdaysMin:\"вÑ_пн_вт_ÑÑ€_чт_пт_Ñб\".split(\"_\"),monthsParse:[/^Ñнв/i,/^фев/i,/^мар/i,/^апр/i,/^ма[й|Ñ]/i,/^июн/i,/^июл/i,/^авг/i,/^Ñен/i,/^окт/i,/^ноÑ/i,/^дек/i],longDateFormat:{LT:\"HH:mm\",L:\"DD.MM.YYYY\",LL:\"D MMMM YYYY г.\",LLL:\"D MMMM YYYY г., LT\",LLLL:\"dddd, D MMMM YYYY г., LT\"},calendar:{sameDay:\"[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT\",nextDay:\"[Завтра в] LT\",lastDay:\"[Вчера в] LT\",nextWeek:function(){return 2===this.day()?\"[Во] dddd [в] LT\":\"[Ð’] dddd [в] LT\"},lastWeek:function(){switch(this.day()){case 0:return\"[Ð’ прошлое] dddd [в] LT\";case 1:case 2:case 4:return\"[Ð’ прошлый] dddd [в] LT\";case 3:case 5:case 6:return\"[Ð’ прошлую] dddd [в] LT\"}},sameElse:\"L\"},relativeTime:{future:\"через %s\",past:\"%s назад\",s:\"неÑколько Ñекунд\",m:c,mm:c,h:\"чаÑ\",hh:c,d:\"день\",dd:c,M:\"меÑÑц\",MM:c,y:\"год\",yy:c},meridiemParse:/ночи|утра|днÑ|вечера/i,isPM:function(a){return/^(днÑ|вечера)$/.test(a)},meridiem:function(a){return 4>a?\"ночи\":12>a?\"утра\":17>a?\"днÑ\":\"вечера\"},ordinal:function(a,b){switch(b){case\"M\":case\"d\":case\"DDD\":return a+\"-й\";case\"D\":return a+\"-го\";case\"w\":case\"W\":return a+\"-Ñ\";default:return a}},week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){function b(a){return a>1&&5>a}function c(a,c,d,e){var f=a+\" \";switch(d){case\"s\":return c||e?\"pár sekúnd\":\"pár sekundami\";case\"m\":return c?\"minúta\":e?\"minútu\":\"minútou\";case\"mm\":return c||e?f+(b(a)?\"minúty\":\"minút\"):f+\"minútami\";break;case\"h\":return c?\"hodina\":e?\"hodinu\":\"hodinou\";case\"hh\":return c||e?f+(b(a)?\"hodiny\":\"hodÃn\"):f+\"hodinami\";break;case\"d\":return c||e?\"deň\":\"dňom\";case\"dd\":return c||e?f+(b(a)?\"dni\":\"dnÃ\"):f+\"dňami\";break;case\"M\":return c||e?\"mesiac\":\"mesiacom\";case\"MM\":return c||e?f+(b(a)?\"mesiace\":\"mesiacov\"):f+\"mesiacmi\";break;case\"y\":return c||e?\"rok\":\"rokom\";case\"yy\":return c||e?f+(b(a)?\"roky\":\"rokov\"):f+\"rokmi\"}}var d=\"január_február_marec_aprÃl_máj_jún_júl_august_september_október_november_december\".split(\"_\"),e=\"jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec\".split(\"_\");return a.lang(\"sk\",{months:d,monthsShort:e,monthsParse:function(a,b){var c,d=[];for(c=0;12>c;c++)d[c]=new RegExp(\"^\"+a[c]+\"$|^\"+b[c]+\"$\",\"i\");return d}(d,e),weekdays:\"nedeľa_pondelok_utorok_streda_Å¡tvrtok_piatok_sobota\".split(\"_\"),weekdaysShort:\"ne_po_ut_st_Å¡t_pi_so\".split(\"_\"),weekdaysMin:\"ne_po_ut_st_Å¡t_pi_so\".split(\"_\"),longDateFormat:{LT:\"H:mm\",L:\"DD.MM.YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY LT\",LLLL:\"dddd D. MMMM YYYY LT\"},calendar:{sameDay:\"[dnes o] LT\",nextDay:\"[zajtra o] LT\",nextWeek:function(){switch(this.day()){case 0:return\"[v nedeľu o] LT\";case 1:case 2:return\"[v] dddd [o] LT\";case 3:return\"[v stredu o] LT\";case 4:return\"[vo Å¡tvrtok o] LT\";case 5:return\"[v piatok o] LT\";case 6:return\"[v sobotu o] LT\"}},lastDay:\"[vÄera o] LT\",lastWeek:function(){switch(this.day()){case 0:return\"[minulú nedeľu o] LT\";case 1:case 2:return\"[minulý] dddd [o] LT\";case 3:return\"[minulú stredu o] LT\";case 4:case 5:return\"[minulý] dddd [o] LT\";case 6:return\"[minulú sobotu o] LT\"}},sameElse:\"L\"},relativeTime:{future:\"za %s\",past:\"pred %s\",s:c,m:c,mm:c,h:c,hh:c,d:c,dd:c,M:c,MM:c,y:c,yy:c},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){function b(a,b,c){var d=a+\" \";switch(c){case\"m\":return b?\"ena minuta\":\"eno minuto\";case\"mm\":return d+=1===a?\"minuta\":2===a?\"minuti\":3===a||4===a?\"minute\":\"minut\";case\"h\":return b?\"ena ura\":\"eno uro\";case\"hh\":return d+=1===a?\"ura\":2===a?\"uri\":3===a||4===a?\"ure\":\"ur\";case\"dd\":return d+=1===a?\"dan\":\"dni\";case\"MM\":return d+=1===a?\"mesec\":2===a?\"meseca\":3===a||4===a?\"mesece\":\"mesecev\";case\"yy\":return d+=1===a?\"leto\":2===a?\"leti\":3===a||4===a?\"leta\":\"let\"}}return a.lang(\"sl\",{months:\"januar_februar_marec_april_maj_junij_julij_avgust_september_oktober_november_december\".split(\"_\"),monthsShort:\"jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.\".split(\"_\"),weekdays:\"nedelja_ponedeljek_torek_sreda_Äetrtek_petek_sobota\".split(\"_\"),weekdaysShort:\"ned._pon._tor._sre._Äet._pet._sob.\".split(\"_\"),weekdaysMin:\"ne_po_to_sr_Äe_pe_so\".split(\"_\"),longDateFormat:{LT:\"H:mm\",L:\"DD. MM. YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY LT\",LLLL:\"dddd, D. MMMM YYYY LT\"},calendar:{sameDay:\"[danes ob] LT\",nextDay:\"[jutri ob] LT\",nextWeek:function(){switch(this.day()){case 0:return\"[v] [nedeljo] [ob] LT\";case 3:return\"[v] [sredo] [ob] LT\";case 6:return\"[v] [soboto] [ob] LT\";case 1:case 2:case 4:case 5:return\"[v] dddd [ob] LT\"}},lastDay:\"[vÄeraj ob] LT\",lastWeek:function(){switch(this.day()){case 0:case 3:case 6:return\"[prejÅ¡nja] dddd [ob] LT\";case 1:case 2:case 4:case 5:return\"[prejÅ¡nji] dddd [ob] LT\"}},sameElse:\"L\"},relativeTime:{future:\"Äez %s\",past:\"%s nazaj\",s:\"nekaj sekund\",m:b,mm:b,h:b,hh:b,d:\"en dan\",dd:b,M:\"en mesec\",MM:b,y:\"eno leto\",yy:b},ordinal:\"%d.\",week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){return a.lang(\"sq\",{months:\"Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor\".split(\"_\"),monthsShort:\"Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj\".split(\"_\"),weekdays:\"E Diel_E Hënë_E Martë_E Mërkurë_E Enjte_E Premte_E Shtunë\".split(\"_\"),weekdaysShort:\"Die_Hën_Mar_Mër_Enj_Pre_Sht\".split(\"_\"),weekdaysMin:\"D_H_Ma_Më_E_P_Sh\".split(\"_\"),meridiem:function(a){return 12>a?\"PD\":\"MD\"},longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd, D MMMM YYYY LT\"},calendar:{sameDay:\"[Sot në] LT\",nextDay:\"[Nesër në] LT\",nextWeek:\"dddd [në] LT\",lastDay:\"[Dje në] LT\",lastWeek:\"dddd [e kaluar në] LT\",sameElse:\"L\"},relativeTime:{future:\"në %s\",past:\"%s më parë\",s:\"disa sekonda\",m:\"një minutë\",mm:\"%d minuta\",h:\"një orë\",hh:\"%d orë\",d:\"një ditë\",dd:\"%d ditë\",M:\"një muaj\",MM:\"%d muaj\",y:\"një vit\",yy:\"%d vite\"},ordinal:\"%d.\",week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){var b={words:{m:[\"један минут\",\"једне минуте\"],mm:[\"минут\",\"минуте\",\"минута\"],h:[\"један Ñат\",\"једног Ñата\"],hh:[\"Ñат\",\"Ñата\",\"Ñати\"],dd:[\"дан\",\"дана\",\"дана\"],MM:[\"меÑец\",\"меÑеца\",\"меÑеци\"],yy:[\"година\",\"године\",\"година\"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+\" \"+b.correctGrammaticalCase(a,e)}};return a.lang(\"sr-cyrl\",{months:[\"јануар\",\"фебруар\",\"март\",\"април\",\"мај\",\"јун\",\"јул\",\"авгуÑÑ‚\",\"Ñептембар\",\"октобар\",\"новембар\",\"децембар\"],monthsShort:[\"јан.\",\"феб.\",\"мар.\",\"апр.\",\"мај\",\"јун\",\"јул\",\"авг.\",\"Ñеп.\",\"окт.\",\"нов.\",\"дец.\"],weekdays:[\"недеља\",\"понедељак\",\"уторак\",\"Ñреда\",\"четвртак\",\"петак\",\"Ñубота\"],weekdaysShort:[\"нед.\",\"пон.\",\"уто.\",\"Ñре.\",\"чет.\",\"пет.\",\"Ñуб.\"],weekdaysMin:[\"не\",\"по\",\"ут\",\"ÑÑ€\",\"че\",\"пе\",\"Ñу\"],longDateFormat:{LT:\"H:mm\",L:\"DD. MM. YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY LT\",LLLL:\"dddd, D. MMMM YYYY LT\"},calendar:{sameDay:\"[Ð´Ð°Ð½Ð°Ñ Ñƒ] LT\",nextDay:\"[Ñутра у] LT\",nextWeek:function(){switch(this.day()){case 0:return\"[у] [недељу] [у] LT\";case 3:return\"[у] [Ñреду] [у] LT\";case 6:return\"[у] [Ñуботу] [у] LT\";case 1:case 2:case 4:case 5:return\"[у] dddd [у] LT\"}},lastDay:\"[јуче у] LT\",lastWeek:function(){var a=[\"[прошле] [недеље] [у] LT\",\"[прошлог] [понедељка] [у] LT\",\"[прошлог] [уторка] [у] LT\",\"[прошле] [Ñреде] [у] LT\",\"[прошлог] [четвртка] [у] LT\",\"[прошлог] [петка] [у] LT\",\"[прошле] [Ñуботе] [у] LT\"];return a[this.day()]},sameElse:\"L\"},relativeTime:{future:\"за %s\",past:\"пре %s\",s:\"неколико Ñекунди\",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:\"дан\",dd:b.translate,M:\"меÑец\",MM:b.translate,y:\"годину\",yy:b.translate},ordinal:\"%d.\",week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){var b={words:{m:[\"jedan minut\",\"jedne minute\"],mm:[\"minut\",\"minute\",\"minuta\"],h:[\"jedan sat\",\"jednog sata\"],hh:[\"sat\",\"sata\",\"sati\"],dd:[\"dan\",\"dana\",\"dana\"],MM:[\"mesec\",\"meseca\",\"meseci\"],yy:[\"godina\",\"godine\",\"godina\"]},correctGrammaticalCase:function(a,b){return 1===a?b[0]:a>=2&&4>=a?b[1]:b[2]},translate:function(a,c,d){var e=b.words[d];return 1===d.length?c?e[0]:e[1]:a+\" \"+b.correctGrammaticalCase(a,e)}};return a.lang(\"sr\",{months:[\"januar\",\"februar\",\"mart\",\"april\",\"maj\",\"jun\",\"jul\",\"avgust\",\"septembar\",\"oktobar\",\"novembar\",\"decembar\"],monthsShort:[\"jan.\",\"feb.\",\"mar.\",\"apr.\",\"maj\",\"jun\",\"jul\",\"avg.\",\"sep.\",\"okt.\",\"nov.\",\"dec.\"],weekdays:[\"nedelja\",\"ponedeljak\",\"utorak\",\"sreda\",\"Äetvrtak\",\"petak\",\"subota\"],weekdaysShort:[\"ned.\",\"pon.\",\"uto.\",\"sre.\",\"Äet.\",\"pet.\",\"sub.\"],weekdaysMin:[\"ne\",\"po\",\"ut\",\"sr\",\"Äe\",\"pe\",\"su\"],longDateFormat:{LT:\"H:mm\",L:\"DD. MM. YYYY\",LL:\"D. MMMM YYYY\",LLL:\"D. MMMM YYYY LT\",LLLL:\"dddd, D. MMMM YYYY LT\"},calendar:{sameDay:\"[danas u] LT\",nextDay:\"[sutra u] LT\",nextWeek:function(){switch(this.day()){case 0:return\"[u] [nedelju] [u] LT\";case 3:return\"[u] [sredu] [u] LT\";case 6:return\"[u] [subotu] [u] LT\";case 1:case 2:case 4:case 5:return\"[u] dddd [u] LT\"}},lastDay:\"[juÄe u] LT\",lastWeek:function(){var a=[\"[proÅ¡le] [nedelje] [u] LT\",\"[proÅ¡log] [ponedeljka] [u] LT\",\"[proÅ¡log] [utorka] [u] LT\",\"[proÅ¡le] [srede] [u] LT\",\"[proÅ¡log] [Äetvrtka] [u] LT\",\"[proÅ¡log] [petka] [u] LT\",\"[proÅ¡le] [subote] [u] LT\"];return a[this.day()]},sameElse:\"L\"},relativeTime:{future:\"za %s\",past:\"pre %s\",s:\"nekoliko sekundi\",m:b.translate,mm:b.translate,h:b.translate,hh:b.translate,d:\"dan\",dd:b.translate,M:\"mesec\",MM:b.translate,y:\"godinu\",yy:b.translate},ordinal:\"%d.\",week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){return a.lang(\"sv\",{months:\"januari_februari_mars_april_maj_juni_juli_augusti_september_oktober_november_december\".split(\"_\"),monthsShort:\"jan_feb_mar_apr_maj_jun_jul_aug_sep_okt_nov_dec\".split(\"_\"),weekdays:\"söndag_mÃ¥ndag_tisdag_onsdag_torsdag_fredag_lördag\".split(\"_\"),weekdaysShort:\"sön_mÃ¥n_tis_ons_tor_fre_lör\".split(\"_\"),weekdaysMin:\"sö_mÃ¥_ti_on_to_fr_lö\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"YYYY-MM-DD\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd D MMMM YYYY LT\"},calendar:{sameDay:\"[Idag] LT\",nextDay:\"[Imorgon] LT\",lastDay:\"[IgÃ¥r] LT\",nextWeek:\"dddd LT\",lastWeek:\"[Förra] dddd[en] LT\",sameElse:\"L\"},relativeTime:{future:\"om %s\",past:\"för %s sedan\",s:\"nÃ¥gra sekunder\",m:\"en minut\",mm:\"%d minuter\",h:\"en timme\",hh:\"%d timmar\",d:\"en dag\",dd:\"%d dagar\",M:\"en mÃ¥nad\",MM:\"%d mÃ¥nader\",y:\"ett Ã¥r\",yy:\"%d Ã¥r\"},ordinal:function(a){var b=a%10,c=1===~~(a%100/10)?\"e\":1===b?\"a\":2===b?\"a\":3===b?\"e\":\"e\";return a+c},week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"ta\",{months:\"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯\".split(\"_\"),monthsShort:\"ஜனவரி_பிபà¯à®°à®µà®°à®¿_மாரà¯à®šà¯_à®à®ªà¯à®°à®²à¯_மே_ஜூனà¯_ஜூலை_ஆகஸà¯à®Ÿà¯_செபà¯à®Ÿà¯†à®®à¯à®ªà®°à¯_அகà¯à®Ÿà¯‡à®¾à®ªà®°à¯_நவமà¯à®ªà®°à¯_டிசமà¯à®ªà®°à¯\".split(\"_\"),weekdays:\"ஞாயிறà¯à®±à¯à®•à¯à®•à®¿à®´à®®à¯ˆ_திஙà¯à®•à®Ÿà¯à®•à®¿à®´à®®à¯ˆ_செவà¯à®µà®¾à®¯à¯à®•à®¿à®´à®®à¯ˆ_பà¯à®¤à®©à¯à®•à®¿à®´à®®à¯ˆ_வியாழகà¯à®•à®¿à®´à®®à¯ˆ_வெளà¯à®³à®¿à®•à¯à®•à®¿à®´à®®à¯ˆ_சனிகà¯à®•à®¿à®´à®®à¯ˆ\".split(\"_\"),weekdaysShort:\"ஞாயிறà¯_திஙà¯à®•à®³à¯_செவà¯à®µà®¾à®¯à¯_பà¯à®¤à®©à¯_வியாழனà¯_வெளà¯à®³à®¿_சனி\".split(\"_\"),weekdaysMin:\"ஞா_தி_செ_பà¯_வி_வெ_ச\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY, LT\",LLLL:\"dddd, D MMMM YYYY, LT\"},calendar:{sameDay:\"[இனà¯à®±à¯] LT\",nextDay:\"[நாளை] LT\",nextWeek:\"dddd, LT\",lastDay:\"[நேறà¯à®±à¯] LT\",lastWeek:\"[கடநà¯à®¤ வாரமà¯] dddd, LT\",sameElse:\"L\"},relativeTime:{future:\"%s இலà¯\",past:\"%s à®®à¯à®©à¯\",s:\"ஒர௠சில விநாடிகளà¯\",m:\"ஒர௠நிமிடமà¯\",mm:\"%d நிமிடஙà¯à®•à®³à¯\",h:\"ஒர௠மணி நேரமà¯\",hh:\"%d மணி நேரமà¯\",d:\"ஒர௠நாளà¯\",dd:\"%d நாடà¯à®•à®³à¯\",M:\"ஒர௠மாதமà¯\",MM:\"%d மாதஙà¯à®•à®³à¯\",y:\"ஒர௠வரà¯à®Ÿà®®à¯\",yy:\"%d ஆணà¯à®Ÿà¯à®•à®³à¯\"},ordinal:function(a){return a+\"வதà¯\"},meridiem:function(a){return a>=6&&10>=a?\" காலை\":a>=10&&14>=a?\" நணà¯à®ªà®•à®²à¯\":a>=14&&18>=a?\" எறà¯à®ªà®¾à®Ÿà¯\":a>=18&&20>=a?\" மாலை\":a>=20&&24>=a?\" இரவà¯\":a>=0&&6>=a?\" வைகறை\":void 0},week:{dow:0,doy:6}})}),function(a){a(mb)}(function(a){return a.lang(\"th\",{months:\"มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ าพันธ์_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม\".split(\"_\"),monthsShort:\"มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ า_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา\".split(\"_\"),weekdays:\"à¸à¸²à¸—ิตย์_จันทร์_à¸à¸±à¸‡à¸„าร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์\".split(\"_\"),weekdaysShort:\"à¸à¸²à¸—ิตย์_จันทร์_à¸à¸±à¸‡à¸„าร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์\".split(\"_\"),weekdaysMin:\"à¸à¸²._จ._à¸._พ._พฤ._ศ._ส.\".split(\"_\"),longDateFormat:{LT:\"H นาฬิà¸à¸² m นาที\",L:\"YYYY/MM/DD\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY เวลา LT\",LLLL:\"วันddddที่ D MMMM YYYY เวลา LT\"},meridiem:function(a){return 12>a?\"à¸à¹ˆà¸à¸™à¹€à¸—ี่ยง\":\"หลังเที่ยง\"},calendar:{sameDay:\"[วันนี้ เวลา] LT\",nextDay:\"[พรุ่งนี้ เวลา] LT\",nextWeek:\"dddd[หน้า เวลา] LT\",lastDay:\"[เมื่à¸à¸§à¸²à¸™à¸™à¸µà¹‰ เวลา] LT\",lastWeek:\"[วัน]dddd[ที่à¹à¸¥à¹‰à¸§ เวลา] LT\",sameElse:\"L\"},relativeTime:{future:\"à¸à¸µà¸ %s\",past:\"%sที่à¹à¸¥à¹‰à¸§\",s:\"ไม่à¸à¸µà¹ˆà¸§à¸´à¸™à¸²à¸—ี\",m:\"1 นาที\",mm:\"%d นาที\",h:\"1 ชั่วโมง\",hh:\"%d ชั่วโมง\",d:\"1 วัน\",dd:\"%d วัน\",M:\"1 เดืà¸à¸™\",MM:\"%d เดืà¸à¸™\",y:\"1 ปี\",yy:\"%d ปี\"}})}),function(a){a(mb)}(function(a){return a.lang(\"tl-ph\",{months:\"Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre\".split(\"_\"),monthsShort:\"Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis\".split(\"_\"),weekdays:\"Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado\".split(\"_\"),weekdaysShort:\"Lin_Lun_Mar_Miy_Huw_Biy_Sab\".split(\"_\"),weekdaysMin:\"Li_Lu_Ma_Mi_Hu_Bi_Sab\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"MM/D/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY LT\",LLLL:\"dddd, MMMM DD, YYYY LT\"},calendar:{sameDay:\"[Ngayon sa] LT\",nextDay:\"[Bukas sa] LT\",nextWeek:\"dddd [sa] LT\",lastDay:\"[Kahapon sa] LT\",lastWeek:\"dddd [huling linggo] LT\",sameElse:\"L\"},relativeTime:{future:\"sa loob ng %s\",past:\"%s ang nakalipas\",s:\"ilang segundo\",m:\"isang minuto\",mm:\"%d minuto\",h:\"isang oras\",hh:\"%d oras\",d:\"isang araw\",dd:\"%d araw\",M:\"isang buwan\",MM:\"%d buwan\",y:\"isang taon\",yy:\"%d taon\"},ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){var b={1:\"'inci\",5:\"'inci\",8:\"'inci\",70:\"'inci\",80:\"'inci\",2:\"'nci\",7:\"'nci\",20:\"'nci\",50:\"'nci\",3:\"'üncü\",4:\"'üncü\",100:\"'üncü\",6:\"'ncı\",9:\"'uncu\",10:\"'uncu\",30:\"'uncu\",60:\"'ıncı\",90:\"'ıncı\"};return a.lang(\"tr\",{months:\"Ocak_Åžubat_Mart_Nisan_Mayıs_Haziran_Temmuz_AÄŸustos_Eylül_Ekim_Kasım_Aralık\".split(\"_\"),monthsShort:\"Oca_Åžub_Mar_Nis_May_Haz_Tem_AÄŸu_Eyl_Eki_Kas_Ara\".split(\"_\"),weekdays:\"Pazar_Pazartesi_Salı_ÇarÅŸamba_PerÅŸembe_Cuma_Cumartesi\".split(\"_\"),weekdaysShort:\"Paz_Pts_Sal_Çar_Per_Cum_Cts\".split(\"_\"),weekdaysMin:\"Pz_Pt_Sa_Ça_Pe_Cu_Ct\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD.MM.YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd, D MMMM YYYY LT\"},calendar:{sameDay:\"[bugün saat] LT\",nextDay:\"[yarın saat] LT\",nextWeek:\"[haftaya] dddd [saat] LT\",lastDay:\"[dün] LT\",lastWeek:\"[geçen hafta] dddd [saat] LT\",sameElse:\"L\"},relativeTime:{future:\"%s sonra\",past:\"%s önce\",s:\"birkaç saniye\",m:\"bir dakika\",mm:\"%d dakika\",h:\"bir saat\",hh:\"%d saat\",d:\"bir gün\",dd:\"%d gün\",M:\"bir ay\",MM:\"%d ay\",y:\"bir yıl\",yy:\"%d yıl\"},ordinal:function(a){if(0===a)return a+\"'ıncı\";var c=a%10,d=a%100-c,e=a>=100?100:null;return a+(b[c]||b[d]||b[e])},week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){return a.lang(\"tzm-latn\",{months:\"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir\".split(\"_\"),monthsShort:\"innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_É£wÅ¡t_Å¡wtanbir_ktˤwbrˤ_nwwanbir_dwjnbir\".split(\"_\"),weekdays:\"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas\".split(\"_\"),weekdaysShort:\"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas\".split(\"_\"),weekdaysMin:\"asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd D MMMM YYYY LT\"},calendar:{sameDay:\"[asdkh g] LT\",nextDay:\"[aska g] LT\",nextWeek:\"dddd [g] LT\",lastDay:\"[assant g] LT\",lastWeek:\"dddd [g] LT\",sameElse:\"L\"},relativeTime:{future:\"dadkh s yan %s\",past:\"yan %s\",s:\"imik\",m:\"minuá¸\",mm:\"%d minuá¸\",h:\"saÉ›a\",hh:\"%d tassaÉ›in\",d:\"ass\",dd:\"%d ossan\",M:\"ayowr\",MM:\"%d iyyirn\",y:\"asgas\",yy:\"%d isgasn\"},week:{dow:6,doy:12}})}),function(a){a(mb)}(function(a){return a.lang(\"tzm\",{months:\"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”\".split(\"_\"),monthsShort:\"ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”\".split(\"_\"),weekdays:\"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ\".split(\"_\"),weekdaysShort:\"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ\".split(\"_\"),weekdaysMin:\"ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"dddd D MMMM YYYY LT\"},calendar:{sameDay:\"[ⴰⵙⴷⵅ â´´] LT\",nextDay:\"[ⴰⵙⴽⴰ â´´] LT\",nextWeek:\"dddd [â´´] LT\",lastDay:\"[ⴰⵚⴰâµâµœ â´´] LT\",lastWeek:\"dddd [â´´] LT\",sameElse:\"L\"},relativeTime:{future:\"â´·â´°â´·âµ… âµ™ ⵢⴰⵠ%s\",past:\"ⵢⴰⵠ%s\",s:\"ⵉⵎⵉⴽ\",m:\"ⵎⵉâµâµ“â´º\",mm:\"%d ⵎⵉâµâµ“â´º\",h:\"ⵙⴰⵄⴰ\",hh:\"%d ⵜⴰⵙⵙⴰⵄⵉâµ\",d:\"ⴰⵙⵙ\",dd:\"%d oⵙⵙⴰâµ\",M:\"â´°âµ¢oⵓⵔ\",MM:\"%d ⵉⵢⵢⵉⵔâµ\",y:\"ⴰⵙⴳⴰⵙ\",yy:\"%d ⵉⵙⴳⴰⵙâµ\"},week:{dow:6,doy:12}})}),function(a){a(mb)}(function(a){function b(a,b){var c=a.split(\"_\");return b%10===1&&b%100!==11?c[0]:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?c[1]:c[2]}function c(a,c,d){var e={mm:\"хвилина_хвилини_хвилин\",hh:\"година_години_годин\",dd:\"день_дні_днів\",MM:\"міÑÑць_міÑÑці_міÑÑців\",yy:\"рік_роки_років\"};return\"m\"===d?c?\"хвилина\":\"хвилину\":\"h\"===d?c?\"година\":\"годину\":a+\" \"+b(e[d],+a)}function d(a,b){var c={nominative:\"Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень\".split(\"_\"),accusative:\"ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ\".split(\"_\")},d=/D[oD]? *MMMM?/.test(b)?\"accusative\":\"nominative\";return c[d][a.month()]}function e(a,b){var c={nominative:\"неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота\".split(\"_\"),accusative:\"неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу\".split(\"_\"),genitive:\"неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи\".split(\"_\")},d=/(\\[[ВвУу]\\]) ?dddd/.test(b)?\"accusative\":/\\[?(?:минулої|наÑтупної)? ?\\] ?dddd/.test(b)?\"genitive\":\"nominative\";return c[d][a.day()]}function f(a){return function(){return a+\"о\"+(11===this.hours()?\"б\":\"\")+\"] LT\"}}return a.lang(\"uk\",{months:d,monthsShort:\"Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд\".split(\"_\"),weekdays:e,weekdaysShort:\"нд_пн_вт_ÑÑ€_чт_пт_Ñб\".split(\"_\"),weekdaysMin:\"нд_пн_вт_ÑÑ€_чт_пт_Ñб\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD.MM.YYYY\",LL:\"D MMMM YYYY Ñ€.\",LLL:\"D MMMM YYYY Ñ€., LT\",LLLL:\"dddd, D MMMM YYYY Ñ€., LT\"},calendar:{sameDay:f(\"[Сьогодні \"),nextDay:f(\"[Завтра \"),lastDay:f(\"[Вчора \"),nextWeek:f(\"[У] dddd [\"),lastWeek:function(){switch(this.day()){case 0:case 3:case 5:case 6:return f(\"[Минулої] dddd [\").call(this);case 1:case 2:case 4:return f(\"[Минулого] dddd [\").call(this)}},sameElse:\"L\"},relativeTime:{future:\"за %s\",past:\"%s тому\",s:\"декілька Ñекунд\",m:c,mm:c,h:\"годину\",hh:c,d:\"день\",dd:c,M:\"міÑÑць\",MM:c,y:\"рік\",yy:c},meridiem:function(a){return 4>a?\"ночі\":12>a?\"ранку\":17>a?\"днÑ\":\"вечора\"},ordinal:function(a,b){switch(b){case\"M\":case\"d\":case\"DDD\":case\"w\":case\"W\":return a+\"-й\";case\"D\":return a+\"-го\";default:return a}},week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){return a.lang(\"uz\",{months:\"Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь\".split(\"_\"),monthsShort:\"Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек\".split(\"_\"),weekdays:\"Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба\".split(\"_\"),weekdaysShort:\"Якш_Душ_Сеш_Чор_Пай_Жум_Шан\".split(\"_\"),weekdaysMin:\"Як_Ду_Се_Чо_Па_Жу_Ша\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM YYYY\",LLL:\"D MMMM YYYY LT\",LLLL:\"D MMMM YYYY, dddd LT\"},calendar:{sameDay:\"[Бугун Ñоат] LT [да]\",nextDay:\"[Ðртага] LT [да]\",nextWeek:\"dddd [куни Ñоат] LT [да]\",lastDay:\"[Кеча Ñоат] LT [да]\",lastWeek:\"[Утган] dddd [куни Ñоат] LT [да]\",sameElse:\"L\"},relativeTime:{future:\"Якин %s ичида\",past:\"Бир неча %s олдин\",s:\"фурÑат\",m:\"бир дакика\",mm:\"%d дакика\",h:\"бир Ñоат\",hh:\"%d Ñоат\",d:\"бир кун\",dd:\"%d кун\",M:\"бир ой\",MM:\"%d ой\",y:\"бир йил\",yy:\"%d йил\"},week:{dow:1,doy:7}})}),function(a){a(mb)}(function(a){return a.lang(\"vi\",{months:\"tháng 1_tháng 2_tháng 3_tháng 4_tháng 5_tháng 6_tháng 7_tháng 8_tháng 9_tháng 10_tháng 11_tháng 12\".split(\"_\"),monthsShort:\"Th01_Th02_Th03_Th04_Th05_Th06_Th07_Th08_Th09_Th10_Th11_Th12\".split(\"_\"),weekdays:\"chủ nháºt_thứ hai_thứ ba_thứ tÆ°_thứ năm_thứ sáu_thứ bảy\".split(\"_\"),weekdaysShort:\"CN_T2_T3_T4_T5_T6_T7\".split(\"_\"),weekdaysMin:\"CN_T2_T3_T4_T5_T6_T7\".split(\"_\"),longDateFormat:{LT:\"HH:mm\",L:\"DD/MM/YYYY\",LL:\"D MMMM [năm] YYYY\",LLL:\"D MMMM [năm] YYYY LT\",LLLL:\"dddd, D MMMM [năm] YYYY LT\",l:\"DD/M/YYYY\",ll:\"D MMM YYYY\",lll:\"D MMM YYYY LT\",llll:\"ddd, D MMM YYYY LT\"},calendar:{sameDay:\"[Hôm nay lúc] LT\",nextDay:\"[Ngà y mai lúc] LT\",nextWeek:\"dddd [tuần tá»›i lúc] LT\",lastDay:\"[Hôm qua lúc] LT\",lastWeek:\"dddd [tuần rồi lúc] LT\",sameElse:\"L\"},relativeTime:{future:\"%s tá»›i\",past:\"%s trÆ°á»›c\",s:\"và i giây\",m:\"má»™t phút\",mm:\"%d phút\",h:\"má»™t giá»\",hh:\"%d giá»\",d:\"má»™t ngà y\",dd:\"%d ngà y\",M:\"má»™t tháng\",MM:\"%d tháng\",y:\"má»™t năm\",yy:\"%d năm\"},ordinal:function(a){return a},week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"zh-cn\",{months:\"一月_二月_三月_四月_五月_å…月_七月_八月_ä¹æœˆ_å月_å一月_å二月\".split(\"_\"),monthsShort:\"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月\".split(\"_\"),weekdays:\"星期日_星期一_星期二_星期三_星期四_星期五_星期å…\".split(\"_\"),weekdaysShort:\"周日_周一_周二_周三_周四_周五_周å…\".split(\"_\"),weekdaysMin:\"æ—¥_一_二_三_å››_五_å…\".split(\"_\"),longDateFormat:{LT:\"Ah点mm\",L:\"YYYY-MM-DD\",LL:\"YYYYå¹´MMMDæ—¥\",LLL:\"YYYYå¹´MMMDæ—¥LT\",LLLL:\"YYYYå¹´MMMDæ—¥ddddLT\",l:\"YYYY-MM-DD\",ll:\"YYYYå¹´MMMDæ—¥\",lll:\"YYYYå¹´MMMDæ—¥LT\",llll:\"YYYYå¹´MMMDæ—¥ddddLT\"},meridiem:function(a,b){var c=100*a+b;return 600>c?\"凌晨\":900>c?\"早上\":1130>c?\"上åˆ\":1230>c?\"ä¸åˆ\":1800>c?\"下åˆ\":\"晚上\"},calendar:{sameDay:function(){return 0===this.minutes()?\"[今天]Ah[点整]\":\"[今天]LT\"},nextDay:function(){return 0===this.minutes()?\"[明天]Ah[点整]\":\"[明天]LT\"},lastDay:function(){return 0===this.minutes()?\"[昨天]Ah[点整]\":\"[昨天]LT\"},nextWeek:function(){var b,c;return b=a().startOf(\"week\"),c=this.unix()-b.unix()>=604800?\"[下]\":\"[本]\",0===this.minutes()?c+\"dddAh点整\":c+\"dddAh点mm\"},lastWeek:function(){var b,c;return b=a().startOf(\"week\"),c=this.unix()<b.unix()?\"[上]\":\"[本]\",0===this.minutes()?c+\"dddAh点整\":c+\"dddAh点mm\"},sameElse:\"LL\"},ordinal:function(a,b){switch(b){case\"d\":case\"D\":case\"DDD\":return a+\"æ—¥\";case\"M\":return a+\"月\";case\"w\":case\"W\":return a+\"周\";default:return a}},relativeTime:{future:\"%s内\",past:\"%så‰\",s:\"å‡ ç§’\",m:\"1分钟\",mm:\"%d分钟\",h:\"1å°æ—¶\",hh:\"%då°æ—¶\",d:\"1天\",dd:\"%d天\",M:\"1个月\",MM:\"%d个月\",y:\"1å¹´\",yy:\"%då¹´\"},week:{dow:1,doy:4}})}),function(a){a(mb)}(function(a){return a.lang(\"zh-tw\",{months:\"一月_二月_三月_四月_五月_å…月_七月_八月_ä¹æœˆ_å月_å一月_å二月\".split(\"_\"),monthsShort:\"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月\".split(\"_\"),weekdays:\"星期日_星期一_星期二_星期三_星期四_星期五_星期å…\".split(\"_\"),weekdaysShort:\"週日_週一_週二_週三_週四_週五_週å…\".split(\"_\"),weekdaysMin:\"æ—¥_一_二_三_å››_五_å…\".split(\"_\"),longDateFormat:{LT:\"Ah點mm\",L:\"YYYYå¹´MMMDæ—¥\",LL:\"YYYYå¹´MMMDæ—¥\",LLL:\"YYYYå¹´MMMDæ—¥LT\",LLLL:\"YYYYå¹´MMMDæ—¥ddddLT\",l:\"YYYYå¹´MMMDæ—¥\",ll:\"YYYYå¹´MMMDæ—¥\",lll:\"YYYYå¹´MMMDæ—¥LT\",llll:\"YYYYå¹´MMMDæ—¥ddddLT\"},meridiem:function(a,b){var c=100*a+b;return 900>c?\"早上\":1130>c?\"上åˆ\":1230>c?\"ä¸åˆ\":1800>c?\"下åˆ\":\"晚上\"},calendar:{sameDay:\"[今天]LT\",nextDay:\"[明天]LT\",nextWeek:\"[下]ddddLT\",lastDay:\"[昨天]LT\",lastWeek:\"[上]ddddLT\",sameElse:\"L\"},ordinal:function(a,b){switch(b){case\"d\":case\"D\":case\"DDD\":return a+\"æ—¥\";case\"M\":return a+\"月\";case\"w\":case\"W\":return a+\"週\";default:return a}},relativeTime:{future:\"%så…§\",past:\"%så‰\",s:\"幾秒\",m:\"一分é˜\",mm:\"%d分é˜\",h:\"一å°æ™‚\",hh:\"%då°æ™‚\",d:\"一天\",dd:\"%d天\",M:\"一個月\",MM:\"%d個月\",y:\"一年\",yy:\"%då¹´\"}})}),mb.lang(\"en\"),Bb?module.exports=mb:\"function\"==typeof define&&define.amd?(define(\"moment\",function(a,b,c){return c.config&&c.config()&&c.config().noGlobal===!0&&(qb.moment=nb),mb}),lb(!0)):lb()}).call(this);","// ┌────────────────────────────────────────────────────────────────────┠\\\\\r\n// │ Raphaël 2.1.4 - JavaScript Vector Library │ \\\\\r\n// ├────────────────────────────────────────────────────────────────────┤ \\\\\r\n// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\\\\r\n// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\\\\r\n// ├────────────────────────────────────────────────────────────────────┤ \\\\\r\n// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\\\\r\n// └────────────────────────────────────────────────────────────────────┘ \\\\\r\n!function (a, b) { \"function\" == typeof define && define.amd ? define(\"eve\", function () { return b() }) : \"object\" == typeof exports ? module.exports = b() : a.eve = b() }(this, function () { var a, b, c = \"0.4.2\", d = \"hasOwnProperty\", e = /[\\.\\/]/, f = \"*\", g = function () { }, h = function (a, b) { return a - b }, i = { n: {} }, j = function (c, d) { c = String(c); var e, f = b, g = Array.prototype.slice.call(arguments, 2), i = j.listeners(c), k = 0, l = [], m = {}, n = [], o = a; a = c, b = 0; for (var p = 0, q = i.length; q > p; p++) \"zIndex\" in i[p] && (l.push(i[p].zIndex), i[p].zIndex < 0 && (m[i[p].zIndex] = i[p])); for (l.sort(h) ; l[k] < 0;) if (e = m[l[k++]], n.push(e.apply(d, g)), b) return b = f, n; for (p = 0; q > p; p++) if (e = i[p], \"zIndex\" in e) if (e.zIndex == l[k]) { if (n.push(e.apply(d, g)), b) break; do if (k++, e = m[l[k]], e && n.push(e.apply(d, g)), b) break; while (e) } else m[e.zIndex] = e; else if (n.push(e.apply(d, g)), b) break; return b = f, a = o, n.length ? n : null }; return j._events = i, j.listeners = function (a) { var b, c, d, g, h, j, k, l, m = a.split(e), n = i, o = [n], p = []; for (g = 0, h = m.length; h > g; g++) { for (l = [], j = 0, k = o.length; k > j; j++) for (n = o[j].n, c = [n[m[g]], n[f]], d = 2; d--;) b = c[d], b && (l.push(b), p = p.concat(b.f || [])); o = l } return p }, j.on = function (a, b) { if (a = String(a), \"function\" != typeof b) return function () { }; for (var c = a.split(e), d = i, f = 0, h = c.length; h > f; f++) d = d.n, d = d.hasOwnProperty(c[f]) && d[c[f]] || (d[c[f]] = { n: {} }); for (d.f = d.f || [], f = 0, h = d.f.length; h > f; f++) if (d.f[f] == b) return g; return d.f.push(b), function (a) { +a == +a && (b.zIndex = +a) } }, j.f = function (a) { var b = [].slice.call(arguments, 1); return function () { j.apply(null, [a, null].concat(b).concat([].slice.call(arguments, 0))) } }, j.stop = function () { b = 1 }, j.nt = function (b) { return b ? new RegExp(\"(?:\\\\.|\\\\/|^)\" + b + \"(?:\\\\.|\\\\/|$)\").test(a) : a }, j.nts = function () { return a.split(e) }, j.off = j.unbind = function (a, b) { if (!a) return void (j._events = i = { n: {} }); var c, g, h, k, l, m, n, o = a.split(e), p = [i]; for (k = 0, l = o.length; l > k; k++) for (m = 0; m < p.length; m += h.length - 2) { if (h = [m, 1], c = p[m].n, o[k] != f) c[o[k]] && h.push(c[o[k]]); else for (g in c) c[d](g) && h.push(c[g]); p.splice.apply(p, h) } for (k = 0, l = p.length; l > k; k++) for (c = p[k]; c.n;) { if (b) { if (c.f) { for (m = 0, n = c.f.length; n > m; m++) if (c.f[m] == b) { c.f.splice(m, 1); break } !c.f.length && delete c.f } for (g in c.n) if (c.n[d](g) && c.n[g].f) { var q = c.n[g].f; for (m = 0, n = q.length; n > m; m++) if (q[m] == b) { q.splice(m, 1); break } !q.length && delete c.n[g].f } } else { delete c.f; for (g in c.n) c.n[d](g) && c.n[g].f && delete c.n[g].f } c = c.n } }, j.once = function (a, b) { var c = function () { return j.unbind(a, c), b.apply(this, arguments) }; return j.on(a, c) }, j.version = c, j.toString = function () { return \"You are running Eve \" + c }, j }), function (a, b) { \"function\" == typeof define && define.amd ? define(\"raphael.core\", [\"eve\"], function (a) { return b(a) }) : \"object\" == typeof exports ? module.exports = b(require(\"eve\")) : a.Raphael = b(a.eve) }(this, function (a) {\r\n function b(c) { if (b.is(c, \"function\")) return t ? c() : a.on(\"raphael.DOMload\", c); if (b.is(c, U)) return b._engine.create[C](b, c.splice(0, 3 + b.is(c[0], S))).add(c); var d = Array.prototype.slice.call(arguments, 0); if (b.is(d[d.length - 1], \"function\")) { var e = d.pop(); return t ? e.call(b._engine.create[C](b, d)) : a.on(\"raphael.DOMload\", function () { e.call(b._engine.create[C](b, d)) }) } return b._engine.create[C](b, arguments) } function c(a) { if (\"function\" == typeof a || Object(a) !== a) return a; var b = new a.constructor; for (var d in a) a[y](d) && (b[d] = c(a[d])); return b } function d(a, b) { for (var c = 0, d = a.length; d > c; c++) if (a[c] === b) return a.push(a.splice(c, 1)[0]) } function e(a, b, c) { function e() { var f = Array.prototype.slice.call(arguments, 0), g = f.join(\"â€\"), h = e.cache = e.cache || {}, i = e.count = e.count || []; return h[y](g) ? (d(i, g), c ? c(h[g]) : h[g]) : (i.length >= 1e3 && delete h[i.shift()], i.push(g), h[g] = a[C](b, f), c ? c(h[g]) : h[g]) } return e } function f() { return this.hex } function g(a, b) { for (var c = [], d = 0, e = a.length; e - 2 * !b > d; d += 2) { var f = [{ x: +a[d - 2], y: +a[d - 1] }, { x: +a[d], y: +a[d + 1] }, { x: +a[d + 2], y: +a[d + 3] }, { x: +a[d + 4], y: +a[d + 5] }]; b ? d ? e - 4 == d ? f[3] = { x: +a[0], y: +a[1] } : e - 2 == d && (f[2] = { x: +a[0], y: +a[1] }, f[3] = { x: +a[2], y: +a[3] }) : f[0] = { x: +a[e - 2], y: +a[e - 1] } : e - 4 == d ? f[3] = f[2] : d || (f[0] = { x: +a[d], y: +a[d + 1] }), c.push([\"C\", (-f[0].x + 6 * f[1].x + f[2].x) / 6, (-f[0].y + 6 * f[1].y + f[2].y) / 6, (f[1].x + 6 * f[2].x - f[3].x) / 6, (f[1].y + 6 * f[2].y - f[3].y) / 6, f[2].x, f[2].y]) } return c } function h(a, b, c, d, e) { var f = -3 * b + 9 * c - 9 * d + 3 * e, g = a * f + 6 * b - 12 * c + 6 * d; return a * g - 3 * b + 3 * c } function i(a, b, c, d, e, f, g, i, j) { null == j && (j = 1), j = j > 1 ? 1 : 0 > j ? 0 : j; for (var k = j / 2, l = 12, m = [-.1252, .1252, -.3678, .3678, -.5873, .5873, -.7699, .7699, -.9041, .9041, -.9816, .9816], n = [.2491, .2491, .2335, .2335, .2032, .2032, .1601, .1601, .1069, .1069, .0472, .0472], o = 0, p = 0; l > p; p++) { var q = k * m[p] + k, r = h(q, a, c, e, g), s = h(q, b, d, f, i), t = r * r + s * s; o += n[p] * M.sqrt(t) } return k * o } function j(a, b, c, d, e, f, g, h, j) { if (!(0 > j || i(a, b, c, d, e, f, g, h) < j)) { var k, l = 1, m = l / 2, n = l - m, o = .01; for (k = i(a, b, c, d, e, f, g, h, n) ; P(k - j) > o;) m /= 2, n += (j > k ? 1 : -1) * m, k = i(a, b, c, d, e, f, g, h, n); return n } } function k(a, b, c, d, e, f, g, h) { if (!(N(a, c) < O(e, g) || O(a, c) > N(e, g) || N(b, d) < O(f, h) || O(b, d) > N(f, h))) { var i = (a * d - b * c) * (e - g) - (a - c) * (e * h - f * g), j = (a * d - b * c) * (f - h) - (b - d) * (e * h - f * g), k = (a - c) * (f - h) - (b - d) * (e - g); if (k) { var l = i / k, m = j / k, n = +l.toFixed(2), o = +m.toFixed(2); if (!(n < +O(a, c).toFixed(2) || n > +N(a, c).toFixed(2) || n < +O(e, g).toFixed(2) || n > +N(e, g).toFixed(2) || o < +O(b, d).toFixed(2) || o > +N(b, d).toFixed(2) || o < +O(f, h).toFixed(2) || o > +N(f, h).toFixed(2))) return { x: l, y: m } } } } function l(a, c, d) { var e = b.bezierBBox(a), f = b.bezierBBox(c); if (!b.isBBoxIntersect(e, f)) return d ? 0 : []; for (var g = i.apply(0, a), h = i.apply(0, c), j = N(~~(g / 5), 1), l = N(~~(h / 5), 1), m = [], n = [], o = {}, p = d ? 0 : [], q = 0; j + 1 > q; q++) { var r = b.findDotsAtSegment.apply(b, a.concat(q / j)); m.push({ x: r.x, y: r.y, t: q / j }) } for (q = 0; l + 1 > q; q++) r = b.findDotsAtSegment.apply(b, c.concat(q / l)), n.push({ x: r.x, y: r.y, t: q / l }); for (q = 0; j > q; q++) for (var s = 0; l > s; s++) { var t = m[q], u = m[q + 1], v = n[s], w = n[s + 1], x = P(u.x - t.x) < .001 ? \"y\" : \"x\", y = P(w.x - v.x) < .001 ? \"y\" : \"x\", z = k(t.x, t.y, u.x, u.y, v.x, v.y, w.x, w.y); if (z) { if (o[z.x.toFixed(4)] == z.y.toFixed(4)) continue; o[z.x.toFixed(4)] = z.y.toFixed(4); var A = t.t + P((z[x] - t[x]) / (u[x] - t[x])) * (u.t - t.t), B = v.t + P((z[y] - v[y]) / (w[y] - v[y])) * (w.t - v.t); A >= 0 && 1.001 >= A && B >= 0 && 1.001 >= B && (d ? p++ : p.push({ x: z.x, y: z.y, t1: O(A, 1), t2: O(B, 1) })) } } return p } function m(a, c, d) { a = b._path2curve(a), c = b._path2curve(c); for (var e, f, g, h, i, j, k, m, n, o, p = d ? 0 : [], q = 0, r = a.length; r > q; q++) { var s = a[q]; if (\"M\" == s[0]) e = i = s[1], f = j = s[2]; else { \"C\" == s[0] ? (n = [e, f].concat(s.slice(1)), e = n[6], f = n[7]) : (n = [e, f, e, f, i, j, i, j], e = i, f = j); for (var t = 0, u = c.length; u > t; t++) { var v = c[t]; if (\"M\" == v[0]) g = k = v[1], h = m = v[2]; else { \"C\" == v[0] ? (o = [g, h].concat(v.slice(1)), g = o[6], h = o[7]) : (o = [g, h, g, h, k, m, k, m], g = k, h = m); var w = l(n, o, d); if (d) p += w; else { for (var x = 0, y = w.length; y > x; x++) w[x].segment1 = q, w[x].segment2 = t, w[x].bez1 = n, w[x].bez2 = o; p = p.concat(w) } } } } } return p } function n(a, b, c, d, e, f) { null != a ? (this.a = +a, this.b = +b, this.c = +c, this.d = +d, this.e = +e, this.f = +f) : (this.a = 1, this.b = 0, this.c = 0, this.d = 1, this.e = 0, this.f = 0) } function o() { return this.x + G + this.y + G + this.width + \" × \" + this.height } function p(a, b, c, d, e, f) { function g(a) { return ((l * a + k) * a + j) * a } function h(a, b) { var c = i(a, b); return ((o * c + n) * c + m) * c } function i(a, b) { var c, d, e, f, h, i; for (e = a, i = 0; 8 > i; i++) { if (f = g(e) - a, P(f) < b) return e; if (h = (3 * l * e + 2 * k) * e + j, P(h) < 1e-6) break; e -= f / h } if (c = 0, d = 1, e = a, c > e) return c; if (e > d) return d; for (; d > c;) { if (f = g(e), P(f - a) < b) return e; a > f ? c = e : d = e, e = (d - c) / 2 + c } return e } var j = 3 * b, k = 3 * (d - b) - j, l = 1 - j - k, m = 3 * c, n = 3 * (e - c) - m, o = 1 - m - n; return h(a, 1 / (200 * f)) } function q(a, b) { var c = [], d = {}; if (this.ms = b, this.times = 1, a) { for (var e in a) a[y](e) && (d[$(e)] = a[e], c.push($(e))); c.sort(ka) } this.anim = d, this.top = c[c.length - 1], this.percents = c } function r(c, d, e, f, g, h) { e = $(e); var i, j, k, l, m, o, q = c.ms, r = {}, s = {}, t = {}; if (f) for (w = 0, x = fb.length; x > w; w++) { var u = fb[w]; if (u.el.id == d.id && u.anim == c) { u.percent != e ? (fb.splice(w, 1), k = 1) : j = u, d.attr(u.totalOrigin); break } } else f = +s; for (var w = 0, x = c.percents.length; x > w; w++) { if (c.percents[w] == e || c.percents[w] > f * c.top) { e = c.percents[w], m = c.percents[w - 1] || 0, q = q / c.top * (e - m), l = c.percents[w + 1], i = c.anim[e]; break } f && d.attr(c.anim[c.percents[w]]) } if (i) { if (j) j.initstatus = f, j.start = new Date - j.ms * f; else { for (var z in i) if (i[y](z) && (ca[y](z) || d.paper.customAttributes[y](z))) switch (r[z] = d.attr(z), null == r[z] && (r[z] = ba[z]), s[z] = i[z], ca[z]) { case S: t[z] = (s[z] - r[z]) / q; break; case \"colour\": r[z] = b.getRGB(r[z]); var A = b.getRGB(s[z]); t[z] = { r: (A.r - r[z].r) / q, g: (A.g - r[z].g) / q, b: (A.b - r[z].b) / q }; break; case \"path\": var B = Ia(r[z], s[z]), C = B[1]; for (r[z] = B[0], t[z] = [], w = 0, x = r[z].length; x > w; w++) { t[z][w] = [0]; for (var E = 1, F = r[z][w].length; F > E; E++) t[z][w][E] = (C[w][E] - r[z][w][E]) / q } break; case \"transform\": var G = d._, J = Na(G[z], s[z]); if (J) for (r[z] = J.from, s[z] = J.to, t[z] = [], t[z].real = !0, w = 0, x = r[z].length; x > w; w++) for (t[z][w] = [r[z][w][0]], E = 1, F = r[z][w].length; F > E; E++) t[z][w][E] = (s[z][w][E] - r[z][w][E]) / q; else { var K = d.matrix || new n, L = { _: { transform: G.transform }, getBBox: function () { return d.getBBox(1) } }; r[z] = [K.a, K.b, K.c, K.d, K.e, K.f], La(L, s[z]), s[z] = L._.transform, t[z] = [(L.matrix.a - K.a) / q, (L.matrix.b - K.b) / q, (L.matrix.c - K.c) / q, (L.matrix.d - K.d) / q, (L.matrix.e - K.e) / q, (L.matrix.f - K.f) / q] } break; case \"csv\": var M = H(i[z])[I](v), N = H(r[z])[I](v); if (\"clip-rect\" == z) for (r[z] = N, t[z] = [], w = N.length; w--;) t[z][w] = (M[w] - r[z][w]) / q; s[z] = M; break; default: for (M = [][D](i[z]), N = [][D](r[z]), t[z] = [], w = d.paper.customAttributes[z].length; w--;) t[z][w] = ((M[w] || 0) - (N[w] || 0)) / q } var O = i.easing, P = b.easing_formulas[O]; if (!P) if (P = H(O).match(Y), P && 5 == P.length) { var Q = P; P = function (a) { return p(a, +Q[1], +Q[2], +Q[3], +Q[4], q) } } else P = la; if (o = i.start || c.start || +new Date, u = { anim: c, percent: e, timestamp: o, start: o + (c.del || 0), status: 0, initstatus: f || 0, stop: !1, ms: q, easing: P, from: r, diff: t, to: s, el: d, callback: i.callback, prev: m, next: l, repeat: h || c.times, origin: d.attr(), totalOrigin: g }, fb.push(u), f && !j && !k && (u.stop = !0, u.start = new Date - q * f, 1 == fb.length)) return hb(); k && (u.start = new Date - u.ms * f), 1 == fb.length && gb(hb) } a(\"raphael.anim.start.\" + d.id, d, c) } } function s(a) { for (var b = 0; b < fb.length; b++) fb[b].el.paper == a && fb.splice(b--, 1) } b.version = \"2.1.4\", b.eve = a; var t, u, v = /[, ]+/, w = { circle: 1, rect: 1, path: 1, ellipse: 1, text: 1, image: 1 }, x = /\\{(\\d+)\\}/g, y = \"hasOwnProperty\", z = { doc: document, win: window }, A = { was: Object.prototype[y].call(z.win, \"Raphael\"), is: z.win.Raphael }, B = function () { this.ca = this.customAttributes = {} }, C = \"apply\", D = \"concat\", E = \"ontouchstart\" in z.win || z.win.DocumentTouch && z.doc instanceof DocumentTouch, F = \"\", G = \" \", H = String, I = \"split\", J = \"click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel\"[I](G), K = { mousedown: \"touchstart\", mousemove: \"touchmove\", mouseup: \"touchend\" }, L = H.prototype.toLowerCase, M = Math, N = M.max, O = M.min, P = M.abs, Q = M.pow, R = M.PI, S = \"number\", T = \"string\", U = \"array\", V = Object.prototype.toString, W = (b._ISURL = /^url\\(['\"]?(.+?)['\"]?\\)$/i, /^\\s*((#[a-f\\d]{6})|(#[a-f\\d]{3})|rgba?\\(\\s*([\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+%?(?:\\s*,\\s*[\\d\\.]+%?)?)\\s*\\)|hsba?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?)%?\\s*\\)|hsla?\\(\\s*([\\d\\.]+(?:deg|\\xb0|%)?\\s*,\\s*[\\d\\.]+%?\\s*,\\s*[\\d\\.]+(?:%?\\s*,\\s*[\\d\\.]+)?)%?\\s*\\))\\s*$/i), X = { NaN: 1, Infinity: 1, \"-Infinity\": 1 }, Y = /^(?:cubic-)?bezier\\(([^,]+),([^,]+),([^,]+),([^\\)]+)\\)/, Z = M.round, $ = parseFloat, _ = parseInt, aa = H.prototype.toUpperCase, ba = b._availableAttrs = { \"arrow-end\": \"none\", \"arrow-start\": \"none\", blur: 0, \"clip-rect\": \"0 0 1e9 1e9\", cursor: \"default\", cx: 0, cy: 0, fill: \"#fff\", \"fill-opacity\": 1, font: '10px \"Arial\"', \"font-family\": '\"Arial\"', \"font-size\": \"10\", \"font-style\": \"normal\", \"font-weight\": 400, gradient: 0, height: 0, href: \"http://raphaeljs.com/\", \"letter-spacing\": 0, opacity: 1, path: \"M0,0\", r: 0, rx: 0, ry: 0, src: \"\", stroke: \"#000\", \"stroke-dasharray\": \"\", \"stroke-linecap\": \"butt\", \"stroke-linejoin\": \"butt\", \"stroke-miterlimit\": 0, \"stroke-opacity\": 1, \"stroke-width\": 1, target: \"_blank\", \"text-anchor\": \"middle\", title: \"Raphael\", transform: \"\", width: 0, x: 0, y: 0 }, ca = b._availableAnimAttrs = { blur: S, \"clip-rect\": \"csv\", cx: S, cy: S, fill: \"colour\", \"fill-opacity\": S, \"font-size\": S, height: S, opacity: S, path: \"path\", r: S, rx: S, ry: S, stroke: \"colour\", \"stroke-opacity\": S, \"stroke-width\": S, transform: \"transform\", width: S, x: S, y: S }, da = /[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*/, ea = { hs: 1, rg: 1 }, fa = /,?([achlmqrstvxz]),?/gi, ga = /([achlmrqstvz])[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*)+)/gi, ha = /([rstm])[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029,]*((-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*)+)/gi, ia = /(-?\\d*\\.?\\d*(?:e[\\-+]?\\d+)?)[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,?[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*/gi, ja = (b._radial_gradient = /^r(?:\\(([^,]+?)[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*,[\\x09\\x0a\\x0b\\x0c\\x0d\\x20\\xa0\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000\\u2028\\u2029]*([^\\)]+?)\\))?/, {}), ka = function (a, b) { return $(a) - $(b) }, la = function (a) { return a }, ma = b._rectPath = function (a, b, c, d, e) { return e ? [[\"M\", a + e, b], [\"l\", c - 2 * e, 0], [\"a\", e, e, 0, 0, 1, e, e], [\"l\", 0, d - 2 * e], [\"a\", e, e, 0, 0, 1, -e, e], [\"l\", 2 * e - c, 0], [\"a\", e, e, 0, 0, 1, -e, -e], [\"l\", 0, 2 * e - d], [\"a\", e, e, 0, 0, 1, e, -e], [\"z\"]] : [[\"M\", a, b], [\"l\", c, 0], [\"l\", 0, d], [\"l\", -c, 0], [\"z\"]] }, na = function (a, b, c, d) { return null == d && (d = c), [[\"M\", a, b], [\"m\", 0, -d], [\"a\", c, d, 0, 1, 1, 0, 2 * d], [\"a\", c, d, 0, 1, 1, 0, -2 * d], [\"z\"]] }, oa = b._getPath = { path: function (a) { return a.attr(\"path\") }, circle: function (a) { var b = a.attrs; return na(b.cx, b.cy, b.r) }, ellipse: function (a) { var b = a.attrs; return na(b.cx, b.cy, b.rx, b.ry) }, rect: function (a) { var b = a.attrs; return ma(b.x, b.y, b.width, b.height, b.r) }, image: function (a) { var b = a.attrs; return ma(b.x, b.y, b.width, b.height) }, text: function (a) { var b = a._getBBox(); return ma(b.x, b.y, b.width, b.height) }, set: function (a) { var b = a._getBBox(); return ma(b.x, b.y, b.width, b.height) } }, pa = b.mapPath = function (a, b) { if (!b) return a; var c, d, e, f, g, h, i; for (a = Ia(a), e = 0, g = a.length; g > e; e++) for (i = a[e], f = 1, h = i.length; h > f; f += 2) c = b.x(i[f], i[f + 1]), d = b.y(i[f], i[f + 1]), i[f] = c, i[f + 1] = d; return a }; if (b._g = z, b.type = z.win.SVGAngle || z.doc.implementation.hasFeature(\"http://www.w3.org/TR/SVG11/feature#BasicStructure\", \"1.1\") ? \"SVG\" : \"VML\", \"VML\" == b.type) { var qa, ra = z.doc.createElement(\"div\"); if (ra.innerHTML = '<v:shape adj=\"1\"/>', qa = ra.firstChild, qa.style.behavior = \"url(#default#VML)\", !qa || \"object\" != typeof qa.adj) return b.type = F; ra = null } b.svg = !(b.vml = \"VML\" == b.type), b._Paper = B, b.fn = u = B.prototype = b.prototype, b._id = 0, b._oid = 0, b.is = function (a, b) { return b = L.call(b), \"finite\" == b ? !X[y](+a) : \"array\" == b ? a instanceof Array : \"null\" == b && null === a || b == typeof a && null !== a || \"object\" == b && a === Object(a) || \"array\" == b && Array.isArray && Array.isArray(a) || V.call(a).slice(8, -1).toLowerCase() == b }, b.angle = function (a, c, d, e, f, g) { if (null == f) { var h = a - d, i = c - e; return h || i ? (180 + 180 * M.atan2(-i, -h) / R + 360) % 360 : 0 } return b.angle(a, c, f, g) - b.angle(d, e, f, g) }, b.rad = function (a) { return a % 360 * R / 180 }, b.deg = function (a) { return Math.round(180 * a / R % 360 * 1e3) / 1e3 }, b.snapTo = function (a, c, d) { if (d = b.is(d, \"finite\") ? d : 10, b.is(a, U)) { for (var e = a.length; e--;) if (P(a[e] - c) <= d) return a[e] } else { a = +a; var f = c % a; if (d > f) return c - f; if (f > a - d) return c - f + a } return c }; b.createUUID = function (a, b) { return function () { return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(a, b).toUpperCase() } }(/[xy]/g, function (a) { var b = 16 * M.random() | 0, c = \"x\" == a ? b : 3 & b | 8; return c.toString(16) }); b.setWindow = function (c) { a(\"raphael.setWindow\", b, z.win, c), z.win = c, z.doc = z.win.document, b._engine.initWin && b._engine.initWin(z.win) }; var sa = function (a) { if (b.vml) { var c, d = /^\\s+|\\s+$/g; try { var f = new ActiveXObject(\"htmlfile\"); f.write(\"<body>\"), f.close(), c = f.body } catch (g) { c = createPopup().document.body } var h = c.createTextRange(); sa = e(function (a) { try { c.style.color = H(a).replace(d, F); var b = h.queryCommandValue(\"ForeColor\"); return b = (255 & b) << 16 | 65280 & b | (16711680 & b) >>> 16, \"#\" + (\"000000\" + b.toString(16)).slice(-6) } catch (e) { return \"none\" } }) } else { var i = z.doc.createElement(\"i\"); i.title = \"Raphaël Colour Picker\", i.style.display = \"none\", z.doc.body.appendChild(i), sa = e(function (a) { return i.style.color = a, z.doc.defaultView.getComputedStyle(i, F).getPropertyValue(\"color\") }) } return sa(a) }, ta = function () { return \"hsb(\" + [this.h, this.s, this.b] + \")\" }, ua = function () { return \"hsl(\" + [this.h, this.s, this.l] + \")\" }, va = function () { return this.hex }, wa = function (a, c, d) { if (null == c && b.is(a, \"object\") && \"r\" in a && \"g\" in a && \"b\" in a && (d = a.b, c = a.g, a = a.r), null == c && b.is(a, T)) { var e = b.getRGB(a); a = e.r, c = e.g, d = e.b } return (a > 1 || c > 1 || d > 1) && (a /= 255, c /= 255, d /= 255), [a, c, d] }, xa = function (a, c, d, e) { a *= 255, c *= 255, d *= 255; var f = { r: a, g: c, b: d, hex: b.rgb(a, c, d), toString: va }; return b.is(e, \"finite\") && (f.opacity = e), f }; b.color = function (a) { var c; return b.is(a, \"object\") && \"h\" in a && \"s\" in a && \"b\" in a ? (c = b.hsb2rgb(a), a.r = c.r, a.g = c.g, a.b = c.b, a.hex = c.hex) : b.is(a, \"object\") && \"h\" in a && \"s\" in a && \"l\" in a ? (c = b.hsl2rgb(a), a.r = c.r, a.g = c.g, a.b = c.b, a.hex = c.hex) : (b.is(a, \"string\") && (a = b.getRGB(a)), b.is(a, \"object\") && \"r\" in a && \"g\" in a && \"b\" in a ? (c = b.rgb2hsl(a), a.h = c.h, a.s = c.s, a.l = c.l, c = b.rgb2hsb(a), a.v = c.b) : (a = { hex: \"none\" }, a.r = a.g = a.b = a.h = a.s = a.v = a.l = -1)), a.toString = va, a }, b.hsb2rgb = function (a, b, c, d) { this.is(a, \"object\") && \"h\" in a && \"s\" in a && \"b\" in a && (c = a.b, b = a.s, d = a.o, a = a.h), a *= 360; var e, f, g, h, i; return a = a % 360 / 60, i = c * b, h = i * (1 - P(a % 2 - 1)), e = f = g = c - i, a = ~~a, e += [i, h, 0, 0, h, i][a], f += [h, i, i, h, 0, 0][a], g += [0, 0, h, i, i, h][a], xa(e, f, g, d) }, b.hsl2rgb = function (a, b, c, d) { this.is(a, \"object\") && \"h\" in a && \"s\" in a && \"l\" in a && (c = a.l, b = a.s, a = a.h), (a > 1 || b > 1 || c > 1) && (a /= 360, b /= 100, c /= 100), a *= 360; var e, f, g, h, i; return a = a % 360 / 60, i = 2 * b * (.5 > c ? c : 1 - c), h = i * (1 - P(a % 2 - 1)), e = f = g = c - i / 2, a = ~~a, e += [i, h, 0, 0, h, i][a], f += [h, i, i, h, 0, 0][a], g += [0, 0, h, i, i, h][a], xa(e, f, g, d) }, b.rgb2hsb = function (a, b, c) { c = wa(a, b, c), a = c[0], b = c[1], c = c[2]; var d, e, f, g; return f = N(a, b, c), g = f - O(a, b, c), d = 0 == g ? null : f == a ? (b - c) / g : f == b ? (c - a) / g + 2 : (a - b) / g + 4, d = (d + 360) % 6 * 60 / 360, e = 0 == g ? 0 : g / f, { h: d, s: e, b: f, toString: ta } }, b.rgb2hsl = function (a, b, c) { c = wa(a, b, c), a = c[0], b = c[1], c = c[2]; var d, e, f, g, h, i; return g = N(a, b, c), h = O(a, b, c), i = g - h, d = 0 == i ? null : g == a ? (b - c) / i : g == b ? (c - a) / i + 2 : (a - b) / i + 4, d = (d + 360) % 6 * 60 / 360, f = (g + h) / 2, e = 0 == i ? 0 : .5 > f ? i / (2 * f) : i / (2 - 2 * f), { h: d, s: e, l: f, toString: ua } }, b._path2string = function () { return this.join(\",\").replace(fa, \"$1\") }; b._preload = function (a, b) { var c = z.doc.createElement(\"img\"); c.style.cssText = \"position:absolute;left:-9999em;top:-9999em\", c.onload = function () { b.call(this), this.onload = null, z.doc.body.removeChild(this) }, c.onerror = function () { z.doc.body.removeChild(this) }, z.doc.body.appendChild(c), c.src = a }; b.getRGB = e(function (a) { if (!a || (a = H(a)).indexOf(\"-\") + 1) return { r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: f }; if (\"none\" == a) return { r: -1, g: -1, b: -1, hex: \"none\", toString: f }; !(ea[y](a.toLowerCase().substring(0, 2)) || \"#\" == a.charAt()) && (a = sa(a)); var c, d, e, g, h, i, j = a.match(W); return j ? (j[2] && (e = _(j[2].substring(5), 16), d = _(j[2].substring(3, 5), 16), c = _(j[2].substring(1, 3), 16)), j[3] && (e = _((h = j[3].charAt(3)) + h, 16), d = _((h = j[3].charAt(2)) + h, 16), c = _((h = j[3].charAt(1)) + h, 16)), j[4] && (i = j[4][I](da), c = $(i[0]), \"%\" == i[0].slice(-1) && (c *= 2.55), d = $(i[1]), \"%\" == i[1].slice(-1) && (d *= 2.55), e = $(i[2]), \"%\" == i[2].slice(-1) && (e *= 2.55), \"rgba\" == j[1].toLowerCase().slice(0, 4) && (g = $(i[3])), i[3] && \"%\" == i[3].slice(-1) && (g /= 100)), j[5] ? (i = j[5][I](da), c = $(i[0]), \"%\" == i[0].slice(-1) && (c *= 2.55), d = $(i[1]), \"%\" == i[1].slice(-1) && (d *= 2.55), e = $(i[2]), \"%\" == i[2].slice(-1) && (e *= 2.55), (\"deg\" == i[0].slice(-3) || \"°\" == i[0].slice(-1)) && (c /= 360), \"hsba\" == j[1].toLowerCase().slice(0, 4) && (g = $(i[3])), i[3] && \"%\" == i[3].slice(-1) && (g /= 100), b.hsb2rgb(c, d, e, g)) : j[6] ? (i = j[6][I](da), c = $(i[0]), \"%\" == i[0].slice(-1) && (c *= 2.55), d = $(i[1]), \"%\" == i[1].slice(-1) && (d *= 2.55), e = $(i[2]), \"%\" == i[2].slice(-1) && (e *= 2.55), (\"deg\" == i[0].slice(-3) || \"°\" == i[0].slice(-1)) && (c /= 360), \"hsla\" == j[1].toLowerCase().slice(0, 4) && (g = $(i[3])), i[3] && \"%\" == i[3].slice(-1) && (g /= 100), b.hsl2rgb(c, d, e, g)) : (j = { r: c, g: d, b: e, toString: f }, j.hex = \"#\" + (16777216 | e | d << 8 | c << 16).toString(16).slice(1), b.is(g, \"finite\") && (j.opacity = g), j)) : { r: -1, g: -1, b: -1, hex: \"none\", error: 1, toString: f } }, b), b.hsb = e(function (a, c, d) { return b.hsb2rgb(a, c, d).hex }), b.hsl = e(function (a, c, d) { return b.hsl2rgb(a, c, d).hex }), b.rgb = e(function (a, b, c) { function d(a) { return a + .5 | 0 } return \"#\" + (16777216 | d(c) | d(b) << 8 | d(a) << 16).toString(16).slice(1) }), b.getColor = function (a) { var b = this.getColor.start = this.getColor.start || { h: 0, s: 1, b: a || .75 }, c = this.hsb2rgb(b.h, b.s, b.b); return b.h += .075, b.h > 1 && (b.h = 0, b.s -= .2, b.s <= 0 && (this.getColor.start = { h: 0, s: 1, b: b.b })), c.hex }, b.getColor.reset = function () { delete this.start }, b.parsePathString = function (a) { if (!a) return null; var c = ya(a); if (c.arr) return Aa(c.arr); var d = { a: 7, c: 6, h: 1, l: 2, m: 2, r: 4, q: 4, s: 4, t: 2, v: 1, z: 0 }, e = []; return b.is(a, U) && b.is(a[0], U) && (e = Aa(a)), e.length || H(a).replace(ga, function (a, b, c) { var f = [], g = b.toLowerCase(); if (c.replace(ia, function (a, b) { b && f.push(+b) }), \"m\" == g && f.length > 2 && (e.push([b][D](f.splice(0, 2))), g = \"l\", b = \"m\" == b ? \"l\" : \"L\"), \"r\" == g) e.push([b][D](f)); else for (; f.length >= d[g] && (e.push([b][D](f.splice(0, d[g]))), d[g]) ;); }), e.toString = b._path2string, c.arr = Aa(e), e }, b.parseTransformString = e(function (a) { if (!a) return null; var c = []; return b.is(a, U) && b.is(a[0], U) && (c = Aa(a)), c.length || H(a).replace(ha, function (a, b, d) { { var e = []; L.call(b) } d.replace(ia, function (a, b) { b && e.push(+b) }), c.push([b][D](e)) }), c.toString = b._path2string, c }); var ya = function (a) { var b = ya.ps = ya.ps || {}; return b[a] ? b[a].sleep = 100 : b[a] = { sleep: 100 }, setTimeout(function () { for (var c in b) b[y](c) && c != a && (b[c].sleep--, !b[c].sleep && delete b[c]) }), b[a] }; b.findDotsAtSegment = function (a, b, c, d, e, f, g, h, i) { var j = 1 - i, k = Q(j, 3), l = Q(j, 2), m = i * i, n = m * i, o = k * a + 3 * l * i * c + 3 * j * i * i * e + n * g, p = k * b + 3 * l * i * d + 3 * j * i * i * f + n * h, q = a + 2 * i * (c - a) + m * (e - 2 * c + a), r = b + 2 * i * (d - b) + m * (f - 2 * d + b), s = c + 2 * i * (e - c) + m * (g - 2 * e + c), t = d + 2 * i * (f - d) + m * (h - 2 * f + d), u = j * a + i * c, v = j * b + i * d, w = j * e + i * g, x = j * f + i * h, y = 90 - 180 * M.atan2(q - s, r - t) / R; return (q > s || t > r) && (y += 180), { x: o, y: p, m: { x: q, y: r }, n: { x: s, y: t }, start: { x: u, y: v }, end: { x: w, y: x }, alpha: y } }, b.bezierBBox = function (a, c, d, e, f, g, h, i) { b.is(a, \"array\") || (a = [a, c, d, e, f, g, h, i]); var j = Ha.apply(null, a); return { x: j.min.x, y: j.min.y, x2: j.max.x, y2: j.max.y, width: j.max.x - j.min.x, height: j.max.y - j.min.y } }, b.isPointInsideBBox = function (a, b, c) { return b >= a.x && b <= a.x2 && c >= a.y && c <= a.y2 }, b.isBBoxIntersect = function (a, c) { var d = b.isPointInsideBBox; return d(c, a.x, a.y) || d(c, a.x2, a.y) || d(c, a.x, a.y2) || d(c, a.x2, a.y2) || d(a, c.x, c.y) || d(a, c.x2, c.y) || d(a, c.x, c.y2) || d(a, c.x2, c.y2) || (a.x < c.x2 && a.x > c.x || c.x < a.x2 && c.x > a.x) && (a.y < c.y2 && a.y > c.y || c.y < a.y2 && c.y > a.y) }, b.pathIntersection = function (a, b) { return m(a, b) }, b.pathIntersectionNumber = function (a, b) { return m(a, b, 1) }, b.isPointInsidePath = function (a, c, d) { var e = b.pathBBox(a); return b.isPointInsideBBox(e, c, d) && m(a, [[\"M\", c, d], [\"H\", e.x2 + 10]], 1) % 2 == 1 }, b._removedFactory = function (b) { return function () { a(\"raphael.log\", null, \"Raphaël: you are calling to method “\" + b + \"†of removed object\", b) } }; var za = b.pathBBox = function (a) { var b = ya(a); if (b.bbox) return c(b.bbox); if (!a) return { x: 0, y: 0, width: 0, height: 0, x2: 0, y2: 0 }; a = Ia(a); for (var d, e = 0, f = 0, g = [], h = [], i = 0, j = a.length; j > i; i++) if (d = a[i], \"M\" == d[0]) e = d[1], f = d[2], g.push(e), h.push(f); else { var k = Ha(e, f, d[1], d[2], d[3], d[4], d[5], d[6]); g = g[D](k.min.x, k.max.x), h = h[D](k.min.y, k.max.y), e = d[5], f = d[6] } var l = O[C](0, g), m = O[C](0, h), n = N[C](0, g), o = N[C](0, h), p = n - l, q = o - m, r = { x: l, y: m, x2: n, y2: o, width: p, height: q, cx: l + p / 2, cy: m + q / 2 }; return b.bbox = c(r), r }, Aa = function (a) { var d = c(a); return d.toString = b._path2string, d }, Ba = b._pathToRelative = function (a) { var c = ya(a); if (c.rel) return Aa(c.rel); b.is(a, U) && b.is(a && a[0], U) || (a = b.parsePathString(a)); var d = [], e = 0, f = 0, g = 0, h = 0, i = 0; \"M\" == a[0][0] && (e = a[0][1], f = a[0][2], g = e, h = f, i++, d.push([\"M\", e, f])); for (var j = i, k = a.length; k > j; j++) { var l = d[j] = [], m = a[j]; if (m[0] != L.call(m[0])) switch (l[0] = L.call(m[0]), l[0]) { case \"a\": l[1] = m[1], l[2] = m[2], l[3] = m[3], l[4] = m[4], l[5] = m[5], l[6] = +(m[6] - e).toFixed(3), l[7] = +(m[7] - f).toFixed(3); break; case \"v\": l[1] = +(m[1] - f).toFixed(3); break; case \"m\": g = m[1], h = m[2]; default: for (var n = 1, o = m.length; o > n; n++) l[n] = +(m[n] - (n % 2 ? e : f)).toFixed(3) } else { l = d[j] = [], \"m\" == m[0] && (g = m[1] + e, h = m[2] + f); for (var p = 0, q = m.length; q > p; p++) d[j][p] = m[p] } var r = d[j].length; switch (d[j][0]) { case \"z\": e = g, f = h; break; case \"h\": e += +d[j][r - 1]; break; case \"v\": f += +d[j][r - 1]; break; default: e += +d[j][r - 2], f += +d[j][r - 1] } } return d.toString = b._path2string, c.rel = Aa(d), d }, Ca = b._pathToAbsolute = function (a) { var c = ya(a); if (c.abs) return Aa(c.abs); if (b.is(a, U) && b.is(a && a[0], U) || (a = b.parsePathString(a)), !a || !a.length) return [[\"M\", 0, 0]]; var d = [], e = 0, f = 0, h = 0, i = 0, j = 0; \"M\" == a[0][0] && (e = +a[0][1], f = +a[0][2], h = e, i = f, j++, d[0] = [\"M\", e, f]); for (var k, l, m = 3 == a.length && \"M\" == a[0][0] && \"R\" == a[1][0].toUpperCase() && \"Z\" == a[2][0].toUpperCase(), n = j, o = a.length; o > n; n++) { if (d.push(k = []), l = a[n], l[0] != aa.call(l[0])) switch (k[0] = aa.call(l[0]), k[0]) { case \"A\": k[1] = l[1], k[2] = l[2], k[3] = l[3], k[4] = l[4], k[5] = l[5], k[6] = +(l[6] + e), k[7] = +(l[7] + f); break; case \"V\": k[1] = +l[1] + f; break; case \"H\": k[1] = +l[1] + e; break; case \"R\": for (var p = [e, f][D](l.slice(1)), q = 2, r = p.length; r > q; q++) p[q] = +p[q] + e, p[++q] = +p[q] + f; d.pop(), d = d[D](g(p, m)); break; case \"M\": h = +l[1] + e, i = +l[2] + f; default: for (q = 1, r = l.length; r > q; q++) k[q] = +l[q] + (q % 2 ? e : f) } else if (\"R\" == l[0]) p = [e, f][D](l.slice(1)), d.pop(), d = d[D](g(p, m)), k = [\"R\"][D](l.slice(-2)); else for (var s = 0, t = l.length; t > s; s++) k[s] = l[s]; switch (k[0]) { case \"Z\": e = h, f = i; break; case \"H\": e = k[1]; break; case \"V\": f = k[1]; break; case \"M\": h = k[k.length - 2], i = k[k.length - 1]; default: e = k[k.length - 2], f = k[k.length - 1] } } return d.toString = b._path2string, c.abs = Aa(d), d }, Da = function (a, b, c, d) { return [a, b, c, d, c, d] }, Ea = function (a, b, c, d, e, f) { var g = 1 / 3, h = 2 / 3; return [g * a + h * c, g * b + h * d, g * e + h * c, g * f + h * d, e, f] }, Fa = function (a, b, c, d, f, g, h, i, j, k) { var l, m = 120 * R / 180, n = R / 180 * (+f || 0), o = [], p = e(function (a, b, c) { var d = a * M.cos(c) - b * M.sin(c), e = a * M.sin(c) + b * M.cos(c); return { x: d, y: e } }); if (k) y = k[0], z = k[1], w = k[2], x = k[3]; else { l = p(a, b, -n), a = l.x, b = l.y, l = p(i, j, -n), i = l.x, j = l.y; var q = (M.cos(R / 180 * f), M.sin(R / 180 * f), (a - i) / 2), r = (b - j) / 2, s = q * q / (c * c) + r * r / (d * d); s > 1 && (s = M.sqrt(s), c = s * c, d = s * d); var t = c * c, u = d * d, v = (g == h ? -1 : 1) * M.sqrt(P((t * u - t * r * r - u * q * q) / (t * r * r + u * q * q))), w = v * c * r / d + (a + i) / 2, x = v * -d * q / c + (b + j) / 2, y = M.asin(((b - x) / d).toFixed(9)), z = M.asin(((j - x) / d).toFixed(9)); y = w > a ? R - y : y, z = w > i ? R - z : z, 0 > y && (y = 2 * R + y), 0 > z && (z = 2 * R + z), h && y > z && (y -= 2 * R), !h && z > y && (z -= 2 * R) } var A = z - y; if (P(A) > m) { var B = z, C = i, E = j; z = y + m * (h && z > y ? 1 : -1), i = w + c * M.cos(z), j = x + d * M.sin(z), o = Fa(i, j, c, d, f, 0, h, C, E, [z, B, w, x]) } A = z - y; var F = M.cos(y), G = M.sin(y), H = M.cos(z), J = M.sin(z), K = M.tan(A / 4), L = 4 / 3 * c * K, N = 4 / 3 * d * K, O = [a, b], Q = [a + L * G, b - N * F], S = [i + L * J, j - N * H], T = [i, j]; if (Q[0] = 2 * O[0] - Q[0], Q[1] = 2 * O[1] - Q[1], k) return [Q, S, T][D](o); o = [Q, S, T][D](o).join()[I](\",\"); for (var U = [], V = 0, W = o.length; W > V; V++) U[V] = V % 2 ? p(o[V - 1], o[V], n).y : p(o[V], o[V + 1], n).x; return U }, Ga = function (a, b, c, d, e, f, g, h, i) { var j = 1 - i; return { x: Q(j, 3) * a + 3 * Q(j, 2) * i * c + 3 * j * i * i * e + Q(i, 3) * g, y: Q(j, 3) * b + 3 * Q(j, 2) * i * d + 3 * j * i * i * f + Q(i, 3) * h } }, Ha = e(function (a, b, c, d, e, f, g, h) { var i, j = e - 2 * c + a - (g - 2 * e + c), k = 2 * (c - a) - 2 * (e - c), l = a - c, m = (-k + M.sqrt(k * k - 4 * j * l)) / 2 / j, n = (-k - M.sqrt(k * k - 4 * j * l)) / 2 / j, o = [b, h], p = [a, g]; return P(m) > \"1e12\" && (m = .5), P(n) > \"1e12\" && (n = .5), m > 0 && 1 > m && (i = Ga(a, b, c, d, e, f, g, h, m), p.push(i.x), o.push(i.y)), n > 0 && 1 > n && (i = Ga(a, b, c, d, e, f, g, h, n), p.push(i.x), o.push(i.y)), j = f - 2 * d + b - (h - 2 * f + d), k = 2 * (d - b) - 2 * (f - d), l = b - d, m = (-k + M.sqrt(k * k - 4 * j * l)) / 2 / j, n = (-k - M.sqrt(k * k - 4 * j * l)) / 2 / j, P(m) > \"1e12\" && (m = .5), P(n) > \"1e12\" && (n = .5), m > 0 && 1 > m && (i = Ga(a, b, c, d, e, f, g, h, m), p.push(i.x), o.push(i.y)), n > 0 && 1 > n && (i = Ga(a, b, c, d, e, f, g, h, n), p.push(i.x), o.push(i.y)), { min: { x: O[C](0, p), y: O[C](0, o) }, max: { x: N[C](0, p), y: N[C](0, o) } } }), Ia = b._path2curve = e(function (a, b) { var c = !b && ya(a); if (!b && c.curve) return Aa(c.curve); for (var d = Ca(a), e = b && Ca(b), f = { x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null }, g = { x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null }, h = (function (a, b, c) { var d, e, f = { T: 1, Q: 1 }; if (!a) return [\"C\", b.x, b.y, b.x, b.y, b.x, b.y]; switch (!(a[0] in f) && (b.qx = b.qy = null), a[0]) { case \"M\": b.X = a[1], b.Y = a[2]; break; case \"A\": a = [\"C\"][D](Fa[C](0, [b.x, b.y][D](a.slice(1)))); break; case \"S\": \"C\" == c || \"S\" == c ? (d = 2 * b.x - b.bx, e = 2 * b.y - b.by) : (d = b.x, e = b.y), a = [\"C\", d, e][D](a.slice(1)); break; case \"T\": \"Q\" == c || \"T\" == c ? (b.qx = 2 * b.x - b.qx, b.qy = 2 * b.y - b.qy) : (b.qx = b.x, b.qy = b.y), a = [\"C\"][D](Ea(b.x, b.y, b.qx, b.qy, a[1], a[2])); break; case \"Q\": b.qx = a[1], b.qy = a[2], a = [\"C\"][D](Ea(b.x, b.y, a[1], a[2], a[3], a[4])); break; case \"L\": a = [\"C\"][D](Da(b.x, b.y, a[1], a[2])); break; case \"H\": a = [\"C\"][D](Da(b.x, b.y, a[1], b.y)); break; case \"V\": a = [\"C\"][D](Da(b.x, b.y, b.x, a[1])); break; case \"Z\": a = [\"C\"][D](Da(b.x, b.y, b.X, b.Y)) } return a }), i = function (a, b) { if (a[b].length > 7) { a[b].shift(); for (var c = a[b]; c.length;) k[b] = \"A\", e && (l[b] = \"A\"), a.splice(b++, 0, [\"C\"][D](c.splice(0, 6))); a.splice(b, 1), p = N(d.length, e && e.length || 0) } }, j = function (a, b, c, f, g) { a && b && \"M\" == a[g][0] && \"M\" != b[g][0] && (b.splice(g, 0, [\"M\", f.x, f.y]), c.bx = 0, c.by = 0, c.x = a[g][1], c.y = a[g][2], p = N(d.length, e && e.length || 0)) }, k = [], l = [], m = \"\", n = \"\", o = 0, p = N(d.length, e && e.length || 0) ; p > o; o++) { d[o] && (m = d[o][0]), \"C\" != m && (k[o] = m, o && (n = k[o - 1])), d[o] = h(d[o], f, n), \"A\" != k[o] && \"C\" == m && (k[o] = \"C\"), i(d, o), e && (e[o] && (m = e[o][0]), \"C\" != m && (l[o] = m, o && (n = l[o - 1])), e[o] = h(e[o], g, n), \"A\" != l[o] && \"C\" == m && (l[o] = \"C\"), i(e, o)), j(d, e, f, g, o), j(e, d, g, f, o); var q = d[o], r = e && e[o], s = q.length, t = e && r.length; f.x = q[s - 2], f.y = q[s - 1], f.bx = $(q[s - 4]) || f.x, f.by = $(q[s - 3]) || f.y, g.bx = e && ($(r[t - 4]) || g.x), g.by = e && ($(r[t - 3]) || g.y), g.x = e && r[t - 2], g.y = e && r[t - 1] } return e || (c.curve = Aa(d)), e ? [d, e] : d }, null, Aa), Ja = (b._parseDots = e(function (a) { for (var c = [], d = 0, e = a.length; e > d; d++) { var f = {}, g = a[d].match(/^([^:]*):?([\\d\\.]*)/); if (f.color = b.getRGB(g[1]), f.color.error) return null; f.opacity = f.color.opacity, f.color = f.color.hex, g[2] && (f.offset = g[2] + \"%\"), c.push(f) } for (d = 1, e = c.length - 1; e > d; d++) if (!c[d].offset) { for (var h = $(c[d - 1].offset || 0), i = 0, j = d + 1; e > j; j++) if (c[j].offset) { i = c[j].offset; break } i || (i = 100, j = e), i = $(i); for (var k = (i - h) / (j - d + 1) ; j > d; d++) h += k, c[d].offset = h + \"%\" } return c }), b._tear = function (a, b) { a == b.top && (b.top = a.prev), a == b.bottom && (b.bottom = a.next), a.next && (a.next.prev = a.prev), a.prev && (a.prev.next = a.next) }), Ka = (b._tofront = function (a, b) { b.top !== a && (Ja(a, b), a.next = null, a.prev = b.top, b.top.next = a, b.top = a) }, b._toback = function (a, b) { b.bottom !== a && (Ja(a, b), a.next = b.bottom, a.prev = null, b.bottom.prev = a, b.bottom = a) }, b._insertafter = function (a, b, c) { Ja(a, c), b == c.top && (c.top = a), b.next && (b.next.prev = a), a.next = b.next, a.prev = b, b.next = a }, b._insertbefore = function (a, b, c) { Ja(a, c), b == c.bottom && (c.bottom = a), b.prev && (b.prev.next = a), a.prev = b.prev, b.prev = a, a.next = b }, b.toMatrix = function (a, b) { var c = za(a), d = { _: { transform: F }, getBBox: function () { return c } }; return La(d, b), d.matrix }), La = (b.transformPath = function (a, b) { return pa(a, Ka(a, b)) }, b._extractTransform = function (a, c) { if (null == c) return a._.transform; c = H(c).replace(/\\.{3}|\\u2026/g, a._.transform || F); var d = b.parseTransformString(c), e = 0, f = 0, g = 0, h = 1, i = 1, j = a._, k = new n; if (j.transform = d || [], d) for (var l = 0, m = d.length; m > l; l++) { var o, p, q, r, s, t = d[l], u = t.length, v = H(t[0]).toLowerCase(), w = t[0] != v, x = w ? k.invert() : 0; \"t\" == v && 3 == u ? w ? (o = x.x(0, 0), p = x.y(0, 0), q = x.x(t[1], t[2]), r = x.y(t[1], t[2]), k.translate(q - o, r - p)) : k.translate(t[1], t[2]) : \"r\" == v ? 2 == u ? (s = s || a.getBBox(1), k.rotate(t[1], s.x + s.width / 2, s.y + s.height / 2), e += t[1]) : 4 == u && (w ? (q = x.x(t[2], t[3]), r = x.y(t[2], t[3]), k.rotate(t[1], q, r)) : k.rotate(t[1], t[2], t[3]), e += t[1]) : \"s\" == v ? 2 == u || 3 == u ? (s = s || a.getBBox(1), k.scale(t[1], t[u - 1], s.x + s.width / 2, s.y + s.height / 2), h *= t[1], i *= t[u - 1]) : 5 == u && (w ? (q = x.x(t[3], t[4]), r = x.y(t[3], t[4]), k.scale(t[1], t[2], q, r)) : k.scale(t[1], t[2], t[3], t[4]), h *= t[1], i *= t[2]) : \"m\" == v && 7 == u && k.add(t[1], t[2], t[3], t[4], t[5], t[6]), j.dirtyT = 1, a.matrix = k } a.matrix = k, j.sx = h, j.sy = i, j.deg = e, j.dx = f = k.e, j.dy = g = k.f, 1 == h && 1 == i && !e && j.bbox ? (j.bbox.x += +f, j.bbox.y += +g) : j.dirtyT = 1 }), Ma = function (a) { var b = a[0]; switch (b.toLowerCase()) { case \"t\": return [b, 0, 0]; case \"m\": return [b, 1, 0, 0, 1, 0, 0]; case \"r\": return 4 == a.length ? [b, 0, a[2], a[3]] : [b, 0]; case \"s\": return 5 == a.length ? [b, 1, 1, a[3], a[4]] : 3 == a.length ? [b, 1, 1] : [b, 1] } }, Na = b._equaliseTransform = function (a, c) {\r\n c = H(c).replace(/\\.{3}|\\u2026/g, a), a = b.parseTransformString(a) || [], c = b.parseTransformString(c) || []; for (var d, e, f, g, h = N(a.length, c.length), i = [], j = [], k = 0; h > k; k++) { if (f = a[k] || Ma(c[k]), g = c[k] || Ma(f), f[0] != g[0] || \"r\" == f[0].toLowerCase() && (f[2] != g[2] || f[3] != g[3]) || \"s\" == f[0].toLowerCase() && (f[3] != g[3] || f[4] != g[4])) return; for (i[k] = [], j[k] = [], d = 0, e = N(f.length, g.length) ; e > d; d++) d in f && (i[k][d] = f[d]), d in g && (j[k][d] = g[d]) } return { from: i, to: j }\r\n }; b._getContainer = function (a, c, d, e) { var f; return f = null != e || b.is(a, \"object\") ? a : z.doc.getElementById(a), null != f ? f.tagName ? null == c ? { container: f, width: f.style.pixelWidth || f.offsetWidth, height: f.style.pixelHeight || f.offsetHeight } : { container: f, width: c, height: d } : { container: 1, x: a, y: c, width: d, height: e } : void 0 }, b.pathToRelative = Ba, b._engine = {}, b.path2curve = Ia, b.matrix = function (a, b, c, d, e, f) { return new n(a, b, c, d, e, f) }, function (a) { function c(a) { return a[0] * a[0] + a[1] * a[1] } function d(a) { var b = M.sqrt(c(a)); a[0] && (a[0] /= b), a[1] && (a[1] /= b) } a.add = function (a, b, c, d, e, f) { var g, h, i, j, k = [[], [], []], l = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]], m = [[a, c, e], [b, d, f], [0, 0, 1]]; for (a && a instanceof n && (m = [[a.a, a.c, a.e], [a.b, a.d, a.f], [0, 0, 1]]), g = 0; 3 > g; g++) for (h = 0; 3 > h; h++) { for (j = 0, i = 0; 3 > i; i++) j += l[g][i] * m[i][h]; k[g][h] = j } this.a = k[0][0], this.b = k[1][0], this.c = k[0][1], this.d = k[1][1], this.e = k[0][2], this.f = k[1][2] }, a.invert = function () { var a = this, b = a.a * a.d - a.b * a.c; return new n(a.d / b, -a.b / b, -a.c / b, a.a / b, (a.c * a.f - a.d * a.e) / b, (a.b * a.e - a.a * a.f) / b) }, a.clone = function () { return new n(this.a, this.b, this.c, this.d, this.e, this.f) }, a.translate = function (a, b) { this.add(1, 0, 0, 1, a, b) }, a.scale = function (a, b, c, d) { null == b && (b = a), (c || d) && this.add(1, 0, 0, 1, c, d), this.add(a, 0, 0, b, 0, 0), (c || d) && this.add(1, 0, 0, 1, -c, -d) }, a.rotate = function (a, c, d) { a = b.rad(a), c = c || 0, d = d || 0; var e = +M.cos(a).toFixed(9), f = +M.sin(a).toFixed(9); this.add(e, f, -f, e, c, d), this.add(1, 0, 0, 1, -c, -d) }, a.x = function (a, b) { return a * this.a + b * this.c + this.e }, a.y = function (a, b) { return a * this.b + b * this.d + this.f }, a.get = function (a) { return +this[H.fromCharCode(97 + a)].toFixed(4) }, a.toString = function () { return b.svg ? \"matrix(\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)].join() + \")\" : [this.get(0), this.get(2), this.get(1), this.get(3), 0, 0].join() }, a.toFilter = function () { return \"progid:DXImageTransform.Microsoft.Matrix(M11=\" + this.get(0) + \", M12=\" + this.get(2) + \", M21=\" + this.get(1) + \", M22=\" + this.get(3) + \", Dx=\" + this.get(4) + \", Dy=\" + this.get(5) + \", sizingmethod='auto expand')\" }, a.offset = function () { return [this.e.toFixed(4), this.f.toFixed(4)] }, a.split = function () { var a = {}; a.dx = this.e, a.dy = this.f; var e = [[this.a, this.c], [this.b, this.d]]; a.scalex = M.sqrt(c(e[0])), d(e[0]), a.shear = e[0][0] * e[1][0] + e[0][1] * e[1][1], e[1] = [e[1][0] - e[0][0] * a.shear, e[1][1] - e[0][1] * a.shear], a.scaley = M.sqrt(c(e[1])), d(e[1]), a.shear /= a.scaley; var f = -e[0][1], g = e[1][1]; return 0 > g ? (a.rotate = b.deg(M.acos(g)), 0 > f && (a.rotate = 360 - a.rotate)) : a.rotate = b.deg(M.asin(f)), a.isSimple = !(+a.shear.toFixed(9) || a.scalex.toFixed(9) != a.scaley.toFixed(9) && a.rotate), a.isSuperSimple = !+a.shear.toFixed(9) && a.scalex.toFixed(9) == a.scaley.toFixed(9) && !a.rotate, a.noRotation = !+a.shear.toFixed(9) && !a.rotate, a }, a.toTransformString = function (a) { var b = a || this[I](); return b.isSimple ? (b.scalex = +b.scalex.toFixed(4), b.scaley = +b.scaley.toFixed(4), b.rotate = +b.rotate.toFixed(4), (b.dx || b.dy ? \"t\" + [b.dx, b.dy] : F) + (1 != b.scalex || 1 != b.scaley ? \"s\" + [b.scalex, b.scaley, 0, 0] : F) + (b.rotate ? \"r\" + [b.rotate, 0, 0] : F)) : \"m\" + [this.get(0), this.get(1), this.get(2), this.get(3), this.get(4), this.get(5)] } }(n.prototype); for (var Oa = function () { this.returnValue = !1 }, Pa = function () { return this.originalEvent.preventDefault() }, Qa = function () { this.cancelBubble = !0 }, Ra = function () { return this.originalEvent.stopPropagation() }, Sa = function (a) { var b = z.doc.documentElement.scrollTop || z.doc.body.scrollTop, c = z.doc.documentElement.scrollLeft || z.doc.body.scrollLeft; return { x: a.clientX + c, y: a.clientY + b } }, Ta = function () { return z.doc.addEventListener ? function (a, b, c, d) { var e = function (a) { var b = Sa(a); return c.call(d, a, b.x, b.y) }; if (a.addEventListener(b, e, !1), E && K[b]) { var f = function (b) { for (var e = Sa(b), f = b, g = 0, h = b.targetTouches && b.targetTouches.length; h > g; g++) if (b.targetTouches[g].target == a) { b = b.targetTouches[g], b.originalEvent = f, b.preventDefault = Pa, b.stopPropagation = Ra; break } return c.call(d, b, e.x, e.y) }; a.addEventListener(K[b], f, !1) } return function () { return a.removeEventListener(b, e, !1), E && K[b] && a.removeEventListener(K[b], f, !1), !0 } } : z.doc.attachEvent ? function (a, b, c, d) { var e = function (a) { a = a || z.win.event; var b = z.doc.documentElement.scrollTop || z.doc.body.scrollTop, e = z.doc.documentElement.scrollLeft || z.doc.body.scrollLeft, f = a.clientX + e, g = a.clientY + b; return a.preventDefault = a.preventDefault || Oa, a.stopPropagation = a.stopPropagation || Qa, c.call(d, a, f, g) }; a.attachEvent(\"on\" + b, e); var f = function () { return a.detachEvent(\"on\" + b, e), !0 }; return f } : void 0 }(), Ua = [], Va = function (b) { for (var c, d = b.clientX, e = b.clientY, f = z.doc.documentElement.scrollTop || z.doc.body.scrollTop, g = z.doc.documentElement.scrollLeft || z.doc.body.scrollLeft, h = Ua.length; h--;) { if (c = Ua[h], E && b.touches) { for (var i, j = b.touches.length; j--;) if (i = b.touches[j], i.identifier == c.el._drag.id) { d = i.clientX, e = i.clientY, (b.originalEvent ? b.originalEvent : b).preventDefault(); break } } else b.preventDefault(); var k, l = c.el.node, m = l.nextSibling, n = l.parentNode, o = l.style.display; z.win.opera && n.removeChild(l), l.style.display = \"none\", k = c.el.paper.getElementByPoint(d, e), l.style.display = o, z.win.opera && (m ? n.insertBefore(l, m) : n.appendChild(l)), k && a(\"raphael.drag.over.\" + c.el.id, c.el, k), d += g, e += f, a(\"raphael.drag.move.\" + c.el.id, c.move_scope || c.el, d - c.el._drag.x, e - c.el._drag.y, d, e, b) } }, Wa = function (c) { b.unmousemove(Va).unmouseup(Wa); for (var d, e = Ua.length; e--;) d = Ua[e], d.el._drag = {}, a(\"raphael.drag.end.\" + d.el.id, d.end_scope || d.start_scope || d.move_scope || d.el, c); Ua = [] }, Xa = b.el = {}, Ya = J.length; Ya--;) !function (a) { b[a] = Xa[a] = function (c, d) { return b.is(c, \"function\") && (this.events = this.events || [], this.events.push({ name: a, f: c, unbind: Ta(this.shape || this.node || z.doc, a, c, d || this) })), this }, b[\"un\" + a] = Xa[\"un\" + a] = function (c) { for (var d = this.events || [], e = d.length; e--;) d[e].name != a || !b.is(c, \"undefined\") && d[e].f != c || (d[e].unbind(), d.splice(e, 1), !d.length && delete this.events); return this } }(J[Ya]); Xa.data = function (c, d) { var e = ja[this.id] = ja[this.id] || {}; if (0 == arguments.length) return e; if (1 == arguments.length) { if (b.is(c, \"object\")) { for (var f in c) c[y](f) && this.data(f, c[f]); return this } return a(\"raphael.data.get.\" + this.id, this, e[c], c), e[c] } return e[c] = d, a(\"raphael.data.set.\" + this.id, this, d, c), this }, Xa.removeData = function (a) { return null == a ? ja[this.id] = {} : ja[this.id] && delete ja[this.id][a], this }, Xa.getData = function () { return c(ja[this.id] || {}) }, Xa.hover = function (a, b, c, d) { return this.mouseover(a, c).mouseout(b, d || c) }, Xa.unhover = function (a, b) { return this.unmouseover(a).unmouseout(b) }; var Za = []; Xa.drag = function (c, d, e, f, g, h) { function i(i) { (i.originalEvent || i).preventDefault(); var j = i.clientX, k = i.clientY, l = z.doc.documentElement.scrollTop || z.doc.body.scrollTop, m = z.doc.documentElement.scrollLeft || z.doc.body.scrollLeft; if (this._drag.id = i.identifier, E && i.touches) for (var n, o = i.touches.length; o--;) if (n = i.touches[o], this._drag.id = n.identifier, n.identifier == this._drag.id) { j = n.clientX, k = n.clientY; break } this._drag.x = j + m, this._drag.y = k + l, !Ua.length && b.mousemove(Va).mouseup(Wa), Ua.push({ el: this, move_scope: f, start_scope: g, end_scope: h }), d && a.on(\"raphael.drag.start.\" + this.id, d), c && a.on(\"raphael.drag.move.\" + this.id, c), e && a.on(\"raphael.drag.end.\" + this.id, e), a(\"raphael.drag.start.\" + this.id, g || f || this, i.clientX + m, i.clientY + l, i) } return this._drag = {}, Za.push({ el: this, start: i }), this.mousedown(i), this }, Xa.onDragOver = function (b) { b ? a.on(\"raphael.drag.over.\" + this.id, b) : a.unbind(\"raphael.drag.over.\" + this.id) }, Xa.undrag = function () { for (var c = Za.length; c--;) Za[c].el == this && (this.unmousedown(Za[c].start), Za.splice(c, 1), a.unbind(\"raphael.drag.*.\" + this.id)); !Za.length && b.unmousemove(Va).unmouseup(Wa), Ua = [] }, u.circle = function (a, c, d) { var e = b._engine.circle(this, a || 0, c || 0, d || 0); return this.__set__ && this.__set__.push(e), e }, u.rect = function (a, c, d, e, f) { var g = b._engine.rect(this, a || 0, c || 0, d || 0, e || 0, f || 0); return this.__set__ && this.__set__.push(g), g }, u.ellipse = function (a, c, d, e) { var f = b._engine.ellipse(this, a || 0, c || 0, d || 0, e || 0); return this.__set__ && this.__set__.push(f), f }, u.path = function (a) { a && !b.is(a, T) && !b.is(a[0], U) && (a += F); var c = b._engine.path(b.format[C](b, arguments), this); return this.__set__ && this.__set__.push(c), c }, u.image = function (a, c, d, e, f) { var g = b._engine.image(this, a || \"about:blank\", c || 0, d || 0, e || 0, f || 0); return this.__set__ && this.__set__.push(g), g }, u.text = function (a, c, d) { var e = b._engine.text(this, a || 0, c || 0, H(d)); return this.__set__ && this.__set__.push(e), e }, u.set = function (a) { !b.is(a, \"array\") && (a = Array.prototype.splice.call(arguments, 0, arguments.length)); var c = new jb(a); return this.__set__ && this.__set__.push(c), c.paper = this, c.type = \"set\", c }, u.setStart = function (a) { this.__set__ = a || this.set() }, u.setFinish = function (a) { var b = this.__set__; return delete this.__set__, b }, u.getSize = function () { var a = this.canvas.parentNode; return { width: a.offsetWidth, height: a.offsetHeight } }, u.setSize = function (a, c) { return b._engine.setSize.call(this, a, c) }, u.setViewBox = function (a, c, d, e, f) { return b._engine.setViewBox.call(this, a, c, d, e, f) }, u.top = u.bottom = null, u.raphael = b; var $a = function (a) { var b = a.getBoundingClientRect(), c = a.ownerDocument, d = c.body, e = c.documentElement, f = e.clientTop || d.clientTop || 0, g = e.clientLeft || d.clientLeft || 0, h = b.top + (z.win.pageYOffset || e.scrollTop || d.scrollTop) - f, i = b.left + (z.win.pageXOffset || e.scrollLeft || d.scrollLeft) - g; return { y: h, x: i } }; u.getElementByPoint = function (a, b) { var c = this, d = c.canvas, e = z.doc.elementFromPoint(a, b); if (z.win.opera && \"svg\" == e.tagName) { var f = $a(d), g = d.createSVGRect(); g.x = a - f.x, g.y = b - f.y, g.width = g.height = 1; var h = d.getIntersectionList(g, null); h.length && (e = h[h.length - 1]) } if (!e) return null; for (; e.parentNode && e != d.parentNode && !e.raphael;) e = e.parentNode; return e == c.canvas.parentNode && (e = d), e = e && e.raphael ? c.getById(e.raphaelid) : null }, u.getElementsByBBox = function (a) { var c = this.set(); return this.forEach(function (d) { b.isBBoxIntersect(d.getBBox(), a) && c.push(d) }), c }, u.getById = function (a) { for (var b = this.bottom; b;) { if (b.id == a) return b; b = b.next } return null }, u.forEach = function (a, b) { for (var c = this.bottom; c;) { if (a.call(b, c) === !1) return this; c = c.next } return this }, u.getElementsByPoint = function (a, b) { var c = this.set(); return this.forEach(function (d) { d.isPointInside(a, b) && c.push(d) }), c }, Xa.isPointInside = function (a, c) { var d = this.realPath = oa[this.type](this); return this.attr(\"transform\") && this.attr(\"transform\").length && (d = b.transformPath(d, this.attr(\"transform\"))), b.isPointInsidePath(d, a, c) }, Xa.getBBox = function (a) { if (this.removed) return {}; var b = this._; return a ? ((b.dirty || !b.bboxwt) && (this.realPath = oa[this.type](this), b.bboxwt = za(this.realPath), b.bboxwt.toString = o, b.dirty = 0), b.bboxwt) : ((b.dirty || b.dirtyT || !b.bbox) && ((b.dirty || !this.realPath) && (b.bboxwt = 0, this.realPath = oa[this.type](this)), b.bbox = za(pa(this.realPath, this.matrix)), b.bbox.toString = o, b.dirty = b.dirtyT = 0), b.bbox) }, Xa.clone = function () { if (this.removed) return null; var a = this.paper[this.type]().attr(this.attr()); return this.__set__ && this.__set__.push(a), a }, Xa.glow = function (a) { if (\"text\" == this.type) return null; a = a || {}; var b = { width: (a.width || 10) + (+this.attr(\"stroke-width\") || 1), fill: a.fill || !1, opacity: null == a.opacity ? .5 : a.opacity, offsetx: a.offsetx || 0, offsety: a.offsety || 0, color: a.color || \"#000\" }, c = b.width / 2, d = this.paper, e = d.set(), f = this.realPath || oa[this.type](this); f = this.matrix ? pa(f, this.matrix) : f; for (var g = 1; c + 1 > g; g++) e.push(d.path(f).attr({ stroke: b.color, fill: b.fill ? b.color : \"none\", \"stroke-linejoin\": \"round\", \"stroke-linecap\": \"round\", \"stroke-width\": +(b.width / c * g).toFixed(3), opacity: +(b.opacity / c).toFixed(3) })); return e.insertBefore(this).translate(b.offsetx, b.offsety) }; var _a = function (a, c, d, e, f, g, h, k, l) { return null == l ? i(a, c, d, e, f, g, h, k) : b.findDotsAtSegment(a, c, d, e, f, g, h, k, j(a, c, d, e, f, g, h, k, l)) }, ab = function (a, c) { return function (d, e, f) { d = Ia(d); for (var g, h, i, j, k, l = \"\", m = {}, n = 0, o = 0, p = d.length; p > o; o++) { if (i = d[o], \"M\" == i[0]) g = +i[1], h = +i[2]; else { if (j = _a(g, h, i[1], i[2], i[3], i[4], i[5], i[6]), n + j > e) { if (c && !m.start) { if (k = _a(g, h, i[1], i[2], i[3], i[4], i[5], i[6], e - n), l += [\"C\" + k.start.x, k.start.y, k.m.x, k.m.y, k.x, k.y], f) return l; m.start = l, l = [\"M\" + k.x, k.y + \"C\" + k.n.x, k.n.y, k.end.x, k.end.y, i[5], i[6]].join(), n += j, g = +i[5], h = +i[6]; continue } if (!a && !c) return k = _a(g, h, i[1], i[2], i[3], i[4], i[5], i[6], e - n), { x: k.x, y: k.y, alpha: k.alpha } } n += j, g = +i[5], h = +i[6] } l += i.shift() + i } return m.end = l, k = a ? n : c ? m : b.findDotsAtSegment(g, h, i[0], i[1], i[2], i[3], i[4], i[5], 1), k.alpha && (k = { x: k.x, y: k.y, alpha: k.alpha }), k } }, bb = ab(1), cb = ab(), db = ab(0, 1); b.getTotalLength = bb, b.getPointAtLength = cb, b.getSubpath = function (a, b, c) { if (this.getTotalLength(a) - c < 1e-6) return db(a, b).end; var d = db(a, c, 1); return b ? db(d, b).end : d }, Xa.getTotalLength = function () { var a = this.getPath(); if (a) return this.node.getTotalLength ? this.node.getTotalLength() : bb(a) }, Xa.getPointAtLength = function (a) { var b = this.getPath(); if (b) return cb(b, a) }, Xa.getPath = function () { var a, c = b._getPath[this.type]; if (\"text\" != this.type && \"set\" != this.type) return c && (a = c(this)), a }, Xa.getSubpath = function (a, c) { var d = this.getPath(); if (d) return b.getSubpath(d, a, c) }; var eb = b.easing_formulas = { linear: function (a) { return a }, \"<\": function (a) { return Q(a, 1.7) }, \">\": function (a) { return Q(a, .48) }, \"<>\": function (a) { var b = .48 - a / 1.04, c = M.sqrt(.1734 + b * b), d = c - b, e = Q(P(d), 1 / 3) * (0 > d ? -1 : 1), f = -c - b, g = Q(P(f), 1 / 3) * (0 > f ? -1 : 1), h = e + g + .5; return 3 * (1 - h) * h * h + h * h * h }, backIn: function (a) { var b = 1.70158; return a * a * ((b + 1) * a - b) }, backOut: function (a) { a -= 1; var b = 1.70158; return a * a * ((b + 1) * a + b) + 1 }, elastic: function (a) { return a == !!a ? a : Q(2, -10 * a) * M.sin(2 * (a - .075) * R / .3) + 1 }, bounce: function (a) { var b, c = 7.5625, d = 2.75; return 1 / d > a ? b = c * a * a : 2 / d > a ? (a -= 1.5 / d, b = c * a * a + .75) : 2.5 / d > a ? (a -= 2.25 / d, b = c * a * a + .9375) : (a -= 2.625 / d, b = c * a * a + .984375), b } }; eb.easeIn = eb[\"ease-in\"] = eb[\"<\"], eb.easeOut = eb[\"ease-out\"] = eb[\">\"], eb.easeInOut = eb[\"ease-in-out\"] = eb[\"<>\"], eb[\"back-in\"] = eb.backIn, eb[\"back-out\"] = eb.backOut; var fb = [], gb = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (a) { setTimeout(a, 16) }, hb = function () { for (var c = +new Date, d = 0; d < fb.length; d++) { var e = fb[d]; if (!e.el.removed && !e.paused) { var f, g, h = c - e.start, i = e.ms, j = e.easing, k = e.from, l = e.diff, m = e.to, n = (e.t, e.el), o = {}, p = {}; if (e.initstatus ? (h = (e.initstatus * e.anim.top - e.prev) / (e.percent - e.prev) * i, e.status = e.initstatus, delete e.initstatus, e.stop && fb.splice(d--, 1)) : e.status = (e.prev + (e.percent - e.prev) * (h / i)) / e.anim.top, !(0 > h)) if (i > h) { var q = j(h / i); for (var s in k) if (k[y](s)) { switch (ca[s]) { case S: f = +k[s] + q * i * l[s]; break; case \"colour\": f = \"rgb(\" + [ib(Z(k[s].r + q * i * l[s].r)), ib(Z(k[s].g + q * i * l[s].g)), ib(Z(k[s].b + q * i * l[s].b))].join(\",\") + \")\"; break; case \"path\": f = []; for (var t = 0, u = k[s].length; u > t; t++) { f[t] = [k[s][t][0]]; for (var v = 1, w = k[s][t].length; w > v; v++) f[t][v] = +k[s][t][v] + q * i * l[s][t][v]; f[t] = f[t].join(G) } f = f.join(G); break; case \"transform\": if (l[s].real) for (f = [], t = 0, u = k[s].length; u > t; t++) for (f[t] = [k[s][t][0]], v = 1, w = k[s][t].length; w > v; v++) f[t][v] = k[s][t][v] + q * i * l[s][t][v]; else { var x = function (a) { return +k[s][a] + q * i * l[s][a] }; f = [[\"m\", x(0), x(1), x(2), x(3), x(4), x(5)]] } break; case \"csv\": if (\"clip-rect\" == s) for (f = [], t = 4; t--;) f[t] = +k[s][t] + q * i * l[s][t]; break; default: var z = [][D](k[s]); for (f = [], t = n.paper.customAttributes[s].length; t--;) f[t] = +z[t] + q * i * l[s][t] } o[s] = f } n.attr(o), function (b, c, d) { setTimeout(function () { a(\"raphael.anim.frame.\" + b, c, d) }) }(n.id, n, e.anim) } else { if (function (c, d, e) { setTimeout(function () { a(\"raphael.anim.frame.\" + d.id, d, e), a(\"raphael.anim.finish.\" + d.id, d, e), b.is(c, \"function\") && c.call(d) }) }(e.callback, n, e.anim), n.attr(m), fb.splice(d--, 1), e.repeat > 1 && !e.next) { for (g in m) m[y](g) && (p[g] = e.totalOrigin[g]); e.el.attr(p), r(e.anim, e.el, e.anim.percents[0], null, e.totalOrigin, e.repeat - 1) } e.next && !e.stop && r(e.anim, e.el, e.next, null, e.totalOrigin, e.repeat) } } } fb.length && gb(hb) }, ib = function (a) { return a > 255 ? 255 : 0 > a ? 0 : a }; Xa.animateWith = function (a, c, d, e, f, g) { var h = this; if (h.removed) return g && g.call(h), h; var i = d instanceof q ? d : b.animation(d, e, f, g); r(i, h, i.percents[0], null, h.attr()); for (var j = 0, k = fb.length; k > j; j++) if (fb[j].anim == c && fb[j].el == a) { fb[k - 1].start = fb[j].start; break } return h }, Xa.onAnimation = function (b) { return b ? a.on(\"raphael.anim.frame.\" + this.id, b) : a.unbind(\"raphael.anim.frame.\" + this.id), this }, q.prototype.delay = function (a) { var b = new q(this.anim, this.ms); return b.times = this.times, b.del = +a || 0, b }, q.prototype.repeat = function (a) { var b = new q(this.anim, this.ms); return b.del = this.del, b.times = M.floor(N(a, 0)) || 1, b }, b.animation = function (a, c, d, e) { if (a instanceof q) return a; (b.is(d, \"function\") || !d) && (e = e || d || null, d = null), a = Object(a), c = +c || 0; var f, g, h = {}; for (g in a) a[y](g) && $(g) != g && $(g) + \"%\" != g && (f = !0, h[g] = a[g]); if (f) return d && (h.easing = d), e && (h.callback = e), new q({ 100: h }, c); if (e) { var i = 0; for (var j in a) { var k = _(j); a[y](j) && k > i && (i = k) } i += \"%\", !a[i].callback && (a[i].callback = e) } return new q(a, c) }, Xa.animate = function (a, c, d, e) { var f = this; if (f.removed) return e && e.call(f), f; var g = a instanceof q ? a : b.animation(a, c, d, e); return r(g, f, g.percents[0], null, f.attr()), f }, Xa.setTime = function (a, b) { return a && null != b && this.status(a, O(b, a.ms) / a.ms), this }, Xa.status = function (a, b) { var c, d, e = [], f = 0; if (null != b) return r(a, this, -1, O(b, 1)), this; for (c = fb.length; c > f; f++) if (d = fb[f], d.el.id == this.id && (!a || d.anim == a)) { if (a) return d.status; e.push({ anim: d.anim, status: d.status }) } return a ? 0 : e }, Xa.pause = function (b) { for (var c = 0; c < fb.length; c++) fb[c].el.id != this.id || b && fb[c].anim != b || a(\"raphael.anim.pause.\" + this.id, this, fb[c].anim) !== !1 && (fb[c].paused = !0); return this }, Xa.resume = function (b) { for (var c = 0; c < fb.length; c++) if (fb[c].el.id == this.id && (!b || fb[c].anim == b)) { var d = fb[c]; a(\"raphael.anim.resume.\" + this.id, this, d.anim) !== !1 && (delete d.paused, this.status(d.anim, d.status)) } return this }, Xa.stop = function (b) { for (var c = 0; c < fb.length; c++) fb[c].el.id != this.id || b && fb[c].anim != b || a(\"raphael.anim.stop.\" + this.id, this, fb[c].anim) !== !1 && fb.splice(c--, 1); return this }, a.on(\"raphael.remove\", s), a.on(\"raphael.clear\", s), Xa.toString = function () { return \"Raphaël’s object\" }; var jb = function (a) { if (this.items = [], this.length = 0, this.type = \"set\", a) for (var b = 0, c = a.length; c > b; b++) !a[b] || a[b].constructor != Xa.constructor && a[b].constructor != jb || (this[this.items.length] = this.items[this.items.length] = a[b], this.length++) }, kb = jb.prototype; kb.push = function () { for (var a, b, c = 0, d = arguments.length; d > c; c++) a = arguments[c], !a || a.constructor != Xa.constructor && a.constructor != jb || (b = this.items.length, this[b] = this.items[b] = a, this.length++); return this }, kb.pop = function () { return this.length && delete this[this.length--], this.items.pop() }, kb.forEach = function (a, b) { for (var c = 0, d = this.items.length; d > c; c++) if (a.call(b, this.items[c], c) === !1) return this; return this }; for (var lb in Xa) Xa[y](lb) && (kb[lb] = function (a) { return function () { var b = arguments; return this.forEach(function (c) { c[a][C](c, b) }) } }(lb)); return kb.attr = function (a, c) { if (a && b.is(a, U) && b.is(a[0], \"object\")) for (var d = 0, e = a.length; e > d; d++) this.items[d].attr(a[d]); else for (var f = 0, g = this.items.length; g > f; f++) this.items[f].attr(a, c); return this }, kb.clear = function () { for (; this.length;) this.pop() }, kb.splice = function (a, b, c) { a = 0 > a ? N(this.length + a, 0) : a, b = N(0, O(this.length - a, b)); var d, e = [], f = [], g = []; for (d = 2; d < arguments.length; d++) g.push(arguments[d]); for (d = 0; b > d; d++) f.push(this[a + d]); for (; d < this.length - a; d++) e.push(this[a + d]); var h = g.length; for (d = 0; d < h + e.length; d++) this.items[a + d] = this[a + d] = h > d ? g[d] : e[d - h]; for (d = this.items.length = this.length -= b - h; this[d];) delete this[d++]; return new jb(f) }, kb.exclude = function (a) { for (var b = 0, c = this.length; c > b; b++) if (this[b] == a) return this.splice(b, 1), !0 }, kb.animate = function (a, c, d, e) { (b.is(d, \"function\") || !d) && (e = d || null); var f, g, h = this.items.length, i = h, j = this; if (!h) return this; e && (g = function () { !--h && e.call(j) }), d = b.is(d, T) ? d : g; var k = b.animation(a, c, d, g); for (f = this.items[--i].animate(k) ; i--;) this.items[i] && !this.items[i].removed && this.items[i].animateWith(f, k, k), this.items[i] && !this.items[i].removed || h--; return this }, kb.insertAfter = function (a) { for (var b = this.items.length; b--;) this.items[b].insertAfter(a); return this }, kb.getBBox = function () { for (var a = [], b = [], c = [], d = [], e = this.items.length; e--;) if (!this.items[e].removed) { var f = this.items[e].getBBox(); a.push(f.x), b.push(f.y), c.push(f.x + f.width), d.push(f.y + f.height) } return a = O[C](0, a), b = O[C](0, b), c = N[C](0, c), d = N[C](0, d), { x: a, y: b, x2: c, y2: d, width: c - a, height: d - b } }, kb.clone = function (a) { a = this.paper.set(); for (var b = 0, c = this.items.length; c > b; b++) a.push(this.items[b].clone()); return a }, kb.toString = function () { return \"Raphaël‘s set\" }, kb.glow = function (a) { var b = this.paper.set(); return this.forEach(function (c, d) { var e = c.glow(a); null != e && e.forEach(function (a, c) { b.push(a) }) }), b }, kb.isPointInside = function (a, b) { var c = !1; return this.forEach(function (d) { return d.isPointInside(a, b) ? (c = !0, !1) : void 0 }), c }, b.registerFont = function (a) { if (!a.face) return a; this.fonts = this.fonts || {}; var b = { w: a.w, face: {}, glyphs: {} }, c = a.face[\"font-family\"]; for (var d in a.face) a.face[y](d) && (b.face[d] = a.face[d]); if (this.fonts[c] ? this.fonts[c].push(b) : this.fonts[c] = [b], !a.svg) { b.face[\"units-per-em\"] = _(a.face[\"units-per-em\"], 10); for (var e in a.glyphs) if (a.glyphs[y](e)) { var f = a.glyphs[e]; if (b.glyphs[e] = { w: f.w, k: {}, d: f.d && \"M\" + f.d.replace(/[mlcxtrv]/g, function (a) { return { l: \"L\", c: \"C\", x: \"z\", t: \"m\", r: \"l\", v: \"c\" }[a] || \"M\" }) + \"z\" }, f.k) for (var g in f.k) f[y](g) && (b.glyphs[e].k[g] = f.k[g]) } } return a }, u.getFont = function (a, c, d, e) { if (e = e || \"normal\", d = d || \"normal\", c = +c || { normal: 400, bold: 700, lighter: 300, bolder: 800 }[c] || 400, b.fonts) { var f = b.fonts[a]; if (!f) { var g = new RegExp(\"(^|\\\\s)\" + a.replace(/[^\\w\\d\\s+!~.:_-]/g, F) + \"(\\\\s|$)\", \"i\"); for (var h in b.fonts) if (b.fonts[y](h) && g.test(h)) { f = b.fonts[h]; break } } var i; if (f) for (var j = 0, k = f.length; k > j && (i = f[j], i.face[\"font-weight\"] != c || i.face[\"font-style\"] != d && i.face[\"font-style\"] || i.face[\"font-stretch\"] != e) ; j++); return i } }, u.print = function (a, c, d, e, f, g, h, i) { g = g || \"middle\", h = N(O(h || 0, 1), -1), i = N(O(i || 1, 3), 1); var j, k = H(d)[I](F), l = 0, m = 0, n = F; if (b.is(e, \"string\") && (e = this.getFont(e)), e) { j = (f || 16) / e.face[\"units-per-em\"]; for (var o = e.face.bbox[I](v), p = +o[0], q = o[3] - o[1], r = 0, s = +o[1] + (\"baseline\" == g ? q + +e.face.descent : q / 2), t = 0, u = k.length; u > t; t++) { if (\"\\n\" == k[t]) l = 0, x = 0, m = 0, r += q * i; else { var w = m && e.glyphs[k[t - 1]] || {}, x = e.glyphs[k[t]]; l += m ? (w.w || e.w) + (w.k && w.k[k[t]] || 0) + e.w * h : 0, m = 1 } x && x.d && (n += b.transformPath(x.d, [\"t\", l * j, r * j, \"s\", j, j, p, s, \"t\", (a - p) / j, (c - s) / j])) } } return this.path(n).attr({ fill: \"#000\", stroke: \"none\" }) }, u.add = function (a) { if (b.is(a, \"array\")) for (var c, d = this.set(), e = 0, f = a.length; f > e; e++) c = a[e] || {}, w[y](c.type) && d.push(this[c.type]().attr(c)); return d }, b.format = function (a, c) { var d = b.is(c, U) ? [0][D](c) : arguments; return a && b.is(a, T) && d.length - 1 && (a = a.replace(x, function (a, b) { return null == d[++b] ? F : d[b] })), a || F }, b.fullfill = function () { var a = /\\{([^\\}]+)\\}/g, b = /(?:(?:^|\\.)(.+?)(?=\\[|\\.|$|\\()|\\[('|\")(.+?)\\2\\])(\\(\\))?/g, c = function (a, c, d) { var e = d; return c.replace(b, function (a, b, c, d, f) { b = b || d, e && (b in e && (e = e[b]), \"function\" == typeof e && f && (e = e())) }), e = (null == e || e == d ? a : e) + \"\" }; return function (b, d) { return String(b).replace(a, function (a, b) { return c(a, b, d) }) } }(), b.ninja = function () { return A.was ? z.win.Raphael = A.is : delete Raphael, b }, b.st = kb, a.on(\"raphael.DOMload\", function () { t = !0 }), function (a, c, d) { function e() { /in/.test(a.readyState) ? setTimeout(e, 9) : b.eve(\"raphael.DOMload\") } null == a.readyState && a.addEventListener && (a.addEventListener(c, d = function () { a.removeEventListener(c, d, !1), a.readyState = \"complete\" }, !1), a.readyState = \"loading\"), e() }(document, \"DOMContentLoaded\"), b\r\n}), function (a, b) { \"function\" == typeof define && define.amd ? define(\"raphael.svg\", [\"raphael.core\"], function (a) { return b(a) }) : b(\"object\" == typeof exports ? require(\"./raphael.core\") : a.Raphael) }(this, function (a) {\r\n if (!a || a.svg) {\r\n var b = \"hasOwnProperty\", c = String, d = parseFloat, e = parseInt, f = Math, g = f.max, h = f.abs, i = f.pow, j = /[, ]+/, k = a.eve, l = \"\", m = \" \", n = \"http://www.w3.org/1999/xlink\", o = { block: \"M5,0 0,2.5 5,5z\", classic: \"M5,0 0,2.5 5,5 3.5,3 3.5,2z\", diamond: \"M2.5,0 5,2.5 2.5,5 0,2.5z\", open: \"M6,1 1,3.5 6,6\", oval: \"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z\" }, p = {}; a.toString = function () { return \"Your browser supports SVG.\\nYou are running Raphaël \" + this.version }; var q = function (d, e) { if (e) { \"string\" == typeof d && (d = q(d)); for (var f in e) e[b](f) && (\"xlink:\" == f.substring(0, 6) ? d.setAttributeNS(n, f.substring(6), c(e[f])) : d.setAttribute(f, c(e[f]))) } else d = a._g.doc.createElementNS(\"http://www.w3.org/2000/svg\", d), d.style && (d.style.webkitTapHighlightColor = \"rgba(0,0,0,0)\"); return d }, r = function (b, e) { var j = \"linear\", k = b.id + e, m = .5, n = .5, o = b.node, p = b.paper, r = o.style, s = a._g.doc.getElementById(k); if (!s) { if (e = c(e).replace(a._radial_gradient, function (a, b, c) { if (j = \"radial\", b && c) { m = d(b), n = d(c); var e = 2 * (n > .5) - 1; i(m - .5, 2) + i(n - .5, 2) > .25 && (n = f.sqrt(.25 - i(m - .5, 2)) * e + .5) && .5 != n && (n = n.toFixed(5) - 1e-5 * e) } return l }), e = e.split(/\\s*\\-\\s*/), \"linear\" == j) { var t = e.shift(); if (t = -d(t), isNaN(t)) return null; var u = [0, 0, f.cos(a.rad(t)), f.sin(a.rad(t))], v = 1 / (g(h(u[2]), h(u[3])) || 1); u[2] *= v, u[3] *= v, u[2] < 0 && (u[0] = -u[2], u[2] = 0), u[3] < 0 && (u[1] = -u[3], u[3] = 0) } var w = a._parseDots(e); if (!w) return null; if (k = k.replace(/[\\(\\)\\s,\\xb0#]/g, \"_\"), b.gradient && k != b.gradient.id && (p.defs.removeChild(b.gradient), delete b.gradient), !b.gradient) { s = q(j + \"Gradient\", { id: k }), b.gradient = s, q(s, \"radial\" == j ? { fx: m, fy: n } : { x1: u[0], y1: u[1], x2: u[2], y2: u[3], gradientTransform: b.matrix.invert() }), p.defs.appendChild(s); for (var x = 0, y = w.length; y > x; x++) s.appendChild(q(\"stop\", { offset: w[x].offset ? w[x].offset : x ? \"100%\" : \"0%\", \"stop-color\": w[x].color || \"#fff\", \"stop-opacity\": isFinite(w[x].opacity) ? w[x].opacity : 1 })) } } return q(o, { fill: \"url('\" + document.location.origin + document.location.pathname + \"#\" + k + \"')\", opacity: 1, \"fill-opacity\": 1 }), r.fill = l, r.opacity = 1, r.fillOpacity = 1, 1 }, s = function (a) { var b = a.getBBox(1); q(a.pattern, { patternTransform: a.matrix.invert() + \" translate(\" + b.x + \",\" + b.y + \")\" }) }, t = function (d, e, f) { if (\"path\" == d.type) { for (var g, h, i, j, k, m = c(e).toLowerCase().split(\"-\"), n = d.paper, r = f ? \"end\" : \"start\", s = d.node, t = d.attrs, u = t[\"stroke-width\"], v = m.length, w = \"classic\", x = 3, y = 3, z = 5; v--;) switch (m[v]) { case \"block\": case \"classic\": case \"oval\": case \"diamond\": case \"open\": case \"none\": w = m[v]; break; case \"wide\": y = 5; break; case \"narrow\": y = 2; break; case \"long\": x = 5; break; case \"short\": x = 2 } if (\"open\" == w ? (x += 2, y += 2, z += 2, i = 1, j = f ? 4 : 1, k = { fill: \"none\", stroke: t.stroke }) : (j = i = x / 2, k = { fill: t.stroke, stroke: \"none\" }), d._.arrows ? f ? (d._.arrows.endPath && p[d._.arrows.endPath]--, d._.arrows.endMarker && p[d._.arrows.endMarker]--) : (d._.arrows.startPath && p[d._.arrows.startPath]--, d._.arrows.startMarker && p[d._.arrows.startMarker]--) : d._.arrows = {}, \"none\" != w) { var A = \"raphael-marker-\" + w, B = \"raphael-marker-\" + r + w + x + y + \"-obj\" + d.id; a._g.doc.getElementById(A) ? p[A]++ : (n.defs.appendChild(q(q(\"path\"), { \"stroke-linecap\": \"round\", d: o[w], id: A })), p[A] = 1); var C, D = a._g.doc.getElementById(B); D ? (p[B]++, C = D.getElementsByTagName(\"use\")[0]) : (D = q(q(\"marker\"), { id: B, markerHeight: y, markerWidth: x, orient: \"auto\", refX: j, refY: y / 2 }), C = q(q(\"use\"), { \"xlink:href\": \"#\" + A, transform: (f ? \"rotate(180 \" + x / 2 + \" \" + y / 2 + \") \" : l) + \"scale(\" + x / z + \",\" + y / z + \")\", \"stroke-width\": (1 / ((x / z + y / z) / 2)).toFixed(4) }), D.appendChild(C), n.defs.appendChild(D), p[B] = 1), q(C, k); var E = i * (\"diamond\" != w && \"oval\" != w); f ? (g = d._.arrows.startdx * u || 0, h = a.getTotalLength(t.path) - E * u) : (g = E * u, h = a.getTotalLength(t.path) - (d._.arrows.enddx * u || 0)), k = {}, k[\"marker-\" + r] = \"url(#\" + B + \")\", (h || g) && (k.d = a.getSubpath(t.path, g, h)), q(s, k), d._.arrows[r + \"Path\"] = A, d._.arrows[r + \"Marker\"] = B, d._.arrows[r + \"dx\"] = E, d._.arrows[r + \"Type\"] = w, d._.arrows[r + \"String\"] = e } else f ? (g = d._.arrows.startdx * u || 0, h = a.getTotalLength(t.path) - g) : (g = 0, h = a.getTotalLength(t.path) - (d._.arrows.enddx * u || 0)), d._.arrows[r + \"Path\"] && q(s, { d: a.getSubpath(t.path, g, h) }), delete d._.arrows[r + \"Path\"], delete d._.arrows[r + \"Marker\"], delete d._.arrows[r + \"dx\"], delete d._.arrows[r + \"Type\"], delete d._.arrows[r + \"String\"]; for (k in p) if (p[b](k) && !p[k]) { var F = a._g.doc.getElementById(k); F && F.parentNode.removeChild(F) } } }, u = { \"-\": [3, 1], \".\": [1, 1], \"-.\": [3, 1, 1, 1], \"-..\": [3, 1, 1, 1, 1, 1], \". \": [1, 3], \"- \": [4, 3], \"--\": [8, 3], \"- .\": [4, 3, 1, 3], \"--.\": [8, 3, 1, 3], \"--..\": [8, 3, 1, 3, 1, 3] }, v = function (a, b, d) { if (b = u[c(b).toLowerCase()]) { for (var e = a.attrs[\"stroke-width\"] || \"1\", f = { round: e, square: e, butt: 0 }[a.attrs[\"stroke-linecap\"] || d[\"stroke-linecap\"]] || 0, g = [], h = b.length; h--;) g[h] = b[h] * e + (h % 2 ? 1 : -1) * f; q(a.node, { \"stroke-dasharray\": g.join(\",\") }) } else q(a.node, { \"stroke-dasharray\": \"none\" }) }, w = function (d, f) {\r\n var i = d.node, k = d.attrs, m = i.style.visibility; i.style.visibility = \"hidden\"; for (var o in f) if (f[b](o)) {\r\n if (!a._availableAttrs[b](o)) continue; var p = f[o]; switch (k[o] = p, o) {\r\n case \"blur\": d.blur(p); break; case \"title\": var u = i.getElementsByTagName(\"title\"); if (u.length && (u = u[0])) u.firstChild.nodeValue = p; else { u = q(\"title\"); var w = a._g.doc.createTextNode(p); u.appendChild(w), i.appendChild(u) } break; case \"href\": case \"target\": var x = i.parentNode; if (\"a\" != x.tagName.toLowerCase()) { var z = q(\"a\"); x.insertBefore(z, i), z.appendChild(i), x = z } \"target\" == o ? x.setAttributeNS(n, \"show\", \"blank\" == p ? \"new\" : p) : x.setAttributeNS(n, o, p); break; case \"cursor\": i.style.cursor = p; break; case \"transform\": d.transform(p); break; case \"arrow-start\": t(d, p); break; case \"arrow-end\": t(d, p, 1); break; case \"clip-rect\": var A = c(p).split(j); if (4 == A.length) { d.clip && d.clip.parentNode.parentNode.removeChild(d.clip.parentNode); var B = q(\"clipPath\"), C = q(\"rect\"); B.id = a.createUUID(), q(C, { x: A[0], y: A[1], width: A[2], height: A[3] }), B.appendChild(C), d.paper.defs.appendChild(B), q(i, { \"clip-path\": \"url(#\" + B.id + \")\" }), d.clip = C } if (!p) { var D = i.getAttribute(\"clip-path\"); if (D) { var E = a._g.doc.getElementById(D.replace(/(^url\\(#|\\)$)/g, l)); E && E.parentNode.removeChild(E), q(i, { \"clip-path\": l }), delete d.clip } } break; case \"path\": \"path\" == d.type && (q(i, { d: p ? k.path = a._pathToAbsolute(p) : \"M0,0\" }), d._.dirty = 1, d._.arrows && (\"startString\" in d._.arrows && t(d, d._.arrows.startString), \"endString\" in d._.arrows && t(d, d._.arrows.endString, 1))); break; case \"width\": if (i.setAttribute(o, p), d._.dirty = 1, !k.fx) break; o = \"x\", p = k.x; case \"x\": k.fx && (p = -k.x - (k.width || 0)); case \"rx\": if (\"rx\" == o && \"rect\" == d.type) break; case \"cx\": i.setAttribute(o, p), d.pattern && s(d), d._.dirty = 1; break; case \"height\": if (i.setAttribute(o, p), d._.dirty = 1, !k.fy) break; o = \"y\", p = k.y; case \"y\": k.fy && (p = -k.y - (k.height || 0)); case \"ry\": if (\"ry\" == o && \"rect\" == d.type) break; case \"cy\": i.setAttribute(o, p), d.pattern && s(d), d._.dirty = 1; break; case \"r\": \"rect\" == d.type ? q(i, { rx: p, ry: p }) : i.setAttribute(o, p), d._.dirty = 1; break; case \"src\": \"image\" == d.type && i.setAttributeNS(n, \"href\", p); break; case \"stroke-width\": (1 != d._.sx || 1 != d._.sy) && (p /= g(h(d._.sx), h(d._.sy)) || 1), i.setAttribute(o, p), k[\"stroke-dasharray\"] && v(d, k[\"stroke-dasharray\"], f), d._.arrows && (\"startString\" in d._.arrows && t(d, d._.arrows.startString), \"endString\" in d._.arrows && t(d, d._.arrows.endString, 1)); break; case \"stroke-dasharray\": v(d, p, f); break; case \"fill\": var F = c(p).match(a._ISURL); if (F) { B = q(\"pattern\"); var G = q(\"image\"); B.id = a.createUUID(), q(B, { x: 0, y: 0, patternUnits: \"userSpaceOnUse\", height: 1, width: 1 }), q(G, { x: 0, y: 0, \"xlink:href\": F[1] }), B.appendChild(G), function (b) { a._preload(F[1], function () { var a = this.offsetWidth, c = this.offsetHeight; q(b, { width: a, height: c }), q(G, { width: a, height: c }) }) }(B), d.paper.defs.appendChild(B), q(i, { fill: \"url(#\" + B.id + \")\" }), d.pattern = B, d.pattern && s(d); break } var H = a.getRGB(p); if (H.error) { if ((\"circle\" == d.type || \"ellipse\" == d.type || \"r\" != c(p).charAt()) && r(d, p)) { if (\"opacity\" in k || \"fill-opacity\" in k) { var I = a._g.doc.getElementById(i.getAttribute(\"fill\").replace(/^url\\(#|\\)$/g, l)); if (I) { var J = I.getElementsByTagName(\"stop\"); q(J[J.length - 1], { \"stop-opacity\": (\"opacity\" in k ? k.opacity : 1) * (\"fill-opacity\" in k ? k[\"fill-opacity\"] : 1) }) } } k.gradient = p, k.fill = \"none\"; break } } else delete f.gradient, delete k.gradient, !a.is(k.opacity, \"undefined\") && a.is(f.opacity, \"undefined\") && q(i, { opacity: k.opacity }), !a.is(k[\"fill-opacity\"], \"undefined\") && a.is(f[\"fill-opacity\"], \"undefined\") && q(i, { \"fill-opacity\": k[\"fill-opacity\"] }); H[b](\"opacity\") && q(i, { \"fill-opacity\": H.opacity > 1 ? H.opacity / 100 : H.opacity }); case \"stroke\": H = a.getRGB(p), i.setAttribute(o, H.hex), \"stroke\" == o && H[b](\"opacity\") && q(i, { \"stroke-opacity\": H.opacity > 1 ? H.opacity / 100 : H.opacity }), \"stroke\" == o && d._.arrows && (\"startString\" in d._.arrows && t(d, d._.arrows.startString), \"endString\" in d._.arrows && t(d, d._.arrows.endString, 1)); break; case \"gradient\": (\"circle\" == d.type || \"ellipse\" == d.type || \"r\" != c(p).charAt()) && r(d, p);\r\n\r\n break; case \"opacity\": k.gradient && !k[b](\"stroke-opacity\") && q(i, { \"stroke-opacity\": p > 1 ? p / 100 : p }); case \"fill-opacity\": if (k.gradient) { I = a._g.doc.getElementById(i.getAttribute(\"fill\").replace(/^url\\(#|\\)$/g, l)), I && (J = I.getElementsByTagName(\"stop\"), q(J[J.length - 1], { \"stop-opacity\": p })); break } default: \"font-size\" == o && (p = e(p, 10) + \"px\"); var K = o.replace(/(\\-.)/g, function (a) { return a.substring(1).toUpperCase() }); i.style[K] = p, d._.dirty = 1, i.setAttribute(o, p)\r\n }\r\n } y(d, f), i.style.visibility = m\r\n }, x = 1.2, y = function (d, f) { if (\"text\" == d.type && (f[b](\"text\") || f[b](\"font\") || f[b](\"font-size\") || f[b](\"x\") || f[b](\"y\"))) { var g = d.attrs, h = d.node, i = h.firstChild ? e(a._g.doc.defaultView.getComputedStyle(h.firstChild, l).getPropertyValue(\"font-size\"), 10) : 10; if (f[b](\"text\")) { for (g.text = f.text; h.firstChild;) h.removeChild(h.firstChild); for (var j, k = c(f.text).split(\"\\n\"), m = [], n = 0, o = k.length; o > n; n++) j = q(\"tspan\"), n && q(j, { dy: i * x, x: g.x }), j.appendChild(a._g.doc.createTextNode(k[n])), h.appendChild(j), m[n] = j } else for (m = h.getElementsByTagName(\"tspan\"), n = 0, o = m.length; o > n; n++) n ? q(m[n], { dy: i * x, x: g.x }) : q(m[0], { dy: 0 }); q(h, { x: g.x, y: g.y }), d._.dirty = 1; var p = d._getBBox(), r = g.y - (p.y + p.height / 2); r && a.is(r, \"finite\") && q(m[0], { dy: r }) } }, z = function (a) { return a.parentNode && \"a\" === a.parentNode.tagName.toLowerCase() ? a.parentNode : a }, A = function (b, c) { this[0] = this.node = b, b.raphael = !0, this.id = a._oid++, b.raphaelid = this.id, this.matrix = a.matrix(), this.realPath = null, this.paper = c, this.attrs = this.attrs || {}, this._ = { transform: [], sx: 1, sy: 1, deg: 0, dx: 0, dy: 0, dirty: 1 }, !c.bottom && (c.bottom = this), this.prev = c.top, c.top && (c.top.next = this), c.top = this, this.next = null }, B = a.el; A.prototype = B, B.constructor = A, a._engine.path = function (a, b) { var c = q(\"path\"); b.canvas && b.canvas.appendChild(c); var d = new A(c, b); return d.type = \"path\", w(d, { fill: \"none\", stroke: \"#000\", path: a }), d }, B.rotate = function (a, b, e) { if (this.removed) return this; if (a = c(a).split(j), a.length - 1 && (b = d(a[1]), e = d(a[2])), a = d(a[0]), null == e && (b = e), null == b || null == e) { var f = this.getBBox(1); b = f.x + f.width / 2, e = f.y + f.height / 2 } return this.transform(this._.transform.concat([[\"r\", a, b, e]])), this }, B.scale = function (a, b, e, f) { if (this.removed) return this; if (a = c(a).split(j), a.length - 1 && (b = d(a[1]), e = d(a[2]), f = d(a[3])), a = d(a[0]), null == b && (b = a), null == f && (e = f), null == e || null == f) var g = this.getBBox(1); return e = null == e ? g.x + g.width / 2 : e, f = null == f ? g.y + g.height / 2 : f, this.transform(this._.transform.concat([[\"s\", a, b, e, f]])), this }, B.translate = function (a, b) { return this.removed ? this : (a = c(a).split(j), a.length - 1 && (b = d(a[1])), a = d(a[0]) || 0, b = +b || 0, this.transform(this._.transform.concat([[\"t\", a, b]])), this) }, B.transform = function (c) { var d = this._; if (null == c) return d.transform; if (a._extractTransform(this, c), this.clip && q(this.clip, { transform: this.matrix.invert() }), this.pattern && s(this), this.node && q(this.node, { transform: this.matrix }), 1 != d.sx || 1 != d.sy) { var e = this.attrs[b](\"stroke-width\") ? this.attrs[\"stroke-width\"] : 1; this.attr({ \"stroke-width\": e }) } return d.transform = this.matrix.toTransformString(), this }, B.hide = function () { return this.removed || (this.node.style.display = \"none\"), this }, B.show = function () { return this.removed || (this.node.style.display = \"\"), this }, B.remove = function () { var b = z(this.node); if (!this.removed && b.parentNode) { var c = this.paper; c.__set__ && c.__set__.exclude(this), k.unbind(\"raphael.*.*.\" + this.id), this.gradient && c.defs.removeChild(this.gradient), a._tear(this, c), b.parentNode.removeChild(b), this.removeData(); for (var d in this) this[d] = \"function\" == typeof this[d] ? a._removedFactory(d) : null; this.removed = !0 } }, B._getBBox = function () { if (\"none\" == this.node.style.display) { this.show(); var a = !0 } var b, c = !1; this.paper.canvas.parentElement ? b = this.paper.canvas.parentElement.style : this.paper.canvas.parentNode && (b = this.paper.canvas.parentNode.style), b && \"none\" == b.display && (c = !0, b.display = \"\"); var d = {}; try { d = this.node.getBBox() } catch (e) { d = { x: this.node.clientLeft, y: this.node.clientTop, width: this.node.clientWidth, height: this.node.clientHeight } } finally { d = d || {}, c && (b.display = \"none\") } return a && this.hide(), d }, B.attr = function (c, d) { if (this.removed) return this; if (null == c) { var e = {}; for (var f in this.attrs) this.attrs[b](f) && (e[f] = this.attrs[f]); return e.gradient && \"none\" == e.fill && (e.fill = e.gradient) && delete e.gradient, e.transform = this._.transform, e } if (null == d && a.is(c, \"string\")) { if (\"fill\" == c && \"none\" == this.attrs.fill && this.attrs.gradient) return this.attrs.gradient; if (\"transform\" == c) return this._.transform; for (var g = c.split(j), h = {}, i = 0, l = g.length; l > i; i++) c = g[i], c in this.attrs ? h[c] = this.attrs[c] : a.is(this.paper.customAttributes[c], \"function\") ? h[c] = this.paper.customAttributes[c].def : h[c] = a._availableAttrs[c]; return l - 1 ? h : h[g[0]] } if (null == d && a.is(c, \"array\")) { for (h = {}, i = 0, l = c.length; l > i; i++) h[c[i]] = this.attr(c[i]); return h } if (null != d) { var m = {}; m[c] = d } else null != c && a.is(c, \"object\") && (m = c); for (var n in m) k(\"raphael.attr.\" + n + \".\" + this.id, this, m[n]); for (n in this.paper.customAttributes) if (this.paper.customAttributes[b](n) && m[b](n) && a.is(this.paper.customAttributes[n], \"function\")) { var o = this.paper.customAttributes[n].apply(this, [].concat(m[n])); this.attrs[n] = m[n]; for (var p in o) o[b](p) && (m[p] = o[p]) } return w(this, m), this }, B.toFront = function () { if (this.removed) return this; var b = z(this.node); b.parentNode.appendChild(b); var c = this.paper; return c.top != this && a._tofront(this, c), this }, B.toBack = function () { if (this.removed) return this; var b = z(this.node), c = b.parentNode; c.insertBefore(b, c.firstChild), a._toback(this, this.paper); this.paper; return this }, B.insertAfter = function (b) { if (this.removed || !b) return this; var c = z(this.node), d = z(b.node || b[b.length - 1].node); return d.nextSibling ? d.parentNode.insertBefore(c, d.nextSibling) : d.parentNode.appendChild(c), a._insertafter(this, b, this.paper), this }, B.insertBefore = function (b) { if (this.removed || !b) return this; var c = z(this.node), d = z(b.node || b[0].node); return d.parentNode.insertBefore(c, d), a._insertbefore(this, b, this.paper), this }, B.blur = function (b) { var c = this; if (0 !== +b) { var d = q(\"filter\"), e = q(\"feGaussianBlur\"); c.attrs.blur = b, d.id = a.createUUID(), q(e, { stdDeviation: +b || 1.5 }), d.appendChild(e), c.paper.defs.appendChild(d), c._blur = d, q(c.node, { filter: \"url(#\" + d.id + \")\" }) } else c._blur && (c._blur.parentNode.removeChild(c._blur), delete c._blur, delete c.attrs.blur), c.node.removeAttribute(\"filter\"); return c }, a._engine.circle = function (a, b, c, d) { var e = q(\"circle\"); a.canvas && a.canvas.appendChild(e); var f = new A(e, a); return f.attrs = { cx: b, cy: c, r: d, fill: \"none\", stroke: \"#000\" }, f.type = \"circle\", q(e, f.attrs), f }, a._engine.rect = function (a, b, c, d, e, f) { var g = q(\"rect\"); a.canvas && a.canvas.appendChild(g); var h = new A(g, a); return h.attrs = { x: b, y: c, width: d, height: e, rx: f || 0, ry: f || 0, fill: \"none\", stroke: \"#000\" }, h.type = \"rect\", q(g, h.attrs), h }, a._engine.ellipse = function (a, b, c, d, e) { var f = q(\"ellipse\"); a.canvas && a.canvas.appendChild(f); var g = new A(f, a); return g.attrs = { cx: b, cy: c, rx: d, ry: e, fill: \"none\", stroke: \"#000\" }, g.type = \"ellipse\", q(f, g.attrs), g }, a._engine.image = function (a, b, c, d, e, f) { var g = q(\"image\"); q(g, { x: c, y: d, width: e, height: f, preserveAspectRatio: \"none\" }), g.setAttributeNS(n, \"href\", b), a.canvas && a.canvas.appendChild(g); var h = new A(g, a); return h.attrs = { x: c, y: d, width: e, height: f, src: b }, h.type = \"image\", h }, a._engine.text = function (b, c, d, e) { var f = q(\"text\"); b.canvas && b.canvas.appendChild(f); var g = new A(f, b); return g.attrs = { x: c, y: d, \"text-anchor\": \"middle\", text: e, \"font-family\": a._availableAttrs[\"font-family\"], \"font-size\": a._availableAttrs[\"font-size\"], stroke: \"none\", fill: \"#000\" }, g.type = \"text\", w(g, g.attrs), g }, a._engine.setSize = function (a, b) { return this.width = a || this.width, this.height = b || this.height, this.canvas.setAttribute(\"width\", this.width), this.canvas.setAttribute(\"height\", this.height), this._viewBox && this.setViewBox.apply(this, this._viewBox), this }, a._engine.create = function () { var b = a._getContainer.apply(0, arguments), c = b && b.container, d = b.x, e = b.y, f = b.width, g = b.height; if (!c) throw new Error(\"SVG container not found.\"); var h, i = q(\"svg\"), j = \"overflow:hidden;\"; return d = d || 0, e = e || 0, f = f || 512, g = g || 342, q(i, { height: g, version: 1.1, width: f, xmlns: \"http://www.w3.org/2000/svg\", \"xmlns:xlink\": \"http://www.w3.org/1999/xlink\" }), 1 == c ? (i.style.cssText = j + \"position:absolute;left:\" + d + \"px;top:\" + e + \"px\", a._g.doc.body.appendChild(i), h = 1) : (i.style.cssText = j + \"position:relative\", c.firstChild ? c.insertBefore(i, c.firstChild) : c.appendChild(i)), c = new a._Paper, c.width = f, c.height = g, c.canvas = i, c.clear(), c._left = c._top = 0, h && (c.renderfix = function () { }), c.renderfix(), c }, a._engine.setViewBox = function (a, b, c, d, e) { k(\"raphael.setViewBox\", this, this._viewBox, [a, b, c, d, e]); var f, h, i = this.getSize(), j = g(c / i.width, d / i.height), l = this.top, n = e ? \"xMidYMid meet\" : \"xMinYMin\"; for (null == a ? (this._vbSize && (j = 1), delete this._vbSize, f = \"0 0 \" + this.width + m + this.height) : (this._vbSize = j, f = a + m + b + m + c + m + d), q(this.canvas, { viewBox: f, preserveAspectRatio: n }) ; j && l;) h = \"stroke-width\" in l.attrs ? l.attrs[\"stroke-width\"] : 1, l.attr({ \"stroke-width\": h }), l._.dirty = 1, l._.dirtyT = 1, l = l.prev; return this._viewBox = [a, b, c, d, !!e], this }, a.prototype.renderfix = function () { var a, b = this.canvas, c = b.style; try { a = b.getScreenCTM() || b.createSVGMatrix() } catch (d) { a = b.createSVGMatrix() } var e = -a.e % 1, f = -a.f % 1; (e || f) && (e && (this._left = (this._left + e) % 1, c.left = this._left + \"px\"), f && (this._top = (this._top + f) % 1, c.top = this._top + \"px\")) }, a.prototype.clear = function () { a.eve(\"raphael.clear\", this); for (var b = this.canvas; b.firstChild;) b.removeChild(b.firstChild); this.bottom = this.top = null, (this.desc = q(\"desc\")).appendChild(a._g.doc.createTextNode(\"Created with Raphaël \" + a.version)), b.appendChild(this.desc), b.appendChild(this.defs = q(\"defs\")) }, a.prototype.remove = function () { k(\"raphael.remove\", this), this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas); for (var b in this) this[b] = \"function\" == typeof this[b] ? a._removedFactory(b) : null }; var C = a.st; for (var D in B) B[b](D) && !C[b](D) && (C[D] = function (a) { return function () { var b = arguments; return this.forEach(function (c) { c[a].apply(c, b) }) } }(D))\r\n }\r\n}), function (a, b) { \"function\" == typeof define && define.amd ? define(\"raphael.vml\", [\"raphael.core\"], function (a) { return b(a) }) : b(\"object\" == typeof exports ? require(\"./raphael.core\") : a.Raphael) }(this, function (a) { if (!a || a.vml) { var b = \"hasOwnProperty\", c = String, d = parseFloat, e = Math, f = e.round, g = e.max, h = e.min, i = e.abs, j = \"fill\", k = /[, ]+/, l = a.eve, m = \" progid:DXImageTransform.Microsoft\", n = \" \", o = \"\", p = { M: \"m\", L: \"l\", C: \"c\", Z: \"x\", m: \"t\", l: \"r\", c: \"v\", z: \"x\" }, q = /([clmz]),?([^clmz]*)/gi, r = / progid:\\S+Blur\\([^\\)]+\\)/g, s = /-?[^,\\s-]+/g, t = \"position:absolute;left:0;top:0;width:1px;height:1px;behavior:url(#default#VML)\", u = 21600, v = { path: 1, rect: 1, image: 1 }, w = { circle: 1, ellipse: 1 }, x = function (b) { var d = /[ahqstv]/gi, e = a._pathToAbsolute; if (c(b).match(d) && (e = a._path2curve), d = /[clmz]/g, e == a._pathToAbsolute && !c(b).match(d)) { var g = c(b).replace(q, function (a, b, c) { var d = [], e = \"m\" == b.toLowerCase(), g = p[b]; return c.replace(s, function (a) { e && 2 == d.length && (g += d + p[\"m\" == b ? \"l\" : \"L\"], d = []), d.push(f(a * u)) }), g + d }); return g } var h, i, j = e(b); g = []; for (var k = 0, l = j.length; l > k; k++) { h = j[k], i = j[k][0].toLowerCase(), \"z\" == i && (i = \"x\"); for (var m = 1, r = h.length; r > m; m++) i += f(h[m] * u) + (m != r - 1 ? \",\" : o); g.push(i) } return g.join(n) }, y = function (b, c, d) { var e = a.matrix(); return e.rotate(-b, .5, .5), { dx: e.x(c, d), dy: e.y(c, d) } }, z = function (a, b, c, d, e, f) { var g = a._, h = a.matrix, k = g.fillpos, l = a.node, m = l.style, o = 1, p = \"\", q = u / b, r = u / c; if (m.visibility = \"hidden\", b && c) { if (l.coordsize = i(q) + n + i(r), m.rotation = f * (0 > b * c ? -1 : 1), f) { var s = y(f, d, e); d = s.dx, e = s.dy } if (0 > b && (p += \"x\"), 0 > c && (p += \" y\") && (o = -1), m.flip = p, l.coordorigin = d * -q + n + e * -r, k || g.fillsize) { var t = l.getElementsByTagName(j); t = t && t[0], l.removeChild(t), k && (s = y(f, h.x(k[0], k[1]), h.y(k[0], k[1])), t.position = s.dx * o + n + s.dy * o), g.fillsize && (t.size = g.fillsize[0] * i(b) + n + g.fillsize[1] * i(c)), l.appendChild(t) } m.visibility = \"visible\" } }; a.toString = function () { return \"Your browser doesn’t support SVG. Falling down to VML.\\nYou are running Raphaël \" + this.version }; var A = function (a, b, d) { for (var e = c(b).toLowerCase().split(\"-\"), f = d ? \"end\" : \"start\", g = e.length, h = \"classic\", i = \"medium\", j = \"medium\"; g--;) switch (e[g]) { case \"block\": case \"classic\": case \"oval\": case \"diamond\": case \"open\": case \"none\": h = e[g]; break; case \"wide\": case \"narrow\": j = e[g]; break; case \"long\": case \"short\": i = e[g] } var k = a.node.getElementsByTagName(\"stroke\")[0]; k[f + \"arrow\"] = h, k[f + \"arrowlength\"] = i, k[f + \"arrowwidth\"] = j }, B = function (e, i) { e.attrs = e.attrs || {}; var l = e.node, m = e.attrs, p = l.style, q = v[e.type] && (i.x != m.x || i.y != m.y || i.width != m.width || i.height != m.height || i.cx != m.cx || i.cy != m.cy || i.rx != m.rx || i.ry != m.ry || i.r != m.r), r = w[e.type] && (m.cx != i.cx || m.cy != i.cy || m.r != i.r || m.rx != i.rx || m.ry != i.ry), s = e; for (var t in i) i[b](t) && (m[t] = i[t]); if (q && (m.path = a._getPath[e.type](e), e._.dirty = 1), i.href && (l.href = i.href), i.title && (l.title = i.title), i.target && (l.target = i.target), i.cursor && (p.cursor = i.cursor), \"blur\" in i && e.blur(i.blur), (i.path && \"path\" == e.type || q) && (l.path = x(~c(m.path).toLowerCase().indexOf(\"r\") ? a._pathToAbsolute(m.path) : m.path), e._.dirty = 1, \"image\" == e.type && (e._.fillpos = [m.x, m.y], e._.fillsize = [m.width, m.height], z(e, 1, 1, 0, 0, 0))), \"transform\" in i && e.transform(i.transform), r) { var y = +m.cx, B = +m.cy, D = +m.rx || +m.r || 0, E = +m.ry || +m.r || 0; l.path = a.format(\"ar{0},{1},{2},{3},{4},{1},{4},{1}x\", f((y - D) * u), f((B - E) * u), f((y + D) * u), f((B + E) * u), f(y * u)), e._.dirty = 1 } if (\"clip-rect\" in i) { var G = c(i[\"clip-rect\"]).split(k); if (4 == G.length) { G[2] = +G[2] + +G[0], G[3] = +G[3] + +G[1]; var H = l.clipRect || a._g.doc.createElement(\"div\"), I = H.style; I.clip = a.format(\"rect({1}px {2}px {3}px {0}px)\", G), l.clipRect || (I.position = \"absolute\", I.top = 0, I.left = 0, I.width = e.paper.width + \"px\", I.height = e.paper.height + \"px\", l.parentNode.insertBefore(H, l), H.appendChild(l), l.clipRect = H) } i[\"clip-rect\"] || l.clipRect && (l.clipRect.style.clip = \"auto\") } if (e.textpath) { var J = e.textpath.style; i.font && (J.font = i.font), i[\"font-family\"] && (J.fontFamily = '\"' + i[\"font-family\"].split(\",\")[0].replace(/^['\"]+|['\"]+$/g, o) + '\"'), i[\"font-size\"] && (J.fontSize = i[\"font-size\"]), i[\"font-weight\"] && (J.fontWeight = i[\"font-weight\"]), i[\"font-style\"] && (J.fontStyle = i[\"font-style\"]) } if (\"arrow-start\" in i && A(s, i[\"arrow-start\"]), \"arrow-end\" in i && A(s, i[\"arrow-end\"], 1), null != i.opacity || null != i[\"stroke-width\"] || null != i.fill || null != i.src || null != i.stroke || null != i[\"stroke-width\"] || null != i[\"stroke-opacity\"] || null != i[\"fill-opacity\"] || null != i[\"stroke-dasharray\"] || null != i[\"stroke-miterlimit\"] || null != i[\"stroke-linejoin\"] || null != i[\"stroke-linecap\"]) { var K = l.getElementsByTagName(j), L = !1; if (K = K && K[0], !K && (L = K = F(j)), \"image\" == e.type && i.src && (K.src = i.src), i.fill && (K.on = !0), (null == K.on || \"none\" == i.fill || null === i.fill) && (K.on = !1), K.on && i.fill) { var M = c(i.fill).match(a._ISURL); if (M) { K.parentNode == l && l.removeChild(K), K.rotate = !0, K.src = M[1], K.type = \"tile\"; var N = e.getBBox(1); K.position = N.x + n + N.y, e._.fillpos = [N.x, N.y], a._preload(M[1], function () { e._.fillsize = [this.offsetWidth, this.offsetHeight] }) } else K.color = a.getRGB(i.fill).hex, K.src = o, K.type = \"solid\", a.getRGB(i.fill).error && (s.type in { circle: 1, ellipse: 1 } || \"r\" != c(i.fill).charAt()) && C(s, i.fill, K) && (m.fill = \"none\", m.gradient = i.fill, K.rotate = !1) } if (\"fill-opacity\" in i || \"opacity\" in i) { var O = ((+m[\"fill-opacity\"] + 1 || 2) - 1) * ((+m.opacity + 1 || 2) - 1) * ((+a.getRGB(i.fill).o + 1 || 2) - 1); O = h(g(O, 0), 1), K.opacity = O, K.src && (K.color = \"none\") } l.appendChild(K); var P = l.getElementsByTagName(\"stroke\") && l.getElementsByTagName(\"stroke\")[0], Q = !1; !P && (Q = P = F(\"stroke\")), (i.stroke && \"none\" != i.stroke || i[\"stroke-width\"] || null != i[\"stroke-opacity\"] || i[\"stroke-dasharray\"] || i[\"stroke-miterlimit\"] || i[\"stroke-linejoin\"] || i[\"stroke-linecap\"]) && (P.on = !0), (\"none\" == i.stroke || null === i.stroke || null == P.on || 0 == i.stroke || 0 == i[\"stroke-width\"]) && (P.on = !1); var R = a.getRGB(i.stroke); P.on && i.stroke && (P.color = R.hex), O = ((+m[\"stroke-opacity\"] + 1 || 2) - 1) * ((+m.opacity + 1 || 2) - 1) * ((+R.o + 1 || 2) - 1); var S = .75 * (d(i[\"stroke-width\"]) || 1); if (O = h(g(O, 0), 1), null == i[\"stroke-width\"] && (S = m[\"stroke-width\"]), i[\"stroke-width\"] && (P.weight = S), S && 1 > S && (O *= S) && (P.weight = 1), P.opacity = O, i[\"stroke-linejoin\"] && (P.joinstyle = i[\"stroke-linejoin\"] || \"miter\"), P.miterlimit = i[\"stroke-miterlimit\"] || 8, i[\"stroke-linecap\"] && (P.endcap = \"butt\" == i[\"stroke-linecap\"] ? \"flat\" : \"square\" == i[\"stroke-linecap\"] ? \"square\" : \"round\"), \"stroke-dasharray\" in i) { var T = { \"-\": \"shortdash\", \".\": \"shortdot\", \"-.\": \"shortdashdot\", \"-..\": \"shortdashdotdot\", \". \": \"dot\", \"- \": \"dash\", \"--\": \"longdash\", \"- .\": \"dashdot\", \"--.\": \"longdashdot\", \"--..\": \"longdashdotdot\" }; P.dashstyle = T[b](i[\"stroke-dasharray\"]) ? T[i[\"stroke-dasharray\"]] : o } Q && l.appendChild(P) } if (\"text\" == s.type) { s.paper.canvas.style.display = o; var U = s.paper.span, V = 100, W = m.font && m.font.match(/\\d+(?:\\.\\d*)?(?=px)/); p = U.style, m.font && (p.font = m.font), m[\"font-family\"] && (p.fontFamily = m[\"font-family\"]), m[\"font-weight\"] && (p.fontWeight = m[\"font-weight\"]), m[\"font-style\"] && (p.fontStyle = m[\"font-style\"]), W = d(m[\"font-size\"] || W && W[0]) || 10, p.fontSize = W * V + \"px\", s.textpath.string && (U.innerHTML = c(s.textpath.string).replace(/</g, \"<\").replace(/&/g, \"&\").replace(/\\n/g, \"<br>\")); var X = U.getBoundingClientRect(); s.W = m.w = (X.right - X.left) / V, s.H = m.h = (X.bottom - X.top) / V, s.X = m.x, s.Y = m.y + s.H / 2, (\"x\" in i || \"y\" in i) && (s.path.v = a.format(\"m{0},{1}l{2},{1}\", f(m.x * u), f(m.y * u), f(m.x * u) + 1)); for (var Y = [\"x\", \"y\", \"text\", \"font\", \"font-family\", \"font-weight\", \"font-style\", \"font-size\"], Z = 0, $ = Y.length; $ > Z; Z++) if (Y[Z] in i) { s._.dirty = 1; break } switch (m[\"text-anchor\"]) { case \"start\": s.textpath.style[\"v-text-align\"] = \"left\", s.bbx = s.W / 2; break; case \"end\": s.textpath.style[\"v-text-align\"] = \"right\", s.bbx = -s.W / 2; break; default: s.textpath.style[\"v-text-align\"] = \"center\", s.bbx = 0 } s.textpath.style[\"v-text-kern\"] = !0 } }, C = function (b, f, g) { b.attrs = b.attrs || {}; var h = (b.attrs, Math.pow), i = \"linear\", j = \".5 .5\"; if (b.attrs.gradient = f, f = c(f).replace(a._radial_gradient, function (a, b, c) { return i = \"radial\", b && c && (b = d(b), c = d(c), h(b - .5, 2) + h(c - .5, 2) > .25 && (c = e.sqrt(.25 - h(b - .5, 2)) * (2 * (c > .5) - 1) + .5), j = b + n + c), o }), f = f.split(/\\s*\\-\\s*/), \"linear\" == i) { var k = f.shift(); if (k = -d(k), isNaN(k)) return null } var l = a._parseDots(f); if (!l) return null; if (b = b.shape || b.node, l.length) { b.removeChild(g), g.on = !0, g.method = \"none\", g.color = l[0].color, g.color2 = l[l.length - 1].color; for (var m = [], p = 0, q = l.length; q > p; p++) l[p].offset && m.push(l[p].offset + n + l[p].color); g.colors = m.length ? m.join() : \"0% \" + g.color, \"radial\" == i ? (g.type = \"gradientTitle\", g.focus = \"100%\", g.focussize = \"0 0\", g.focusposition = j, g.angle = 0) : (g.type = \"gradient\", g.angle = (270 - k) % 360), b.appendChild(g) } return 1 }, D = function (b, c) { this[0] = this.node = b, b.raphael = !0, this.id = a._oid++, b.raphaelid = this.id, this.X = 0, this.Y = 0, this.attrs = {}, this.paper = c, this.matrix = a.matrix(), this._ = { transform: [], sx: 1, sy: 1, dx: 0, dy: 0, deg: 0, dirty: 1, dirtyT: 1 }, !c.bottom && (c.bottom = this), this.prev = c.top, c.top && (c.top.next = this), c.top = this, this.next = null }, E = a.el; D.prototype = E, E.constructor = D, E.transform = function (b) { if (null == b) return this._.transform; var d, e = this.paper._viewBoxShift, f = e ? \"s\" + [e.scale, e.scale] + \"-1-1t\" + [e.dx, e.dy] : o; e && (d = b = c(b).replace(/\\.{3}|\\u2026/g, this._.transform || o)), a._extractTransform(this, f + b); var g, h = this.matrix.clone(), i = this.skew, j = this.node, k = ~c(this.attrs.fill).indexOf(\"-\"), l = !c(this.attrs.fill).indexOf(\"url(\"); if (h.translate(1, 1), l || k || \"image\" == this.type) if (i.matrix = \"1 0 0 1\", i.offset = \"0 0\", g = h.split(), k && g.noRotation || !g.isSimple) { j.style.filter = h.toFilter(); var m = this.getBBox(), p = this.getBBox(1), q = m.x - p.x, r = m.y - p.y; j.coordorigin = q * -u + n + r * -u, z(this, 1, 1, q, r, 0) } else j.style.filter = o, z(this, g.scalex, g.scaley, g.dx, g.dy, g.rotate); else j.style.filter = o, i.matrix = c(h), i.offset = h.offset(); return null !== d && (this._.transform = d, a._extractTransform(this, d)), this }, E.rotate = function (a, b, e) { if (this.removed) return this; if (null != a) { if (a = c(a).split(k), a.length - 1 && (b = d(a[1]), e = d(a[2])), a = d(a[0]), null == e && (b = e), null == b || null == e) { var f = this.getBBox(1); b = f.x + f.width / 2, e = f.y + f.height / 2 } return this._.dirtyT = 1, this.transform(this._.transform.concat([[\"r\", a, b, e]])), this } }, E.translate = function (a, b) { return this.removed ? this : (a = c(a).split(k), a.length - 1 && (b = d(a[1])), a = d(a[0]) || 0, b = +b || 0, this._.bbox && (this._.bbox.x += a, this._.bbox.y += b), this.transform(this._.transform.concat([[\"t\", a, b]])), this) }, E.scale = function (a, b, e, f) { if (this.removed) return this; if (a = c(a).split(k), a.length - 1 && (b = d(a[1]), e = d(a[2]), f = d(a[3]), isNaN(e) && (e = null), isNaN(f) && (f = null)), a = d(a[0]), null == b && (b = a), null == f && (e = f), null == e || null == f) var g = this.getBBox(1); return e = null == e ? g.x + g.width / 2 : e, f = null == f ? g.y + g.height / 2 : f, this.transform(this._.transform.concat([[\"s\", a, b, e, f]])), this._.dirtyT = 1, this }, E.hide = function () { return !this.removed && (this.node.style.display = \"none\"), this }, E.show = function () { return !this.removed && (this.node.style.display = o), this }, E.auxGetBBox = a.el.getBBox, E.getBBox = function () { var a = this.auxGetBBox(); if (this.paper && this.paper._viewBoxShift) { var b = {}, c = 1 / this.paper._viewBoxShift.scale; return b.x = a.x - this.paper._viewBoxShift.dx, b.x *= c, b.y = a.y - this.paper._viewBoxShift.dy, b.y *= c, b.width = a.width * c, b.height = a.height * c, b.x2 = b.x + b.width, b.y2 = b.y + b.height, b } return a }, E._getBBox = function () { return this.removed ? {} : { x: this.X + (this.bbx || 0) - this.W / 2, y: this.Y - this.H, width: this.W, height: this.H } }, E.remove = function () { if (!this.removed && this.node.parentNode) { this.paper.__set__ && this.paper.__set__.exclude(this), a.eve.unbind(\"raphael.*.*.\" + this.id), a._tear(this, this.paper), this.node.parentNode.removeChild(this.node), this.shape && this.shape.parentNode.removeChild(this.shape); for (var b in this) this[b] = \"function\" == typeof this[b] ? a._removedFactory(b) : null; this.removed = !0 } }, E.attr = function (c, d) { if (this.removed) return this; if (null == c) { var e = {}; for (var f in this.attrs) this.attrs[b](f) && (e[f] = this.attrs[f]); return e.gradient && \"none\" == e.fill && (e.fill = e.gradient) && delete e.gradient, e.transform = this._.transform, e } if (null == d && a.is(c, \"string\")) { if (c == j && \"none\" == this.attrs.fill && this.attrs.gradient) return this.attrs.gradient; for (var g = c.split(k), h = {}, i = 0, m = g.length; m > i; i++) c = g[i], c in this.attrs ? h[c] = this.attrs[c] : a.is(this.paper.customAttributes[c], \"function\") ? h[c] = this.paper.customAttributes[c].def : h[c] = a._availableAttrs[c]; return m - 1 ? h : h[g[0]] } if (this.attrs && null == d && a.is(c, \"array\")) { for (h = {}, i = 0, m = c.length; m > i; i++) h[c[i]] = this.attr(c[i]); return h } var n; null != d && (n = {}, n[c] = d), null == d && a.is(c, \"object\") && (n = c); for (var o in n) l(\"raphael.attr.\" + o + \".\" + this.id, this, n[o]); if (n) { for (o in this.paper.customAttributes) if (this.paper.customAttributes[b](o) && n[b](o) && a.is(this.paper.customAttributes[o], \"function\")) { var p = this.paper.customAttributes[o].apply(this, [].concat(n[o])); this.attrs[o] = n[o]; for (var q in p) p[b](q) && (n[q] = p[q]) } n.text && \"text\" == this.type && (this.textpath.string = n.text), B(this, n) } return this }, E.toFront = function () { return !this.removed && this.node.parentNode.appendChild(this.node), this.paper && this.paper.top != this && a._tofront(this, this.paper), this }, E.toBack = function () { return this.removed ? this : (this.node.parentNode.firstChild != this.node && (this.node.parentNode.insertBefore(this.node, this.node.parentNode.firstChild), a._toback(this, this.paper)), this) }, E.insertAfter = function (b) { return this.removed ? this : (b.constructor == a.st.constructor && (b = b[b.length - 1]), b.node.nextSibling ? b.node.parentNode.insertBefore(this.node, b.node.nextSibling) : b.node.parentNode.appendChild(this.node), a._insertafter(this, b, this.paper), this) }, E.insertBefore = function (b) { return this.removed ? this : (b.constructor == a.st.constructor && (b = b[0]), b.node.parentNode.insertBefore(this.node, b.node), a._insertbefore(this, b, this.paper), this) }, E.blur = function (b) { var c = this.node.runtimeStyle, d = c.filter; return d = d.replace(r, o), 0 !== +b ? (this.attrs.blur = b, c.filter = d + n + m + \".Blur(pixelradius=\" + (+b || 1.5) + \")\", c.margin = a.format(\"-{0}px 0 0 -{0}px\", f(+b || 1.5))) : (c.filter = d, c.margin = 0, delete this.attrs.blur), this }, a._engine.path = function (a, b) { var c = F(\"shape\"); c.style.cssText = t, c.coordsize = u + n + u, c.coordorigin = b.coordorigin; var d = new D(c, b), e = { fill: \"none\", stroke: \"#000\" }; a && (e.path = a), d.type = \"path\", d.path = [], d.Path = o, B(d, e), b.canvas.appendChild(c); var f = F(\"skew\"); return f.on = !0, c.appendChild(f), d.skew = f, d.transform(o), d }, a._engine.rect = function (b, c, d, e, f, g) { var h = a._rectPath(c, d, e, f, g), i = b.path(h), j = i.attrs; return i.X = j.x = c, i.Y = j.y = d, i.W = j.width = e, i.H = j.height = f, j.r = g, j.path = h, i.type = \"rect\", i }, a._engine.ellipse = function (a, b, c, d, e) { { var f = a.path(); f.attrs } return f.X = b - d, f.Y = c - e, f.W = 2 * d, f.H = 2 * e, f.type = \"ellipse\", B(f, { cx: b, cy: c, rx: d, ry: e }), f }, a._engine.circle = function (a, b, c, d) { { var e = a.path(); e.attrs } return e.X = b - d, e.Y = c - d, e.W = e.H = 2 * d, e.type = \"circle\", B(e, { cx: b, cy: c, r: d }), e }, a._engine.image = function (b, c, d, e, f, g) { var h = a._rectPath(d, e, f, g), i = b.path(h).attr({ stroke: \"none\" }), k = i.attrs, l = i.node, m = l.getElementsByTagName(j)[0]; return k.src = c, i.X = k.x = d, i.Y = k.y = e, i.W = k.width = f, i.H = k.height = g, k.path = h, i.type = \"image\", m.parentNode == l && l.removeChild(m), m.rotate = !0, m.src = c, m.type = \"tile\", i._.fillpos = [d, e], i._.fillsize = [f, g], l.appendChild(m), z(i, 1, 1, 0, 0, 0), i }, a._engine.text = function (b, d, e, g) { var h = F(\"shape\"), i = F(\"path\"), j = F(\"textpath\"); d = d || 0, e = e || 0, g = g || \"\", i.v = a.format(\"m{0},{1}l{2},{1}\", f(d * u), f(e * u), f(d * u) + 1), i.textpathok = !0, j.string = c(g), j.on = !0, h.style.cssText = t, h.coordsize = u + n + u, h.coordorigin = \"0 0\"; var k = new D(h, b), l = { fill: \"#000\", stroke: \"none\", font: a._availableAttrs.font, text: g }; k.shape = h, k.path = i, k.textpath = j, k.type = \"text\", k.attrs.text = c(g), k.attrs.x = d, k.attrs.y = e, k.attrs.w = 1, k.attrs.h = 1, B(k, l), h.appendChild(j), h.appendChild(i), b.canvas.appendChild(h); var m = F(\"skew\"); return m.on = !0, h.appendChild(m), k.skew = m, k.transform(o), k }, a._engine.setSize = function (b, c) { var d = this.canvas.style; return this.width = b, this.height = c, b == +b && (b += \"px\"), c == +c && (c += \"px\"), d.width = b, d.height = c, d.clip = \"rect(0 \" + b + \" \" + c + \" 0)\", this._viewBox && a._engine.setViewBox.apply(this, this._viewBox), this }, a._engine.setViewBox = function (b, c, d, e, f) { a.eve(\"raphael.setViewBox\", this, this._viewBox, [b, c, d, e, f]); var g, h, i = this.getSize(), j = i.width, k = i.height; return f && (g = k / e, h = j / d, j > d * g && (b -= (j - d * g) / 2 / g), k > e * h && (c -= (k - e * h) / 2 / h)), this._viewBox = [b, c, d, e, !!f], this._viewBoxShift = { dx: -b, dy: -c, scale: i }, this.forEach(function (a) { a.transform(\"...\") }), this }; var F; a._engine.initWin = function (a) { var b = a.document; b.styleSheets.length < 31 ? b.createStyleSheet().addRule(\".rvml\", \"behavior:url(#default#VML)\") : b.styleSheets[0].addRule(\".rvml\", \"behavior:url(#default#VML)\"); try { !b.namespaces.rvml && b.namespaces.add(\"rvml\", \"urn:schemas-microsoft-com:vml\"), F = function (a) { return b.createElement(\"<rvml:\" + a + ' class=\"rvml\">') } } catch (c) { F = function (a) { return b.createElement(\"<\" + a + ' xmlns=\"urn:schemas-microsoft.com:vml\" class=\"rvml\">') } } }, a._engine.initWin(a._g.win), a._engine.create = function () { var b = a._getContainer.apply(0, arguments), c = b.container, d = b.height, e = b.width, f = b.x, g = b.y; if (!c) throw new Error(\"VML container not found.\"); var h = new a._Paper, i = h.canvas = a._g.doc.createElement(\"div\"), j = i.style; return f = f || 0, g = g || 0, e = e || 512, d = d || 342, h.width = e, h.height = d, e == +e && (e += \"px\"), d == +d && (d += \"px\"), h.coordsize = 1e3 * u + n + 1e3 * u, h.coordorigin = \"0 0\", h.span = a._g.doc.createElement(\"span\"), h.span.style.cssText = \"position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;\", i.appendChild(h.span), j.cssText = a.format(\"top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden\", e, d), 1 == c ? (a._g.doc.body.appendChild(i), j.left = f + \"px\", j.top = g + \"px\", j.position = \"absolute\") : c.firstChild ? c.insertBefore(i, c.firstChild) : c.appendChild(i), h.renderfix = function () { }, h }, a.prototype.clear = function () { a.eve(\"raphael.clear\", this), this.canvas.innerHTML = o, this.span = a._g.doc.createElement(\"span\"), this.span.style.cssText = \"position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;\", this.canvas.appendChild(this.span), this.bottom = this.top = null }, a.prototype.remove = function () { a.eve(\"raphael.remove\", this), this.canvas.parentNode.removeChild(this.canvas); for (var b in this) this[b] = \"function\" == typeof this[b] ? a._removedFactory(b) : null; return !0 }; var G = a.st; for (var H in E) E[b](H) && !G[b](H) && (G[H] = function (a) { return function () { var b = arguments; return this.forEach(function (c) { c[a].apply(c, b) }) } }(H)) } }), function (a, b) { if (\"function\" == typeof define && define.amd) define(\"raphael\", [\"raphael.core\", \"raphael.svg\", \"raphael.vml\"], function (c) { return a.Raphael = b(c) }); else if (\"object\" == typeof exports) { var c = require(\"raphael.core\"); require(\"raphael.svg\"), require(\"raphael.vml\"), module.exports = b(c) } else a.Raphael = b(a.Raphael) }(this, function (a) { return a.ninja() });","// https://tc39.github.io/ecma262/#sec-array.prototype.find\r\nif (!Array.prototype.find) {\r\n Object.defineProperty(Array.prototype, 'find', {\r\n value: function (predicate) {\r\n // 1. Let O be ? ToObject(this value).\r\n if (this == null) {\r\n throw new TypeError('\"this\" is null or not defined');\r\n }\r\n\r\n var o = Object(this);\r\n\r\n // 2. Let len be ? ToLength(? Get(O, \"length\")).\r\n var len = o.length >>> 0;\r\n\r\n // 3. If IsCallable(predicate) is false, throw a TypeError exception.\r\n if (typeof predicate !== 'function') {\r\n throw new TypeError('predicate must be a function');\r\n }\r\n\r\n // 4. If thisArg was supplied, let T be thisArg; else let T be undefined.\r\n var thisArg = arguments[1];\r\n\r\n // 5. Let k be 0.\r\n var k = 0;\r\n\r\n // 6. Repeat, while k < len\r\n while (k < len) {\r\n // a. Let Pk be ! ToString(k).\r\n // b. Let kValue be ? Get(O, Pk).\r\n // c. Let testResult be ToBoolean(? Call(predicate, T, « kValue, k, O »)).\r\n // d. If testResult is true, return kValue.\r\n var kValue = o[k];\r\n if (predicate.call(thisArg, kValue, k, o)) {\r\n return kValue;\r\n }\r\n // e. Increase k by 1.\r\n k++;\r\n }\r\n\r\n // 7. Return undefined.\r\n return undefined;\r\n }\r\n });\r\n}\r\n\r\nString.prototype.replaceAll = function (search, replacement) {\r\n var target = this;\r\n return target.split(search).join(replacement);\r\n};","(function(a){if(typeof define===\"function\"&&define.amd&&define.amd.jQuery){define([\"jquery\"],a)}else{a(jQuery)}}(function(f){var p=\"left\",o=\"right\",e=\"up\",x=\"down\",c=\"in\",z=\"out\",m=\"none\",s=\"auto\",l=\"swipe\",t=\"pinch\",A=\"tap\",j=\"doubletap\",b=\"longtap\",y=\"hold\",D=\"horizontal\",u=\"vertical\",i=\"all\",r=10,g=\"start\",k=\"move\",h=\"end\",q=\"cancel\",a=\"ontouchstart\" in window,v=window.navigator.msPointerEnabled&&!window.navigator.pointerEnabled,d=window.navigator.pointerEnabled||window.navigator.msPointerEnabled,B=\"TouchSwipe\";var n={fingers:1,threshold:75,cancelThreshold:null,pinchThreshold:20,maxTimeThreshold:null,fingerReleaseThreshold:250,longTapThreshold:500,doubleTapThreshold:200,swipe:null,swipeLeft:null,swipeRight:null,swipeUp:null,swipeDown:null,swipeStatus:null,pinchIn:null,pinchOut:null,pinchStatus:null,click:null,tap:null,doubleTap:null,longTap:null,hold:null,triggerOnTouchEnd:true,triggerOnTouchLeave:false,allowPageScroll:\"auto\",fallbackToMouseEvents:true,excludedElements:\"label, button, input, select, textarea, a, .noSwipe\",preventDefaultEvents:true};f.fn.swipe=function(G){var F=f(this),E=F.data(B);if(E&&typeof G===\"string\"){if(E[G]){return E[G].apply(this,Array.prototype.slice.call(arguments,1))}else{f.error(\"Method \"+G+\" does not exist on jQuery.swipe\")}}else{if(!E&&(typeof G===\"object\"||!G)){return w.apply(this,arguments)}}return F};f.fn.swipe.defaults=n;f.fn.swipe.phases={PHASE_START:g,PHASE_MOVE:k,PHASE_END:h,PHASE_CANCEL:q};f.fn.swipe.directions={LEFT:p,RIGHT:o,UP:e,DOWN:x,IN:c,OUT:z};f.fn.swipe.pageScroll={NONE:m,HORIZONTAL:D,VERTICAL:u,AUTO:s};f.fn.swipe.fingers={ONE:1,TWO:2,THREE:3,ALL:i};function w(E){if(E&&(E.allowPageScroll===undefined&&(E.swipe!==undefined||E.swipeStatus!==undefined))){E.allowPageScroll=m}if(E.click!==undefined&&E.tap===undefined){E.tap=E.click}if(!E){E={}}E=f.extend({},f.fn.swipe.defaults,E);return this.each(function(){var G=f(this);var F=G.data(B);if(!F){F=new C(this,E);G.data(B,F)}})}function C(a4,av){var az=(a||d||!av.fallbackToMouseEvents),J=az?(d?(v?\"MSPointerDown\":\"pointerdown\"):\"touchstart\"):\"mousedown\",ay=az?(d?(v?\"MSPointerMove\":\"pointermove\"):\"touchmove\"):\"mousemove\",U=az?(d?(v?\"MSPointerUp\":\"pointerup\"):\"touchend\"):\"mouseup\",S=az?null:\"mouseleave\",aD=(d?(v?\"MSPointerCancel\":\"pointercancel\"):\"touchcancel\");var ag=0,aP=null,ab=0,a1=0,aZ=0,G=1,aq=0,aJ=0,M=null;var aR=f(a4);var Z=\"start\";var W=0;var aQ=null;var T=0,a2=0,a5=0,ad=0,N=0;var aW=null,af=null;try{aR.bind(J,aN);aR.bind(aD,a9)}catch(ak){f.error(\"events not supported \"+J+\",\"+aD+\" on jQuery.swipe\")}this.enable=function(){aR.bind(J,aN);aR.bind(aD,a9);return aR};this.disable=function(){aK();return aR};this.destroy=function(){aK();aR.data(B,null);aR=null};this.option=function(bc,bb){if(av[bc]!==undefined){if(bb===undefined){return av[bc]}else{av[bc]=bb}}else{f.error(\"Option \"+bc+\" does not exist on jQuery.swipe.options\")}return null};function aN(bd){if(aB()){return}if(f(bd.target).closest(av.excludedElements,aR).length>0){return}var be=bd.originalEvent?bd.originalEvent:bd;var bc,bb=a?be.touches[0]:be;Z=g;if(a){W=be.touches.length}else{bd.preventDefault()}ag=0;aP=null;aJ=null;ab=0;a1=0;aZ=0;G=1;aq=0;aQ=aj();M=aa();R();if(!a||(W===av.fingers||av.fingers===i)||aX()){ai(0,bb);T=at();if(W==2){ai(1,be.touches[1]);a1=aZ=au(aQ[0].start,aQ[1].start)}if(av.swipeStatus||av.pinchStatus){bc=O(be,Z)}}else{bc=false}if(bc===false){Z=q;O(be,Z);return bc}else{if(av.hold){af=setTimeout(f.proxy(function(){aR.trigger(\"hold\",[be.target]);if(av.hold){bc=av.hold.call(aR,be,be.target)}},this),av.longTapThreshold)}ao(true)}return null}function a3(be){var bh=be.originalEvent?be.originalEvent:be;if(Z===h||Z===q||am()){return}var bd,bc=a?bh.touches[0]:bh;var bf=aH(bc);a2=at();if(a){W=bh.touches.length}if(av.hold){clearTimeout(af)}Z=k;if(W==2){if(a1==0){ai(1,bh.touches[1]);a1=aZ=au(aQ[0].start,aQ[1].start)}else{aH(bh.touches[1]);aZ=au(aQ[0].end,aQ[1].end);aJ=ar(aQ[0].end,aQ[1].end)}G=a7(a1,aZ);aq=Math.abs(a1-aZ)}if((W===av.fingers||av.fingers===i)||!a||aX()){aP=aL(bf.start,bf.end);al(be,aP);ag=aS(bf.start,bf.end);ab=aM();aI(aP,ag);if(av.swipeStatus||av.pinchStatus){bd=O(bh,Z)}if(!av.triggerOnTouchEnd||av.triggerOnTouchLeave){var bb=true;if(av.triggerOnTouchLeave){var bg=aY(this);bb=E(bf.end,bg)}if(!av.triggerOnTouchEnd&&bb){Z=aC(k)}else{if(av.triggerOnTouchLeave&&!bb){Z=aC(h)}}if(Z==q||Z==h){O(bh,Z)}}}else{Z=q;O(bh,Z)}if(bd===false){Z=q;O(bh,Z)}}function L(bb){var bc=bb.originalEvent;if(a){if(bc.touches.length>0){F();return true}}if(am()){W=ad}a2=at();ab=aM();if(ba()||!an()){Z=q;O(bc,Z)}else{if(av.triggerOnTouchEnd||(av.triggerOnTouchEnd==false&&Z===k)){bb.preventDefault();Z=h;O(bc,Z)}else{if(!av.triggerOnTouchEnd&&a6()){Z=h;aF(bc,Z,A)}else{if(Z===k){Z=q;O(bc,Z)}}}}ao(false);return null}function a9(){W=0;a2=0;T=0;a1=0;aZ=0;G=1;R();ao(false)}function K(bb){var bc=bb.originalEvent;if(av.triggerOnTouchLeave){Z=aC(h);O(bc,Z)}}function aK(){aR.unbind(J,aN);aR.unbind(aD,a9);aR.unbind(ay,a3);aR.unbind(U,L);if(S){aR.unbind(S,K)}ao(false)}function aC(bf){var be=bf;var bd=aA();var bc=an();var bb=ba();if(!bd||bb){be=q}else{if(bc&&bf==k&&(!av.triggerOnTouchEnd||av.triggerOnTouchLeave)){be=h}else{if(!bc&&bf==h&&av.triggerOnTouchLeave){be=q}}}return be}function O(bd,bb){var bc=undefined;if((I()||V())||(P()||aX())){if(I()||V()){bc=aF(bd,bb,l)}if((P()||aX())&&bc!==false){bc=aF(bd,bb,t)}}else{if(aG()&&bc!==false){bc=aF(bd,bb,j)}else{if(ap()&&bc!==false){bc=aF(bd,bb,b)}else{if(ah()&&bc!==false){bc=aF(bd,bb,A)}}}}if(bb===q){a9(bd)}if(bb===h){if(a){if(bd.touches.length==0){a9(bd)}}else{a9(bd)}}return bc}function aF(be,bb,bd){var bc=undefined;if(bd==l){aR.trigger(\"swipeStatus\",[bb,aP||null,ag||0,ab||0,W,aQ]);if(av.swipeStatus){bc=av.swipeStatus.call(aR,be,bb,aP||null,ag||0,ab||0,W,aQ);if(bc===false){return false}}if(bb==h&&aV()){aR.trigger(\"swipe\",[aP,ag,ab,W,aQ]);if(av.swipe){bc=av.swipe.call(aR,be,aP,ag,ab,W,aQ);if(bc===false){return false}}switch(aP){case p:aR.trigger(\"swipeLeft\",[aP,ag,ab,W,aQ]);if(av.swipeLeft){bc=av.swipeLeft.call(aR,be,aP,ag,ab,W,aQ)}break;case o:aR.trigger(\"swipeRight\",[aP,ag,ab,W,aQ]);if(av.swipeRight){bc=av.swipeRight.call(aR,be,aP,ag,ab,W,aQ)}break;case e:aR.trigger(\"swipeUp\",[aP,ag,ab,W,aQ]);if(av.swipeUp){bc=av.swipeUp.call(aR,be,aP,ag,ab,W,aQ)}break;case x:aR.trigger(\"swipeDown\",[aP,ag,ab,W,aQ]);if(av.swipeDown){bc=av.swipeDown.call(aR,be,aP,ag,ab,W,aQ)}break}}}if(bd==t){aR.trigger(\"pinchStatus\",[bb,aJ||null,aq||0,ab||0,W,G,aQ]);if(av.pinchStatus){bc=av.pinchStatus.call(aR,be,bb,aJ||null,aq||0,ab||0,W,G,aQ);if(bc===false){return false}}if(bb==h&&a8()){switch(aJ){case c:aR.trigger(\"pinchIn\",[aJ||null,aq||0,ab||0,W,G,aQ]);if(av.pinchIn){bc=av.pinchIn.call(aR,be,aJ||null,aq||0,ab||0,W,G,aQ)}break;case z:aR.trigger(\"pinchOut\",[aJ||null,aq||0,ab||0,W,G,aQ]);if(av.pinchOut){bc=av.pinchOut.call(aR,be,aJ||null,aq||0,ab||0,W,G,aQ)}break}}}if(bd==A){if(bb===q||bb===h){clearTimeout(aW);clearTimeout(af);if(Y()&&!H()){N=at();aW=setTimeout(f.proxy(function(){N=null;aR.trigger(\"tap\",[be.target]);if(av.tap){bc=av.tap.call(aR,be,be.target)}},this),av.doubleTapThreshold)}else{N=null;aR.trigger(\"tap\",[be.target]);if(av.tap){bc=av.tap.call(aR,be,be.target)}}}}else{if(bd==j){if(bb===q||bb===h){clearTimeout(aW);N=null;aR.trigger(\"doubletap\",[be.target]);if(av.doubleTap){bc=av.doubleTap.call(aR,be,be.target)}}}else{if(bd==b){if(bb===q||bb===h){clearTimeout(aW);N=null;aR.trigger(\"longtap\",[be.target]);if(av.longTap){bc=av.longTap.call(aR,be,be.target)}}}}}return bc}function an(){var bb=true;if(av.threshold!==null){bb=ag>=av.threshold}return bb}function ba(){var bb=false;if(av.cancelThreshold!==null&&aP!==null){bb=(aT(aP)-ag)>=av.cancelThreshold}return bb}function ae(){if(av.pinchThreshold!==null){return aq>=av.pinchThreshold}return true}function aA(){var bb;if(av.maxTimeThreshold){if(ab>=av.maxTimeThreshold){bb=false}else{bb=true}}else{bb=true}return bb}function al(bb,bc){if(av.preventDefaultEvents===false){return}if(av.allowPageScroll===m){bb.preventDefault()}else{var bd=av.allowPageScroll===s;switch(bc){case p:if((av.swipeLeft&&bd)||(!bd&&av.allowPageScroll!=D)){bb.preventDefault()}break;case o:if((av.swipeRight&&bd)||(!bd&&av.allowPageScroll!=D)){bb.preventDefault()}break;case e:if((av.swipeUp&&bd)||(!bd&&av.allowPageScroll!=u)){bb.preventDefault()}break;case x:if((av.swipeDown&&bd)||(!bd&&av.allowPageScroll!=u)){bb.preventDefault()}break}}}function a8(){var bc=aO();var bb=X();var bd=ae();return bc&&bb&&bd}function aX(){return !!(av.pinchStatus||av.pinchIn||av.pinchOut)}function P(){return !!(a8()&&aX())}function aV(){var be=aA();var bg=an();var bd=aO();var bb=X();var bc=ba();var bf=!bc&&bb&&bd&&bg&&be;return bf}function V(){return !!(av.swipe||av.swipeStatus||av.swipeLeft||av.swipeRight||av.swipeUp||av.swipeDown)}function I(){return !!(aV()&&V())}function aO(){return((W===av.fingers||av.fingers===i)||!a)}function X(){return aQ[0].end.x!==0}function a6(){return !!(av.tap)}function Y(){return !!(av.doubleTap)}function aU(){return !!(av.longTap)}function Q(){if(N==null){return false}var bb=at();return(Y()&&((bb-N)<=av.doubleTapThreshold))}function H(){return Q()}function ax(){return((W===1||!a)&&(isNaN(ag)||ag<av.threshold))}function a0(){return((ab>av.longTapThreshold)&&(ag<r))}function ah(){return !!(ax()&&a6())}function aG(){return !!(Q()&&Y())}function ap(){return !!(a0()&&aU())}function F(){a5=at();ad=event.touches.length+1}function R(){a5=0;ad=0}function am(){var bb=false;if(a5){var bc=at()-a5;if(bc<=av.fingerReleaseThreshold){bb=true}}return bb}function aB(){return !!(aR.data(B+\"_intouch\")===true)}function ao(bb){if(bb===true){aR.bind(ay,a3);aR.bind(U,L);if(S){aR.bind(S,K)}}else{aR.unbind(ay,a3,false);aR.unbind(U,L,false);if(S){aR.unbind(S,K,false)}}aR.data(B+\"_intouch\",bb===true)}function ai(bc,bb){var bd=bb.identifier!==undefined?bb.identifier:0;aQ[bc].identifier=bd;aQ[bc].start.x=aQ[bc].end.x=bb.pageX||bb.clientX;aQ[bc].start.y=aQ[bc].end.y=bb.pageY||bb.clientY;return aQ[bc]}function aH(bb){var bd=bb.identifier!==undefined?bb.identifier:0;var bc=ac(bd);bc.end.x=bb.pageX||bb.clientX;bc.end.y=bb.pageY||bb.clientY;return bc}function ac(bc){for(var bb=0;bb<aQ.length;bb++){if(aQ[bb].identifier==bc){return aQ[bb]}}}function aj(){var bb=[];for(var bc=0;bc<=5;bc++){bb.push({start:{x:0,y:0},end:{x:0,y:0},identifier:0})}return bb}function aI(bb,bc){bc=Math.max(bc,aT(bb));M[bb].distance=bc}function aT(bb){if(M[bb]){return M[bb].distance}return undefined}function aa(){var bb={};bb[p]=aw(p);bb[o]=aw(o);bb[e]=aw(e);bb[x]=aw(x);return bb}function aw(bb){return{direction:bb,distance:0}}function aM(){return a2-T}function au(be,bd){var bc=Math.abs(be.x-bd.x);var bb=Math.abs(be.y-bd.y);return Math.round(Math.sqrt(bc*bc+bb*bb))}function a7(bb,bc){var bd=(bc/bb)*1;return bd.toFixed(2)}function ar(){if(G<1){return z}else{return c}}function aS(bc,bb){return Math.round(Math.sqrt(Math.pow(bb.x-bc.x,2)+Math.pow(bb.y-bc.y,2)))}function aE(be,bc){var bb=be.x-bc.x;var bg=bc.y-be.y;var bd=Math.atan2(bg,bb);var bf=Math.round(bd*180/Math.PI);if(bf<0){bf=360-Math.abs(bf)}return bf}function aL(bc,bb){var bd=aE(bc,bb);if((bd<=45)&&(bd>=0)){return p}else{if((bd<=360)&&(bd>=315)){return p}else{if((bd>=135)&&(bd<=225)){return o}else{if((bd>45)&&(bd<135)){return x}else{return e}}}}}function at(){var bb=new Date();return bb.getTime()}function aY(bb){bb=f(bb);var bd=bb.offset();var bc={left:bd.left,right:bd.left+bb.outerWidth(),top:bd.top,bottom:bd.top+bb.outerHeight()};return bc}function E(bb,bc){return(bb.x>bc.left&&bb.x<bc.right&&bb.y>bc.top&&bb.y<bc.bottom)}}}));","/*\r\n * JavaScript MD5\r\n * https://github.com/blueimp/JavaScript-MD5\r\n *\r\n * Copyright 2011, Sebastian Tschan\r\n * https://blueimp.net\r\n *\r\n * Licensed under the MIT license:\r\n * https://opensource.org/licenses/MIT\r\n *\r\n * Based on\r\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\r\n * Digest Algorithm, as defined in RFC 1321.\r\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\r\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\r\n * Distributed under the BSD License\r\n * See http://pajhome.org.uk/crypt/md5 for more info.\r\n */\r\n\r\n/* global define */\r\n\r\n; (function ($) {\r\n 'use strict'\r\n\r\n /*\r\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\r\n * to work around bugs in some JS interpreters.\r\n */\r\n function safeAdd(x, y) {\r\n var lsw = (x & 0xffff) + (y & 0xffff)\r\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16)\r\n return (msw << 16) | (lsw & 0xffff)\r\n }\r\n\r\n /*\r\n * Bitwise rotate a 32-bit number to the left.\r\n */\r\n function bitRotateLeft(num, cnt) {\r\n return (num << cnt) | (num >>> (32 - cnt))\r\n }\r\n\r\n /*\r\n * These functions implement the four basic operations the algorithm uses.\r\n */\r\n function md5cmn(q, a, b, x, s, t) {\r\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b)\r\n }\r\n function md5ff(a, b, c, d, x, s, t) {\r\n return md5cmn((b & c) | (~b & d), a, b, x, s, t)\r\n }\r\n function md5gg(a, b, c, d, x, s, t) {\r\n return md5cmn((b & d) | (c & ~d), a, b, x, s, t)\r\n }\r\n function md5hh(a, b, c, d, x, s, t) {\r\n return md5cmn(b ^ c ^ d, a, b, x, s, t)\r\n }\r\n function md5ii(a, b, c, d, x, s, t) {\r\n return md5cmn(c ^ (b | ~d), a, b, x, s, t)\r\n }\r\n\r\n /*\r\n * Calculate the MD5 of an array of little-endian words, and a bit length.\r\n */\r\n function binlMD5(x, len) {\r\n /* append padding */\r\n x[len >> 5] |= 0x80 << (len % 32)\r\n x[((len + 64) >>> 9 << 4) + 14] = len\r\n\r\n var i\r\n var olda\r\n var oldb\r\n var oldc\r\n var oldd\r\n var a = 1732584193\r\n var b = -271733879\r\n var c = -1732584194\r\n var d = 271733878\r\n\r\n for (i = 0; i < x.length; i += 16) {\r\n olda = a\r\n oldb = b\r\n oldc = c\r\n oldd = d\r\n\r\n a = md5ff(a, b, c, d, x[i], 7, -680876936)\r\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586)\r\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819)\r\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330)\r\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897)\r\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426)\r\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341)\r\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983)\r\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416)\r\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417)\r\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063)\r\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162)\r\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682)\r\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101)\r\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290)\r\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329)\r\n\r\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510)\r\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632)\r\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713)\r\n b = md5gg(b, c, d, a, x[i], 20, -373897302)\r\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691)\r\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083)\r\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335)\r\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848)\r\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438)\r\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690)\r\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961)\r\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501)\r\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467)\r\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784)\r\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473)\r\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734)\r\n\r\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558)\r\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463)\r\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562)\r\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556)\r\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060)\r\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353)\r\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632)\r\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640)\r\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174)\r\n d = md5hh(d, a, b, c, x[i], 11, -358537222)\r\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979)\r\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189)\r\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487)\r\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835)\r\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520)\r\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651)\r\n\r\n a = md5ii(a, b, c, d, x[i], 6, -198630844)\r\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415)\r\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905)\r\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055)\r\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571)\r\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606)\r\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523)\r\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799)\r\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359)\r\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744)\r\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380)\r\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649)\r\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070)\r\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379)\r\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259)\r\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551)\r\n\r\n a = safeAdd(a, olda)\r\n b = safeAdd(b, oldb)\r\n c = safeAdd(c, oldc)\r\n d = safeAdd(d, oldd)\r\n }\r\n return [a, b, c, d]\r\n }\r\n\r\n /*\r\n * Convert an array of little-endian words to a string\r\n */\r\n function binl2rstr(input) {\r\n var i\r\n var output = ''\r\n var length32 = input.length * 32\r\n for (i = 0; i < length32; i += 8) {\r\n output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff)\r\n }\r\n return output\r\n }\r\n\r\n /*\r\n * Convert a raw string to an array of little-endian words\r\n * Characters >255 have their high-byte silently ignored.\r\n */\r\n function rstr2binl(input) {\r\n var i\r\n var output = []\r\n output[(input.length >> 2) - 1] = undefined\r\n for (i = 0; i < output.length; i += 1) {\r\n output[i] = 0\r\n }\r\n var length8 = input.length * 8\r\n for (i = 0; i < length8; i += 8) {\r\n output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32)\r\n }\r\n return output\r\n }\r\n\r\n /*\r\n * Calculate the MD5 of a raw string\r\n */\r\n function rstrMD5(s) {\r\n return binl2rstr(binlMD5(rstr2binl(s), s.length * 8))\r\n }\r\n\r\n /*\r\n * Calculate the HMAC-MD5, of a key and some data (raw strings)\r\n */\r\n function rstrHMACMD5(key, data) {\r\n var i\r\n var bkey = rstr2binl(key)\r\n var ipad = []\r\n var opad = []\r\n var hash\r\n ipad[15] = opad[15] = undefined\r\n if (bkey.length > 16) {\r\n bkey = binlMD5(bkey, key.length * 8)\r\n }\r\n for (i = 0; i < 16; i += 1) {\r\n ipad[i] = bkey[i] ^ 0x36363636\r\n opad[i] = bkey[i] ^ 0x5c5c5c5c\r\n }\r\n hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8)\r\n return binl2rstr(binlMD5(opad.concat(hash), 512 + 128))\r\n }\r\n\r\n /*\r\n * Convert a raw string to a hex string\r\n */\r\n function rstr2hex(input) {\r\n var hexTab = '0123456789abcdef'\r\n var output = ''\r\n var x\r\n var i\r\n for (i = 0; i < input.length; i += 1) {\r\n x = input.charCodeAt(i)\r\n output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f)\r\n }\r\n return output\r\n }\r\n\r\n /*\r\n * Encode a string as utf-8\r\n */\r\n function str2rstrUTF8(input) {\r\n return unescape(encodeURIComponent(input))\r\n }\r\n\r\n /*\r\n * Take string arguments and return either raw or hex encoded strings\r\n */\r\n function rawMD5(s) {\r\n return rstrMD5(str2rstrUTF8(s))\r\n }\r\n function hexMD5(s) {\r\n return rstr2hex(rawMD5(s))\r\n }\r\n function rawHMACMD5(k, d) {\r\n return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d))\r\n }\r\n function hexHMACMD5(k, d) {\r\n return rstr2hex(rawHMACMD5(k, d))\r\n }\r\n\r\n function md5(string, key, raw) {\r\n if (!key) {\r\n if (!raw) {\r\n return hexMD5(string)\r\n }\r\n return rawMD5(string)\r\n }\r\n if (!raw) {\r\n return hexHMACMD5(key, string)\r\n }\r\n return rawHMACMD5(key, string)\r\n }\r\n\r\n if (typeof define === 'function' && define.amd) {\r\n define(function () {\r\n return md5\r\n })\r\n } else if (typeof module === 'object' && module.exports) {\r\n module.exports = md5\r\n } else {\r\n $.md5 = md5\r\n }\r\n})(this)","/**!\r\n * AngularJS file upload shim for HTML5 FormData\r\n * @author Danial <danial.farid@gmail.com>\r\n * @version 1.2.8\r\n */\r\n(function() {\r\n\r\nif (window.XMLHttpRequest) {\r\n\tif (window.FormData) {\r\n\t\t// allow access to Angular XHR private field: https://github.com/angular/angular.js/issues/1934\r\n\t\twindow.XMLHttpRequest = (function(origXHR) {\r\n\t\t\treturn function() {\r\n\t\t\t\tvar xhr = new origXHR();\r\n\t\t\t\txhr.setRequestHeader = (function(orig) {\r\n\t\t\t\t\treturn function(header, value) {\r\n\t\t\t\t\t\tif (header === '__setXHR_') {\r\n\t\t\t\t\t\t\tvar val = value(xhr);\r\n\t\t\t\t\t\t\t// fix for angular < 1.2.0\r\n\t\t\t\t\t\t\tif (val instanceof Function) {\r\n\t\t\t\t\t\t\t\tval(xhr);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\torig.apply(xhr, arguments);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t})(xhr.setRequestHeader);\r\n\t\t\t\treturn xhr;\r\n\t\t\t}\r\n\t\t})(window.XMLHttpRequest);\r\n\t} else {\r\n\t\tvar hasFlash = false;\r\n\t\ttry {\r\n\t\t var fo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');\r\n\t\t if (fo) hasFlash = true;\r\n\t\t} catch(e) {\r\n\t\t if (navigator.mimeTypes[\"application/x-shockwave-flash\"] != undefined) hasFlash = true;\r\n\t\t}\r\n\t\twindow.XMLHttpRequest = (function(origXHR) {\r\n\t\t\treturn function() {\r\n\t\t\t\tvar xhr = new origXHR();\r\n\t\t\t\tvar origSend = xhr.send;\r\n\t\t\t\txhr.__requestHeaders = [];\r\n\t\t\t\txhr.open = (function(orig) {\r\n\t\t\t\t\tif (!xhr.upload) xhr.upload = {};\r\n\t\t\t\t\txhr.upload.addEventListener = function(t, fn, b) {\r\n\t\t\t\t\t\tif (t === 'progress') {\r\n\t\t\t\t\t\t\txhr.__progress = fn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (t === 'load') {\r\n\t\t\t\t\t\t\txhr.__load = fn;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn function(m, url, b) {\r\n\t\t\t\t\t\torig.apply(xhr, [m, url, b]);\r\n\t\t\t\t\t\txhr.__url = url;\r\n\t\t\t\t\t}\r\n\t\t\t\t})(xhr.open);\r\n\t\t\t\txhr.getResponseHeader = (function(orig) {\r\n\t\t\t\t\treturn function(h) {\r\n\t\t\t\t\t\treturn xhr.__fileApiXHR ? xhr.__fileApiXHR.getResponseHeader(h) : orig.apply(xhr, [h]);\r\n\t\t\t\t\t}\r\n\t\t\t\t})(xhr.getResponseHeader);\r\n\t\t\t\txhr.getAllResponseHeaders = (function(orig) {\r\n\t\t\t\t\treturn function() {\r\n\t\t\t\t\t\treturn xhr.__fileApiXHR ? xhr.__fileApiXHR.getAllResponseHeaders() : orig.apply(xhr);\r\n\t\t\t\t\t}\r\n\t\t\t\t})(xhr.getAllResponseHeaders);\r\n\t\t\t\txhr.abort = (function(orig) {\r\n\t\t\t\t\treturn function() {\r\n\t\t\t\t\t\treturn xhr.__fileApiXHR ? xhr.__fileApiXHR.abort() : (orig == null ? null : orig.apply(xhr));\r\n\t\t\t\t\t}\r\n\t\t\t\t})(xhr.abort);\r\n\t\t\t\txhr.setRequestHeader = (function(orig) {\r\n\t\t\t\t\treturn function(header, value) {\r\n\t\t\t\t\t\tif (header === '__setXHR_') {\r\n\t\t\t\t\t\t\tvar val = value(xhr);\r\n\t\t\t\t\t\t\t// fix for angular < 1.2.0\r\n\t\t\t\t\t\t\tif (val instanceof Function) {\r\n\t\t\t\t\t\t\t\tval(xhr);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\torig.apply(xhr, arguments);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t})(xhr.setRequestHeader);\r\n\r\n\t\t\t\txhr.send = function() {\r\n\t\t\t\t\tif (arguments[0] && arguments[0].__isShim) {\r\n\t\t\t\t\t\tvar formData = arguments[0];\r\n\t\t\t\t\t\tvar config = {\r\n\t\t\t\t\t\t\turl: xhr.__url,\r\n\t\t\t\t\t\t\tcomplete: function(err, fileApiXHR) {\r\n\t\t\t\t\t\t\t\tif (!err) xhr.__load({type: 'load', loaded: xhr.__total, total: xhr.__total, target: xhr, lengthComputable: true});\r\n\t\t\t\t\t\t\t\tif (fileApiXHR.status !== undefined) Object.defineProperty(xhr, 'status', {get: function() {return fileApiXHR.status}});\r\n\t\t\t\t\t\t\t\tif (fileApiXHR.statusText !== undefined) Object.defineProperty(xhr, 'statusText', {get: function() {return fileApiXHR.statusText}});\r\n\t\t\t\t\t\t\t\tObject.defineProperty(xhr, 'readyState', {get: function() {return 4}});\r\n\t\t\t\t\t\t\t\tif (fileApiXHR.response !== undefined) Object.defineProperty(xhr, 'response', {get: function() {return fileApiXHR.response}});\r\n\t\t\t\t\t\t\t\tObject.defineProperty(xhr, 'responseText', {get: function() {return fileApiXHR.responseText}});\r\n\t\t\t\t\t\t\t\txhr.__fileApiXHR = fileApiXHR;\r\n\t\t\t\t\t\t\t\txhr.onreadystatechange();\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\tprogress: function(e) {\r\n\t\t\t\t\t\t\t\te.target = xhr;\r\n\t\t\t\t\t\t\t\txhr.__progress(e);\r\n\t\t\t\t\t\t\t\txhr.__total = e.total;\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\theaders: xhr.__requestHeaders\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tconfig.data = {};\r\n\t\t\t\t\t\tconfig.files = {}\r\n\t\t\t\t\t\tfor (var i = 0; i < formData.data.length; i++) {\r\n\t\t\t\t\t\t\tvar item = formData.data[i];\r\n\t\t\t\t\t\t\tif (item.val != null && item.val.name != null && item.val.size != null && item.val.type != null) {\r\n\t\t\t\t\t\t\t\tconfig.files[item.key] = item.val;\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tconfig.data[item.key] = item.val;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tsetTimeout(function() {\r\n\t\t\t\t\t\t\tif (!hasFlash) {\r\n\t\t\t\t\t\t\t\talert('Please install Adode Flash Player to upload files.');\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\txhr.__fileApiXHR = FileAPI.upload(config);\r\n\t\t\t\t\t\t}, 1);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\torigSend.apply(xhr, arguments);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn xhr;\r\n\t\t\t}\r\n\t\t})(window.XMLHttpRequest);\r\n\t\twindow.XMLHttpRequest.__hasFlash = hasFlash;\r\n\t}\r\n\twindow.XMLHttpRequest.__isShim = true;\r\n}\r\n\r\nif (!window.FormData) {\r\n\tvar wrapFileApi = function(elem) {\r\n\t\tif (!elem.__isWrapped && (elem.getAttribute('ng-file-select') != null || elem.getAttribute('data-ng-file-select') != null)) {\r\n\t\t\tvar wrap = document.createElement('div');\r\n\t\t\twrap.innerHTML = '<div class=\"js-fileapi-wrapper\" style=\"position:relative; overflow:hidden\"></div>';\r\n\t\t\twrap = wrap.firstChild;\r\n\t\t\tvar parent = elem.parentNode;\r\n\t\t\tparent.insertBefore(wrap, elem);\r\n\t\t\tparent.removeChild(elem);\r\n\t\t\twrap.appendChild(elem);\r\n\t\t\telem.__isWrapped = true;\r\n\t\t}\r\n\t};\r\n\tvar changeFnWrapper = function(fn) {\r\n\t\treturn function(evt) {\r\n\t\t\tvar files = FileAPI.getFiles(evt);\r\n\t\t\tif (!evt.target) {\r\n\t\t\t\tevt.target = {};\r\n\t\t\t}\r\n\t\t\tevt.target.files = files;\r\n\t\t\tevt.target.files.item = function(i) {\r\n\t\t\t\treturn evt.target.files[i] || null;\r\n\t\t\t}\r\n\t\t\tfn(evt);\r\n\t\t};\r\n\t};\r\n\tvar isFileChange = function(elem, e) {\r\n\t\treturn (e.toLowerCase() === 'change' || e.toLowerCase() === 'onchange') && elem.getAttribute('type') == 'file';\r\n\t}\r\n\tif (HTMLInputElement.prototype.addEventListener) {\r\n\t\tHTMLInputElement.prototype.addEventListener = (function(origAddEventListener) {\r\n\t\t\treturn function(e, fn, b, d) {\r\n\t\t\t\tif (isFileChange(this, e)) {\r\n\t\t\t\t\twrapFileApi(this);\r\n\t\t\t\t\torigAddEventListener.apply(this, [e, changeFnWrapper(fn), b, d]);\r\n\t\t\t\t} else {\r\n\t\t\t\t\torigAddEventListener.apply(this, [e, fn, b, d]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})(HTMLInputElement.prototype.addEventListener);\r\n\t}\r\n\tif (HTMLInputElement.prototype.attachEvent) {\r\n\t\tHTMLInputElement.prototype.attachEvent = (function(origAttachEvent) {\r\n\t\t\treturn function(e, fn) {\r\n\t\t\t\tif (isFileChange(this, e)) {\r\n\t\t\t\t\twrapFileApi(this);\r\n\t\t\t\t\torigAttachEvent.apply(this, [e, changeFnWrapper(fn)]);\r\n\t\t\t\t} else {\r\n\t\t\t\t\torigAttachEvent.apply(this, [e, fn]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t})(HTMLInputElement.prototype.attachEvent);\r\n\t}\r\n\r\n\twindow.FormData = FormData = function() {\r\n\t\treturn {\r\n\t\t\tappend: function(key, val, name) {\r\n\t\t\t\tthis.data.push({\r\n\t\t\t\t\tkey: key,\r\n\t\t\t\t\tval: val,\r\n\t\t\t\t\tname: name\r\n\t\t\t\t});\r\n\t\t\t},\r\n\t\t\tdata: [],\r\n\t\t\t__isShim: true\r\n\t\t};\r\n\t};\r\n\r\n\t(function () {\r\n\t\t//load FileAPI\r\n\t\tif (!window.FileAPI) {\r\n\t\t\twindow.FileAPI = {};\r\n\t\t}\r\n\t\tif (!FileAPI.upload) {\r\n\t\t\tvar jsUrl, basePath, script = document.createElement('script'), allScripts = document.getElementsByTagName('script'), i, index, src;\r\n\t\t\tif (window.FileAPI.jsUrl) {\r\n\t\t\t\tjsUrl = window.FileAPI.jsUrl;\r\n\t\t\t} else if (window.FileAPI.jsPath) {\r\n\t\t\t\tbasePath = window.FileAPI.jsPath;\r\n\t\t\t} else {\r\n\t\t\t\tfor (i = 0; i < allScripts.length; i++) {\r\n\t\t\t\t\tsrc = allScripts[i].src;\r\n\t\t\t\t\tindex = src.indexOf('angular-file-upload-shim.js')\r\n\t\t\t\t\tif (index == -1) {\r\n\t\t\t\t\t\tindex = src.indexOf('angular-file-upload-shim.min.js');\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (index > -1) {\r\n\t\t\t\t\t\tbasePath = src.substring(0, index);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (FileAPI.staticPath == null) FileAPI.staticPath = basePath;\r\n\t\t\tscript.setAttribute('src', jsUrl || basePath + \"FileAPI.min.js\");\r\n\t\t\tdocument.getElementsByTagName('head')[0].appendChild(script);\r\n\t\t}\r\n\t})();\r\n}\r\n\r\n\r\nif (!window.FileReader) {\r\n\twindow.FileReader = function() {\r\n\t\tvar _this = this, loadStarted = false;\r\n\t\tthis.listeners = {};\r\n\t\tthis.addEventListener = function(type, fn) {\r\n\t\t\t_this.listeners[type] = _this.listeners[type] || [];\r\n\t\t\t_this.listeners[type].push(fn);\r\n\t\t};\r\n\t\tthis.removeEventListener = function(type, fn) {\r\n\t\t\t_this.listeners[type] && _this.listeners[type].splice(_this.listeners[type].indexOf(fn), 1);\r\n\t\t};\r\n\t\tthis.dispatchEvent = function(evt) {\r\n\t\t\tvar list = _this.listeners[evt.type];\r\n\t\t\tif (list) {\r\n\t\t\t\tfor (var i = 0; i < list.length; i++) {\r\n\t\t\t\t\tlist[i].call(_this, evt);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis.onabort = this.onerror = this.onload = this.onloadstart = this.onloadend = this.onprogress = null;\r\n\r\n\t\tfunction constructEvent(type, evt) {\r\n\t\t\tvar e = {type: type, target: _this, loaded: evt.loaded, total: evt.total, error: evt.error};\r\n\t\t\tif (evt.result != null) e.target.result = evt.result;\r\n\t\t\treturn e;\r\n\t\t};\r\n\t\tvar listener = function(evt) {\r\n\t\t\tif (!loadStarted) {\r\n\t\t\t\tloadStarted = true;\r\n\t\t\t\t_this.onloadstart && this.onloadstart(constructEvent('loadstart', evt));\r\n\t\t\t}\r\n\t\t\tif (evt.type === 'load') {\r\n\t\t\t\t_this.onloadend && _this.onloadend(constructEvent('loadend', evt));\r\n\t\t\t\tvar e = constructEvent('load', evt);\r\n\t\t\t\t_this.onload && _this.onload(e);\r\n\t\t\t\t_this.dispatchEvent(e);\r\n\t\t\t} else if (evt.type === 'progress') {\r\n\t\t\t\tvar e = constructEvent('progress', evt);\r\n\t\t\t\t_this.onprogress && _this.onprogress(e);\r\n\t\t\t\t_this.dispatchEvent(e);\r\n\t\t\t} else {\r\n\t\t\t\tvar e = constructEvent('error', evt);\r\n\t\t\t\t_this.onerror && _this.onerror(e);\r\n\t\t\t\t_this.dispatchEvent(e);\r\n\t\t\t}\r\n\t\t};\r\n\t\tthis.readAsArrayBuffer = function(file) {\r\n\t\t\tFileAPI.readAsBinaryString(file, listener);\r\n\t\t}\r\n\t\tthis.readAsBinaryString = function(file) {\r\n\t\t\tFileAPI.readAsBinaryString(file, listener);\r\n\t\t}\r\n\t\tthis.readAsDataURL = function(file) {\r\n\t\t\tFileAPI.readAsDataURL(file, listener);\r\n\t\t}\r\n\t\tthis.readAsText = function(file) {\r\n\t\t\tFileAPI.readAsText(file, listener);\r\n\t\t}\r\n\t}\r\n}\r\n\r\n})();\r\n","/**\r\n * @license AngularJS v1.2.19\r\n * (c) 2010-2014 Google, Inc. http://angularjs.org\r\n * License: MIT\r\n */\r\n(function (window, document, undefined) {\r\n\t'use strict';\r\n\r\n\t/**\r\n\t * @description\r\n\t *\r\n\t * This object provides a utility for producing rich Error messages within\r\n\t * Angular. It can be called as follows:\r\n\t *\r\n\t * var exampleMinErr = minErr('example');\r\n\t * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);\r\n\t *\r\n\t * The above creates an instance of minErr in the example namespace. The\r\n\t * resulting error will have a namespaced error code of example.one. The\r\n\t * resulting error will replace {0} with the value of foo, and {1} with the\r\n\t * value of bar. The object is not restricted in the number of arguments it can\r\n\t * take.\r\n\t *\r\n\t * If fewer arguments are specified than necessary for interpolation, the extra\r\n\t * interpolation markers will be preserved in the final string.\r\n\t *\r\n\t * Since data will be parsed statically during a build step, some restrictions\r\n\t * are applied with respect to how minErr instances are created and called.\r\n\t * Instances should have names of the form namespaceMinErr for a minErr created\r\n\t * using minErr('namespace') . Error codes, namespaces and template strings\r\n\t * should all be static strings, not variables or general expressions.\r\n\t *\r\n\t * @param {string} module The namespace to use for the new minErr instance.\r\n\t * @returns {function(code:string, template:string, ...templateArgs): Error} minErr instance\r\n\t */\r\n\r\n\tfunction minErr(module) {\r\n\t\treturn function () {\r\n\t\t\tvar code = arguments[0],\r\n\t\t\t prefix = '[' + (module ? module + ':' : '') + code + '] ',\r\n\t\t\t template = arguments[1],\r\n\t\t\t templateArgs = arguments,\r\n\t\t\t stringify = function (obj) {\r\n\t\t\t \tif (typeof obj === 'function') {\r\n\t\t\t \t\treturn obj.toString().replace(/ \\{[\\s\\S]*$/, '');\r\n\t\t\t \t} else if (typeof obj === 'undefined') {\r\n\t\t\t \t\treturn 'undefined';\r\n\t\t\t \t} else if (typeof obj !== 'string') {\r\n\t\t\t \t\treturn JSON.stringify(obj);\r\n\t\t\t \t}\r\n\t\t\t \treturn obj;\r\n\t\t\t },\r\n\t\t\t message, i;\r\n\r\n\t\t\tmessage = prefix + template.replace(/\\{\\d+\\}/g, function (match) {\r\n\t\t\t\tvar index = +match.slice(1, -1), arg;\r\n\r\n\t\t\t\tif (index + 2 < templateArgs.length) {\r\n\t\t\t\t\targ = templateArgs[index + 2];\r\n\t\t\t\t\tif (typeof arg === 'function') {\r\n\t\t\t\t\t\treturn arg.toString().replace(/ ?\\{[\\s\\S]*$/, '');\r\n\t\t\t\t\t} else if (typeof arg === 'undefined') {\r\n\t\t\t\t\t\treturn 'undefined';\r\n\t\t\t\t\t} else if (typeof arg !== 'string') {\r\n\t\t\t\t\t\treturn toJson(arg);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn arg;\r\n\t\t\t\t}\r\n\t\t\t\treturn match;\r\n\t\t\t});\r\n\r\n\t\t\tmessage = message + '\\nhttp://errors.angularjs.org/1.2.19/' +\r\n\t\t\t (module ? module + '/' : '') + code;\r\n\t\t\tfor (i = 2; i < arguments.length; i++) {\r\n\t\t\t\tmessage = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +\r\n\t\t\t\t encodeURIComponent(stringify(arguments[i]));\r\n\t\t\t}\r\n\r\n\t\t\treturn new Error(message);\r\n\t\t};\r\n\t}\r\n\r\n\t/* We need to tell jshint what variables are being exported */\r\n\t/* global\r\n\t\t-angular,\r\n\t\t-msie,\r\n\t\t-jqLite,\r\n\t\t-jQuery,\r\n\t\t-slice,\r\n\t\t-push,\r\n\t\t-toString,\r\n\t\t-ngMinErr,\r\n\t\t-angularModule,\r\n\t\t-nodeName_,\r\n\t\t-uid,\r\n\t\t-VALIDITY_STATE_PROPERTY,\r\n\t\r\n\t\t-lowercase,\r\n\t\t-uppercase,\r\n\t\t-manualLowercase,\r\n\t\t-manualUppercase,\r\n\t\t-nodeName_,\r\n\t\t-isArrayLike,\r\n\t\t-forEach,\r\n\t\t-sortedKeys,\r\n\t\t-forEachSorted,\r\n\t\t-reverseParams,\r\n\t\t-nextUid,\r\n\t\t-setHashKey,\r\n\t\t-extend,\r\n\t\t-int,\r\n\t\t-inherit,\r\n\t\t-noop,\r\n\t\t-identity,\r\n\t\t-valueFn,\r\n\t\t-isUndefined,\r\n\t\t-isDefined,\r\n\t\t-isObject,\r\n\t\t-isString,\r\n\t\t-isNumber,\r\n\t\t-isDate,\r\n\t\t-isArray,\r\n\t\t-isFunction,\r\n\t\t-isRegExp,\r\n\t\t-isWindow,\r\n\t\t-isScope,\r\n\t\t-isFile,\r\n\t\t-isBlob,\r\n\t\t-isBoolean,\r\n\t\t-trim,\r\n\t\t-isElement,\r\n\t\t-makeMap,\r\n\t\t-map,\r\n\t\t-size,\r\n\t\t-includes,\r\n\t\t-indexOf,\r\n\t\t-arrayRemove,\r\n\t\t-isLeafNode,\r\n\t\t-copy,\r\n\t\t-shallowCopy,\r\n\t\t-equals,\r\n\t\t-csp,\r\n\t\t-concat,\r\n\t\t-sliceArgs,\r\n\t\t-bind,\r\n\t\t-toJsonReplacer,\r\n\t\t-toJson,\r\n\t\t-fromJson,\r\n\t\t-toBoolean,\r\n\t\t-startingTag,\r\n\t\t-tryDecodeURIComponent,\r\n\t\t-parseKeyValue,\r\n\t\t-toKeyValue,\r\n\t\t-encodeUriSegment,\r\n\t\t-encodeUriQuery,\r\n\t\t-angularInit,\r\n\t\t-bootstrap,\r\n\t\t-snake_case,\r\n\t\t-bindJQuery,\r\n\t\t-assertArg,\r\n\t\t-assertArgFn,\r\n\t\t-assertNotHasOwnProperty,\r\n\t\t-getter,\r\n\t\t-getBlockElements,\r\n\t\t-hasOwnProperty,\r\n\t\r\n\t*/\r\n\r\n\t////////////////////////////////////\r\n\r\n\t/**\r\n\t * @ngdoc module\r\n\t * @name ng\r\n\t * @module ng\r\n\t * @description\r\n\t *\r\n\t * # ng (core module)\r\n\t * The ng module is loaded by default when an AngularJS application is started. The module itself\r\n\t * contains the essential components for an AngularJS application to function. The table below\r\n\t * lists a high level breakdown of each of the services/factories, filters, directives and testing\r\n\t * components available within this core module.\r\n\t *\r\n\t * <div doc-module-components=\"ng\"></div>\r\n\t */\r\n\r\n\t// The name of a form control's ValidityState property.\r\n\t// This is used so that it's possible for internal tests to create mock ValidityStates.\r\n\tvar VALIDITY_STATE_PROPERTY = 'validity';\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.lowercase\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description Converts the specified string to lowercase.\r\n\t * @param {string} string String to be converted to lowercase.\r\n\t * @returns {string} Lowercased string.\r\n\t */\r\n\tvar lowercase = function (string) { return isString(string) ? string.toLowerCase() : string; };\r\n\tvar hasOwnProperty = Object.prototype.hasOwnProperty;\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.uppercase\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description Converts the specified string to uppercase.\r\n\t * @param {string} string String to be converted to uppercase.\r\n\t * @returns {string} Uppercased string.\r\n\t */\r\n\tvar uppercase = function (string) { return isString(string) ? string.toUpperCase() : string; };\r\n\r\n\r\n\tvar manualLowercase = function (s) {\r\n\t\t/* jshint bitwise: false */\r\n\t\treturn isString(s)\r\n\t\t\t? s.replace(/[A-Z]/g, function (ch) { return String.fromCharCode(ch.charCodeAt(0) | 32); })\r\n\t\t\t: s;\r\n\t};\r\n\tvar manualUppercase = function (s) {\r\n\t\t/* jshint bitwise: false */\r\n\t\treturn isString(s)\r\n\t\t\t? s.replace(/[a-z]/g, function (ch) { return String.fromCharCode(ch.charCodeAt(0) & ~32); })\r\n\t\t\t: s;\r\n\t};\r\n\r\n\r\n\t// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish\r\n\t// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods\r\n\t// with correct but slower alternatives.\r\n\tif ('i' !== 'I'.toLowerCase()) {\r\n\t\tlowercase = manualLowercase;\r\n\t\tuppercase = manualUppercase;\r\n\t}\r\n\r\n\r\n\tvar /** holds major version number for IE or NaN for real browsers */\r\n\t\tmsie,\r\n\t\tjqLite, // delay binding since jQuery could be loaded after us.\r\n\t\tjQuery, // delay binding\r\n\t\tslice = [].slice,\r\n\t\tpush = [].push,\r\n\t\ttoString = Object.prototype.toString,\r\n\t\tngMinErr = minErr('ng'),\r\n\r\n\t\t/** @name angular */\r\n\t\tangular = window.angular || (window.angular = {}),\r\n\t\tangularModule,\r\n\t\tnodeName_,\r\n\t\tuid = ['0', '0', '0'];\r\n\r\n\t/**\r\n\t * IE 11 changed the format of the UserAgent string.\r\n\t * See http://msdn.microsoft.com/en-us/library/ms537503.aspx\r\n\t */\r\n\tmsie = int((/msie (\\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]);\r\n\tif (isNaN(msie)) {\r\n\t\tmsie = int((/trident\\/.*; rv:(\\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]);\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @private\r\n\t * @param {*} obj\r\n\t * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments,\r\n\t * String ...)\r\n\t */\r\n\tfunction isArrayLike(obj) {\r\n\t\tif (obj == null || isWindow(obj)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tvar length = obj.length;\r\n\r\n\t\tif (obj.nodeType === 1 && length) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn isString(obj) || isArray(obj) || length === 0 ||\r\n\t\t\t typeof length === 'number' && length > 0 && (length - 1) in obj;\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.forEach\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Invokes the `iterator` function once for each item in `obj` collection, which can be either an\r\n\t * object or an array. The `iterator` function is invoked with `iterator(value, key)`, where `value`\r\n\t * is the value of an object property or an array element and `key` is the object property key or\r\n\t * array element index. Specifying a `context` for the function is optional.\r\n\t *\r\n\t * It is worth noting that `.forEach` does not iterate over inherited properties because it filters\r\n\t * using the `hasOwnProperty` method.\r\n\t *\r\n\t ```js\r\n\t\t var values = {name: 'misko', gender: 'male'};\r\n\t\t var log = [];\r\n\t\t angular.forEach(values, function(value, key) {\r\n\t\t this.push(key + ': ' + value);\r\n\t\t }, log);\r\n\t\t expect(log).toEqual(['name: misko', 'gender: male']);\r\n\t ```\r\n\t *\r\n\t * @param {Object|Array} obj Object to iterate over.\r\n\t * @param {Function} iterator Iterator function.\r\n\t * @param {Object=} context Object to become context (`this`) for the iterator function.\r\n\t * @returns {Object|Array} Reference to `obj`.\r\n\t */\r\n\tfunction forEach(obj, iterator, context) {\r\n\t\tvar key;\r\n\t\tif (obj) {\r\n\t\t\tif (isFunction(obj)) {\r\n\t\t\t\tfor (key in obj) {\r\n\t\t\t\t\t// Need to check if hasOwnProperty exists,\r\n\t\t\t\t\t// as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function\r\n\t\t\t\t\tif (key != 'prototype' && key != 'length' && key != 'name' && (!obj.hasOwnProperty || obj.hasOwnProperty(key))) {\r\n\t\t\t\t\t\titerator.call(context, obj[key], key);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (obj.forEach && obj.forEach !== forEach) {\r\n\t\t\t\tobj.forEach(iterator, context);\r\n\t\t\t} else if (isArrayLike(obj)) {\r\n\t\t\t\tfor (key = 0; key < obj.length; key++)\r\n\t\t\t\t\titerator.call(context, obj[key], key);\r\n\t\t\t} else {\r\n\t\t\t\tfor (key in obj) {\r\n\t\t\t\t\tif (obj.hasOwnProperty(key)) {\r\n\t\t\t\t\t\titerator.call(context, obj[key], key);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\tfunction sortedKeys(obj) {\r\n\t\tvar keys = [];\r\n\t\tfor (var key in obj) {\r\n\t\t\tif (obj.hasOwnProperty(key)) {\r\n\t\t\t\tkeys.push(key);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn keys.sort();\r\n\t}\r\n\r\n\tfunction forEachSorted(obj, iterator, context) {\r\n\t\tvar keys = sortedKeys(obj);\r\n\t\tfor (var i = 0; i < keys.length; i++) {\r\n\t\t\titerator.call(context, obj[keys[i]], keys[i]);\r\n\t\t}\r\n\t\treturn keys;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * when using forEach the params are value, key, but it is often useful to have key, value.\r\n\t * @param {function(string, *)} iteratorFn\r\n\t * @returns {function(*, string)}\r\n\t */\r\n\tfunction reverseParams(iteratorFn) {\r\n\t\treturn function (value, key) { iteratorFn(key, value); };\r\n\t}\r\n\r\n\t/**\r\n\t * A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric\r\n\t * characters such as '012ABC'. The reason why we are not using simply a number counter is that\r\n\t * the number string gets longer over time, and it can also overflow, where as the nextId\r\n\t * will grow much slower, it is a string, and it will never overflow.\r\n\t *\r\n\t * @returns {string} an unique alpha-numeric string\r\n\t */\r\n\tfunction nextUid() {\r\n\t\tvar index = uid.length;\r\n\t\tvar digit;\r\n\r\n\t\twhile (index) {\r\n\t\t\tindex--;\r\n\t\t\tdigit = uid[index].charCodeAt(0);\r\n\t\t\tif (digit == 57 /*'9'*/) {\r\n\t\t\t\tuid[index] = 'A';\r\n\t\t\t\treturn uid.join('');\r\n\t\t\t}\r\n\t\t\tif (digit == 90 /*'Z'*/) {\r\n\t\t\t\tuid[index] = '0';\r\n\t\t\t} else {\r\n\t\t\t\tuid[index] = String.fromCharCode(digit + 1);\r\n\t\t\t\treturn uid.join('');\r\n\t\t\t}\r\n\t\t}\r\n\t\tuid.unshift('0');\r\n\t\treturn uid.join('');\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Set or clear the hashkey for an object.\r\n\t * @param obj object\r\n\t * @param h the hashkey (!truthy to delete the hashkey)\r\n\t */\r\n\tfunction setHashKey(obj, h) {\r\n\t\tif (h) {\r\n\t\t\tobj.$$hashKey = h;\r\n\t\t}\r\n\t\telse {\r\n\t\t\tdelete obj.$$hashKey;\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.extend\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Extends the destination object `dst` by copying all of the properties from the `src` object(s)\r\n\t * to `dst`. You can specify multiple `src` objects.\r\n\t *\r\n\t * @param {Object} dst Destination object.\r\n\t * @param {...Object} src Source object(s).\r\n\t * @returns {Object} Reference to `dst`.\r\n\t */\r\n\tfunction extend(dst) {\r\n\t\tvar h = dst.$$hashKey;\r\n\t\tforEach(arguments, function (obj) {\r\n\t\t\tif (obj !== dst) {\r\n\t\t\t\tforEach(obj, function (value, key) {\r\n\t\t\t\t\tdst[key] = value;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tsetHashKey(dst, h);\r\n\t\treturn dst;\r\n\t}\r\n\r\n\tfunction int(str) {\r\n\t\treturn parseInt(str, 10);\r\n\t}\r\n\r\n\r\n\tfunction inherit(parent, extra) {\r\n\t\treturn extend(new (extend(function () { }, { prototype: parent }))(), extra);\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.noop\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * A function that performs no operations. This function can be useful when writing code in the\r\n\t * functional style.\r\n\t ```js\r\n\t\t function foo(callback) {\r\n\t\t var result = calculateResult();\r\n\t\t (callback || angular.noop)(result);\r\n\t\t }\r\n\t ```\r\n\t */\r\n\tfunction noop() { }\r\n\tnoop.$inject = [];\r\n\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.identity\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * A function that returns its first argument. This function is useful when writing code in the\r\n\t * functional style.\r\n\t *\r\n\t ```js\r\n\t\t function transformer(transformationFn, value) {\r\n\t\t return (transformationFn || angular.identity)(value);\r\n\t\t };\r\n\t ```\r\n\t */\r\n\tfunction identity($) { return $; }\r\n\tidentity.$inject = [];\r\n\r\n\r\n\tfunction valueFn(value) { return function () { return value; }; }\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.isUndefined\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Determines if a reference is undefined.\r\n\t *\r\n\t * @param {*} value Reference to check.\r\n\t * @returns {boolean} True if `value` is undefined.\r\n\t */\r\n\tfunction isUndefined(value) { return typeof value === 'undefined'; }\r\n\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.isDefined\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Determines if a reference is defined.\r\n\t *\r\n\t * @param {*} value Reference to check.\r\n\t * @returns {boolean} True if `value` is defined.\r\n\t */\r\n\tfunction isDefined(value) { return typeof value !== 'undefined'; }\r\n\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.isObject\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not\r\n\t * considered to be objects. Note that JavaScript arrays are objects.\r\n\t *\r\n\t * @param {*} value Reference to check.\r\n\t * @returns {boolean} True if `value` is an `Object` but not `null`.\r\n\t */\r\n\tfunction isObject(value) { return value != null && typeof value === 'object'; }\r\n\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.isString\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Determines if a reference is a `String`.\r\n\t *\r\n\t * @param {*} value Reference to check.\r\n\t * @returns {boolean} True if `value` is a `String`.\r\n\t */\r\n\tfunction isString(value) { return typeof value === 'string'; }\r\n\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.isNumber\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Determines if a reference is a `Number`.\r\n\t *\r\n\t * @param {*} value Reference to check.\r\n\t * @returns {boolean} True if `value` is a `Number`.\r\n\t */\r\n\tfunction isNumber(value) { return typeof value === 'number'; }\r\n\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.isDate\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Determines if a value is a date.\r\n\t *\r\n\t * @param {*} value Reference to check.\r\n\t * @returns {boolean} True if `value` is a `Date`.\r\n\t */\r\n\tfunction isDate(value) {\r\n\t\treturn toString.call(value) === '[object Date]';\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.isArray\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Determines if a reference is an `Array`.\r\n\t *\r\n\t * @param {*} value Reference to check.\r\n\t * @returns {boolean} True if `value` is an `Array`.\r\n\t */\r\n\tvar isArray = (function () {\r\n\t\tif (!isFunction(Array.isArray)) {\r\n\t\t\treturn function (value) {\r\n\t\t\t\treturn toString.call(value) === '[object Array]';\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn Array.isArray;\r\n\t})();\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.isFunction\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Determines if a reference is a `Function`.\r\n\t *\r\n\t * @param {*} value Reference to check.\r\n\t * @returns {boolean} True if `value` is a `Function`.\r\n\t */\r\n\tfunction isFunction(value) { return typeof value === 'function'; }\r\n\r\n\r\n\t/**\r\n\t * Determines if a value is a regular expression object.\r\n\t *\r\n\t * @private\r\n\t * @param {*} value Reference to check.\r\n\t * @returns {boolean} True if `value` is a `RegExp`.\r\n\t */\r\n\tfunction isRegExp(value) {\r\n\t\treturn toString.call(value) === '[object RegExp]';\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Checks if `obj` is a window object.\r\n\t *\r\n\t * @private\r\n\t * @param {*} obj Object to check\r\n\t * @returns {boolean} True if `obj` is a window obj.\r\n\t */\r\n\tfunction isWindow(obj) {\r\n\t\treturn obj && obj.document && obj.location && obj.alert && obj.setInterval;\r\n\t}\r\n\r\n\r\n\tfunction isScope(obj) {\r\n\t\treturn obj && obj.$evalAsync && obj.$watch;\r\n\t}\r\n\r\n\r\n\tfunction isFile(obj) {\r\n\t\treturn toString.call(obj) === '[object File]';\r\n\t}\r\n\r\n\r\n\tfunction isBlob(obj) {\r\n\t\treturn toString.call(obj) === '[object Blob]';\r\n\t}\r\n\r\n\r\n\tfunction isBoolean(value) {\r\n\t\treturn typeof value === 'boolean';\r\n\t}\r\n\r\n\r\n\tvar trim = (function () {\r\n\t\t// native trim is way faster: http://jsperf.com/angular-trim-test\r\n\t\t// but IE doesn't have it... :-(\r\n\t\t// TODO: we should move this into IE/ES5 polyfill\r\n\t\tif (!String.prototype.trim) {\r\n\t\t\treturn function (value) {\r\n\t\t\t\treturn isString(value) ? value.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '') : value;\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn function (value) {\r\n\t\t\treturn isString(value) ? value.trim() : value;\r\n\t\t};\r\n\t})();\r\n\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.isElement\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Determines if a reference is a DOM element (or wrapped jQuery element).\r\n\t *\r\n\t * @param {*} value Reference to check.\r\n\t * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).\r\n\t */\r\n\tfunction isElement(node) {\r\n\t\treturn !!(node &&\r\n\t\t (node.nodeName // we are a direct element\r\n\t\t || (node.prop && node.attr && node.find))); // we have an on and find method part of jQuery API\r\n\t}\r\n\r\n\t/**\r\n\t * @param str 'key1,key2,...'\r\n\t * @returns {object} in the form of {key1:true, key2:true, ...}\r\n\t */\r\n\tfunction makeMap(str) {\r\n\t\tvar obj = {}, items = str.split(\",\"), i;\r\n\t\tfor (i = 0; i < items.length; i++)\r\n\t\t\tobj[items[i]] = true;\r\n\t\treturn obj;\r\n\t}\r\n\r\n\r\n\tif (msie < 9) {\r\n\t\tnodeName_ = function (element) {\r\n\t\t\telement = element.nodeName ? element : element[0];\r\n\t\t\treturn (element.scopeName && element.scopeName != 'HTML')\r\n\t\t\t ? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName;\r\n\t\t};\r\n\t} else {\r\n\t\tnodeName_ = function (element) {\r\n\t\t\treturn element.nodeName ? element.nodeName : element[0].nodeName;\r\n\t\t};\r\n\t}\r\n\r\n\r\n\tfunction map(obj, iterator, context) {\r\n\t\tvar results = [];\r\n\t\tforEach(obj, function (value, index, list) {\r\n\t\t\tresults.push(iterator.call(context, value, index, list));\r\n\t\t});\r\n\t\treturn results;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @description\r\n\t * Determines the number of elements in an array, the number of properties an object has, or\r\n\t * the length of a string.\r\n\t *\r\n\t * Note: This function is used to augment the Object type in Angular expressions. See\r\n\t * {@link angular.Object} for more information about Angular arrays.\r\n\t *\r\n\t * @param {Object|Array|string} obj Object, array, or string to inspect.\r\n\t * @param {boolean} [ownPropsOnly=false] Count only \"own\" properties in an object\r\n\t * @returns {number} The size of `obj` or `0` if `obj` is neither an object nor an array.\r\n\t */\r\n\tfunction size(obj, ownPropsOnly) {\r\n\t\tvar count = 0, key;\r\n\r\n\t\tif (isArray(obj) || isString(obj)) {\r\n\t\t\treturn obj.length;\r\n\t\t} else if (isObject(obj)) {\r\n\t\t\tfor (key in obj)\r\n\t\t\t\tif (!ownPropsOnly || obj.hasOwnProperty(key))\r\n\t\t\t\t\tcount++;\r\n\t\t}\r\n\r\n\t\treturn count;\r\n\t}\r\n\r\n\r\n\tfunction includes(array, obj) {\r\n\t\treturn indexOf(array, obj) != -1;\r\n\t}\r\n\r\n\tfunction indexOf(array, obj) {\r\n\t\tif (array.indexOf) return array.indexOf(obj);\r\n\r\n\t\tfor (var i = 0; i < array.length; i++) {\r\n\t\t\tif (obj === array[i]) return i;\r\n\t\t}\r\n\t\treturn -1;\r\n\t}\r\n\r\n\tfunction arrayRemove(array, value) {\r\n\t\tvar index = indexOf(array, value);\r\n\t\tif (index >= 0)\r\n\t\t\tarray.splice(index, 1);\r\n\t\treturn value;\r\n\t}\r\n\r\n\tfunction isLeafNode(node) {\r\n\t\tif (node) {\r\n\t\t\tswitch (node.nodeName) {\r\n\t\t\t\tcase \"OPTION\":\r\n\t\t\t\tcase \"PRE\":\r\n\t\t\t\tcase \"TITLE\":\r\n\t\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.copy\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Creates a deep copy of `source`, which should be an object or an array.\r\n\t *\r\n\t * * If no destination is supplied, a copy of the object or array is created.\r\n\t * * If a destination is provided, all of its elements (for array) or properties (for objects)\r\n\t * are deleted and then all elements/properties from the source are copied to it.\r\n\t * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned.\r\n\t * * If `source` is identical to 'destination' an exception will be thrown.\r\n\t *\r\n\t * @param {*} source The source that will be used to make a copy.\r\n\t * Can be any type, including primitives, `null`, and `undefined`.\r\n\t * @param {(Object|Array)=} destination Destination into which the source is copied. If\r\n\t * provided, must be of the same type as `source`.\r\n\t * @returns {*} The copy or updated `destination`, if `destination` was specified.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t <file name=\"index.html\">\r\n\t <div ng-controller=\"Controller\">\r\n\t <form novalidate class=\"simple-form\">\r\n\t Name: <input type=\"text\" ng-model=\"user.name\" /><br />\r\n\t E-mail: <input type=\"email\" ng-model=\"user.email\" /><br />\r\n\t Gender: <input type=\"radio\" ng-model=\"user.gender\" value=\"male\" />male\r\n\t <input type=\"radio\" ng-model=\"user.gender\" value=\"female\" />female<br />\r\n\t <button ng-click=\"reset()\">RESET</button>\r\n\t <button ng-click=\"update(user)\">SAVE</button>\r\n\t </form>\r\n\t <pre>form = {{user | json}}</pre>\r\n\t <pre>master = {{master | json}}</pre>\r\n\t </div>\r\n\t\r\n\t <script>\r\n\t function Controller($scope) {\r\n\t\t$scope.master= {};\r\n\t\r\n\t\t$scope.update = function(user) {\r\n\t\t // Example with 1 argument\r\n\t\t $scope.master= angular.copy(user);\r\n\t\t};\r\n\t\r\n\t\t$scope.reset = function() {\r\n\t\t // Example with 2 arguments\r\n\t\t angular.copy($scope.master, $scope.user);\r\n\t\t};\r\n\t\r\n\t\t$scope.reset();\r\n\t }\r\n\t </script>\r\n\t </file>\r\n\t </example>\r\n\t */\r\n\tfunction copy(source, destination, stackSource, stackDest) {\r\n\t\tif (isWindow(source) || isScope(source)) {\r\n\t\t\tthrow ngMinErr('cpws',\r\n\t\t\t \"Can't copy! Making copies of Window or Scope instances is not supported.\");\r\n\t\t}\r\n\r\n\t\tif (!destination) {\r\n\t\t\tdestination = source;\r\n\t\t\tif (source) {\r\n\t\t\t\tif (isArray(source)) {\r\n\t\t\t\t\tdestination = copy(source, [], stackSource, stackDest);\r\n\t\t\t\t} else if (isDate(source)) {\r\n\t\t\t\t\tdestination = new Date(source.getTime());\r\n\t\t\t\t} else if (isRegExp(source)) {\r\n\t\t\t\t\tdestination = new RegExp(source.source);\r\n\t\t\t\t} else if (isObject(source)) {\r\n\t\t\t\t\tdestination = copy(source, {}, stackSource, stackDest);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (source === destination) throw ngMinErr('cpi',\r\n\t\t\t \"Can't copy! Source and destination are identical.\");\r\n\r\n\t\t\tstackSource = stackSource || [];\r\n\t\t\tstackDest = stackDest || [];\r\n\r\n\t\t\tif (isObject(source)) {\r\n\t\t\t\tvar index = indexOf(stackSource, source);\r\n\t\t\t\tif (index !== -1) return stackDest[index];\r\n\r\n\t\t\t\tstackSource.push(source);\r\n\t\t\t\tstackDest.push(destination);\r\n\t\t\t}\r\n\r\n\t\t\tvar result;\r\n\t\t\tif (isArray(source)) {\r\n\t\t\t\tdestination.length = 0;\r\n\t\t\t\tfor (var i = 0; i < source.length; i++) {\r\n\t\t\t\t\tresult = copy(source[i], null, stackSource, stackDest);\r\n\t\t\t\t\tif (isObject(source[i])) {\r\n\t\t\t\t\t\tstackSource.push(source[i]);\r\n\t\t\t\t\t\tstackDest.push(result);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdestination.push(result);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tvar h = destination.$$hashKey;\r\n\t\t\t\tforEach(destination, function (value, key) {\r\n\t\t\t\t\tdelete destination[key];\r\n\t\t\t\t});\r\n\t\t\t\tfor (var key in source) {\r\n\t\t\t\t\tresult = copy(source[key], null, stackSource, stackDest);\r\n\t\t\t\t\tif (isObject(source[key])) {\r\n\t\t\t\t\t\tstackSource.push(source[key]);\r\n\t\t\t\t\t\tstackDest.push(result);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tdestination[key] = result;\r\n\t\t\t\t}\r\n\t\t\t\tsetHashKey(destination, h);\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t\treturn destination;\r\n\t}\r\n\r\n\t/**\r\n\t * Creates a shallow copy of an object, an array or a primitive\r\n\t */\r\n\tfunction shallowCopy(src, dst) {\r\n\t\tif (isArray(src)) {\r\n\t\t\tdst = dst || [];\r\n\r\n\t\t\tfor (var i = 0; i < src.length; i++) {\r\n\t\t\t\tdst[i] = src[i];\r\n\t\t\t}\r\n\t\t} else if (isObject(src)) {\r\n\t\t\tdst = dst || {};\r\n\r\n\t\t\tfor (var key in src) {\r\n\t\t\t\tif (hasOwnProperty.call(src, key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) {\r\n\t\t\t\t\tdst[key] = src[key];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn dst || src;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.equals\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Determines if two objects or two values are equivalent. Supports value types, regular\r\n\t * expressions, arrays and objects.\r\n\t *\r\n\t * Two objects or values are considered equivalent if at least one of the following is true:\r\n\t *\r\n\t * * Both objects or values pass `===` comparison.\r\n\t * * Both objects or values are of the same type and all of their properties are equal by\r\n\t * comparing them with `angular.equals`.\r\n\t * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal)\r\n\t * * Both values represent the same regular expression (In JavaScript,\r\n\t * /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual\r\n\t * representation matches).\r\n\t *\r\n\t * During a property comparison, properties of `function` type and properties with names\r\n\t * that begin with `$` are ignored.\r\n\t *\r\n\t * Scope and DOMWindow objects are being compared only by identify (`===`).\r\n\t *\r\n\t * @param {*} o1 Object or value to compare.\r\n\t * @param {*} o2 Object or value to compare.\r\n\t * @returns {boolean} True if arguments are equal.\r\n\t */\r\n\tfunction equals(o1, o2) {\r\n\t\tif (o1 === o2) return true;\r\n\t\tif (o1 === null || o2 === null) return false;\r\n\t\tif (o1 !== o1 && o2 !== o2) return true; // NaN === NaN\r\n\t\tvar t1 = typeof o1, t2 = typeof o2, length, key, keySet;\r\n\t\tif (t1 == t2) {\r\n\t\t\tif (t1 == 'object') {\r\n\t\t\t\tif (isArray(o1)) {\r\n\t\t\t\t\tif (!isArray(o2)) return false;\r\n\t\t\t\t\tif ((length = o1.length) == o2.length) {\r\n\t\t\t\t\t\tfor (key = 0; key < length; key++) {\r\n\t\t\t\t\t\t\tif (!equals(o1[key], o2[key])) return false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (isDate(o1)) {\r\n\t\t\t\t\treturn isDate(o2) && o1.getTime() == o2.getTime();\r\n\t\t\t\t} else if (isRegExp(o1) && isRegExp(o2)) {\r\n\t\t\t\t\treturn o1.toString() == o2.toString();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2)) return false;\r\n\t\t\t\t\tkeySet = {};\r\n\t\t\t\t\tfor (key in o1) {\r\n\t\t\t\t\t\tif (key.charAt(0) === '$' || isFunction(o1[key])) continue;\r\n\t\t\t\t\t\tif (!equals(o1[key], o2[key])) return false;\r\n\t\t\t\t\t\tkeySet[key] = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tfor (key in o2) {\r\n\t\t\t\t\t\tif (!keySet.hasOwnProperty(key) &&\r\n\t\t\t\t\t\t\tkey.charAt(0) !== '$' &&\r\n\t\t\t\t\t\t\to2[key] !== undefined &&\r\n\t\t\t\t\t\t\t!isFunction(o2[key])) return false;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\r\n\tfunction csp() {\r\n\t\treturn (document.securityPolicy && document.securityPolicy.isActive) ||\r\n\t\t\t(document.querySelector &&\r\n\t\t\t!!(document.querySelector('[ng-csp]') || document.querySelector('[data-ng-csp]')));\r\n\t}\r\n\r\n\r\n\tfunction concat(array1, array2, index) {\r\n\t\treturn array1.concat(slice.call(array2, index));\r\n\t}\r\n\r\n\tfunction sliceArgs(args, startIndex) {\r\n\t\treturn slice.call(args, startIndex || 0);\r\n\t}\r\n\r\n\r\n\t/* jshint -W101 */\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.bind\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for\r\n\t * `fn`). You can supply optional `args` that are prebound to the function. This feature is also\r\n\t * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as\r\n\t * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application).\r\n\t *\r\n\t * @param {Object} self Context which `fn` should be evaluated in.\r\n\t * @param {function()} fn Function to be bound.\r\n\t * @param {...*} args Optional arguments to be prebound to the `fn` function call.\r\n\t * @returns {function()} Function that wraps the `fn` with all the specified bindings.\r\n\t */\r\n\t/* jshint +W101 */\r\n\tfunction bind(self, fn) {\r\n\t\tvar curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];\r\n\t\tif (isFunction(fn) && !(fn instanceof RegExp)) {\r\n\t\t\treturn curryArgs.length\r\n\t\t\t ? function () {\r\n\t\t\t \treturn arguments.length\r\n\t\t\t\t ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0)))\r\n\t\t\t\t : fn.apply(self, curryArgs);\r\n\t\t\t }\r\n\t\t\t : function () {\r\n\t\t\t \treturn arguments.length\r\n\t\t\t\t ? fn.apply(self, arguments)\r\n\t\t\t\t : fn.call(self);\r\n\t\t\t };\r\n\t\t} else {\r\n\t\t\t// in IE, native methods are not functions so they cannot be bound (note: they don't need to be)\r\n\t\t\treturn fn;\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tfunction toJsonReplacer(key, value) {\r\n\t\tvar val = value;\r\n\r\n\t\tif (typeof key === 'string' && key.charAt(0) === '$') {\r\n\t\t\tval = undefined;\r\n\t\t} else if (isWindow(value)) {\r\n\t\t\tval = '$WINDOW';\r\n\t\t} else if (value && document === value) {\r\n\t\t\tval = '$DOCUMENT';\r\n\t\t} else if (isScope(value)) {\r\n\t\t\tval = '$SCOPE';\r\n\t\t}\r\n\r\n\t\treturn val;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.toJson\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Serializes input into a JSON-formatted string. Properties with leading $ characters will be\r\n\t * stripped since angular uses this notation internally.\r\n\t *\r\n\t * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.\r\n\t * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace.\r\n\t * @returns {string|undefined} JSON-ified string representing `obj`.\r\n\t */\r\n\tfunction toJson(obj, pretty) {\r\n\t\tif (typeof obj === 'undefined') return undefined;\r\n\t\treturn JSON.stringify(obj, toJsonReplacer, pretty ? ' ' : null);\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.fromJson\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Deserializes a JSON string.\r\n\t *\r\n\t * @param {string} json JSON string to deserialize.\r\n\t * @returns {Object|Array|string|number} Deserialized thingy.\r\n\t */\r\n\tfunction fromJson(json) {\r\n\t\treturn isString(json)\r\n\t\t\t? JSON.parse(json)\r\n\t\t\t: json;\r\n\t}\r\n\r\n\r\n\tfunction toBoolean(value) {\r\n\t\tif (typeof value === 'function') {\r\n\t\t\tvalue = true;\r\n\t\t} else if (value && value.length !== 0) {\r\n\t\t\tvar v = lowercase(\"\" + value);\r\n\t\t\tvalue = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');\r\n\t\t} else {\r\n\t\t\tvalue = false;\r\n\t\t}\r\n\t\treturn value;\r\n\t}\r\n\r\n\t/**\r\n\t * @returns {string} Returns the string representation of the element.\r\n\t */\r\n\tfunction startingTag(element) {\r\n\t\telement = jqLite(element).clone();\r\n\t\ttry {\r\n\t\t\t// turns out IE does not let you set .html() on elements which\r\n\t\t\t// are not allowed to have children. So we just ignore it.\r\n\t\t\telement.empty();\r\n\t\t} catch (e) { }\r\n\t\t// As Per DOM Standards\r\n\t\tvar TEXT_NODE = 3;\r\n\t\tvar elemHtml = jqLite('<div>').append(element).html();\r\n\t\ttry {\r\n\t\t\treturn element[0].nodeType === TEXT_NODE ? lowercase(elemHtml) :\r\n\t\t\t\telemHtml.\r\n\t\t\t\t match(/^(<[^>]+>)/)[1].\r\n\t\t\t\t replace(/^<([\\w\\-]+)/, function (match, nodeName) { return '<' + lowercase(nodeName); });\r\n\t\t} catch (e) {\r\n\t\t\treturn lowercase(elemHtml);\r\n\t\t}\r\n\r\n\t}\r\n\r\n\r\n\t/////////////////////////////////////////////////\r\n\r\n\t/**\r\n\t * Tries to decode the URI component without throwing an exception.\r\n\t *\r\n\t * @private\r\n\t * @param str value potential URI component to check.\r\n\t * @returns {boolean} True if `value` can be decoded\r\n\t * with the decodeURIComponent function.\r\n\t */\r\n\tfunction tryDecodeURIComponent(value) {\r\n\t\ttry {\r\n\t\t\treturn decodeURIComponent(value);\r\n\t\t} catch (e) {\r\n\t\t\t// Ignore any invalid uri component\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Parses an escaped url query string into key-value pairs.\r\n\t * @returns {Object.<string,boolean|Array>}\r\n\t */\r\n\tfunction parseKeyValue(/**string*/keyValue) {\r\n\t\tvar obj = {}, key_value, key;\r\n\t\tforEach((keyValue || \"\").split('&'), function (keyValue) {\r\n\t\t\tif (keyValue) {\r\n\t\t\t\tkey_value = keyValue.split('=');\r\n\t\t\t\tkey = tryDecodeURIComponent(key_value[0]);\r\n\t\t\t\tif (isDefined(key)) {\r\n\t\t\t\t\tvar val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;\r\n\t\t\t\t\tif (!obj[key]) {\r\n\t\t\t\t\t\tobj[key] = val;\r\n\t\t\t\t\t} else if (isArray(obj[key])) {\r\n\t\t\t\t\t\tobj[key].push(val);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tobj[key] = [obj[key], val];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn obj;\r\n\t}\r\n\r\n\tfunction toKeyValue(obj) {\r\n\t\tvar parts = [];\r\n\t\tforEach(obj, function (value, key) {\r\n\t\t\tif (isArray(value)) {\r\n\t\t\t\tforEach(value, function (arrayValue) {\r\n\t\t\t\t\tparts.push(encodeUriQuery(key, true) +\r\n\t\t\t\t\t\t\t (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true)));\r\n\t\t\t\t});\r\n\t\t\t} else {\r\n\t\t\t\tparts.push(encodeUriQuery(key, true) +\r\n\t\t\t\t\t\t (value === true ? '' : '=' + encodeUriQuery(value, true)));\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn parts.length ? parts.join('&') : '';\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * We need our custom method because encodeURIComponent is too aggressive and doesn't follow\r\n\t * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path\r\n\t * segments:\r\n\t * segment = *pchar\r\n\t * pchar = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\r\n\t * pct-encoded = \"%\" HEXDIG HEXDIG\r\n\t * unreserved = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\r\n\t * sub-delims = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\r\n\t * / \"*\" / \"+\" / \",\" / \";\" / \"=\"\r\n\t */\r\n\tfunction encodeUriSegment(val) {\r\n\t\treturn encodeUriQuery(val, true).\r\n\t\t\t\t replace(/%26/gi, '&').\r\n\t\t\t\t replace(/%3D/gi, '=').\r\n\t\t\t\t replace(/%2B/gi, '+');\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * This method is intended for encoding *key* or *value* parts of query component. We need a custom\r\n\t * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be\r\n\t * encoded per http://tools.ietf.org/html/rfc3986:\r\n\t * query = *( pchar / \"/\" / \"?\" )\r\n\t * pchar = unreserved / pct-encoded / sub-delims / \":\" / \"@\"\r\n\t * unreserved = ALPHA / DIGIT / \"-\" / \".\" / \"_\" / \"~\"\r\n\t * pct-encoded = \"%\" HEXDIG HEXDIG\r\n\t * sub-delims = \"!\" / \"$\" / \"&\" / \"'\" / \"(\" / \")\"\r\n\t * / \"*\" / \"+\" / \",\" / \";\" / \"=\"\r\n\t */\r\n\tfunction encodeUriQuery(val, pctEncodeSpaces) {\r\n\t\treturn encodeURIComponent(val).\r\n\t\t\t\t replace(/%40/gi, '@').\r\n\t\t\t\t replace(/%3A/gi, ':').\r\n\t\t\t\t replace(/%24/g, '$').\r\n\t\t\t\t replace(/%2C/gi, ',').\r\n\t\t\t\t replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngApp\r\n\t * @module ng\r\n\t *\r\n\t * @element ANY\r\n\t * @param {angular.Module} ngApp an optional application\r\n\t * {@link angular.module module} name to load.\r\n\t *\r\n\t * @description\r\n\t *\r\n\t * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive\r\n\t * designates the **root element** of the application and is typically placed near the root element\r\n\t * of the page - e.g. on the `<body>` or `<html>` tags.\r\n\t *\r\n\t * Only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp`\r\n\t * found in the document will be used to define the root element to auto-bootstrap as an\r\n\t * application. To run multiple applications in an HTML document you must manually bootstrap them using\r\n\t * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other.\r\n\t *\r\n\t * You can specify an **AngularJS module** to be used as the root module for the application. This\r\n\t * module will be loaded into the {@link auto.$injector} when the application is bootstrapped and\r\n\t * should contain the application code needed or have dependencies on other modules that will\r\n\t * contain the code. See {@link angular.module} for more information.\r\n\t *\r\n\t * In the example below if the `ngApp` directive were not placed on the `html` element then the\r\n\t * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`\r\n\t * would not be resolved to `3`.\r\n\t *\r\n\t * `ngApp` is the easiest, and most common, way to bootstrap an application.\r\n\t *\r\n\t <example module=\"ngAppDemo\">\r\n\t <file name=\"index.html\">\r\n\t <div ng-controller=\"ngAppDemoController\">\r\n\t\t I can add: {{a}} + {{b}} = {{ a+b }}\r\n\t </div>\r\n\t </file>\r\n\t <file name=\"script.js\">\r\n\t angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) {\r\n\t\t $scope.a = 1;\r\n\t\t $scope.b = 2;\r\n\t });\r\n\t </file>\r\n\t </example>\r\n\t *\r\n\t */\r\n\tfunction angularInit(element, bootstrap) {\r\n\t\tvar elements = [element],\r\n\t\t\tappElement,\r\n\t\t\tmodule,\r\n\t\t\tnames = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'],\r\n\t\t\tNG_APP_CLASS_REGEXP = /\\sng[:\\-]app(:\\s*([\\w\\d_]+);?)?\\s/;\r\n\r\n\t\tfunction append(element) {\r\n\t\t\telement && elements.push(element);\r\n\t\t}\r\n\r\n\t\tforEach(names, function (name) {\r\n\t\t\tnames[name] = true;\r\n\t\t\tappend(document.getElementById(name));\r\n\t\t\tname = name.replace(':', '\\\\:');\r\n\t\t\tif (element.querySelectorAll) {\r\n\t\t\t\tforEach(element.querySelectorAll('.' + name), append);\r\n\t\t\t\tforEach(element.querySelectorAll('.' + name + '\\\\:'), append);\r\n\t\t\t\tforEach(element.querySelectorAll('[' + name + ']'), append);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tforEach(elements, function (element) {\r\n\t\t\tif (!appElement) {\r\n\t\t\t\tvar className = ' ' + element.className + ' ';\r\n\t\t\t\tvar match = NG_APP_CLASS_REGEXP.exec(className);\r\n\t\t\t\tif (match) {\r\n\t\t\t\t\tappElement = element;\r\n\t\t\t\t\tmodule = (match[2] || '').replace(/\\s+/g, ',');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tforEach(element.attributes, function (attr) {\r\n\t\t\t\t\t\tif (!appElement && names[attr.name]) {\r\n\t\t\t\t\t\t\tappElement = element;\r\n\t\t\t\t\t\t\tmodule = attr.value;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t\tif (appElement) {\r\n\t\t\tbootstrap(appElement, module ? [module] : []);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.bootstrap\r\n\t * @module ng\r\n\t * @description\r\n\t * Use this function to manually start up angular application.\r\n\t *\r\n\t * See: {@link guide/bootstrap Bootstrap}\r\n\t *\r\n\t * Note that ngScenario-based end-to-end tests cannot use this function to bootstrap manually.\r\n\t * They must use {@link ng.directive:ngApp ngApp}.\r\n\t *\r\n\t * Angular will detect if it has been loaded into the browser more than once and only allow the\r\n\t * first loaded script to be bootstrapped and will report a warning to the browser console for\r\n\t * each of the subsequent scripts. This prevents strange results in applications, where otherwise\r\n\t * multiple instances of Angular try to work on the DOM.\r\n\t *\r\n\t * <example name=\"multi-bootstrap\" module=\"multi-bootstrap\">\r\n\t * <file name=\"index.html\">\r\n\t * <script src=\"../../../angular.js\"></script>\r\n\t * <div ng-controller=\"BrokenTable\">\r\n\t * <table>\r\n\t * <tr>\r\n\t * <th ng-repeat=\"heading in headings\">{{heading}}</th>\r\n\t * </tr>\r\n\t * <tr ng-repeat=\"filling in fillings\">\r\n\t * <td ng-repeat=\"fill in filling\">{{fill}}</td>\r\n\t * </tr>\r\n\t * </table>\r\n\t * </div>\r\n\t * </file>\r\n\t * <file name=\"controller.js\">\r\n\t * var app = angular.module('multi-bootstrap', [])\r\n\t *\r\n\t * .controller('BrokenTable', function($scope) {\r\n\t * $scope.headings = ['One', 'Two', 'Three'];\r\n\t * $scope.fillings = [[1, 2, 3], ['A', 'B', 'C'], [7, 8, 9]];\r\n\t * });\r\n\t * </file>\r\n\t * <file name=\"protractor.js\" type=\"protractor\">\r\n\t * it('should only insert one table cell for each item in $scope.fillings', function() {\r\n\t * expect(element.all(by.css('td')).count())\r\n\t * .toBe(9);\r\n\t * });\r\n\t * </file>\r\n\t * </example>\r\n\t *\r\n\t * @param {DOMElement} element DOM element which is the root of angular application.\r\n\t * @param {Array<String|Function|Array>=} modules an array of modules to load into the application.\r\n\t * Each item in the array should be the name of a predefined module or a (DI annotated)\r\n\t * function that will be invoked by the injector as a run block.\r\n\t * See: {@link angular.module modules}\r\n\t * @returns {auto.$injector} Returns the newly created injector for this app.\r\n\t */\r\n\tfunction bootstrap(element, modules) {\r\n\t\tvar doBootstrap = function () {\r\n\t\t\telement = jqLite(element);\r\n\r\n\t\t\tif (element.injector()) {\r\n\t\t\t\tvar tag = (element[0] === document) ? 'document' : startingTag(element);\r\n\t\t\t\tthrow ngMinErr('btstrpd', \"App Already Bootstrapped with this Element '{0}'\", tag);\r\n\t\t\t}\r\n\r\n\t\t\tmodules = modules || [];\r\n\t\t\tmodules.unshift(['$provide', function ($provide) {\r\n\t\t\t\t$provide.value('$rootElement', element);\r\n\t\t\t}]);\r\n\t\t\tmodules.unshift('ng');\r\n\t\t\tvar injector = createInjector(modules);\r\n\t\t\tinjector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', '$animate',\r\n\t\t\t function (scope, element, compile, injector, animate) {\r\n\t\t\t \tscope.$apply(function () {\r\n\t\t\t \t\telement.data('$injector', injector);\r\n\t\t\t \t\tcompile(element)(scope);\r\n\t\t\t \t});\r\n\t\t\t }]\r\n\t\t\t);\r\n\t\t\treturn injector;\r\n\t\t};\r\n\r\n\t\tvar NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;\r\n\r\n\t\tif (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {\r\n\t\t\treturn doBootstrap();\r\n\t\t}\r\n\r\n\t\twindow.name = window.name.replace(NG_DEFER_BOOTSTRAP, '');\r\n\t\tangular.resumeBootstrap = function (extraModules) {\r\n\t\t\tforEach(extraModules, function (module) {\r\n\t\t\t\tmodules.push(module);\r\n\t\t\t});\r\n\t\t\tdoBootstrap();\r\n\t\t};\r\n\t}\r\n\r\n\tvar SNAKE_CASE_REGEXP = /[A-Z]/g;\r\n\tfunction snake_case(name, separator) {\r\n\t\tseparator = separator || '_';\r\n\t\treturn name.replace(SNAKE_CASE_REGEXP, function (letter, pos) {\r\n\t\t\treturn (pos ? separator : '') + letter.toLowerCase();\r\n\t\t});\r\n\t}\r\n\r\n\tfunction bindJQuery() {\r\n\t\t// bind to jQuery if present;\r\n\t\tjQuery = window.jQuery;\r\n\t\t// Use jQuery if it exists with proper functionality, otherwise default to us.\r\n\t\t// Angular 1.2+ requires jQuery 1.7.1+ for on()/off() support.\r\n\t\tif (jQuery && jQuery.fn.on) {\r\n\t\t\tjqLite = jQuery;\r\n\t\t\textend(jQuery.fn, {\r\n\t\t\t\tscope: JQLitePrototype.scope,\r\n\t\t\t\tisolateScope: JQLitePrototype.isolateScope,\r\n\t\t\t\tcontroller: JQLitePrototype.controller,\r\n\t\t\t\tinjector: JQLitePrototype.injector,\r\n\t\t\t\tinheritedData: JQLitePrototype.inheritedData\r\n\t\t\t});\r\n\t\t\t// Method signature:\r\n\t\t\t// jqLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArguments)\r\n\t\t\tjqLitePatchJQueryRemove('remove', true, true, false);\r\n\t\t\tjqLitePatchJQueryRemove('empty', false, false, false);\r\n\t\t\tjqLitePatchJQueryRemove('html', false, false, true);\r\n\t\t} else {\r\n\t\t\tjqLite = JQLite;\r\n\t\t}\r\n\t\tangular.element = jqLite;\r\n\t}\r\n\r\n\t/**\r\n\t * throw error if the argument is falsy.\r\n\t */\r\n\tfunction assertArg(arg, name, reason) {\r\n\t\tif (!arg) {\r\n\t\t\tthrow ngMinErr('areq', \"Argument '{0}' is {1}\", (name || '?'), (reason || \"required\"));\r\n\t\t}\r\n\t\treturn arg;\r\n\t}\r\n\r\n\tfunction assertArgFn(arg, name, acceptArrayAnnotation) {\r\n\t\tif (acceptArrayAnnotation && isArray(arg)) {\r\n\t\t\targ = arg[arg.length - 1];\r\n\t\t}\r\n\r\n\t\tassertArg(isFunction(arg), name, 'not a function, got ' +\r\n\t\t\t(arg && typeof arg === 'object' ? arg.constructor.name || 'Object' : typeof arg));\r\n\t\treturn arg;\r\n\t}\r\n\r\n\t/**\r\n\t * throw error if the name given is hasOwnProperty\r\n\t * @param {String} name the name to test\r\n\t * @param {String} context the context in which the name is used, such as module or directive\r\n\t */\r\n\tfunction assertNotHasOwnProperty(name, context) {\r\n\t\tif (name === 'hasOwnProperty') {\r\n\t\t\tthrow ngMinErr('badname', \"hasOwnProperty is not a valid {0} name\", context);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Return the value accessible from the object by path. Any undefined traversals are ignored\r\n\t * @param {Object} obj starting object\r\n\t * @param {String} path path to traverse\r\n\t * @param {boolean} [bindFnToScope=true]\r\n\t * @returns {Object} value as accessible by path\r\n\t */\r\n\t//TODO(misko): this function needs to be removed\r\n\tfunction getter(obj, path, bindFnToScope) {\r\n\t\tif (!path) return obj;\r\n\t\tvar keys = path.split('.');\r\n\t\tvar key;\r\n\t\tvar lastInstance = obj;\r\n\t\tvar len = keys.length;\r\n\r\n\t\tfor (var i = 0; i < len; i++) {\r\n\t\t\tkey = keys[i];\r\n\t\t\tif (obj) {\r\n\t\t\t\tobj = (lastInstance = obj)[key];\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!bindFnToScope && isFunction(obj)) {\r\n\t\t\treturn bind(lastInstance, obj);\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\t/**\r\n\t * Return the DOM siblings between the first and last node in the given array.\r\n\t * @param {Array} array like object\r\n\t * @returns {DOMElement} object containing the elements\r\n\t */\r\n\tfunction getBlockElements(nodes) {\r\n\t\tvar startNode = nodes[0],\r\n\t\t\tendNode = nodes[nodes.length - 1];\r\n\t\tif (startNode === endNode) {\r\n\t\t\treturn jqLite(startNode);\r\n\t\t}\r\n\r\n\t\tvar element = startNode;\r\n\t\tvar elements = [element];\r\n\r\n\t\tdo {\r\n\t\t\telement = element.nextSibling;\r\n\t\t\tif (!element) break;\r\n\t\t\telements.push(element);\r\n\t\t} while (element !== endNode);\r\n\r\n\t\treturn jqLite(elements);\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc type\r\n\t * @name angular.Module\r\n\t * @module ng\r\n\t * @description\r\n\t *\r\n\t * Interface for configuring angular {@link angular.module modules}.\r\n\t */\r\n\r\n\tfunction setupModuleLoader(window) {\r\n\r\n\t\tvar $injectorMinErr = minErr('$injector');\r\n\t\tvar ngMinErr = minErr('ng');\r\n\r\n\t\tfunction ensure(obj, name, factory) {\r\n\t\t\treturn obj[name] || (obj[name] = factory());\r\n\t\t}\r\n\r\n\t\tvar angular = ensure(window, 'angular', Object);\r\n\r\n\t\t// We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap\r\n\t\tangular.$$minErr = angular.$$minErr || minErr;\r\n\r\n\t\treturn ensure(angular, 'module', function () {\r\n\t\t\t/** @type {Object.<string, angular.Module>} */\r\n\t\t\tvar modules = {};\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc function\r\n\t\t\t * @name angular.module\r\n\t\t\t * @module ng\r\n\t\t\t * @description\r\n\t\t\t *\r\n\t\t\t * The `angular.module` is a global place for creating, registering and retrieving Angular\r\n\t\t\t * modules.\r\n\t\t\t * All modules (angular core or 3rd party) that should be available to an application must be\r\n\t\t\t * registered using this mechanism.\r\n\t\t\t *\r\n\t\t\t * When passed two or more arguments, a new module is created. If passed only one argument, an\r\n\t\t\t * existing module (the name passed as the first argument to `module`) is retrieved.\r\n\t\t\t *\r\n\t\t\t *\r\n\t\t\t * # Module\r\n\t\t\t *\r\n\t\t\t * A module is a collection of services, directives, controllers, filters, and configuration information.\r\n\t\t\t * `angular.module` is used to configure the {@link auto.$injector $injector}.\r\n\t\t\t *\r\n\t\t\t * ```js\r\n\t\t\t * // Create a new module\r\n\t\t\t * var myModule = angular.module('myModule', []);\r\n\t\t\t *\r\n\t\t\t * // register a new service\r\n\t\t\t * myModule.value('appName', 'MyCoolApp');\r\n\t\t\t *\r\n\t\t\t * // configure existing services inside initialization blocks.\r\n\t\t\t * myModule.config(['$locationProvider', function($locationProvider) {\r\n\t\t\t * // Configure existing providers\r\n\t\t\t * $locationProvider.hashPrefix('!');\r\n\t\t\t * }]);\r\n\t\t\t * ```\r\n\t\t\t *\r\n\t\t\t * Then you can create an injector and load your modules like this:\r\n\t\t\t *\r\n\t\t\t * ```js\r\n\t\t\t * var injector = angular.injector(['ng', 'myModule'])\r\n\t\t\t * ```\r\n\t\t\t *\r\n\t\t\t * However it's more likely that you'll just use\r\n\t\t\t * {@link ng.directive:ngApp ngApp} or\r\n\t\t\t * {@link angular.bootstrap} to simplify this process for you.\r\n\t\t\t *\r\n\t\t\t * @param {!string} name The name of the module to create or retrieve.\r\n\t\t\t * @param {!Array.<string>=} requires If specified then new module is being created. If\r\n\t\t\t * unspecified then the module is being retrieved for further configuration.\r\n\t\t\t * @param {Function=} configFn Optional configuration function for the module. Same as\r\n\t\t\t * {@link angular.Module#config Module#config()}.\r\n\t\t\t * @returns {module} new module with the {@link angular.Module} api.\r\n\t\t\t */\r\n\t\t\treturn function module(name, requires, configFn) {\r\n\t\t\t\tvar assertNotHasOwnProperty = function (name, context) {\r\n\t\t\t\t\tif (name === 'hasOwnProperty') {\r\n\t\t\t\t\t\tthrow ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\tassertNotHasOwnProperty(name, 'module');\r\n\t\t\t\tif (requires && modules.hasOwnProperty(name)) {\r\n\t\t\t\t\tmodules[name] = null;\r\n\t\t\t\t}\r\n\t\t\t\treturn ensure(modules, name, function () {\r\n\t\t\t\t\tif (!requires) {\r\n\t\t\t\t\t\tthrow $injectorMinErr('nomod', \"Module '{0}' is not available! You either misspelled \" +\r\n\t\t\t\t\t\t \"the module name or forgot to load it. If registering a module ensure that you \" +\r\n\t\t\t\t\t\t \"specify the dependencies as the second argument.\", name);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t/** @type {!Array.<Array.<*>>} */\r\n\t\t\t\t\tvar invokeQueue = [];\r\n\r\n\t\t\t\t\t/** @type {!Array.<Function>} */\r\n\t\t\t\t\tvar runBlocks = [];\r\n\r\n\t\t\t\t\tvar config = invokeLater('$injector', 'invoke');\r\n\r\n\t\t\t\t\t/** @type {angular.Module} */\r\n\t\t\t\t\tvar moduleInstance = {\r\n\t\t\t\t\t\t// Private state\r\n\t\t\t\t\t\t_invokeQueue: invokeQueue,\r\n\t\t\t\t\t\t_runBlocks: runBlocks,\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * @ngdoc property\r\n\t\t\t\t\t\t * @name angular.Module#requires\r\n\t\t\t\t\t\t * @module ng\r\n\t\t\t\t\t\t * @returns {Array.<string>} List of module names which must be loaded before this module.\r\n\t\t\t\t\t\t * @description\r\n\t\t\t\t\t\t * Holds the list of modules which the injector will load before the current module is\r\n\t\t\t\t\t\t * loaded.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\trequires: requires,\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * @ngdoc property\r\n\t\t\t\t\t\t * @name angular.Module#name\r\n\t\t\t\t\t\t * @module ng\r\n\t\t\t\t\t\t * @returns {string} Name of the module.\r\n\t\t\t\t\t\t * @description\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tname: name,\r\n\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t\t * @name angular.Module#provider\r\n\t\t\t\t\t\t * @module ng\r\n\t\t\t\t\t\t * @param {string} name service name\r\n\t\t\t\t\t\t * @param {Function} providerType Construction function for creating new instance of the\r\n\t\t\t\t\t\t * service.\r\n\t\t\t\t\t\t * @description\r\n\t\t\t\t\t\t * See {@link auto.$provide#provider $provide.provider()}.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tprovider: invokeLater('$provide', 'provider'),\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t\t * @name angular.Module#factory\r\n\t\t\t\t\t\t * @module ng\r\n\t\t\t\t\t\t * @param {string} name service name\r\n\t\t\t\t\t\t * @param {Function} providerFunction Function for creating new instance of the service.\r\n\t\t\t\t\t\t * @description\r\n\t\t\t\t\t\t * See {@link auto.$provide#factory $provide.factory()}.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tfactory: invokeLater('$provide', 'factory'),\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t\t * @name angular.Module#service\r\n\t\t\t\t\t\t * @module ng\r\n\t\t\t\t\t\t * @param {string} name service name\r\n\t\t\t\t\t\t * @param {Function} constructor A constructor function that will be instantiated.\r\n\t\t\t\t\t\t * @description\r\n\t\t\t\t\t\t * See {@link auto.$provide#service $provide.service()}.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tservice: invokeLater('$provide', 'service'),\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t\t * @name angular.Module#value\r\n\t\t\t\t\t\t * @module ng\r\n\t\t\t\t\t\t * @param {string} name service name\r\n\t\t\t\t\t\t * @param {*} object Service instance object.\r\n\t\t\t\t\t\t * @description\r\n\t\t\t\t\t\t * See {@link auto.$provide#value $provide.value()}.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tvalue: invokeLater('$provide', 'value'),\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t\t * @name angular.Module#constant\r\n\t\t\t\t\t\t * @module ng\r\n\t\t\t\t\t\t * @param {string} name constant name\r\n\t\t\t\t\t\t * @param {*} object Constant value.\r\n\t\t\t\t\t\t * @description\r\n\t\t\t\t\t\t * Because the constant are fixed, they get applied before other provide methods.\r\n\t\t\t\t\t\t * See {@link auto.$provide#constant $provide.constant()}.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tconstant: invokeLater('$provide', 'constant', 'unshift'),\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t\t * @name angular.Module#animation\r\n\t\t\t\t\t\t * @module ng\r\n\t\t\t\t\t\t * @param {string} name animation name\r\n\t\t\t\t\t\t * @param {Function} animationFactory Factory function for creating new instance of an\r\n\t\t\t\t\t\t * animation.\r\n\t\t\t\t\t\t * @description\r\n\t\t\t\t\t\t *\r\n\t\t\t\t\t\t * **NOTE**: animations take effect only if the **ngAnimate** module is loaded.\r\n\t\t\t\t\t\t *\r\n\t\t\t\t\t\t *\r\n\t\t\t\t\t\t * Defines an animation hook that can be later used with\r\n\t\t\t\t\t\t * {@link ngAnimate.$animate $animate} service and directives that use this service.\r\n\t\t\t\t\t\t *\r\n\t\t\t\t\t\t * ```js\r\n\t\t\t\t\t\t * module.animation('.animation-name', function($inject1, $inject2) {\r\n\t\t\t\t\t\t * return {\r\n\t\t\t\t\t\t * eventName : function(element, done) {\r\n\t\t\t\t\t\t * //code to run the animation\r\n\t\t\t\t\t\t * //once complete, then run done()\r\n\t\t\t\t\t\t * return function cancellationFunction(element) {\r\n\t\t\t\t\t\t * //code to cancel the animation\r\n\t\t\t\t\t\t * }\r\n\t\t\t\t\t\t * }\r\n\t\t\t\t\t\t * }\r\n\t\t\t\t\t\t * })\r\n\t\t\t\t\t\t * ```\r\n\t\t\t\t\t\t *\r\n\t\t\t\t\t\t * See {@link ngAnimate.$animateProvider#register $animateProvider.register()} and\r\n\t\t\t\t\t\t * {@link ngAnimate ngAnimate module} for more information.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tanimation: invokeLater('$animateProvider', 'register'),\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t\t * @name angular.Module#filter\r\n\t\t\t\t\t\t * @module ng\r\n\t\t\t\t\t\t * @param {string} name Filter name.\r\n\t\t\t\t\t\t * @param {Function} filterFactory Factory function for creating new instance of filter.\r\n\t\t\t\t\t\t * @description\r\n\t\t\t\t\t\t * See {@link ng.$filterProvider#register $filterProvider.register()}.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tfilter: invokeLater('$filterProvider', 'register'),\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t\t * @name angular.Module#controller\r\n\t\t\t\t\t\t * @module ng\r\n\t\t\t\t\t\t * @param {string|Object} name Controller name, or an object map of controllers where the\r\n\t\t\t\t\t\t * keys are the names and the values are the constructors.\r\n\t\t\t\t\t\t * @param {Function} constructor Controller constructor function.\r\n\t\t\t\t\t\t * @description\r\n\t\t\t\t\t\t * See {@link ng.$controllerProvider#register $controllerProvider.register()}.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tcontroller: invokeLater('$controllerProvider', 'register'),\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t\t * @name angular.Module#directive\r\n\t\t\t\t\t\t * @module ng\r\n\t\t\t\t\t\t * @param {string|Object} name Directive name, or an object map of directives where the\r\n\t\t\t\t\t\t * keys are the names and the values are the factories.\r\n\t\t\t\t\t\t * @param {Function} directiveFactory Factory function for creating new instance of\r\n\t\t\t\t\t\t * directives.\r\n\t\t\t\t\t\t * @description\r\n\t\t\t\t\t\t * See {@link ng.$compileProvider#directive $compileProvider.directive()}.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tdirective: invokeLater('$compileProvider', 'directive'),\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t\t * @name angular.Module#config\r\n\t\t\t\t\t\t * @module ng\r\n\t\t\t\t\t\t * @param {Function} configFn Execute this function on module load. Useful for service\r\n\t\t\t\t\t\t * configuration.\r\n\t\t\t\t\t\t * @description\r\n\t\t\t\t\t\t * Use this method to register work which needs to be performed on module loading.\r\n\t\t\t\t\t\t * For more about how to configure services, see\r\n\t\t\t\t\t\t * {@link providers#providers_provider-recipe Provider Recipe}.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\tconfig: config,\r\n\r\n\t\t\t\t\t\t/**\r\n\t\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t\t * @name angular.Module#run\r\n\t\t\t\t\t\t * @module ng\r\n\t\t\t\t\t\t * @param {Function} initializationFn Execute this function after injector creation.\r\n\t\t\t\t\t\t * Useful for application initialization.\r\n\t\t\t\t\t\t * @description\r\n\t\t\t\t\t\t * Use this method to register work which should be performed when the injector is done\r\n\t\t\t\t\t\t * loading all modules.\r\n\t\t\t\t\t\t */\r\n\t\t\t\t\t\trun: function (block) {\r\n\t\t\t\t\t\t\trunBlocks.push(block);\r\n\t\t\t\t\t\t\treturn this;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tif (configFn) {\r\n\t\t\t\t\t\tconfig(configFn);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn moduleInstance;\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @param {string} provider\r\n\t\t\t\t\t * @param {string} method\r\n\t\t\t\t\t * @param {String=} insertMethod\r\n\t\t\t\t\t * @returns {angular.Module}\r\n\t\t\t\t\t */\r\n\t\t\t\t\tfunction invokeLater(provider, method, insertMethod) {\r\n\t\t\t\t\t\treturn function () {\r\n\t\t\t\t\t\t\tinvokeQueue[insertMethod || 'push']([provider, method, arguments]);\r\n\t\t\t\t\t\t\treturn moduleInstance;\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t};\r\n\t\t});\r\n\r\n\t}\r\n\r\n\t/* global\r\n\t\tangularModule: true,\r\n\t\tversion: true,\r\n\t\r\n\t\t$LocaleProvider,\r\n\t\t$CompileProvider,\r\n\t\r\n\t\thtmlAnchorDirective,\r\n\t\tinputDirective,\r\n\t\tinputDirective,\r\n\t\tformDirective,\r\n\t\tscriptDirective,\r\n\t\tselectDirective,\r\n\t\tstyleDirective,\r\n\t\toptionDirective,\r\n\t\tngBindDirective,\r\n\t\tngBindHtmlDirective,\r\n\t\tngBindTemplateDirective,\r\n\t\tngClassDirective,\r\n\t\tngClassEvenDirective,\r\n\t\tngClassOddDirective,\r\n\t\tngCspDirective,\r\n\t\tngCloakDirective,\r\n\t\tngControllerDirective,\r\n\t\tngFormDirective,\r\n\t\tngHideDirective,\r\n\t\tngIfDirective,\r\n\t\tngIncludeDirective,\r\n\t\tngIncludeFillContentDirective,\r\n\t\tngInitDirective,\r\n\t\tngNonBindableDirective,\r\n\t\tngPluralizeDirective,\r\n\t\tngRepeatDirective,\r\n\t\tngShowDirective,\r\n\t\tngStyleDirective,\r\n\t\tngSwitchDirective,\r\n\t\tngSwitchWhenDirective,\r\n\t\tngSwitchDefaultDirective,\r\n\t\tngOptionsDirective,\r\n\t\tngTranscludeDirective,\r\n\t\tngModelDirective,\r\n\t\tngListDirective,\r\n\t\tngChangeDirective,\r\n\t\trequiredDirective,\r\n\t\trequiredDirective,\r\n\t\tngValueDirective,\r\n\t\tngAttributeAliasDirectives,\r\n\t\tngEventDirectives,\r\n\t\r\n\t\t$AnchorScrollProvider,\r\n\t\t$AnimateProvider,\r\n\t\t$BrowserProvider,\r\n\t\t$CacheFactoryProvider,\r\n\t\t$ControllerProvider,\r\n\t\t$DocumentProvider,\r\n\t\t$ExceptionHandlerProvider,\r\n\t\t$FilterProvider,\r\n\t\t$InterpolateProvider,\r\n\t\t$IntervalProvider,\r\n\t\t$HttpProvider,\r\n\t\t$HttpBackendProvider,\r\n\t\t$LocationProvider,\r\n\t\t$LogProvider,\r\n\t\t$ParseProvider,\r\n\t\t$RootScopeProvider,\r\n\t\t$QProvider,\r\n\t\t$$SanitizeUriProvider,\r\n\t\t$SceProvider,\r\n\t\t$SceDelegateProvider,\r\n\t\t$SnifferProvider,\r\n\t\t$TemplateCacheProvider,\r\n\t\t$TimeoutProvider,\r\n\t\t$$RAFProvider,\r\n\t\t$$AsyncCallbackProvider,\r\n\t\t$WindowProvider\r\n\t*/\r\n\r\n\r\n\t/**\r\n\t * @ngdoc object\r\n\t * @name angular.version\r\n\t * @module ng\r\n\t * @description\r\n\t * An object that contains information about the current AngularJS version. This object has the\r\n\t * following properties:\r\n\t *\r\n\t * - `full` – `{string}` – Full version string, such as \"0.9.18\".\r\n\t * - `major` – `{number}` – Major version number, such as \"0\".\r\n\t * - `minor` – `{number}` – Minor version number, such as \"9\".\r\n\t * - `dot` – `{number}` – Dot version number, such as \"18\".\r\n\t * - `codeName` – `{string}` – Code name of the release, such as \"jiggling-armfat\".\r\n\t */\r\n\tvar version = {\r\n\t\tfull: '1.2.19', // all of these placeholder strings will be replaced by grunt's\r\n\t\tmajor: 1, // package task\r\n\t\tminor: 2,\r\n\t\tdot: 19,\r\n\t\tcodeName: 'precognitive-flashbacks'\r\n\t};\r\n\r\n\r\n\tfunction publishExternalAPI(angular) {\r\n\t\textend(angular, {\r\n\t\t\t'bootstrap': bootstrap,\r\n\t\t\t'copy': copy,\r\n\t\t\t'extend': extend,\r\n\t\t\t'equals': equals,\r\n\t\t\t'element': jqLite,\r\n\t\t\t'forEach': forEach,\r\n\t\t\t'injector': createInjector,\r\n\t\t\t'noop': noop,\r\n\t\t\t'bind': bind,\r\n\t\t\t'toJson': toJson,\r\n\t\t\t'fromJson': fromJson,\r\n\t\t\t'identity': identity,\r\n\t\t\t'isUndefined': isUndefined,\r\n\t\t\t'isDefined': isDefined,\r\n\t\t\t'isString': isString,\r\n\t\t\t'isFunction': isFunction,\r\n\t\t\t'isObject': isObject,\r\n\t\t\t'isNumber': isNumber,\r\n\t\t\t'isElement': isElement,\r\n\t\t\t'isArray': isArray,\r\n\t\t\t'version': version,\r\n\t\t\t'isDate': isDate,\r\n\t\t\t'lowercase': lowercase,\r\n\t\t\t'uppercase': uppercase,\r\n\t\t\t'callbacks': { counter: 0 },\r\n\t\t\t'$$minErr': minErr,\r\n\t\t\t'$$csp': csp\r\n\t\t});\r\n\r\n\t\tangularModule = setupModuleLoader(window);\r\n\t\ttry {\r\n\t\t\tangularModule('ngLocale');\r\n\t\t} catch (e) {\r\n\t\t\tangularModule('ngLocale', []).provider('$locale', $LocaleProvider);\r\n\t\t}\r\n\r\n\t\tangularModule('ng', ['ngLocale'], ['$provide',\r\n\t\t function ngModule($provide) {\r\n\t\t \t// $$sanitizeUriProvider needs to be before $compileProvider as it is used by it.\r\n\t\t \t$provide.provider({\r\n\t\t \t\t$$sanitizeUri: $$SanitizeUriProvider\r\n\t\t \t});\r\n\t\t \t$provide.provider('$compile', $CompileProvider).\r\n\t\t\t directive({\r\n\t\t\t \ta: htmlAnchorDirective,\r\n\t\t\t \tinput: inputDirective,\r\n\t\t\t \ttextarea: inputDirective,\r\n\t\t\t \tform: formDirective,\r\n\t\t\t \tscript: scriptDirective,\r\n\t\t\t \tselect: selectDirective,\r\n\t\t\t \tstyle: styleDirective,\r\n\t\t\t \toption: optionDirective,\r\n\t\t\t \tngBind: ngBindDirective,\r\n\t\t\t \tngBindHtml: ngBindHtmlDirective,\r\n\t\t\t \tngBindTemplate: ngBindTemplateDirective,\r\n\t\t\t \tngClass: ngClassDirective,\r\n\t\t\t \tngClassEven: ngClassEvenDirective,\r\n\t\t\t \tngClassOdd: ngClassOddDirective,\r\n\t\t\t \tngCloak: ngCloakDirective,\r\n\t\t\t \tngController: ngControllerDirective,\r\n\t\t\t \tngForm: ngFormDirective,\r\n\t\t\t \tngHide: ngHideDirective,\r\n\t\t\t \tngIf: ngIfDirective,\r\n\t\t\t \tngInclude: ngIncludeDirective,\r\n\t\t\t \tngInit: ngInitDirective,\r\n\t\t\t \tngNonBindable: ngNonBindableDirective,\r\n\t\t\t \tngPluralize: ngPluralizeDirective,\r\n\t\t\t \tngRepeat: ngRepeatDirective,\r\n\t\t\t \tngShow: ngShowDirective,\r\n\t\t\t \tngStyle: ngStyleDirective,\r\n\t\t\t \tngSwitch: ngSwitchDirective,\r\n\t\t\t \tngSwitchWhen: ngSwitchWhenDirective,\r\n\t\t\t \tngSwitchDefault: ngSwitchDefaultDirective,\r\n\t\t\t \tngOptions: ngOptionsDirective,\r\n\t\t\t \tngTransclude: ngTranscludeDirective,\r\n\t\t\t \tngModel: ngModelDirective,\r\n\t\t\t \tngList: ngListDirective,\r\n\t\t\t \tngChange: ngChangeDirective,\r\n\t\t\t \trequired: requiredDirective,\r\n\t\t\t \tngRequired: requiredDirective,\r\n\t\t\t \tngValue: ngValueDirective\r\n\t\t\t }).\r\n\t\t\t directive({\r\n\t\t\t \tngInclude: ngIncludeFillContentDirective\r\n\t\t\t }).\r\n\t\t\t directive(ngAttributeAliasDirectives).\r\n\t\t\t directive(ngEventDirectives);\r\n\t\t \t$provide.provider({\r\n\t\t \t\t$anchorScroll: $AnchorScrollProvider,\r\n\t\t \t\t$animate: $AnimateProvider,\r\n\t\t \t\t$browser: $BrowserProvider,\r\n\t\t \t\t$cacheFactory: $CacheFactoryProvider,\r\n\t\t \t\t$controller: $ControllerProvider,\r\n\t\t \t\t$document: $DocumentProvider,\r\n\t\t \t\t$exceptionHandler: $ExceptionHandlerProvider,\r\n\t\t \t\t$filter: $FilterProvider,\r\n\t\t \t\t$interpolate: $InterpolateProvider,\r\n\t\t \t\t$interval: $IntervalProvider,\r\n\t\t \t\t$http: $HttpProvider,\r\n\t\t \t\t$httpBackend: $HttpBackendProvider,\r\n\t\t \t\t$location: $LocationProvider,\r\n\t\t \t\t$log: $LogProvider,\r\n\t\t \t\t$parse: $ParseProvider,\r\n\t\t \t\t$rootScope: $RootScopeProvider,\r\n\t\t \t\t$q: $QProvider,\r\n\t\t \t\t$sce: $SceProvider,\r\n\t\t \t\t$sceDelegate: $SceDelegateProvider,\r\n\t\t \t\t$sniffer: $SnifferProvider,\r\n\t\t \t\t$templateCache: $TemplateCacheProvider,\r\n\t\t \t\t$timeout: $TimeoutProvider,\r\n\t\t \t\t$window: $WindowProvider,\r\n\t\t \t\t$$rAF: $$RAFProvider,\r\n\t\t \t\t$$asyncCallback: $$AsyncCallbackProvider\r\n\t\t \t});\r\n\t\t }\r\n\t\t]);\r\n\t}\r\n\r\n\t/* global\r\n\t\r\n\t -JQLitePrototype,\r\n\t -addEventListenerFn,\r\n\t -removeEventListenerFn,\r\n\t -BOOLEAN_ATTR\r\n\t*/\r\n\r\n\t//////////////////////////////////\r\n\t//JQLite\r\n\t//////////////////////////////////\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @name angular.element\r\n\t * @module ng\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.\r\n\t *\r\n\t * If jQuery is available, `angular.element` is an alias for the\r\n\t * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element`\r\n\t * delegates to Angular's built-in subset of jQuery, called \"jQuery lite\" or \"jqLite.\"\r\n\t *\r\n\t * <div class=\"alert alert-success\">jqLite is a tiny, API-compatible subset of jQuery that allows\r\n\t * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most\r\n\t * commonly needed functionality with the goal of having a very small footprint.</div>\r\n\t *\r\n\t * To use jQuery, simply load it before `DOMContentLoaded` event fired.\r\n\t *\r\n\t * <div class=\"alert\">**Note:** all element references in Angular are always wrapped with jQuery or\r\n\t * jqLite; they are never raw DOM references.</div>\r\n\t *\r\n\t * ## Angular's jqLite\r\n\t * jqLite provides only the following jQuery methods:\r\n\t *\r\n\t * - [`addClass()`](http://api.jquery.com/addClass/)\r\n\t * - [`after()`](http://api.jquery.com/after/)\r\n\t * - [`append()`](http://api.jquery.com/append/)\r\n\t * - [`attr()`](http://api.jquery.com/attr/)\r\n\t * - [`bind()`](http://api.jquery.com/bind/) - Does not support namespaces, selectors or eventData\r\n\t * - [`children()`](http://api.jquery.com/children/) - Does not support selectors\r\n\t * - [`clone()`](http://api.jquery.com/clone/)\r\n\t * - [`contents()`](http://api.jquery.com/contents/)\r\n\t * - [`css()`](http://api.jquery.com/css/)\r\n\t * - [`data()`](http://api.jquery.com/data/)\r\n\t * - [`empty()`](http://api.jquery.com/empty/)\r\n\t * - [`eq()`](http://api.jquery.com/eq/)\r\n\t * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name\r\n\t * - [`hasClass()`](http://api.jquery.com/hasClass/)\r\n\t * - [`html()`](http://api.jquery.com/html/)\r\n\t * - [`next()`](http://api.jquery.com/next/) - Does not support selectors\r\n\t * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData\r\n\t * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or selectors\r\n\t * - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors\r\n\t * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors\r\n\t * - [`prepend()`](http://api.jquery.com/prepend/)\r\n\t * - [`prop()`](http://api.jquery.com/prop/)\r\n\t * - [`ready()`](http://api.jquery.com/ready/)\r\n\t * - [`remove()`](http://api.jquery.com/remove/)\r\n\t * - [`removeAttr()`](http://api.jquery.com/removeAttr/)\r\n\t * - [`removeClass()`](http://api.jquery.com/removeClass/)\r\n\t * - [`removeData()`](http://api.jquery.com/removeData/)\r\n\t * - [`replaceWith()`](http://api.jquery.com/replaceWith/)\r\n\t * - [`text()`](http://api.jquery.com/text/)\r\n\t * - [`toggleClass()`](http://api.jquery.com/toggleClass/)\r\n\t * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers.\r\n\t * - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces\r\n\t * - [`val()`](http://api.jquery.com/val/)\r\n\t * - [`wrap()`](http://api.jquery.com/wrap/)\r\n\t *\r\n\t * ## jQuery/jqLite Extras\r\n\t * Angular also provides the following additional methods and events to both jQuery and jqLite:\r\n\t *\r\n\t * ### Events\r\n\t * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event\r\n\t * on all DOM nodes being removed. This can be used to clean up any 3rd party bindings to the DOM\r\n\t * element before it is removed.\r\n\t *\r\n\t * ### Methods\r\n\t * - `controller(name)` - retrieves the controller of the current element or its parent. By default\r\n\t * retrieves controller associated with the `ngController` directive. If `name` is provided as\r\n\t * camelCase directive name, then the controller for this directive will be retrieved (e.g.\r\n\t * `'ngModel'`).\r\n\t * - `injector()` - retrieves the injector of the current element or its parent.\r\n\t * - `scope()` - retrieves the {@link ng.$rootScope.Scope scope} of the current\r\n\t * element or its parent.\r\n\t * - `isolateScope()` - retrieves an isolate {@link ng.$rootScope.Scope scope} if one is attached directly to the\r\n\t * current element. This getter should be used only on elements that contain a directive which starts a new isolate\r\n\t * scope. Calling `scope()` on this element always returns the original non-isolate scope.\r\n\t * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top\r\n\t * parent element is reached.\r\n\t *\r\n\t * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.\r\n\t * @returns {Object} jQuery object.\r\n\t */\r\n\r\n\tJQLite.expando = 'ng339';\r\n\r\n\tvar jqCache = JQLite.cache = {},\r\n\t\tjqId = 1,\r\n\t\taddEventListenerFn = (window.document.addEventListener\r\n\t\t ? function (element, type, fn) { element.addEventListener(type, fn, false); }\r\n\t\t : function (element, type, fn) { element.attachEvent('on' + type, fn); }),\r\n\t\tremoveEventListenerFn = (window.document.removeEventListener\r\n\t\t ? function (element, type, fn) { element.removeEventListener(type, fn, false); }\r\n\t\t : function (element, type, fn) { element.detachEvent('on' + type, fn); });\r\n\r\n\t/*\r\n\t * !!! This is an undocumented \"private\" function !!!\r\n\t */\r\n\tvar jqData = JQLite._data = function (node) {\r\n\t\t//jQuery always returns an object on cache miss\r\n\t\treturn this.cache[node[this.expando]] || {};\r\n\t};\r\n\r\n\tfunction jqNextId() { return ++jqId; }\r\n\r\n\r\n\tvar SPECIAL_CHARS_REGEXP = /([\\:\\-\\_]+(.))/g;\r\n\tvar MOZ_HACK_REGEXP = /^moz([A-Z])/;\r\n\tvar jqLiteMinErr = minErr('jqLite');\r\n\r\n\t/**\r\n\t * Converts snake_case to camelCase.\r\n\t * Also there is special case for Moz prefix starting with upper case letter.\r\n\t * @param name Name to normalize\r\n\t */\r\n\tfunction camelCase(name) {\r\n\t\treturn name.\r\n\t\t replace(SPECIAL_CHARS_REGEXP, function (_, separator, letter, offset) {\r\n\t\t \treturn offset ? letter.toUpperCase() : letter;\r\n\t\t }).\r\n\t\t replace(MOZ_HACK_REGEXP, 'Moz$1');\r\n\t}\r\n\r\n\t/////////////////////////////////////////////\r\n\t// jQuery mutation patch\r\n\t//\r\n\t// In conjunction with bindJQuery intercepts all jQuery's DOM destruction apis and fires a\r\n\t// $destroy event on all DOM nodes being removed.\r\n\t//\r\n\t/////////////////////////////////////////////\r\n\r\n\tfunction jqLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArguments) {\r\n\t\tvar originalJqFn = jQuery.fn[name];\r\n\t\toriginalJqFn = originalJqFn.$original || originalJqFn;\r\n\t\tremovePatch.$original = originalJqFn;\r\n\t\tjQuery.fn[name] = removePatch;\r\n\r\n\t\tfunction removePatch(param) {\r\n\t\t\t// jshint -W040\r\n\t\t\tvar list = filterElems && param ? [this.filter(param)] : [this],\r\n\t\t\t\tfireEvent = dispatchThis,\r\n\t\t\t\tset, setIndex, setLength,\r\n\t\t\t\telement, childIndex, childLength, children;\r\n\r\n\t\t\tif (!getterIfNoArguments || param != null) {\r\n\t\t\t\twhile (list.length) {\r\n\t\t\t\t\tset = list.shift();\r\n\t\t\t\t\tfor (setIndex = 0, setLength = set.length; setIndex < setLength; setIndex++) {\r\n\t\t\t\t\t\telement = jqLite(set[setIndex]);\r\n\t\t\t\t\t\tif (fireEvent) {\r\n\t\t\t\t\t\t\telement.triggerHandler('$destroy');\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tfireEvent = !fireEvent;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tfor (childIndex = 0, childLength = (children = element.children()).length;\r\n\t\t\t\t\t\t\tchildIndex < childLength;\r\n\t\t\t\t\t\t\tchildIndex++) {\r\n\t\t\t\t\t\t\tlist.push(jQuery(children[childIndex]));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn originalJqFn.apply(this, arguments);\r\n\t\t}\r\n\t}\r\n\r\n\tvar SINGLE_TAG_REGEXP = /^<(\\w+)\\s*\\/?>(?:<\\/\\1>|)$/;\r\n\tvar HTML_REGEXP = /<|&#?\\w+;/;\r\n\tvar TAG_NAME_REGEXP = /<([\\w:]+)/;\r\n\tvar XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\\w:]+)[^>]*)\\/>/gi;\r\n\r\n\tvar wrapMap = {\r\n\t\t'option': [1, '<select multiple=\"multiple\">', '</select>'],\r\n\r\n\t\t'thead': [1, '<table>', '</table>'],\r\n\t\t'col': [2, '<table><colgroup>', '</colgroup></table>'],\r\n\t\t'tr': [2, '<table><tbody>', '</tbody></table>'],\r\n\t\t'td': [3, '<table><tbody><tr>', '</tr></tbody></table>'],\r\n\t\t'_default': [0, \"\", \"\"]\r\n\t};\r\n\r\n\twrapMap.optgroup = wrapMap.option;\r\n\twrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\r\n\twrapMap.th = wrapMap.td;\r\n\r\n\tfunction jqLiteIsTextNode(html) {\r\n\t\treturn !HTML_REGEXP.test(html);\r\n\t}\r\n\r\n\tfunction jqLiteBuildFragment(html, context) {\r\n\t\tvar elem, tmp, tag, wrap,\r\n\t\t\tfragment = context.createDocumentFragment(),\r\n\t\t\tnodes = [], i, j, jj;\r\n\r\n\t\tif (jqLiteIsTextNode(html)) {\r\n\t\t\t// Convert non-html into a text node\r\n\t\t\tnodes.push(context.createTextNode(html));\r\n\t\t} else {\r\n\t\t\ttmp = fragment.appendChild(context.createElement('div'));\r\n\t\t\t// Convert html into DOM nodes\r\n\t\t\ttag = (TAG_NAME_REGEXP.exec(html) || [\"\", \"\"])[1].toLowerCase();\r\n\t\t\twrap = wrapMap[tag] || wrapMap._default;\r\n\t\t\ttmp.innerHTML = '<div> </div>' +\r\n\t\t\t wrap[1] + html.replace(XHTML_TAG_REGEXP, \"<$1></$2>\") + wrap[2];\r\n\t\t\ttmp.removeChild(tmp.firstChild);\r\n\r\n\t\t\t// Descend through wrappers to the right content\r\n\t\t\ti = wrap[0];\r\n\t\t\twhile (i--) {\r\n\t\t\t\ttmp = tmp.lastChild;\r\n\t\t\t}\r\n\r\n\t\t\tfor (j = 0, jj = tmp.childNodes.length; j < jj; ++j) nodes.push(tmp.childNodes[j]);\r\n\r\n\t\t\ttmp = fragment.firstChild;\r\n\t\t\ttmp.textContent = \"\";\r\n\t\t}\r\n\r\n\t\t// Remove wrapper from fragment\r\n\t\tfragment.textContent = \"\";\r\n\t\tfragment.innerHTML = \"\"; // Clear inner HTML\r\n\t\treturn nodes;\r\n\t}\r\n\r\n\tfunction jqLiteParseHTML(html, context) {\r\n\t\tcontext = context || document;\r\n\t\tvar parsed;\r\n\r\n\t\tif ((parsed = SINGLE_TAG_REGEXP.exec(html))) {\r\n\t\t\treturn [context.createElement(parsed[1])];\r\n\t\t}\r\n\r\n\t\treturn jqLiteBuildFragment(html, context);\r\n\t}\r\n\r\n\t/////////////////////////////////////////////\r\n\tfunction JQLite(element) {\r\n\t\tif (element instanceof JQLite) {\r\n\t\t\treturn element;\r\n\t\t}\r\n\t\tif (isString(element)) {\r\n\t\t\telement = trim(element);\r\n\t\t}\r\n\t\tif (!(this instanceof JQLite)) {\r\n\t\t\tif (isString(element) && element.charAt(0) != '<') {\r\n\t\t\t\tthrow jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element');\r\n\t\t\t}\r\n\t\t\treturn new JQLite(element);\r\n\t\t}\r\n\r\n\t\tif (isString(element)) {\r\n\t\t\tjqLiteAddNodes(this, jqLiteParseHTML(element));\r\n\t\t\tvar fragment = jqLite(document.createDocumentFragment());\r\n\t\t\tfragment.append(this);\r\n\t\t} else {\r\n\t\t\tjqLiteAddNodes(this, element);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction jqLiteClone(element) {\r\n\t\treturn element.cloneNode(true);\r\n\t}\r\n\r\n\tfunction jqLiteDealoc(element) {\r\n\t\tjqLiteRemoveData(element);\r\n\t\tfor (var i = 0, children = element.childNodes || []; i < children.length; i++) {\r\n\t\t\tjqLiteDealoc(children[i]);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction jqLiteOff(element, type, fn, unsupported) {\r\n\t\tif (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument');\r\n\r\n\t\tvar events = jqLiteExpandoStore(element, 'events'),\r\n\t\t\thandle = jqLiteExpandoStore(element, 'handle');\r\n\r\n\t\tif (!handle) return; //no listeners registered\r\n\r\n\t\tif (isUndefined(type)) {\r\n\t\t\tforEach(events, function (eventHandler, type) {\r\n\t\t\t\tremoveEventListenerFn(element, type, eventHandler);\r\n\t\t\t\tdelete events[type];\r\n\t\t\t});\r\n\t\t} else {\r\n\t\t\tforEach(type.split(' '), function (type) {\r\n\t\t\t\tif (isUndefined(fn)) {\r\n\t\t\t\t\tremoveEventListenerFn(element, type, events[type]);\r\n\t\t\t\t\tdelete events[type];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tarrayRemove(events[type] || [], fn);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfunction jqLiteRemoveData(element, name) {\r\n\t\tvar expandoId = element.ng339,\r\n\t\t\texpandoStore = jqCache[expandoId];\r\n\r\n\t\tif (expandoStore) {\r\n\t\t\tif (name) {\r\n\t\t\t\tdelete jqCache[expandoId].data[name];\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (expandoStore.handle) {\r\n\t\t\t\texpandoStore.events.$destroy && expandoStore.handle({}, '$destroy');\r\n\t\t\t\tjqLiteOff(element);\r\n\t\t\t}\r\n\t\t\tdelete jqCache[expandoId];\r\n\t\t\telement.ng339 = undefined; // don't delete DOM expandos. IE and Chrome don't like it\r\n\t\t}\r\n\t}\r\n\r\n\tfunction jqLiteExpandoStore(element, key, value) {\r\n\t\tvar expandoId = element.ng339,\r\n\t\t\texpandoStore = jqCache[expandoId || -1];\r\n\r\n\t\tif (isDefined(value)) {\r\n\t\t\tif (!expandoStore) {\r\n\t\t\t\telement.ng339 = expandoId = jqNextId();\r\n\t\t\t\texpandoStore = jqCache[expandoId] = {};\r\n\t\t\t}\r\n\t\t\texpandoStore[key] = value;\r\n\t\t} else {\r\n\t\t\treturn expandoStore && expandoStore[key];\r\n\t\t}\r\n\t}\r\n\r\n\tfunction jqLiteData(element, key, value) {\r\n\t\tvar data = jqLiteExpandoStore(element, 'data'),\r\n\t\t\tisSetter = isDefined(value),\r\n\t\t\tkeyDefined = !isSetter && isDefined(key),\r\n\t\t\tisSimpleGetter = keyDefined && !isObject(key);\r\n\r\n\t\tif (!data && !isSimpleGetter) {\r\n\t\t\tjqLiteExpandoStore(element, 'data', data = {});\r\n\t\t}\r\n\r\n\t\tif (isSetter) {\r\n\t\t\tdata[key] = value;\r\n\t\t} else {\r\n\t\t\tif (keyDefined) {\r\n\t\t\t\tif (isSimpleGetter) {\r\n\t\t\t\t\t// don't create data in this case.\r\n\t\t\t\t\treturn data && data[key];\r\n\t\t\t\t} else {\r\n\t\t\t\t\textend(data, key);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\treturn data;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction jqLiteHasClass(element, selector) {\r\n\t\tif (!element.getAttribute) return false;\r\n\t\treturn ((\" \" + (element.getAttribute('class') || '') + \" \").replace(/[\\n\\t]/g, \" \").\r\n\t\t\tindexOf(\" \" + selector + \" \") > -1);\r\n\t}\r\n\r\n\tfunction jqLiteRemoveClass(element, cssClasses) {\r\n\t\tif (cssClasses && element.setAttribute) {\r\n\t\t\tforEach(cssClasses.split(' '), function (cssClass) {\r\n\t\t\t\telement.setAttribute('class', trim(\r\n\t\t\t\t\t(\" \" + (element.getAttribute('class') || '') + \" \")\r\n\t\t\t\t\t.replace(/[\\n\\t]/g, \" \")\r\n\t\t\t\t\t.replace(\" \" + trim(cssClass) + \" \", \" \"))\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfunction jqLiteAddClass(element, cssClasses) {\r\n\t\tif (cssClasses && element.setAttribute) {\r\n\t\t\tvar existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')\r\n\t\t\t\t\t\t\t\t\t.replace(/[\\n\\t]/g, \" \");\r\n\r\n\t\t\tforEach(cssClasses.split(' '), function (cssClass) {\r\n\t\t\t\tcssClass = trim(cssClass);\r\n\t\t\t\tif (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {\r\n\t\t\t\t\texistingClasses += cssClass + ' ';\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\telement.setAttribute('class', trim(existingClasses));\r\n\t\t}\r\n\t}\r\n\r\n\tfunction jqLiteAddNodes(root, elements) {\r\n\t\tif (elements) {\r\n\t\t\telements = (!elements.nodeName && isDefined(elements.length) && !isWindow(elements))\r\n\t\t\t ? elements\r\n\t\t\t : [elements];\r\n\t\t\tfor (var i = 0; i < elements.length; i++) {\r\n\t\t\t\troot.push(elements[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tfunction jqLiteController(element, name) {\r\n\t\treturn jqLiteInheritedData(element, '$' + (name || 'ngController') + 'Controller');\r\n\t}\r\n\r\n\tfunction jqLiteInheritedData(element, name, value) {\r\n\t\telement = jqLite(element);\r\n\r\n\t\t// if element is the document object work with the html element instead\r\n\t\t// this makes $(document).scope() possible\r\n\t\tif (element[0].nodeType == 9) {\r\n\t\t\telement = element.find('html');\r\n\t\t}\r\n\t\tvar names = isArray(name) ? name : [name];\r\n\r\n\t\twhile (element.length) {\r\n\t\t\tvar node = element[0];\r\n\t\t\tfor (var i = 0, ii = names.length; i < ii; i++) {\r\n\t\t\t\tif ((value = element.data(names[i])) !== undefined) return value;\r\n\t\t\t}\r\n\r\n\t\t\t// If dealing with a document fragment node with a host element, and no parent, use the host\r\n\t\t\t// element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM\r\n\t\t\t// to lookup parent controllers.\r\n\t\t\telement = jqLite(node.parentNode || (node.nodeType === 11 && node.host));\r\n\t\t}\r\n\t}\r\n\r\n\tfunction jqLiteEmpty(element) {\r\n\t\tfor (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {\r\n\t\t\tjqLiteDealoc(childNodes[i]);\r\n\t\t}\r\n\t\twhile (element.firstChild) {\r\n\t\t\telement.removeChild(element.firstChild);\r\n\t\t}\r\n\t}\r\n\r\n\t//////////////////////////////////////////\r\n\t// Functions which are declared directly.\r\n\t//////////////////////////////////////////\r\n\tvar JQLitePrototype = JQLite.prototype = {\r\n\t\tready: function (fn) {\r\n\t\t\tvar fired = false;\r\n\r\n\t\t\tfunction trigger() {\r\n\t\t\t\tif (fired) return;\r\n\t\t\t\tfired = true;\r\n\t\t\t\tfn();\r\n\t\t\t}\r\n\r\n\t\t\t// check if document already is loaded\r\n\t\t\tif (document.readyState === 'complete') {\r\n\t\t\t\tsetTimeout(trigger);\r\n\t\t\t} else {\r\n\t\t\t\tthis.on('DOMContentLoaded', trigger); // works for modern browsers and IE9\r\n\t\t\t\t// we can not use jqLite since we are not done loading and jQuery could be loaded later.\r\n\t\t\t\t// jshint -W064\r\n\t\t\t\tJQLite(window).on('load', trigger); // fallback to window.onload for others\r\n\t\t\t\t// jshint +W064\r\n\t\t\t}\r\n\t\t},\r\n\t\ttoString: function () {\r\n\t\t\tvar value = [];\r\n\t\t\tforEach(this, function (e) { value.push('' + e); });\r\n\t\t\treturn '[' + value.join(', ') + ']';\r\n\t\t},\r\n\r\n\t\teq: function (index) {\r\n\t\t\treturn (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);\r\n\t\t},\r\n\r\n\t\tlength: 0,\r\n\t\tpush: push,\r\n\t\tsort: [].sort,\r\n\t\tsplice: [].splice\r\n\t};\r\n\r\n\t//////////////////////////////////////////\r\n\t// Functions iterating getter/setters.\r\n\t// these functions return self on setter and\r\n\t// value on get.\r\n\t//////////////////////////////////////////\r\n\tvar BOOLEAN_ATTR = {};\r\n\tforEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function (value) {\r\n\t\tBOOLEAN_ATTR[lowercase(value)] = value;\r\n\t});\r\n\tvar BOOLEAN_ELEMENTS = {};\r\n\tforEach('input,select,option,textarea,button,form,details'.split(','), function (value) {\r\n\t\tBOOLEAN_ELEMENTS[uppercase(value)] = true;\r\n\t});\r\n\r\n\tfunction getBooleanAttrName(element, name) {\r\n\t\t// check dom last since we will most likely fail on name\r\n\t\tvar booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];\r\n\r\n\t\t// booleanAttr is here twice to minimize DOM access\r\n\t\treturn booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr;\r\n\t}\r\n\r\n\tforEach({\r\n\t\tdata: jqLiteData,\r\n\t\tinheritedData: jqLiteInheritedData,\r\n\r\n\t\tscope: function (element) {\r\n\t\t\t// Can't use jqLiteData here directly so we stay compatible with jQuery!\r\n\t\t\treturn jqLite(element).data('$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);\r\n\t\t},\r\n\r\n\t\tisolateScope: function (element) {\r\n\t\t\t// Can't use jqLiteData here directly so we stay compatible with jQuery!\r\n\t\t\treturn jqLite(element).data('$isolateScope') || jqLite(element).data('$isolateScopeNoTemplate');\r\n\t\t},\r\n\r\n\t\tcontroller: jqLiteController,\r\n\r\n\t\tinjector: function (element) {\r\n\t\t\treturn jqLiteInheritedData(element, '$injector');\r\n\t\t},\r\n\r\n\t\tremoveAttr: function (element, name) {\r\n\t\t\telement.removeAttribute(name);\r\n\t\t},\r\n\r\n\t\thasClass: jqLiteHasClass,\r\n\r\n\t\tcss: function (element, name, value) {\r\n\t\t\tname = camelCase(name);\r\n\r\n\t\t\tif (isDefined(value)) {\r\n\t\t\t\telement.style[name] = value;\r\n\t\t\t} else {\r\n\t\t\t\tvar val;\r\n\r\n\t\t\t\tif (msie <= 8) {\r\n\t\t\t\t\t// this is some IE specific weirdness that jQuery 1.6.4 does not sure why\r\n\t\t\t\t\tval = element.currentStyle && element.currentStyle[name];\r\n\t\t\t\t\tif (val === '') val = 'auto';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tval = val || element.style[name];\r\n\r\n\t\t\t\tif (msie <= 8) {\r\n\t\t\t\t\t// jquery weirdness :-/\r\n\t\t\t\t\tval = (val === '') ? undefined : val;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn val;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tattr: function (element, name, value) {\r\n\t\t\tvar lowercasedName = lowercase(name);\r\n\t\t\tif (BOOLEAN_ATTR[lowercasedName]) {\r\n\t\t\t\tif (isDefined(value)) {\r\n\t\t\t\t\tif (!!value) {\r\n\t\t\t\t\t\telement[name] = true;\r\n\t\t\t\t\t\telement.setAttribute(name, lowercasedName);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\telement[name] = false;\r\n\t\t\t\t\t\telement.removeAttribute(lowercasedName);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn (element[name] ||\r\n\t\t\t\t\t\t\t (element.attributes.getNamedItem(name) || noop).specified)\r\n\t\t\t\t\t\t ? lowercasedName\r\n\t\t\t\t\t\t : undefined;\r\n\t\t\t\t}\r\n\t\t\t} else if (isDefined(value)) {\r\n\t\t\t\telement.setAttribute(name, value);\r\n\t\t\t} else if (element.getAttribute) {\r\n\t\t\t\t// the extra argument \"2\" is to get the right thing for a.href in IE, see jQuery code\r\n\t\t\t\t// some elements (e.g. Document) don't have get attribute, so return undefined\r\n\t\t\t\tvar ret = element.getAttribute(name, 2);\r\n\t\t\t\t// normalize non-existing attributes to undefined (as jQuery)\r\n\t\t\t\treturn ret === null ? undefined : ret;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tprop: function (element, name, value) {\r\n\t\t\tif (isDefined(value)) {\r\n\t\t\t\telement[name] = value;\r\n\t\t\t} else {\r\n\t\t\t\treturn element[name];\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\ttext: (function () {\r\n\t\t\tvar NODE_TYPE_TEXT_PROPERTY = [];\r\n\t\t\tif (msie < 9) {\r\n\t\t\t\tNODE_TYPE_TEXT_PROPERTY[1] = 'innerText'; /** Element **/\r\n\t\t\t\tNODE_TYPE_TEXT_PROPERTY[3] = 'nodeValue'; /** Text **/\r\n\t\t\t} else {\r\n\t\t\t\tNODE_TYPE_TEXT_PROPERTY[1] = /** Element **/\r\n\t\t\t\tNODE_TYPE_TEXT_PROPERTY[3] = 'textContent'; /** Text **/\r\n\t\t\t}\r\n\t\t\tgetText.$dv = '';\r\n\t\t\treturn getText;\r\n\r\n\t\t\tfunction getText(element, value) {\r\n\t\t\t\tvar textProp = NODE_TYPE_TEXT_PROPERTY[element.nodeType];\r\n\t\t\t\tif (isUndefined(value)) {\r\n\t\t\t\t\treturn textProp ? element[textProp] : '';\r\n\t\t\t\t}\r\n\t\t\t\telement[textProp] = value;\r\n\t\t\t}\r\n\t\t})(),\r\n\r\n\t\tval: function (element, value) {\r\n\t\t\tif (isUndefined(value)) {\r\n\t\t\t\tif (nodeName_(element) === 'SELECT' && element.multiple) {\r\n\t\t\t\t\tvar result = [];\r\n\t\t\t\t\tforEach(element.options, function (option) {\r\n\t\t\t\t\t\tif (option.selected) {\r\n\t\t\t\t\t\t\tresult.push(option.value || option.text);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn result.length === 0 ? null : result;\r\n\t\t\t\t}\r\n\t\t\t\treturn element.value;\r\n\t\t\t}\r\n\t\t\telement.value = value;\r\n\t\t},\r\n\r\n\t\thtml: function (element, value) {\r\n\t\t\tif (isUndefined(value)) {\r\n\t\t\t\treturn element.innerHTML;\r\n\t\t\t}\r\n\t\t\tfor (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {\r\n\t\t\t\tjqLiteDealoc(childNodes[i]);\r\n\t\t\t}\r\n\t\t\telement.innerHTML = value;\r\n\t\t},\r\n\r\n\t\tempty: jqLiteEmpty\r\n\t}, function (fn, name) {\r\n\t\t/**\r\n\t\t * Properties: writes return selection, reads return first value\r\n\t\t */\r\n\t\tJQLite.prototype[name] = function (arg1, arg2) {\r\n\t\t\tvar i, key;\r\n\t\t\tvar nodeCount = this.length;\r\n\r\n\t\t\t// jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it\r\n\t\t\t// in a way that survives minification.\r\n\t\t\t// jqLiteEmpty takes no arguments but is a setter.\r\n\t\t\tif (fn !== jqLiteEmpty &&\r\n\t\t\t\t(((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) {\r\n\t\t\t\tif (isObject(arg1)) {\r\n\r\n\t\t\t\t\t// we are a write, but the object properties are the key/values\r\n\t\t\t\t\tfor (i = 0; i < nodeCount; i++) {\r\n\t\t\t\t\t\tif (fn === jqLiteData) {\r\n\t\t\t\t\t\t\t// data() takes the whole object in jQuery\r\n\t\t\t\t\t\t\tfn(this[i], arg1);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tfor (key in arg1) {\r\n\t\t\t\t\t\t\t\tfn(this[i], key, arg1[key]);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// return self for chaining\r\n\t\t\t\t\treturn this;\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// we are a read, so read the first child.\r\n\t\t\t\t\t// TODO: do we still need this?\r\n\t\t\t\t\tvar value = fn.$dv;\r\n\t\t\t\t\t// Only if we have $dv do we iterate over all, otherwise it is just the first element.\r\n\t\t\t\t\tvar jj = (value === undefined) ? Math.min(nodeCount, 1) : nodeCount;\r\n\t\t\t\t\tfor (var j = 0; j < jj; j++) {\r\n\t\t\t\t\t\tvar nodeValue = fn(this[j], arg1, arg2);\r\n\t\t\t\t\t\tvalue = value ? value + nodeValue : nodeValue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn value;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\t// we are a write, so apply to all children\r\n\t\t\t\tfor (i = 0; i < nodeCount; i++) {\r\n\t\t\t\t\tfn(this[i], arg1, arg2);\r\n\t\t\t\t}\r\n\t\t\t\t// return self for chaining\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\t\t};\r\n\t});\r\n\r\n\tfunction createEventHandler(element, events) {\r\n\t\tvar eventHandler = function (event, type) {\r\n\t\t\tif (!event.preventDefault) {\r\n\t\t\t\tevent.preventDefault = function () {\r\n\t\t\t\t\tevent.returnValue = false; //ie\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tif (!event.stopPropagation) {\r\n\t\t\t\tevent.stopPropagation = function () {\r\n\t\t\t\t\tevent.cancelBubble = true; //ie\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tif (!event.target) {\r\n\t\t\t\tevent.target = event.srcElement || document;\r\n\t\t\t}\r\n\r\n\t\t\tif (isUndefined(event.defaultPrevented)) {\r\n\t\t\t\tvar prevent = event.preventDefault;\r\n\t\t\t\tevent.preventDefault = function () {\r\n\t\t\t\t\tevent.defaultPrevented = true;\r\n\t\t\t\t\tprevent.call(event);\r\n\t\t\t\t};\r\n\t\t\t\tevent.defaultPrevented = false;\r\n\t\t\t}\r\n\r\n\t\t\tevent.isDefaultPrevented = function () {\r\n\t\t\t\treturn event.defaultPrevented || event.returnValue === false;\r\n\t\t\t};\r\n\r\n\t\t\t// Copy event handlers in case event handlers array is modified during execution.\r\n\t\t\tvar eventHandlersCopy = shallowCopy(events[type || event.type] || []);\r\n\r\n\t\t\tforEach(eventHandlersCopy, function (fn) {\r\n\t\t\t\tfn.call(element, event);\r\n\t\t\t});\r\n\r\n\t\t\t// Remove monkey-patched methods (IE),\r\n\t\t\t// as they would cause memory leaks in IE8.\r\n\t\t\tif (msie <= 8) {\r\n\t\t\t\t// IE7/8 does not allow to delete property on native object\r\n\t\t\t\tevent.preventDefault = null;\r\n\t\t\t\tevent.stopPropagation = null;\r\n\t\t\t\tevent.isDefaultPrevented = null;\r\n\t\t\t} else {\r\n\t\t\t\t// It shouldn't affect normal browsers (native methods are defined on prototype).\r\n\t\t\t\tdelete event.preventDefault;\r\n\t\t\t\tdelete event.stopPropagation;\r\n\t\t\t\tdelete event.isDefaultPrevented;\r\n\t\t\t}\r\n\t\t};\r\n\t\teventHandler.elem = element;\r\n\t\treturn eventHandler;\r\n\t}\r\n\r\n\t//////////////////////////////////////////\r\n\t// Functions iterating traversal.\r\n\t// These functions chain results into a single\r\n\t// selector.\r\n\t//////////////////////////////////////////\r\n\tforEach({\r\n\t\tremoveData: jqLiteRemoveData,\r\n\r\n\t\tdealoc: jqLiteDealoc,\r\n\r\n\t\ton: function onFn(element, type, fn, unsupported) {\r\n\t\t\tif (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters');\r\n\r\n\t\t\tvar events = jqLiteExpandoStore(element, 'events'),\r\n\t\t\t\thandle = jqLiteExpandoStore(element, 'handle');\r\n\r\n\t\t\tif (!events) jqLiteExpandoStore(element, 'events', events = {});\r\n\t\t\tif (!handle) jqLiteExpandoStore(element, 'handle', handle = createEventHandler(element, events));\r\n\r\n\t\t\tforEach(type.split(' '), function (type) {\r\n\t\t\t\tvar eventFns = events[type];\r\n\r\n\t\t\t\tif (!eventFns) {\r\n\t\t\t\t\tif (type == 'mouseenter' || type == 'mouseleave') {\r\n\t\t\t\t\t\tvar contains = document.body.contains || document.body.compareDocumentPosition ?\r\n\t\t\t\t\t\tfunction (a, b) {\r\n\t\t\t\t\t\t\t// jshint bitwise: false\r\n\t\t\t\t\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\r\n\t\t\t\t\t\t\tbup = b && b.parentNode;\r\n\t\t\t\t\t\t\treturn a === bup || !!(bup && bup.nodeType === 1 && (\r\n\t\t\t\t\t\t\t adown.contains ?\r\n\t\t\t\t\t\t\t adown.contains(bup) :\r\n\t\t\t\t\t\t\t a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16\r\n\t\t\t\t\t\t\t ));\r\n\t\t\t\t\t\t} :\r\n\t\t\t\t\t\t function (a, b) {\r\n\t\t\t\t\t\t \tif (b) {\r\n\t\t\t\t\t\t \t\twhile ((b = b.parentNode)) {\r\n\t\t\t\t\t\t \t\t\tif (b === a) {\r\n\t\t\t\t\t\t \t\t\t\treturn true;\r\n\t\t\t\t\t\t \t\t\t}\r\n\t\t\t\t\t\t \t\t}\r\n\t\t\t\t\t\t \t}\r\n\t\t\t\t\t\t \treturn false;\r\n\t\t\t\t\t\t };\r\n\r\n\t\t\t\t\t\tevents[type] = [];\r\n\r\n\t\t\t\t\t\t// Refer to jQuery's implementation of mouseenter & mouseleave\r\n\t\t\t\t\t\t// Read about mouseenter and mouseleave:\r\n\t\t\t\t\t\t// http://www.quirksmode.org/js/events_mouse.html#link8\r\n\t\t\t\t\t\tvar eventmap = { mouseleave: \"mouseout\", mouseenter: \"mouseover\" };\r\n\r\n\t\t\t\t\t\tonFn(element, eventmap[type], function (event) {\r\n\t\t\t\t\t\t\tvar target = this, related = event.relatedTarget;\r\n\t\t\t\t\t\t\t// For mousenter/leave call the handler if related is outside the target.\r\n\t\t\t\t\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\r\n\t\t\t\t\t\t\tif (!related || (related !== target && !contains(target, related))) {\r\n\t\t\t\t\t\t\t\thandle(event, type);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\taddEventListenerFn(element, type, handle);\r\n\t\t\t\t\t\tevents[type] = [];\r\n\t\t\t\t\t}\r\n\t\t\t\t\teventFns = events[type];\r\n\t\t\t\t}\r\n\t\t\t\teventFns.push(fn);\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\toff: jqLiteOff,\r\n\r\n\t\tone: function (element, type, fn) {\r\n\t\t\telement = jqLite(element);\r\n\r\n\t\t\t//add the listener twice so that when it is called\r\n\t\t\t//you can remove the original function and still be\r\n\t\t\t//able to call element.off(ev, fn) normally\r\n\t\t\telement.on(type, function onFn() {\r\n\t\t\t\telement.off(type, fn);\r\n\t\t\t\telement.off(type, onFn);\r\n\t\t\t});\r\n\t\t\telement.on(type, fn);\r\n\t\t},\r\n\r\n\t\treplaceWith: function (element, replaceNode) {\r\n\t\t\tvar index, parent = element.parentNode;\r\n\t\t\tjqLiteDealoc(element);\r\n\t\t\tforEach(new JQLite(replaceNode), function (node) {\r\n\t\t\t\tif (index) {\r\n\t\t\t\t\tparent.insertBefore(node, index.nextSibling);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tparent.replaceChild(node, element);\r\n\t\t\t\t}\r\n\t\t\t\tindex = node;\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tchildren: function (element) {\r\n\t\t\tvar children = [];\r\n\t\t\tforEach(element.childNodes, function (element) {\r\n\t\t\t\tif (element.nodeType === 1)\r\n\t\t\t\t\tchildren.push(element);\r\n\t\t\t});\r\n\t\t\treturn children;\r\n\t\t},\r\n\r\n\t\tcontents: function (element) {\r\n\t\t\treturn element.contentDocument || element.childNodes || [];\r\n\t\t},\r\n\r\n\t\tappend: function (element, node) {\r\n\t\t\tforEach(new JQLite(node), function (child) {\r\n\t\t\t\tif (element.nodeType === 1 || element.nodeType === 11) {\r\n\t\t\t\t\telement.appendChild(child);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tprepend: function (element, node) {\r\n\t\t\tif (element.nodeType === 1) {\r\n\t\t\t\tvar index = element.firstChild;\r\n\t\t\t\tforEach(new JQLite(node), function (child) {\r\n\t\t\t\t\telement.insertBefore(child, index);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\twrap: function (element, wrapNode) {\r\n\t\t\twrapNode = jqLite(wrapNode)[0];\r\n\t\t\tvar parent = element.parentNode;\r\n\t\t\tif (parent) {\r\n\t\t\t\tparent.replaceChild(wrapNode, element);\r\n\t\t\t}\r\n\t\t\twrapNode.appendChild(element);\r\n\t\t},\r\n\r\n\t\tremove: function (element) {\r\n\t\t\tjqLiteDealoc(element);\r\n\t\t\tvar parent = element.parentNode;\r\n\t\t\tif (parent) parent.removeChild(element);\r\n\t\t},\r\n\r\n\t\tafter: function (element, newElement) {\r\n\t\t\tvar index = element, parent = element.parentNode;\r\n\t\t\tforEach(new JQLite(newElement), function (node) {\r\n\t\t\t\tparent.insertBefore(node, index.nextSibling);\r\n\t\t\t\tindex = node;\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\taddClass: jqLiteAddClass,\r\n\t\tremoveClass: jqLiteRemoveClass,\r\n\r\n\t\ttoggleClass: function (element, selector, condition) {\r\n\t\t\tif (selector) {\r\n\t\t\t\tforEach(selector.split(' '), function (className) {\r\n\t\t\t\t\tvar classCondition = condition;\r\n\t\t\t\t\tif (isUndefined(classCondition)) {\r\n\t\t\t\t\t\tclassCondition = !jqLiteHasClass(element, className);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t(classCondition ? jqLiteAddClass : jqLiteRemoveClass)(element, className);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tparent: function (element) {\r\n\t\t\tvar parent = element.parentNode;\r\n\t\t\treturn parent && parent.nodeType !== 11 ? parent : null;\r\n\t\t},\r\n\r\n\t\tnext: function (element) {\r\n\t\t\tif (element.nextElementSibling) {\r\n\t\t\t\treturn element.nextElementSibling;\r\n\t\t\t}\r\n\r\n\t\t\t// IE8 doesn't have nextElementSibling\r\n\t\t\tvar elm = element.nextSibling;\r\n\t\t\twhile (elm != null && elm.nodeType !== 1) {\r\n\t\t\t\telm = elm.nextSibling;\r\n\t\t\t}\r\n\t\t\treturn elm;\r\n\t\t},\r\n\r\n\t\tfind: function (element, selector) {\r\n\t\t\tif (element.getElementsByTagName) {\r\n\t\t\t\treturn element.getElementsByTagName(selector);\r\n\t\t\t} else {\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tclone: jqLiteClone,\r\n\r\n\t\ttriggerHandler: function (element, eventName, eventData) {\r\n\t\t\tvar eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName];\r\n\r\n\t\t\teventData = eventData || [];\r\n\r\n\t\t\tvar event = [{\r\n\t\t\t\tpreventDefault: noop,\r\n\t\t\t\tstopPropagation: noop\r\n\t\t\t}];\r\n\r\n\t\t\tforEach(eventFns, function (fn) {\r\n\t\t\t\tfn.apply(element, event.concat(eventData));\r\n\t\t\t});\r\n\t\t}\r\n\t}, function (fn, name) {\r\n\t\t/**\r\n\t\t * chaining functions\r\n\t\t */\r\n\t\tJQLite.prototype[name] = function (arg1, arg2, arg3) {\r\n\t\t\tvar value;\r\n\t\t\tfor (var i = 0; i < this.length; i++) {\r\n\t\t\t\tif (isUndefined(value)) {\r\n\t\t\t\t\tvalue = fn(this[i], arg1, arg2, arg3);\r\n\t\t\t\t\tif (isDefined(value)) {\r\n\t\t\t\t\t\t// any function which returns a value needs to be wrapped\r\n\t\t\t\t\t\tvalue = jqLite(value);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tjqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn isDefined(value) ? value : this;\r\n\t\t};\r\n\r\n\t\t// bind legacy bind/unbind to on/off\r\n\t\tJQLite.prototype.bind = JQLite.prototype.on;\r\n\t\tJQLite.prototype.unbind = JQLite.prototype.off;\r\n\t});\r\n\r\n\t/**\r\n\t * Computes a hash of an 'obj'.\r\n\t * Hash of a:\r\n\t * string is string\r\n\t * number is number as string\r\n\t * object is either result of calling $$hashKey function on the object or uniquely generated id,\r\n\t * that is also assigned to the $$hashKey property of the object.\r\n\t *\r\n\t * @param obj\r\n\t * @returns {string} hash string such that the same input will have the same hash string.\r\n\t * The resulting string key is in 'type:hashKey' format.\r\n\t */\r\n\tfunction hashKey(obj, nextUidFn) {\r\n\t\tvar objType = typeof obj,\r\n\t\t\tkey;\r\n\r\n\t\tif (objType == 'function' || (objType == 'object' && obj !== null)) {\r\n\t\t\tif (typeof (key = obj.$$hashKey) == 'function') {\r\n\t\t\t\t// must invoke on object to keep the right this\r\n\t\t\t\tkey = obj.$$hashKey();\r\n\t\t\t} else if (key === undefined) {\r\n\t\t\t\tkey = obj.$$hashKey = (nextUidFn || nextUid)();\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tkey = obj;\r\n\t\t}\r\n\r\n\t\treturn objType + ':' + key;\r\n\t}\r\n\r\n\t/**\r\n\t * HashMap which can use objects as keys\r\n\t */\r\n\tfunction HashMap(array, isolatedUid) {\r\n\t\tif (isolatedUid) {\r\n\t\t\tvar uid = 0;\r\n\t\t\tthis.nextUid = function () {\r\n\t\t\t\treturn ++uid;\r\n\t\t\t};\r\n\t\t}\r\n\t\tforEach(array, this.put, this);\r\n\t}\r\n\tHashMap.prototype = {\r\n\t\t/**\r\n\t\t * Store key value pair\r\n\t\t * @param key key to store can be any type\r\n\t\t * @param value value to store can be any type\r\n\t\t */\r\n\t\tput: function (key, value) {\r\n\t\t\tthis[hashKey(key, this.nextUid)] = value;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * @param key\r\n\t\t * @returns {Object} the value for the key\r\n\t\t */\r\n\t\tget: function (key) {\r\n\t\t\treturn this[hashKey(key, this.nextUid)];\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Remove the key/value pair\r\n\t\t * @param key\r\n\t\t */\r\n\t\tremove: function (key) {\r\n\t\t\tvar value = this[key = hashKey(key, this.nextUid)];\r\n\t\t\tdelete this[key];\r\n\t\t\treturn value;\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * @ngdoc function\r\n\t * @module ng\r\n\t * @name angular.injector\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Creates an injector function that can be used for retrieving services as well as for\r\n\t * dependency injection (see {@link guide/di dependency injection}).\r\n\t *\r\n\t\r\n\t * @param {Array.<string|Function>} modules A list of module functions or their aliases. See\r\n\t * {@link angular.module}. The `ng` module must be explicitly added.\r\n\t * @returns {function()} Injector function. See {@link auto.$injector $injector}.\r\n\t *\r\n\t * @example\r\n\t * Typical usage\r\n\t * ```js\r\n\t * // create an injector\r\n\t * var $injector = angular.injector(['ng']);\r\n\t *\r\n\t * // use the injector to kick off your application\r\n\t * // use the type inference to auto inject arguments, or use implicit injection\r\n\t * $injector.invoke(function($rootScope, $compile, $document){\r\n\t * $compile($document)($rootScope);\r\n\t * $rootScope.$digest();\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * Sometimes you want to get access to the injector of a currently running Angular app\r\n\t * from outside Angular. Perhaps, you want to inject and compile some markup after the\r\n\t * application has been bootstrapped. You can do this using the extra `injector()` added\r\n\t * to JQuery/jqLite elements. See {@link angular.element}.\r\n\t *\r\n\t * *This is fairly rare but could be the case if a third party library is injecting the\r\n\t * markup.*\r\n\t *\r\n\t * In the following example a new block of HTML containing a `ng-controller`\r\n\t * directive is added to the end of the document body by JQuery. We then compile and link\r\n\t * it into the current AngularJS scope.\r\n\t *\r\n\t * ```js\r\n\t * var $div = $('<div ng-controller=\"MyCtrl\">{{content.label}}</div>');\r\n\t * $(document.body).append($div);\r\n\t *\r\n\t * angular.element(document).injector().invoke(function($compile) {\r\n\t * var scope = angular.element($div).scope();\r\n\t * $compile($div)(scope);\r\n\t * });\r\n\t * ```\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc module\r\n\t * @name auto\r\n\t * @description\r\n\t *\r\n\t * Implicit module which gets automatically added to each {@link auto.$injector $injector}.\r\n\t */\r\n\r\n\tvar FN_ARGS = /^function\\s*[^\\(]*\\(\\s*([^\\)]*)\\)/m;\r\n\tvar FN_ARG_SPLIT = /,/;\r\n\tvar FN_ARG = /^\\s*(_?)(\\S+?)\\1\\s*$/;\r\n\tvar STRIP_COMMENTS = /((\\/\\/.*$)|(\\/\\*[\\s\\S]*?\\*\\/))/mg;\r\n\tvar $injectorMinErr = minErr('$injector');\r\n\tfunction annotate(fn) {\r\n\t\tvar $inject,\r\n\t\t\tfnText,\r\n\t\t\targDecl,\r\n\t\t\tlast;\r\n\r\n\t\tif (typeof fn === 'function') {\r\n\t\t\tif (!($inject = fn.$inject)) {\r\n\t\t\t\t$inject = [];\r\n\t\t\t\tif (fn.length) {\r\n\t\t\t\t\tfnText = fn.toString().replace(STRIP_COMMENTS, '');\r\n\t\t\t\t\targDecl = fnText.match(FN_ARGS);\r\n\t\t\t\t\tforEach(argDecl[1].split(FN_ARG_SPLIT), function (arg) {\r\n\t\t\t\t\t\targ.replace(FN_ARG, function (all, underscore, name) {\r\n\t\t\t\t\t\t\t$inject.push(name);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\tfn.$inject = $inject;\r\n\t\t\t}\r\n\t\t} else if (isArray(fn)) {\r\n\t\t\tlast = fn.length - 1;\r\n\t\t\tassertArgFn(fn[last], 'fn');\r\n\t\t\t$inject = fn.slice(0, last);\r\n\t\t} else {\r\n\t\t\tassertArgFn(fn, 'fn', true);\r\n\t\t}\r\n\t\treturn $inject;\r\n\t}\r\n\r\n\t///////////////////////////////////////\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $injector\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t *\r\n\t * `$injector` is used to retrieve object instances as defined by\r\n\t * {@link auto.$provide provider}, instantiate types, invoke methods,\r\n\t * and load modules.\r\n\t *\r\n\t * The following always holds true:\r\n\t *\r\n\t * ```js\r\n\t * var $injector = angular.injector();\r\n\t * expect($injector.get('$injector')).toBe($injector);\r\n\t * expect($injector.invoke(function($injector){\r\n\t * return $injector;\r\n\t * }).toBe($injector);\r\n\t * ```\r\n\t *\r\n\t * # Injection Function Annotation\r\n\t *\r\n\t * JavaScript does not have annotations, and annotations are needed for dependency injection. The\r\n\t * following are all valid ways of annotating function with injection arguments and are equivalent.\r\n\t *\r\n\t * ```js\r\n\t * // inferred (only works if code not minified/obfuscated)\r\n\t * $injector.invoke(function(serviceA){});\r\n\t *\r\n\t * // annotated\r\n\t * function explicit(serviceA) {};\r\n\t * explicit.$inject = ['serviceA'];\r\n\t * $injector.invoke(explicit);\r\n\t *\r\n\t * // inline\r\n\t * $injector.invoke(['serviceA', function(serviceA){}]);\r\n\t * ```\r\n\t *\r\n\t * ## Inference\r\n\t *\r\n\t * In JavaScript calling `toString()` on a function returns the function definition. The definition\r\n\t * can then be parsed and the function arguments can be extracted. *NOTE:* This does not work with\r\n\t * minification, and obfuscation tools since these tools change the argument names.\r\n\t *\r\n\t * ## `$inject` Annotation\r\n\t * By adding an `$inject` property onto a function the injection parameters can be specified.\r\n\t *\r\n\t * ## Inline\r\n\t * As an array of injection names, where the last item in the array is the function to call.\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $injector#get\r\n\t *\r\n\t * @description\r\n\t * Return an instance of the service.\r\n\t *\r\n\t * @param {string} name The name of the instance to retrieve.\r\n\t * @return {*} The instance.\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $injector#invoke\r\n\t *\r\n\t * @description\r\n\t * Invoke the method and supply the method arguments from the `$injector`.\r\n\t *\r\n\t * @param {!Function} fn The function to invoke. Function parameters are injected according to the\r\n\t * {@link guide/di $inject Annotation} rules.\r\n\t * @param {Object=} self The `this` for the invoked method.\r\n\t * @param {Object=} locals Optional object. If preset then any argument names are read from this\r\n\t * object first, before the `$injector` is consulted.\r\n\t * @returns {*} the value returned by the invoked `fn` function.\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $injector#has\r\n\t *\r\n\t * @description\r\n\t * Allows the user to query if the particular service exists.\r\n\t *\r\n\t * @param {string} Name of the service to query.\r\n\t * @returns {boolean} returns true if injector has given service.\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $injector#instantiate\r\n\t * @description\r\n\t * Create a new instance of JS type. The method takes a constructor function, invokes the new\r\n\t * operator, and supplies all of the arguments to the constructor function as specified by the\r\n\t * constructor annotation.\r\n\t *\r\n\t * @param {Function} Type Annotated constructor function.\r\n\t * @param {Object=} locals Optional object. If preset then any argument names are read from this\r\n\t * object first, before the `$injector` is consulted.\r\n\t * @returns {Object} new instance of `Type`.\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $injector#annotate\r\n\t *\r\n\t * @description\r\n\t * Returns an array of service names which the function is requesting for injection. This API is\r\n\t * used by the injector to determine which services need to be injected into the function when the\r\n\t * function is invoked. There are three ways in which the function can be annotated with the needed\r\n\t * dependencies.\r\n\t *\r\n\t * # Argument names\r\n\t *\r\n\t * The simplest form is to extract the dependencies from the arguments of the function. This is done\r\n\t * by converting the function into a string using `toString()` method and extracting the argument\r\n\t * names.\r\n\t * ```js\r\n\t * // Given\r\n\t * function MyController($scope, $route) {\r\n\t * // ...\r\n\t * }\r\n\t *\r\n\t * // Then\r\n\t * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\r\n\t * ```\r\n\t *\r\n\t * This method does not work with code minification / obfuscation. For this reason the following\r\n\t * annotation strategies are supported.\r\n\t *\r\n\t * # The `$inject` property\r\n\t *\r\n\t * If a function has an `$inject` property and its value is an array of strings, then the strings\r\n\t * represent names of services to be injected into the function.\r\n\t * ```js\r\n\t * // Given\r\n\t * var MyController = function(obfuscatedScope, obfuscatedRoute) {\r\n\t * // ...\r\n\t * }\r\n\t * // Define function dependencies\r\n\t * MyController['$inject'] = ['$scope', '$route'];\r\n\t *\r\n\t * // Then\r\n\t * expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);\r\n\t * ```\r\n\t *\r\n\t * # The array notation\r\n\t *\r\n\t * It is often desirable to inline Injected functions and that's when setting the `$inject` property\r\n\t * is very inconvenient. In these situations using the array notation to specify the dependencies in\r\n\t * a way that survives minification is a better choice:\r\n\t *\r\n\t * ```js\r\n\t * // We wish to write this (not minification / obfuscation safe)\r\n\t * injector.invoke(function($compile, $rootScope) {\r\n\t * // ...\r\n\t * });\r\n\t *\r\n\t * // We are forced to write break inlining\r\n\t * var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {\r\n\t * // ...\r\n\t * };\r\n\t * tmpFn.$inject = ['$compile', '$rootScope'];\r\n\t * injector.invoke(tmpFn);\r\n\t *\r\n\t * // To better support inline function the inline annotation is supported\r\n\t * injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {\r\n\t * // ...\r\n\t * }]);\r\n\t *\r\n\t * // Therefore\r\n\t * expect(injector.annotate(\r\n\t * ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])\r\n\t * ).toEqual(['$compile', '$rootScope']);\r\n\t * ```\r\n\t *\r\n\t * @param {Function|Array.<string|Function>} fn Function for which dependent service names need to\r\n\t * be retrieved as described above.\r\n\t *\r\n\t * @returns {Array.<string>} The names of the services which the function requires.\r\n\t */\r\n\r\n\r\n\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $provide\r\n\t *\r\n\t * @description\r\n\t *\r\n\t * The {@link auto.$provide $provide} service has a number of methods for registering components\r\n\t * with the {@link auto.$injector $injector}. Many of these functions are also exposed on\r\n\t * {@link angular.Module}.\r\n\t *\r\n\t * An Angular **service** is a singleton object created by a **service factory**. These **service\r\n\t * factories** are functions which, in turn, are created by a **service provider**.\r\n\t * The **service providers** are constructor functions. When instantiated they must contain a\r\n\t * property called `$get`, which holds the **service factory** function.\r\n\t *\r\n\t * When you request a service, the {@link auto.$injector $injector} is responsible for finding the\r\n\t * correct **service provider**, instantiating it and then calling its `$get` **service factory**\r\n\t * function to get the instance of the **service**.\r\n\t *\r\n\t * Often services have no configuration options and there is no need to add methods to the service\r\n\t * provider. The provider will be no more than a constructor function with a `$get` property. For\r\n\t * these cases the {@link auto.$provide $provide} service has additional helper methods to register\r\n\t * services without specifying a provider.\r\n\t *\r\n\t * * {@link auto.$provide#provider provider(provider)} - registers a **service provider** with the\r\n\t * {@link auto.$injector $injector}\r\n\t * * {@link auto.$provide#constant constant(obj)} - registers a value/object that can be accessed by\r\n\t * providers and services.\r\n\t * * {@link auto.$provide#value value(obj)} - registers a value/object that can only be accessed by\r\n\t * services, not providers.\r\n\t * * {@link auto.$provide#factory factory(fn)} - registers a service **factory function**, `fn`,\r\n\t * that will be wrapped in a **service provider** object, whose `$get` property will contain the\r\n\t * given factory function.\r\n\t * * {@link auto.$provide#service service(class)} - registers a **constructor function**, `class`\r\n\t * that will be wrapped in a **service provider** object, whose `$get` property will instantiate\r\n\t * a new object using the given constructor function.\r\n\t *\r\n\t * See the individual methods for more information and examples.\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $provide#provider\r\n\t * @description\r\n\t *\r\n\t * Register a **provider function** with the {@link auto.$injector $injector}. Provider functions\r\n\t * are constructor functions, whose instances are responsible for \"providing\" a factory for a\r\n\t * service.\r\n\t *\r\n\t * Service provider names start with the name of the service they provide followed by `Provider`.\r\n\t * For example, the {@link ng.$log $log} service has a provider called\r\n\t * {@link ng.$logProvider $logProvider}.\r\n\t *\r\n\t * Service provider objects can have additional methods which allow configuration of the provider\r\n\t * and its service. Importantly, you can configure what kind of service is created by the `$get`\r\n\t * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a\r\n\t * method {@link ng.$logProvider#debugEnabled debugEnabled}\r\n\t * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the\r\n\t * console or not.\r\n\t *\r\n\t * @param {string} name The name of the instance. NOTE: the provider will be available under `name +\r\n\t\t\t\t\t\t\t'Provider'` key.\r\n\t * @param {(Object|function())} provider If the provider is:\r\n\t *\r\n\t * - `Object`: then it should have a `$get` method. The `$get` method will be invoked using\r\n\t * {@link auto.$injector#invoke $injector.invoke()} when an instance needs to be created.\r\n\t * - `Constructor`: a new instance of the provider will be created using\r\n\t * {@link auto.$injector#instantiate $injector.instantiate()}, then treated as `object`.\r\n\t *\r\n\t * @returns {Object} registered provider instance\r\n\t\r\n\t * @example\r\n\t *\r\n\t * The following example shows how to create a simple event tracking service and register it using\r\n\t * {@link auto.$provide#provider $provide.provider()}.\r\n\t *\r\n\t * ```js\r\n\t * // Define the eventTracker provider\r\n\t * function EventTrackerProvider() {\r\n\t * var trackingUrl = '/track';\r\n\t *\r\n\t * // A provider method for configuring where the tracked events should been saved\r\n\t * this.setTrackingUrl = function(url) {\r\n\t * trackingUrl = url;\r\n\t * };\r\n\t *\r\n\t * // The service factory function\r\n\t * this.$get = ['$http', function($http) {\r\n\t * var trackedEvents = {};\r\n\t * return {\r\n\t * // Call this to track an event\r\n\t * event: function(event) {\r\n\t * var count = trackedEvents[event] || 0;\r\n\t * count += 1;\r\n\t * trackedEvents[event] = count;\r\n\t * return count;\r\n\t * },\r\n\t * // Call this to save the tracked events to the trackingUrl\r\n\t * save: function() {\r\n\t * $http.post(trackingUrl, trackedEvents);\r\n\t * }\r\n\t * };\r\n\t * }];\r\n\t * }\r\n\t *\r\n\t * describe('eventTracker', function() {\r\n\t * var postSpy;\r\n\t *\r\n\t * beforeEach(module(function($provide) {\r\n\t * // Register the eventTracker provider\r\n\t * $provide.provider('eventTracker', EventTrackerProvider);\r\n\t * }));\r\n\t *\r\n\t * beforeEach(module(function(eventTrackerProvider) {\r\n\t * // Configure eventTracker provider\r\n\t * eventTrackerProvider.setTrackingUrl('/custom-track');\r\n\t * }));\r\n\t *\r\n\t * it('tracks events', inject(function(eventTracker) {\r\n\t * expect(eventTracker.event('login')).toEqual(1);\r\n\t * expect(eventTracker.event('login')).toEqual(2);\r\n\t * }));\r\n\t *\r\n\t * it('saves to the tracking url', inject(function(eventTracker, $http) {\r\n\t * postSpy = spyOn($http, 'post');\r\n\t * eventTracker.event('login');\r\n\t * eventTracker.save();\r\n\t * expect(postSpy).toHaveBeenCalled();\r\n\t * expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track');\r\n\t * expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track');\r\n\t * expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 });\r\n\t * }));\r\n\t * });\r\n\t * ```\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $provide#factory\r\n\t * @description\r\n\t *\r\n\t * Register a **service factory**, which will be called to return the service instance.\r\n\t * This is short for registering a service where its provider consists of only a `$get` property,\r\n\t * which is the given service factory function.\r\n\t * You should use {@link auto.$provide#factory $provide.factory(getFn)} if you do not need to\r\n\t * configure your service in a provider.\r\n\t *\r\n\t * @param {string} name The name of the instance.\r\n\t * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand\r\n\t * for `$provide.provider(name, {$get: $getFn})`.\r\n\t * @returns {Object} registered provider instance\r\n\t *\r\n\t * @example\r\n\t * Here is an example of registering a service\r\n\t * ```js\r\n\t * $provide.factory('ping', ['$http', function($http) {\r\n\t * return function ping() {\r\n\t * return $http.send('/ping');\r\n\t * };\r\n\t * }]);\r\n\t * ```\r\n\t * You would then inject and use this service like this:\r\n\t * ```js\r\n\t * someModule.controller('Ctrl', ['ping', function(ping) {\r\n\t * ping();\r\n\t * }]);\r\n\t * ```\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $provide#service\r\n\t * @description\r\n\t *\r\n\t * Register a **service constructor**, which will be invoked with `new` to create the service\r\n\t * instance.\r\n\t * This is short for registering a service where its provider's `$get` property is the service\r\n\t * constructor function that will be used to instantiate the service instance.\r\n\t *\r\n\t * You should use {@link auto.$provide#service $provide.service(class)} if you define your service\r\n\t * as a type/class.\r\n\t *\r\n\t * @param {string} name The name of the instance.\r\n\t * @param {Function} constructor A class (constructor function) that will be instantiated.\r\n\t * @returns {Object} registered provider instance\r\n\t *\r\n\t * @example\r\n\t * Here is an example of registering a service using\r\n\t * {@link auto.$provide#service $provide.service(class)}.\r\n\t * ```js\r\n\t * var Ping = function($http) {\r\n\t * this.$http = $http;\r\n\t * };\r\n\t *\r\n\t * Ping.$inject = ['$http'];\r\n\t *\r\n\t * Ping.prototype.send = function() {\r\n\t * return this.$http.get('/ping');\r\n\t * };\r\n\t * $provide.service('ping', Ping);\r\n\t * ```\r\n\t * You would then inject and use this service like this:\r\n\t * ```js\r\n\t * someModule.controller('Ctrl', ['ping', function(ping) {\r\n\t * ping.send();\r\n\t * }]);\r\n\t * ```\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $provide#value\r\n\t * @description\r\n\t *\r\n\t * Register a **value service** with the {@link auto.$injector $injector}, such as a string, a\r\n\t * number, an array, an object or a function. This is short for registering a service where its\r\n\t * provider's `$get` property is a factory function that takes no arguments and returns the **value\r\n\t * service**.\r\n\t *\r\n\t * Value services are similar to constant services, except that they cannot be injected into a\r\n\t * module configuration function (see {@link angular.Module#config}) but they can be overridden by\r\n\t * an Angular\r\n\t * {@link auto.$provide#decorator decorator}.\r\n\t *\r\n\t * @param {string} name The name of the instance.\r\n\t * @param {*} value The value.\r\n\t * @returns {Object} registered provider instance\r\n\t *\r\n\t * @example\r\n\t * Here are some examples of creating value services.\r\n\t * ```js\r\n\t * $provide.value('ADMIN_USER', 'admin');\r\n\t *\r\n\t * $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 });\r\n\t *\r\n\t * $provide.value('halfOf', function(value) {\r\n\t * return value / 2;\r\n\t * });\r\n\t * ```\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $provide#constant\r\n\t * @description\r\n\t *\r\n\t * Register a **constant service**, such as a string, a number, an array, an object or a function,\r\n\t * with the {@link auto.$injector $injector}. Unlike {@link auto.$provide#value value} it can be\r\n\t * injected into a module configuration function (see {@link angular.Module#config}) and it cannot\r\n\t * be overridden by an Angular {@link auto.$provide#decorator decorator}.\r\n\t *\r\n\t * @param {string} name The name of the constant.\r\n\t * @param {*} value The constant value.\r\n\t * @returns {Object} registered instance\r\n\t *\r\n\t * @example\r\n\t * Here a some examples of creating constants:\r\n\t * ```js\r\n\t * $provide.constant('SHARD_HEIGHT', 306);\r\n\t *\r\n\t * $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']);\r\n\t *\r\n\t * $provide.constant('double', function(value) {\r\n\t * return value * 2;\r\n\t * });\r\n\t * ```\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $provide#decorator\r\n\t * @description\r\n\t *\r\n\t * Register a **service decorator** with the {@link auto.$injector $injector}. A service decorator\r\n\t * intercepts the creation of a service, allowing it to override or modify the behaviour of the\r\n\t * service. The object returned by the decorator may be the original service, or a new service\r\n\t * object which replaces or wraps and delegates to the original service.\r\n\t *\r\n\t * @param {string} name The name of the service to decorate.\r\n\t * @param {function()} decorator This function will be invoked when the service needs to be\r\n\t * instantiated and should return the decorated service instance. The function is called using\r\n\t * the {@link auto.$injector#invoke injector.invoke} method and is therefore fully injectable.\r\n\t * Local injection arguments:\r\n\t *\r\n\t * * `$delegate` - The original service instance, which can be monkey patched, configured,\r\n\t * decorated or delegated to.\r\n\t *\r\n\t * @example\r\n\t * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting\r\n\t * calls to {@link ng.$log#error $log.warn()}.\r\n\t * ```js\r\n\t * $provide.decorator('$log', ['$delegate', function($delegate) {\r\n\t * $delegate.warn = $delegate.error;\r\n\t * return $delegate;\r\n\t * }]);\r\n\t * ```\r\n\t */\r\n\r\n\r\n\tfunction createInjector(modulesToLoad) {\r\n\t\tvar INSTANTIATING = {},\r\n\t\t\tproviderSuffix = 'Provider',\r\n\t\t\tpath = [],\r\n\t\t\tloadedModules = new HashMap([], true),\r\n\t\t\tproviderCache = {\r\n\t\t\t\t$provide: {\r\n\t\t\t\t\tprovider: supportObject(provider),\r\n\t\t\t\t\tfactory: supportObject(factory),\r\n\t\t\t\t\tservice: supportObject(service),\r\n\t\t\t\t\tvalue: supportObject(value),\r\n\t\t\t\t\tconstant: supportObject(constant),\r\n\t\t\t\t\tdecorator: decorator\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tproviderInjector = (providerCache.$injector =\r\n\t\t\t\tcreateInternalInjector(providerCache, function () {\r\n\t\t\t\t\tthrow $injectorMinErr('unpr', \"Unknown provider: {0}\", path.join(' <- '));\r\n\t\t\t\t})),\r\n\t\t\tinstanceCache = {},\r\n\t\t\tinstanceInjector = (instanceCache.$injector =\r\n\t\t\t\tcreateInternalInjector(instanceCache, function (servicename) {\r\n\t\t\t\t\tvar provider = providerInjector.get(servicename + providerSuffix);\r\n\t\t\t\t\treturn instanceInjector.invoke(provider.$get, provider);\r\n\t\t\t\t}));\r\n\r\n\r\n\t\tforEach(loadModules(modulesToLoad), function (fn) { instanceInjector.invoke(fn || noop); });\r\n\r\n\t\treturn instanceInjector;\r\n\r\n\t\t////////////////////////////////////\r\n\t\t// $provider\r\n\t\t////////////////////////////////////\r\n\r\n\t\tfunction supportObject(delegate) {\r\n\t\t\treturn function (key, value) {\r\n\t\t\t\tif (isObject(key)) {\r\n\t\t\t\t\tforEach(key, reverseParams(delegate));\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn delegate(key, value);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tfunction provider(name, provider_) {\r\n\t\t\tassertNotHasOwnProperty(name, 'service');\r\n\t\t\tif (isFunction(provider_) || isArray(provider_)) {\r\n\t\t\t\tprovider_ = providerInjector.instantiate(provider_);\r\n\t\t\t}\r\n\t\t\tif (!provider_.$get) {\r\n\t\t\t\tthrow $injectorMinErr('pget', \"Provider '{0}' must define $get factory method.\", name);\r\n\t\t\t}\r\n\t\t\treturn providerCache[name + providerSuffix] = provider_;\r\n\t\t}\r\n\r\n\t\tfunction factory(name, factoryFn) { return provider(name, { $get: factoryFn }); }\r\n\r\n\t\tfunction service(name, constructor) {\r\n\t\t\treturn factory(name, ['$injector', function ($injector) {\r\n\t\t\t\treturn $injector.instantiate(constructor);\r\n\t\t\t}]);\r\n\t\t}\r\n\r\n\t\tfunction value(name, val) { return factory(name, valueFn(val)); }\r\n\r\n\t\tfunction constant(name, value) {\r\n\t\t\tassertNotHasOwnProperty(name, 'constant');\r\n\t\t\tproviderCache[name] = value;\r\n\t\t\tinstanceCache[name] = value;\r\n\t\t}\r\n\r\n\t\tfunction decorator(serviceName, decorFn) {\r\n\t\t\tvar origProvider = providerInjector.get(serviceName + providerSuffix),\r\n\t\t\t\torig$get = origProvider.$get;\r\n\r\n\t\t\torigProvider.$get = function () {\r\n\t\t\t\tvar origInstance = instanceInjector.invoke(orig$get, origProvider);\r\n\t\t\t\treturn instanceInjector.invoke(decorFn, null, { $delegate: origInstance });\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\t////////////////////////////////////\r\n\t\t// Module Loading\r\n\t\t////////////////////////////////////\r\n\t\tfunction loadModules(modulesToLoad) {\r\n\t\t\tvar runBlocks = [], moduleFn, invokeQueue, i, ii;\r\n\t\t\tforEach(modulesToLoad, function (module) {\r\n\t\t\t\tif (loadedModules.get(module)) return;\r\n\t\t\t\tloadedModules.put(module, true);\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tif (isString(module)) {\r\n\t\t\t\t\t\tmoduleFn = angularModule(module);\r\n\t\t\t\t\t\trunBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);\r\n\r\n\t\t\t\t\t\tfor (invokeQueue = moduleFn._invokeQueue, i = 0, ii = invokeQueue.length; i < ii; i++) {\r\n\t\t\t\t\t\t\tvar invokeArgs = invokeQueue[i],\r\n\t\t\t\t\t\t\t\tprovider = providerInjector.get(invokeArgs[0]);\r\n\r\n\t\t\t\t\t\t\tprovider[invokeArgs[1]].apply(provider, invokeArgs[2]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (isFunction(module)) {\r\n\t\t\t\t\t\trunBlocks.push(providerInjector.invoke(module));\r\n\t\t\t\t\t} else if (isArray(module)) {\r\n\t\t\t\t\t\trunBlocks.push(providerInjector.invoke(module));\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tassertArgFn(module, 'module');\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tif (isArray(module)) {\r\n\t\t\t\t\t\tmodule = module[module.length - 1];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (e.message && e.stack && e.stack.indexOf(e.message) == -1) {\r\n\t\t\t\t\t\t// Safari & FF's stack traces don't contain error.message content\r\n\t\t\t\t\t\t// unlike those of Chrome and IE\r\n\t\t\t\t\t\t// So if stack doesn't contain message, we create a new string that contains both.\r\n\t\t\t\t\t\t// Since error.stack is read-only in Safari, I'm overriding e and not e.stack here.\r\n\t\t\t\t\t\t/* jshint -W022 */\r\n\t\t\t\t\t\te = e.message + '\\n' + e.stack;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthrow $injectorMinErr('modulerr', \"Failed to instantiate module {0} due to:\\n{1}\",\r\n\t\t\t\t\t\t\t module, e.stack || e.message || e);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\treturn runBlocks;\r\n\t\t}\r\n\r\n\t\t////////////////////////////////////\r\n\t\t// internal Injector\r\n\t\t////////////////////////////////////\r\n\r\n\t\tfunction createInternalInjector(cache, factory) {\r\n\r\n\t\t\tfunction getService(serviceName) {\r\n\t\t\t\tif (cache.hasOwnProperty(serviceName)) {\r\n\t\t\t\t\tif (cache[serviceName] === INSTANTIATING) {\r\n\t\t\t\t\t\tthrow $injectorMinErr('cdep', 'Circular dependency found: {0}',\r\n\t\t\t\t\t\t\t\t serviceName + ' <- ' + path.join(' <- '));\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn cache[serviceName];\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tpath.unshift(serviceName);\r\n\t\t\t\t\t\tcache[serviceName] = INSTANTIATING;\r\n\t\t\t\t\t\treturn cache[serviceName] = factory(serviceName);\r\n\t\t\t\t\t} catch (err) {\r\n\t\t\t\t\t\tif (cache[serviceName] === INSTANTIATING) {\r\n\t\t\t\t\t\t\tdelete cache[serviceName];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tthrow err;\r\n\t\t\t\t\t} finally {\r\n\t\t\t\t\t\tpath.shift();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfunction invoke(fn, self, locals) {\r\n\t\t\t\tvar args = [],\r\n\t\t\t\t\t$inject = annotate(fn),\r\n\t\t\t\t\tlength, i,\r\n\t\t\t\t\tkey;\r\n\r\n\t\t\t\tfor (i = 0, length = $inject.length; i < length; i++) {\r\n\t\t\t\t\tkey = $inject[i];\r\n\t\t\t\t\tif (typeof key !== 'string') {\r\n\t\t\t\t\t\tthrow $injectorMinErr('itkn',\r\n\t\t\t\t\t\t\t\t'Incorrect injection token! Expected service name as string, got {0}', key);\r\n\t\t\t\t\t}\r\n\t\t\t\t\targs.push(\r\n\t\t\t\t\t locals && locals.hasOwnProperty(key)\r\n\t\t\t\t\t ? locals[key]\r\n\t\t\t\t\t : getService(key)\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tif (isArray(fn)) {\r\n\t\t\t\t\tfn = fn[length];\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// http://jsperf.com/angularjs-invoke-apply-vs-switch\r\n\t\t\t\t// #5388\r\n\t\t\t\treturn fn.apply(self, args);\r\n\t\t\t}\r\n\r\n\t\t\tfunction instantiate(Type, locals) {\r\n\t\t\t\tvar Constructor = function () { },\r\n\t\t\t\t\tinstance, returnedValue;\r\n\r\n\t\t\t\t// Check if Type is annotated and use just the given function at n-1 as parameter\r\n\t\t\t\t// e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);\r\n\t\t\t\tConstructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype;\r\n\t\t\t\tinstance = new Constructor();\r\n\t\t\t\treturnedValue = invoke(Type, instance, locals);\r\n\r\n\t\t\t\treturn isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance;\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\tinvoke: invoke,\r\n\t\t\t\tinstantiate: instantiate,\r\n\t\t\t\tget: getService,\r\n\t\t\t\tannotate: annotate,\r\n\t\t\t\thas: function (name) {\r\n\t\t\t\t\treturn providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $anchorScroll\r\n\t * @kind function\r\n\t * @requires $window\r\n\t * @requires $location\r\n\t * @requires $rootScope\r\n\t *\r\n\t * @description\r\n\t * When called, it checks current value of `$location.hash()` and scrolls to the related element,\r\n\t * according to rules specified in\r\n\t * [Html5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document).\r\n\t *\r\n\t * It also watches the `$location.hash()` and scrolls whenever it changes to match any anchor.\r\n\t * This can be disabled by calling `$anchorScrollProvider.disableAutoScrolling()`.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <div id=\"scrollArea\" ng-controller=\"ScrollCtrl\">\r\n\t\t\t <a ng-click=\"gotoBottom()\">Go to bottom</a>\r\n\t\t\t <a id=\"bottom\"></a> You're at the bottom!\r\n\t\t </div>\r\n\t\t </file>\r\n\t\t <file name=\"script.js\">\r\n\t\t function ScrollCtrl($scope, $location, $anchorScroll) {\r\n\t\t\t $scope.gotoBottom = function (){\r\n\t\t\t // set the location.hash to the id of\r\n\t\t\t // the element you wish to scroll to.\r\n\t\t\t $location.hash('bottom');\r\n\t\r\n\t\t\t // call $anchorScroll()\r\n\t\t\t $anchorScroll();\r\n\t\t\t };\r\n\t\t }\r\n\t\t </file>\r\n\t\t <file name=\"style.css\">\r\n\t\t #scrollArea {\r\n\t\t\t height: 350px;\r\n\t\t\t overflow: auto;\r\n\t\t }\r\n\t\r\n\t\t #bottom {\r\n\t\t\t display: block;\r\n\t\t\t margin-top: 2000px;\r\n\t\t }\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tfunction $AnchorScrollProvider() {\r\n\r\n\t\tvar autoScrollingEnabled = true;\r\n\r\n\t\tthis.disableAutoScrolling = function () {\r\n\t\t\tautoScrollingEnabled = false;\r\n\t\t};\r\n\r\n\t\tthis.$get = ['$window', '$location', '$rootScope', function ($window, $location, $rootScope) {\r\n\t\t\tvar document = $window.document;\r\n\r\n\t\t\t// helper function to get first anchor from a NodeList\r\n\t\t\t// can't use filter.filter, as it accepts only instances of Array\r\n\t\t\t// and IE can't convert NodeList to an array using [].slice\r\n\t\t\t// TODO(vojta): use filter if we change it to accept lists as well\r\n\t\t\tfunction getFirstAnchor(list) {\r\n\t\t\t\tvar result = null;\r\n\t\t\t\tforEach(list, function (element) {\r\n\t\t\t\t\tif (!result && lowercase(element.nodeName) === 'a') result = element;\r\n\t\t\t\t});\r\n\t\t\t\treturn result;\r\n\t\t\t}\r\n\r\n\t\t\tfunction scroll() {\r\n\t\t\t\tvar hash = $location.hash(), elm;\r\n\r\n\t\t\t\t// empty hash, scroll to the top of the page\r\n\t\t\t\tif (!hash) $window.scrollTo(0, 0);\r\n\r\n\t\t\t\t\t// element with given id\r\n\t\t\t\telse if ((elm = document.getElementById(hash))) elm.scrollIntoView();\r\n\r\n\t\t\t\t\t// first anchor with given name :-D\r\n\t\t\t\telse if ((elm = getFirstAnchor(document.getElementsByName(hash)))) elm.scrollIntoView();\r\n\r\n\t\t\t\t\t// no element and hash == 'top', scroll to the top of the page\r\n\t\t\t\telse if (hash === 'top') $window.scrollTo(0, 0);\r\n\t\t\t}\r\n\r\n\t\t\t// does not scroll when user clicks on anchor link that is currently on\r\n\t\t\t// (no url change, no $location.hash() change), browser native does scroll\r\n\t\t\tif (autoScrollingEnabled) {\r\n\t\t\t\t$rootScope.$watch(function autoScrollWatch() { return $location.hash(); },\r\n\t\t\t\t function autoScrollWatchAction() {\r\n\t\t\t\t \t$rootScope.$evalAsync(scroll);\r\n\t\t\t\t });\r\n\t\t\t}\r\n\r\n\t\t\treturn scroll;\r\n\t\t}];\r\n\t}\r\n\r\n\tvar $animateMinErr = minErr('$animate');\r\n\r\n\t/**\r\n\t * @ngdoc provider\r\n\t * @name $animateProvider\r\n\t *\r\n\t * @description\r\n\t * Default implementation of $animate that doesn't perform any animations, instead just\r\n\t * synchronously performs DOM\r\n\t * updates and calls done() callbacks.\r\n\t *\r\n\t * In order to enable animations the ngAnimate module has to be loaded.\r\n\t *\r\n\t * To see the functional implementation check out src/ngAnimate/animate.js\r\n\t */\r\n\tvar $AnimateProvider = ['$provide', function ($provide) {\r\n\r\n\r\n\t\tthis.$$selectors = {};\r\n\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $animateProvider#register\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Registers a new injectable animation factory function. The factory function produces the\r\n\t\t * animation object which contains callback functions for each event that is expected to be\r\n\t\t * animated.\r\n\t\t *\r\n\t\t * * `eventFn`: `function(Element, doneFunction)` The element to animate, the `doneFunction`\r\n\t\t * must be called once the element animation is complete. If a function is returned then the\r\n\t\t * animation service will use this function to cancel the animation whenever a cancel event is\r\n\t\t * triggered.\r\n\t\t *\r\n\t\t *\r\n\t\t * ```js\r\n\t\t * return {\r\n\t\t * eventFn : function(element, done) {\r\n\t\t * //code to run the animation\r\n\t\t * //once complete, then run done()\r\n\t\t * return function cancellationFunction() {\r\n\t\t * //code to cancel the animation\r\n\t\t * }\r\n\t\t * }\r\n\t\t * }\r\n\t\t * ```\r\n\t\t *\r\n\t\t * @param {string} name The name of the animation.\r\n\t\t * @param {Function} factory The factory function that will be executed to return the animation\r\n\t\t * object.\r\n\t\t */\r\n\t\tthis.register = function (name, factory) {\r\n\t\t\tvar key = name + '-animation';\r\n\t\t\tif (name && name.charAt(0) != '.') throw $animateMinErr('notcsel',\r\n\t\t\t\t\"Expecting class selector starting with '.' got '{0}'.\", name);\r\n\t\t\tthis.$$selectors[name.substr(1)] = key;\r\n\t\t\t$provide.factory(key, factory);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $animateProvider#classNameFilter\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Sets and/or returns the CSS class regular expression that is checked when performing\r\n\t\t * an animation. Upon bootstrap the classNameFilter value is not set at all and will\r\n\t\t * therefore enable $animate to attempt to perform an animation on any element.\r\n\t\t * When setting the classNameFilter value, animations will only be performed on elements\r\n\t\t * that successfully match the filter expression. This in turn can boost performance\r\n\t\t * for low-powered devices as well as applications containing a lot of structural operations.\r\n\t\t * @param {RegExp=} expression The className expression which will be checked against all animations\r\n\t\t * @return {RegExp} The current CSS className expression value. If null then there is no expression value\r\n\t\t */\r\n\t\tthis.classNameFilter = function (expression) {\r\n\t\t\tif (arguments.length === 1) {\r\n\t\t\t\tthis.$$classNameFilter = (expression instanceof RegExp) ? expression : null;\r\n\t\t\t}\r\n\t\t\treturn this.$$classNameFilter;\r\n\t\t};\r\n\r\n\t\tthis.$get = ['$timeout', '$$asyncCallback', function ($timeout, $$asyncCallback) {\r\n\r\n\t\t\tfunction async(fn) {\r\n\t\t\t\tfn && $$asyncCallback(fn);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t *\r\n\t\t\t * @ngdoc service\r\n\t\t\t * @name $animate\r\n\t\t\t * @description The $animate service provides rudimentary DOM manipulation functions to\r\n\t\t\t * insert, remove and move elements within the DOM, as well as adding and removing classes.\r\n\t\t\t * This service is the core service used by the ngAnimate $animator service which provides\r\n\t\t\t * high-level animation hooks for CSS and JavaScript.\r\n\t\t\t *\r\n\t\t\t * $animate is available in the AngularJS core, however, the ngAnimate module must be included\r\n\t\t\t * to enable full out animation support. Otherwise, $animate will only perform simple DOM\r\n\t\t\t * manipulation operations.\r\n\t\t\t *\r\n\t\t\t * To learn more about enabling animation support, click here to visit the {@link ngAnimate\r\n\t\t\t * ngAnimate module page} as well as the {@link ngAnimate.$animate ngAnimate $animate service\r\n\t\t\t * page}.\r\n\t\t\t */\r\n\t\t\treturn {\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t *\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $animate#enter\r\n\t\t\t\t * @kind function\r\n\t\t\t\t * @description Inserts the element into the DOM either after the `after` element or within\r\n\t\t\t\t * the `parent` element. Once complete, the done() callback will be fired (if provided).\r\n\t\t\t\t * @param {DOMElement} element the element which will be inserted into the DOM\r\n\t\t\t\t * @param {DOMElement} parent the parent element which will append the element as\r\n\t\t\t\t * a child (if the after element is not present)\r\n\t\t\t\t * @param {DOMElement} after the sibling element which will append the element\r\n\t\t\t\t * after itself\r\n\t\t\t\t * @param {Function=} done callback function that will be called after the element has been\r\n\t\t\t\t * inserted into the DOM\r\n\t\t\t\t */\r\n\t\t\t\tenter: function (element, parent, after, done) {\r\n\t\t\t\t\tif (after) {\r\n\t\t\t\t\t\tafter.after(element);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif (!parent || !parent[0]) {\r\n\t\t\t\t\t\t\tparent = after.parent();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tparent.append(element);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tasync(done);\r\n\t\t\t\t},\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t *\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $animate#leave\r\n\t\t\t\t * @kind function\r\n\t\t\t\t * @description Removes the element from the DOM. Once complete, the done() callback will be\r\n\t\t\t\t * fired (if provided).\r\n\t\t\t\t * @param {DOMElement} element the element which will be removed from the DOM\r\n\t\t\t\t * @param {Function=} done callback function that will be called after the element has been\r\n\t\t\t\t * removed from the DOM\r\n\t\t\t\t */\r\n\t\t\t\tleave: function (element, done) {\r\n\t\t\t\t\telement.remove();\r\n\t\t\t\t\tasync(done);\r\n\t\t\t\t},\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t *\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $animate#move\r\n\t\t\t\t * @kind function\r\n\t\t\t\t * @description Moves the position of the provided element within the DOM to be placed\r\n\t\t\t\t * either after the `after` element or inside of the `parent` element. Once complete, the\r\n\t\t\t\t * done() callback will be fired (if provided).\r\n\t\t\t\t *\r\n\t\t\t\t * @param {DOMElement} element the element which will be moved around within the\r\n\t\t\t\t * DOM\r\n\t\t\t\t * @param {DOMElement} parent the parent element where the element will be\r\n\t\t\t\t * inserted into (if the after element is not present)\r\n\t\t\t\t * @param {DOMElement} after the sibling element where the element will be\r\n\t\t\t\t * positioned next to\r\n\t\t\t\t * @param {Function=} done the callback function (if provided) that will be fired after the\r\n\t\t\t\t * element has been moved to its new position\r\n\t\t\t\t */\r\n\t\t\t\tmove: function (element, parent, after, done) {\r\n\t\t\t\t\t// Do not remove element before insert. Removing will cause data associated with the\r\n\t\t\t\t\t// element to be dropped. Insert will implicitly do the remove.\r\n\t\t\t\t\tthis.enter(element, parent, after, done);\r\n\t\t\t\t},\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t *\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $animate#addClass\r\n\t\t\t\t * @kind function\r\n\t\t\t\t * @description Adds the provided className CSS class value to the provided element. Once\r\n\t\t\t\t * complete, the done() callback will be fired (if provided).\r\n\t\t\t\t * @param {DOMElement} element the element which will have the className value\r\n\t\t\t\t * added to it\r\n\t\t\t\t * @param {string} className the CSS class which will be added to the element\r\n\t\t\t\t * @param {Function=} done the callback function (if provided) that will be fired after the\r\n\t\t\t\t * className value has been added to the element\r\n\t\t\t\t */\r\n\t\t\t\taddClass: function (element, className, done) {\r\n\t\t\t\t\tclassName = isString(className) ?\r\n\t\t\t\t\t\tclassName :\r\n\t\t\t\t\t\t\t\t isArray(className) ? className.join(' ') : '';\r\n\t\t\t\t\tforEach(element, function (element) {\r\n\t\t\t\t\t\tjqLiteAddClass(element, className);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tasync(done);\r\n\t\t\t\t},\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t *\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $animate#removeClass\r\n\t\t\t\t * @kind function\r\n\t\t\t\t * @description Removes the provided className CSS class value from the provided element.\r\n\t\t\t\t * Once complete, the done() callback will be fired (if provided).\r\n\t\t\t\t * @param {DOMElement} element the element which will have the className value\r\n\t\t\t\t * removed from it\r\n\t\t\t\t * @param {string} className the CSS class which will be removed from the element\r\n\t\t\t\t * @param {Function=} done the callback function (if provided) that will be fired after the\r\n\t\t\t\t * className value has been removed from the element\r\n\t\t\t\t */\r\n\t\t\t\tremoveClass: function (element, className, done) {\r\n\t\t\t\t\tclassName = isString(className) ?\r\n\t\t\t\t\t\tclassName :\r\n\t\t\t\t\t\t\t\t isArray(className) ? className.join(' ') : '';\r\n\t\t\t\t\tforEach(element, function (element) {\r\n\t\t\t\t\t\tjqLiteRemoveClass(element, className);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tasync(done);\r\n\t\t\t\t},\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t *\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $animate#setClass\r\n\t\t\t\t * @kind function\r\n\t\t\t\t * @description Adds and/or removes the given CSS classes to and from the element.\r\n\t\t\t\t * Once complete, the done() callback will be fired (if provided).\r\n\t\t\t\t * @param {DOMElement} element the element which will have its CSS classes changed\r\n\t\t\t\t * removed from it\r\n\t\t\t\t * @param {string} add the CSS classes which will be added to the element\r\n\t\t\t\t * @param {string} remove the CSS class which will be removed from the element\r\n\t\t\t\t * @param {Function=} done the callback function (if provided) that will be fired after the\r\n\t\t\t\t * CSS classes have been set on the element\r\n\t\t\t\t */\r\n\t\t\t\tsetClass: function (element, add, remove, done) {\r\n\t\t\t\t\tforEach(element, function (element) {\r\n\t\t\t\t\t\tjqLiteAddClass(element, add);\r\n\t\t\t\t\t\tjqLiteRemoveClass(element, remove);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tasync(done);\r\n\t\t\t\t},\r\n\r\n\t\t\t\tenabled: noop\r\n\t\t\t};\r\n\t\t}];\r\n\t}];\r\n\r\n\tfunction $$AsyncCallbackProvider() {\r\n\t\tthis.$get = ['$$rAF', '$timeout', function ($$rAF, $timeout) {\r\n\t\t\treturn $$rAF.supported\r\n\t\t\t ? function (fn) { return $$rAF(fn); }\r\n\t\t\t : function (fn) {\r\n\t\t\t \treturn $timeout(fn, 0, false);\r\n\t\t\t };\r\n\t\t}];\r\n\t}\r\n\r\n\t/**\r\n\t * ! This is a private undocumented service !\r\n\t *\r\n\t * @name $browser\r\n\t * @requires $log\r\n\t * @description\r\n\t * This object has two goals:\r\n\t *\r\n\t * - hide all the global state in the browser caused by the window object\r\n\t * - abstract away all the browser specific features and inconsistencies\r\n\t *\r\n\t * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser`\r\n\t * service, which can be used for convenient testing of the application without the interaction with\r\n\t * the real browser apis.\r\n\t */\r\n\t/**\r\n\t * @param {object} window The global window object.\r\n\t * @param {object} document jQuery wrapped document.\r\n\t * @param {function()} XHR XMLHttpRequest constructor.\r\n\t * @param {object} $log console.log or an object with the same interface.\r\n\t * @param {object} $sniffer $sniffer service\r\n\t */\r\n\tfunction Browser(window, document, $log, $sniffer) {\r\n\t\tvar self = this,\r\n\t\t\trawDocument = document[0],\r\n\t\t\tlocation = window.location,\r\n\t\t\thistory = window.history,\r\n\t\t\tsetTimeout = window.setTimeout,\r\n\t\t\tclearTimeout = window.clearTimeout,\r\n\t\t\tpendingDeferIds = {};\r\n\r\n\t\tself.isMock = false;\r\n\r\n\t\tvar outstandingRequestCount = 0;\r\n\t\tvar outstandingRequestCallbacks = [];\r\n\r\n\t\t// TODO(vojta): remove this temporary api\r\n\t\tself.$$completeOutstandingRequest = completeOutstandingRequest;\r\n\t\tself.$$incOutstandingRequestCount = function () { outstandingRequestCount++; };\r\n\r\n\t\t/**\r\n\t\t * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks`\r\n\t\t * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed.\r\n\t\t */\r\n\t\tfunction completeOutstandingRequest(fn) {\r\n\t\t\ttry {\r\n\t\t\t\tfn.apply(null, sliceArgs(arguments, 1));\r\n\t\t\t} finally {\r\n\t\t\t\toutstandingRequestCount--;\r\n\t\t\t\tif (outstandingRequestCount === 0) {\r\n\t\t\t\t\twhile (outstandingRequestCallbacks.length) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\toutstandingRequestCallbacks.pop()();\r\n\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t$log.error(e);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * @private\r\n\t\t * Note: this method is used only by scenario runner\r\n\t\t * TODO(vojta): prefix this method with $$ ?\r\n\t\t * @param {function()} callback Function that will be called when no outstanding request\r\n\t\t */\r\n\t\tself.notifyWhenNoOutstandingRequests = function (callback) {\r\n\t\t\t// force browser to execute all pollFns - this is needed so that cookies and other pollers fire\r\n\t\t\t// at some deterministic time in respect to the test runner's actions. Leaving things up to the\r\n\t\t\t// regular poller would result in flaky tests.\r\n\t\t\tforEach(pollFns, function (pollFn) { pollFn(); });\r\n\r\n\t\t\tif (outstandingRequestCount === 0) {\r\n\t\t\t\tcallback();\r\n\t\t\t} else {\r\n\t\t\t\toutstandingRequestCallbacks.push(callback);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t//////////////////////////////////////////////////////////////\r\n\t\t// Poll Watcher API\r\n\t\t//////////////////////////////////////////////////////////////\r\n\t\tvar pollFns = [],\r\n\t\t\tpollTimeout;\r\n\r\n\t\t/**\r\n\t\t * @name $browser#addPollFn\r\n\t\t *\r\n\t\t * @param {function()} fn Poll function to add\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Adds a function to the list of functions that poller periodically executes,\r\n\t\t * and starts polling if not started yet.\r\n\t\t *\r\n\t\t * @returns {function()} the added function\r\n\t\t */\r\n\t\tself.addPollFn = function (fn) {\r\n\t\t\tif (isUndefined(pollTimeout)) startPoller(100, setTimeout);\r\n\t\t\tpollFns.push(fn);\r\n\t\t\treturn fn;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * @param {number} interval How often should browser call poll functions (ms)\r\n\t\t * @param {function()} setTimeout Reference to a real or fake `setTimeout` function.\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Configures the poller to run in the specified intervals, using the specified\r\n\t\t * setTimeout fn and kicks it off.\r\n\t\t */\r\n\t\tfunction startPoller(interval, setTimeout) {\r\n\t\t\t(function check() {\r\n\t\t\t\tforEach(pollFns, function (pollFn) { pollFn(); });\r\n\t\t\t\tpollTimeout = setTimeout(check, interval);\r\n\t\t\t})();\r\n\t\t}\r\n\r\n\t\t//////////////////////////////////////////////////////////////\r\n\t\t// URL API\r\n\t\t//////////////////////////////////////////////////////////////\r\n\r\n\t\tvar lastBrowserUrl = location.href,\r\n\t\t\tbaseElement = document.find('base'),\r\n\t\t\tnewLocation = null;\r\n\r\n\t\t/**\r\n\t\t * @name $browser#url\r\n\t\t *\r\n\t\t * @description\r\n\t\t * GETTER:\r\n\t\t * Without any argument, this method just returns current value of location.href.\r\n\t\t *\r\n\t\t * SETTER:\r\n\t\t * With at least one argument, this method sets url to new value.\r\n\t\t * If html5 history api supported, pushState/replaceState is used, otherwise\r\n\t\t * location.href/location.replace is used.\r\n\t\t * Returns its own instance to allow chaining\r\n\t\t *\r\n\t\t * NOTE: this api is intended for use only by the $location service. Please use the\r\n\t\t * {@link ng.$location $location service} to change url.\r\n\t\t *\r\n\t\t * @param {string} url New url (when used as setter)\r\n\t\t * @param {boolean=} replace Should new url replace current history record ?\r\n\t\t */\r\n\t\tself.url = function (url, replace) {\r\n\t\t\t// Android Browser BFCache causes location, history reference to become stale.\r\n\t\t\tif (location !== window.location) location = window.location;\r\n\t\t\tif (history !== window.history) history = window.history;\r\n\r\n\t\t\t// setter\r\n\t\t\tif (url) {\r\n\t\t\t\tif (lastBrowserUrl == url) return;\r\n\t\t\t\tlastBrowserUrl = url;\r\n\t\t\t\tif ($sniffer.history) {\r\n\t\t\t\t\tif (replace) history.replaceState(null, '', url);\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\thistory.pushState(null, '', url);\r\n\t\t\t\t\t\t// Crazy Opera Bug: http://my.opera.com/community/forums/topic.dml?id=1185462\r\n\t\t\t\t\t\tbaseElement.attr('href', baseElement.attr('href'));\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tnewLocation = url;\r\n\t\t\t\t\tif (replace) {\r\n\t\t\t\t\t\tlocation.replace(url);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tlocation.href = url;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn self;\r\n\t\t\t\t// getter\r\n\t\t\t} else {\r\n\t\t\t\t// - newLocation is a workaround for an IE7-9 issue with location.replace and location.href\r\n\t\t\t\t// methods not updating location.href synchronously.\r\n\t\t\t\t// - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172\r\n\t\t\t\treturn newLocation || location.href.replace(/%27/g, \"'\");\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar urlChangeListeners = [],\r\n\t\t\turlChangeInit = false;\r\n\r\n\t\tfunction fireUrlChange() {\r\n\t\t\tnewLocation = null;\r\n\t\t\tif (lastBrowserUrl == self.url()) return;\r\n\r\n\t\t\tlastBrowserUrl = self.url();\r\n\t\t\tforEach(urlChangeListeners, function (listener) {\r\n\t\t\t\tlistener(self.url());\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * @name $browser#onUrlChange\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Register callback function that will be called, when url changes.\r\n\t\t *\r\n\t\t * It's only called when the url is changed from outside of angular:\r\n\t\t * - user types different url into address bar\r\n\t\t * - user clicks on history (forward/back) button\r\n\t\t * - user clicks on a link\r\n\t\t *\r\n\t\t * It's not called when url is changed by $browser.url() method\r\n\t\t *\r\n\t\t * The listener gets called with new url as parameter.\r\n\t\t *\r\n\t\t * NOTE: this api is intended for use only by the $location service. Please use the\r\n\t\t * {@link ng.$location $location service} to monitor url changes in angular apps.\r\n\t\t *\r\n\t\t * @param {function(string)} listener Listener function to be called when url changes.\r\n\t\t * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.\r\n\t\t */\r\n\t\tself.onUrlChange = function (callback) {\r\n\t\t\t// TODO(vojta): refactor to use node's syntax for events\r\n\t\t\tif (!urlChangeInit) {\r\n\t\t\t\t// We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)\r\n\t\t\t\t// don't fire popstate when user change the address bar and don't fire hashchange when url\r\n\t\t\t\t// changed by push/replaceState\r\n\r\n\t\t\t\t// html5 history api - popstate event\r\n\t\t\t\tif ($sniffer.history) jqLite(window).on('popstate', fireUrlChange);\r\n\t\t\t\t// hashchange event\r\n\t\t\t\tif ($sniffer.hashchange) jqLite(window).on('hashchange', fireUrlChange);\r\n\t\t\t\t\t// polling\r\n\t\t\t\telse self.addPollFn(fireUrlChange);\r\n\r\n\t\t\t\turlChangeInit = true;\r\n\t\t\t}\r\n\r\n\t\t\turlChangeListeners.push(callback);\r\n\t\t\treturn callback;\r\n\t\t};\r\n\r\n\t\t//////////////////////////////////////////////////////////////\r\n\t\t// Misc API\r\n\t\t//////////////////////////////////////////////////////////////\r\n\r\n\t\t/**\r\n\t\t * @name $browser#baseHref\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Returns current <base href>\r\n\t\t * (always relative - without domain)\r\n\t\t *\r\n\t\t * @returns {string} The current base href\r\n\t\t */\r\n\t\tself.baseHref = function () {\r\n\t\t\tvar href = baseElement.attr('href');\r\n\t\t\treturn href ? href.replace(/^(https?\\:)?\\/\\/[^\\/]*/, '') : '';\r\n\t\t};\r\n\r\n\t\t//////////////////////////////////////////////////////////////\r\n\t\t// Cookies API\r\n\t\t//////////////////////////////////////////////////////////////\r\n\t\tvar lastCookies = {};\r\n\t\tvar lastCookieString = '';\r\n\t\tvar cookiePath = self.baseHref();\r\n\r\n\t\t/**\r\n\t\t * @name $browser#cookies\r\n\t\t *\r\n\t\t * @param {string=} name Cookie name\r\n\t\t * @param {string=} value Cookie value\r\n\t\t *\r\n\t\t * @description\r\n\t\t * The cookies method provides a 'private' low level access to browser cookies.\r\n\t\t * It is not meant to be used directly, use the $cookie service instead.\r\n\t\t *\r\n\t\t * The return values vary depending on the arguments that the method was called with as follows:\r\n\t\t *\r\n\t\t * - cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify\r\n\t\t * it\r\n\t\t * - cookies(name, value) -> set name to value, if value is undefined delete the cookie\r\n\t\t * - cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that\r\n\t\t * way)\r\n\t\t *\r\n\t\t * @returns {Object} Hash of all cookies (if called without any parameter)\r\n\t\t */\r\n\t\tself.cookies = function (name, value) {\r\n\t\t\t/* global escape: false, unescape: false */\r\n\t\t\tvar cookieLength, cookieArray, cookie, i, index;\r\n\r\n\t\t\tif (name) {\r\n\t\t\t\tif (value === undefined) {\r\n\t\t\t\t\trawDocument.cookie = escape(name) + \"=;path=\" + cookiePath +\r\n\t\t\t\t\t\t\t\t\t\t\t\";expires=Thu, 01 Jan 1970 00:00:00 GMT\";\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (isString(value)) {\r\n\t\t\t\t\t\tcookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) +\r\n\t\t\t\t\t\t\t\t\t\t\t ';path=' + cookiePath).length + 1;\r\n\r\n\t\t\t\t\t\t// per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:\r\n\t\t\t\t\t\t// - 300 cookies\r\n\t\t\t\t\t\t// - 20 cookies per unique domain\r\n\t\t\t\t\t\t// - 4096 bytes per cookie\r\n\t\t\t\t\t\tif (cookieLength > 4096) {\r\n\t\t\t\t\t\t\t$log.warn(\"Cookie '\" + name +\r\n\t\t\t\t\t\t\t \"' possibly not set or overflowed because it was too large (\" +\r\n\t\t\t\t\t\t\t cookieLength + \" > 4096 bytes)!\");\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tif (rawDocument.cookie !== lastCookieString) {\r\n\t\t\t\t\tlastCookieString = rawDocument.cookie;\r\n\t\t\t\t\tcookieArray = lastCookieString.split(\"; \");\r\n\t\t\t\t\tlastCookies = {};\r\n\r\n\t\t\t\t\tfor (i = 0; i < cookieArray.length; i++) {\r\n\t\t\t\t\t\tcookie = cookieArray[i];\r\n\t\t\t\t\t\tindex = cookie.indexOf('=');\r\n\t\t\t\t\t\tif (index > 0) { //ignore nameless cookies\r\n\t\t\t\t\t\t\tname = unescape(cookie.substring(0, index));\r\n\t\t\t\t\t\t\t// the first value that is seen for a cookie is the most\r\n\t\t\t\t\t\t\t// specific one. values for the same cookie name that\r\n\t\t\t\t\t\t\t// follow are for less specific paths.\r\n\t\t\t\t\t\t\tif (lastCookies[name] === undefined) {\r\n\t\t\t\t\t\t\t\tlastCookies[name] = unescape(cookie.substring(index + 1));\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn lastCookies;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\t/**\r\n\t\t * @name $browser#defer\r\n\t\t * @param {function()} fn A function, who's execution should be deferred.\r\n\t\t * @param {number=} [delay=0] of milliseconds to defer the function execution.\r\n\t\t * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Executes a fn asynchronously via `setTimeout(fn, delay)`.\r\n\t\t *\r\n\t\t * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using\r\n\t\t * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed\r\n\t\t * via `$browser.defer.flush()`.\r\n\t\t *\r\n\t\t */\r\n\t\tself.defer = function (fn, delay) {\r\n\t\t\tvar timeoutId;\r\n\t\t\toutstandingRequestCount++;\r\n\t\t\ttimeoutId = setTimeout(function () {\r\n\t\t\t\tdelete pendingDeferIds[timeoutId];\r\n\t\t\t\tcompleteOutstandingRequest(fn);\r\n\t\t\t}, delay || 0);\r\n\t\t\tpendingDeferIds[timeoutId] = true;\r\n\t\t\treturn timeoutId;\r\n\t\t};\r\n\r\n\r\n\t\t/**\r\n\t\t * @name $browser#defer.cancel\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Cancels a deferred task identified with `deferId`.\r\n\t\t *\r\n\t\t * @param {*} deferId Token returned by the `$browser.defer` function.\r\n\t\t * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\r\n\t\t * canceled.\r\n\t\t */\r\n\t\tself.defer.cancel = function (deferId) {\r\n\t\t\tif (pendingDeferIds[deferId]) {\r\n\t\t\t\tdelete pendingDeferIds[deferId];\r\n\t\t\t\tclearTimeout(deferId);\r\n\t\t\t\tcompleteOutstandingRequest(noop);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\t}\r\n\r\n\tfunction $BrowserProvider() {\r\n\t\tthis.$get = ['$window', '$log', '$sniffer', '$document',\r\n\t\t\tfunction ($window, $log, $sniffer, $document) {\r\n\t\t\t\treturn new Browser($window, $document, $log, $sniffer);\r\n\t\t\t}];\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $cacheFactory\r\n\t *\r\n\t * @description\r\n\t * Factory that constructs {@link $cacheFactory.Cache Cache} objects and gives access to\r\n\t * them.\r\n\t *\r\n\t * ```js\r\n\t *\r\n\t * var cache = $cacheFactory('cacheId');\r\n\t * expect($cacheFactory.get('cacheId')).toBe(cache);\r\n\t * expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();\r\n\t *\r\n\t * cache.put(\"key\", \"value\");\r\n\t * cache.put(\"another key\", \"another value\");\r\n\t *\r\n\t * // We've specified no options on creation\r\n\t * expect(cache.info()).toEqual({id: 'cacheId', size: 2});\r\n\t *\r\n\t * ```\r\n\t *\r\n\t *\r\n\t * @param {string} cacheId Name or id of the newly created cache.\r\n\t * @param {object=} options Options object that specifies the cache behavior. Properties:\r\n\t *\r\n\t * - `{number=}` `capacity` — turns the cache into LRU cache.\r\n\t *\r\n\t * @returns {object} Newly created cache object with the following set of methods:\r\n\t *\r\n\t * - `{object}` `info()` — Returns id, size, and options of cache.\r\n\t * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns\r\n\t * it.\r\n\t * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss.\r\n\t * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache.\r\n\t * - `{void}` `removeAll()` — Removes all cached values.\r\n\t * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory.\r\n\t *\r\n\t * @example\r\n\t <example module=\"cacheExampleApp\">\r\n\t\t <file name=\"index.html\">\r\n\t\t <div ng-controller=\"CacheController\">\r\n\t\t\t <input ng-model=\"newCacheKey\" placeholder=\"Key\">\r\n\t\t\t <input ng-model=\"newCacheValue\" placeholder=\"Value\">\r\n\t\t\t <button ng-click=\"put(newCacheKey, newCacheValue)\">Cache</button>\r\n\t\r\n\t\t\t <p ng-if=\"keys.length\">Cached Values</p>\r\n\t\t\t <div ng-repeat=\"key in keys\">\r\n\t\t\t <span ng-bind=\"key\"></span>\r\n\t\t\t <span>: </span>\r\n\t\t\t <b ng-bind=\"cache.get(key)\"></b>\r\n\t\t\t </div>\r\n\t\r\n\t\t\t <p>Cache Info</p>\r\n\t\t\t <div ng-repeat=\"(key, value) in cache.info()\">\r\n\t\t\t <span ng-bind=\"key\"></span>\r\n\t\t\t <span>: </span>\r\n\t\t\t <b ng-bind=\"value\"></b>\r\n\t\t\t </div>\r\n\t\t </div>\r\n\t\t </file>\r\n\t\t <file name=\"script.js\">\r\n\t\t angular.module('cacheExampleApp', []).\r\n\t\t\t controller('CacheController', ['$scope', '$cacheFactory', function($scope, $cacheFactory) {\r\n\t\t\t $scope.keys = [];\r\n\t\t\t $scope.cache = $cacheFactory('cacheId');\r\n\t\t\t $scope.put = function(key, value) {\r\n\t\t\t\t $scope.cache.put(key, value);\r\n\t\t\t\t $scope.keys.push(key);\r\n\t\t\t };\r\n\t\t\t }]);\r\n\t\t </file>\r\n\t\t <file name=\"style.css\">\r\n\t\t p {\r\n\t\t\t margin: 10px 0 3px;\r\n\t\t }\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tfunction $CacheFactoryProvider() {\r\n\r\n\t\tthis.$get = function () {\r\n\t\t\tvar caches = {};\r\n\r\n\t\t\tfunction cacheFactory(cacheId, options) {\r\n\t\t\t\tif (cacheId in caches) {\r\n\t\t\t\t\tthrow minErr('$cacheFactory')('iid', \"CacheId '{0}' is already taken!\", cacheId);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar size = 0,\r\n\t\t\t\t\tstats = extend({}, options, { id: cacheId }),\r\n\t\t\t\t\tdata = {},\r\n\t\t\t\t\tcapacity = (options && options.capacity) || Number.MAX_VALUE,\r\n\t\t\t\t\tlruHash = {},\r\n\t\t\t\t\tfreshEnd = null,\r\n\t\t\t\t\tstaleEnd = null;\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc type\r\n\t\t\t\t * @name $cacheFactory.Cache\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * A cache object used to store and retrieve data, primarily used by\r\n\t\t\t\t * {@link $http $http} and the {@link ng.directive:script script} directive to cache\r\n\t\t\t\t * templates and other data.\r\n\t\t\t\t *\r\n\t\t\t\t * ```js\r\n\t\t\t\t * angular.module('superCache')\r\n\t\t\t\t * .factory('superCache', ['$cacheFactory', function($cacheFactory) {\r\n\t\t\t\t * return $cacheFactory('super-cache');\r\n\t\t\t\t * }]);\r\n\t\t\t\t * ```\r\n\t\t\t\t *\r\n\t\t\t\t * Example test:\r\n\t\t\t\t *\r\n\t\t\t\t * ```js\r\n\t\t\t\t * it('should behave like a cache', inject(function(superCache) {\r\n\t\t\t\t * superCache.put('key', 'value');\r\n\t\t\t\t * superCache.put('another key', 'another value');\r\n\t\t\t\t *\r\n\t\t\t\t * expect(superCache.info()).toEqual({\r\n\t\t\t\t * id: 'super-cache',\r\n\t\t\t\t * size: 2\r\n\t\t\t\t * });\r\n\t\t\t\t *\r\n\t\t\t\t * superCache.remove('another key');\r\n\t\t\t\t * expect(superCache.get('another key')).toBeUndefined();\r\n\t\t\t\t *\r\n\t\t\t\t * superCache.removeAll();\r\n\t\t\t\t * expect(superCache.info()).toEqual({\r\n\t\t\t\t * id: 'super-cache',\r\n\t\t\t\t * size: 0\r\n\t\t\t\t * });\r\n\t\t\t\t * }));\r\n\t\t\t\t * ```\r\n\t\t\t\t */\r\n\t\t\t\treturn caches[cacheId] = {\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $cacheFactory.Cache#put\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be\r\n\t\t\t\t\t * retrieved later, and incrementing the size of the cache if the key was not already\r\n\t\t\t\t\t * present in the cache. If behaving like an LRU cache, it will also remove stale\r\n\t\t\t\t\t * entries from the set.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * It will not insert undefined values into the cache.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {string} key the key under which the cached data is stored.\r\n\t\t\t\t\t * @param {*} value the value to store alongside the key. If it is undefined, the key\r\n\t\t\t\t\t * will not be stored.\r\n\t\t\t\t\t * @returns {*} the value stored.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tput: function (key, value) {\r\n\t\t\t\t\t\tif (capacity < Number.MAX_VALUE) {\r\n\t\t\t\t\t\t\tvar lruEntry = lruHash[key] || (lruHash[key] = { key: key });\r\n\r\n\t\t\t\t\t\t\trefresh(lruEntry);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (isUndefined(value)) return;\r\n\t\t\t\t\t\tif (!(key in data)) size++;\r\n\t\t\t\t\t\tdata[key] = value;\r\n\r\n\t\t\t\t\t\tif (size > capacity) {\r\n\t\t\t\t\t\t\tthis.remove(staleEnd.key);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn value;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $cacheFactory.Cache#get\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {string} key the key of the data to be retrieved\r\n\t\t\t\t\t * @returns {*} the value stored.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tget: function (key) {\r\n\t\t\t\t\t\tif (capacity < Number.MAX_VALUE) {\r\n\t\t\t\t\t\t\tvar lruEntry = lruHash[key];\r\n\r\n\t\t\t\t\t\t\tif (!lruEntry) return;\r\n\r\n\t\t\t\t\t\t\trefresh(lruEntry);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn data[key];\r\n\t\t\t\t\t},\r\n\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $cacheFactory.Cache#remove\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Removes an entry from the {@link $cacheFactory.Cache Cache} object.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {string} key the key of the entry to be removed\r\n\t\t\t\t\t */\r\n\t\t\t\t\tremove: function (key) {\r\n\t\t\t\t\t\tif (capacity < Number.MAX_VALUE) {\r\n\t\t\t\t\t\t\tvar lruEntry = lruHash[key];\r\n\r\n\t\t\t\t\t\t\tif (!lruEntry) return;\r\n\r\n\t\t\t\t\t\t\tif (lruEntry == freshEnd) freshEnd = lruEntry.p;\r\n\t\t\t\t\t\t\tif (lruEntry == staleEnd) staleEnd = lruEntry.n;\r\n\t\t\t\t\t\t\tlink(lruEntry.n, lruEntry.p);\r\n\r\n\t\t\t\t\t\t\tdelete lruHash[key];\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tdelete data[key];\r\n\t\t\t\t\t\tsize--;\r\n\t\t\t\t\t},\r\n\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $cacheFactory.Cache#removeAll\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Clears the cache object of any entries.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tremoveAll: function () {\r\n\t\t\t\t\t\tdata = {};\r\n\t\t\t\t\t\tsize = 0;\r\n\t\t\t\t\t\tlruHash = {};\r\n\t\t\t\t\t\tfreshEnd = staleEnd = null;\r\n\t\t\t\t\t},\r\n\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $cacheFactory.Cache#destroy\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Destroys the {@link $cacheFactory.Cache Cache} object entirely,\r\n\t\t\t\t\t * removing it from the {@link $cacheFactory $cacheFactory} set.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tdestroy: function () {\r\n\t\t\t\t\t\tdata = null;\r\n\t\t\t\t\t\tstats = null;\r\n\t\t\t\t\t\tlruHash = null;\r\n\t\t\t\t\t\tdelete caches[cacheId];\r\n\t\t\t\t\t},\r\n\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $cacheFactory.Cache#info\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @returns {object} an object with the following properties:\r\n\t\t\t\t\t * <ul>\r\n\t\t\t\t\t * <li>**id**: the id of the cache instance</li>\r\n\t\t\t\t\t * <li>**size**: the number of entries kept in the cache instance</li>\r\n\t\t\t\t\t * <li>**...**: any additional properties from the options object when creating the\r\n\t\t\t\t\t * cache.</li>\r\n\t\t\t\t\t * </ul>\r\n\t\t\t\t\t */\r\n\t\t\t\t\tinfo: function () {\r\n\t\t\t\t\t\treturn extend({}, stats, { size: size });\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * makes the `entry` the freshEnd of the LRU linked list\r\n\t\t\t\t */\r\n\t\t\t\tfunction refresh(entry) {\r\n\t\t\t\t\tif (entry != freshEnd) {\r\n\t\t\t\t\t\tif (!staleEnd) {\r\n\t\t\t\t\t\t\tstaleEnd = entry;\r\n\t\t\t\t\t\t} else if (staleEnd == entry) {\r\n\t\t\t\t\t\t\tstaleEnd = entry.n;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tlink(entry.n, entry.p);\r\n\t\t\t\t\t\tlink(entry, freshEnd);\r\n\t\t\t\t\t\tfreshEnd = entry;\r\n\t\t\t\t\t\tfreshEnd.n = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * bidirectionally links two entries of the LRU linked list\r\n\t\t\t\t */\r\n\t\t\t\tfunction link(nextEntry, prevEntry) {\r\n\t\t\t\t\tif (nextEntry != prevEntry) {\r\n\t\t\t\t\t\tif (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify\r\n\t\t\t\t\t\tif (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $cacheFactory#info\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Get information about all the caches that have been created\r\n\t\t\t *\r\n\t\t\t * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info`\r\n\t\t\t */\r\n\t\t\tcacheFactory.info = function () {\r\n\t\t\t\tvar info = {};\r\n\t\t\t\tforEach(caches, function (cache, cacheId) {\r\n\t\t\t\t\tinfo[cacheId] = cache.info();\r\n\t\t\t\t});\r\n\t\t\t\treturn info;\r\n\t\t\t};\r\n\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $cacheFactory#get\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Get access to a cache object by the `cacheId` used when it was created.\r\n\t\t\t *\r\n\t\t\t * @param {string} cacheId Name or id of a cache to access.\r\n\t\t\t * @returns {object} Cache object identified by the cacheId or undefined if no such cache.\r\n\t\t\t */\r\n\t\t\tcacheFactory.get = function (cacheId) {\r\n\t\t\t\treturn caches[cacheId];\r\n\t\t\t};\r\n\r\n\r\n\t\t\treturn cacheFactory;\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $templateCache\r\n\t *\r\n\t * @description\r\n\t * The first time a template is used, it is loaded in the template cache for quick retrieval. You\r\n\t * can load templates directly into the cache in a `script` tag, or by consuming the\r\n\t * `$templateCache` service directly.\r\n\t *\r\n\t * Adding via the `script` tag:\r\n\t *\r\n\t * ```html\r\n\t * <script type=\"text/ng-template\" id=\"templateId.html\">\r\n\t * <p>This is the content of the template</p>\r\n\t * </script>\r\n\t * ```\r\n\t *\r\n\t * **Note:** the `script` tag containing the template does not need to be included in the `head` of\r\n\t * the document, but it must be below the `ng-app` definition.\r\n\t *\r\n\t * Adding via the $templateCache service:\r\n\t *\r\n\t * ```js\r\n\t * var myApp = angular.module('myApp', []);\r\n\t * myApp.run(function($templateCache) {\r\n\t * $templateCache.put('templateId.html', 'This is the content of the template');\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * To retrieve the template later, simply use it in your HTML:\r\n\t * ```html\r\n\t * <div ng-include=\" 'templateId.html' \"></div>\r\n\t * ```\r\n\t *\r\n\t * or get it via Javascript:\r\n\t * ```js\r\n\t * $templateCache.get('templateId.html')\r\n\t * ```\r\n\t *\r\n\t * See {@link ng.$cacheFactory $cacheFactory}.\r\n\t *\r\n\t */\r\n\tfunction $TemplateCacheProvider() {\r\n\t\tthis.$get = ['$cacheFactory', function ($cacheFactory) {\r\n\t\t\treturn $cacheFactory('templates');\r\n\t\t}];\r\n\t}\r\n\r\n\t/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!\r\n\t *\r\n\t * DOM-related variables:\r\n\t *\r\n\t * - \"node\" - DOM Node\r\n\t * - \"element\" - DOM Element or Node\r\n\t * - \"$node\" or \"$element\" - jqLite-wrapped node or element\r\n\t *\r\n\t *\r\n\t * Compiler related stuff:\r\n\t *\r\n\t * - \"linkFn\" - linking fn of a single directive\r\n\t * - \"nodeLinkFn\" - function that aggregates all linking fns for a particular node\r\n\t * - \"childLinkFn\" - function that aggregates all linking fns for child nodes of a particular node\r\n\t * - \"compositeLinkFn\" - function that aggregates all linking fns for a compilation root (nodeList)\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $compile\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Compiles an HTML string or DOM into a template and produces a template function, which\r\n\t * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together.\r\n\t *\r\n\t * The compilation is a process of walking the DOM tree and matching DOM elements to\r\n\t * {@link ng.$compileProvider#directive directives}.\r\n\t *\r\n\t * <div class=\"alert alert-warning\">\r\n\t * **Note:** This document is an in-depth reference of all directive options.\r\n\t * For a gentle introduction to directives with examples of common use cases,\r\n\t * see the {@link guide/directive directive guide}.\r\n\t * </div>\r\n\t *\r\n\t * ## Comprehensive Directive API\r\n\t *\r\n\t * There are many different options for a directive.\r\n\t *\r\n\t * The difference resides in the return value of the factory function.\r\n\t * You can either return a \"Directive Definition Object\" (see below) that defines the directive properties,\r\n\t * or just the `postLink` function (all other properties will have the default values).\r\n\t *\r\n\t * <div class=\"alert alert-success\">\r\n\t * **Best Practice:** It's recommended to use the \"directive definition object\" form.\r\n\t * </div>\r\n\t *\r\n\t * Here's an example directive declared with a Directive Definition Object:\r\n\t *\r\n\t * ```js\r\n\t * var myModule = angular.module(...);\r\n\t *\r\n\t * myModule.directive('directiveName', function factory(injectables) {\r\n\t * var directiveDefinitionObject = {\r\n\t * priority: 0,\r\n\t * template: '<div></div>', // or // function(tElement, tAttrs) { ... },\r\n\t * // or\r\n\t * // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... },\r\n\t * transclude: false,\r\n\t * restrict: 'A',\r\n\t * scope: false,\r\n\t * controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... },\r\n\t * controllerAs: 'stringAlias',\r\n\t * require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'],\r\n\t * compile: function compile(tElement, tAttrs, transclude) {\r\n\t * return {\r\n\t * pre: function preLink(scope, iElement, iAttrs, controller) { ... },\r\n\t * post: function postLink(scope, iElement, iAttrs, controller) { ... }\r\n\t * }\r\n\t * // or\r\n\t * // return function postLink( ... ) { ... }\r\n\t * },\r\n\t * // or\r\n\t * // link: {\r\n\t * // pre: function preLink(scope, iElement, iAttrs, controller) { ... },\r\n\t * // post: function postLink(scope, iElement, iAttrs, controller) { ... }\r\n\t * // }\r\n\t * // or\r\n\t * // link: function postLink( ... ) { ... }\r\n\t * };\r\n\t * return directiveDefinitionObject;\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * <div class=\"alert alert-warning\">\r\n\t * **Note:** Any unspecified options will use the default value. You can see the default values below.\r\n\t * </div>\r\n\t *\r\n\t * Therefore the above can be simplified as:\r\n\t *\r\n\t * ```js\r\n\t * var myModule = angular.module(...);\r\n\t *\r\n\t * myModule.directive('directiveName', function factory(injectables) {\r\n\t * var directiveDefinitionObject = {\r\n\t * link: function postLink(scope, iElement, iAttrs) { ... }\r\n\t * };\r\n\t * return directiveDefinitionObject;\r\n\t * // or\r\n\t * // return function postLink(scope, iElement, iAttrs) { ... }\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t *\r\n\t *\r\n\t * ### Directive Definition Object\r\n\t *\r\n\t * The directive definition object provides instructions to the {@link ng.$compile\r\n\t * compiler}. The attributes are:\r\n\t *\r\n\t * #### `priority`\r\n\t * When there are multiple directives defined on a single DOM element, sometimes it\r\n\t * is necessary to specify the order in which the directives are applied. The `priority` is used\r\n\t * to sort the directives before their `compile` functions get called. Priority is defined as a\r\n\t * number. Directives with greater numerical `priority` are compiled first. Pre-link functions\r\n\t * are also run in priority order, but post-link functions are run in reverse order. The order\r\n\t * of directives with the same priority is undefined. The default priority is `0`.\r\n\t *\r\n\t * #### `terminal`\r\n\t * If set to true then the current `priority` will be the last set of directives\r\n\t * which will execute (any directives at the current priority will still execute\r\n\t * as the order of execution on same `priority` is undefined).\r\n\t *\r\n\t * #### `scope`\r\n\t * **If set to `true`,** then a new scope will be created for this directive. If multiple directives on the\r\n\t * same element request a new scope, only one new scope is created. The new scope rule does not\r\n\t * apply for the root of the template since the root of the template always gets a new scope.\r\n\t *\r\n\t * **If set to `{}` (object hash),** then a new \"isolate\" scope is created. The 'isolate' scope differs from\r\n\t * normal scope in that it does not prototypically inherit from the parent scope. This is useful\r\n\t * when creating reusable components, which should not accidentally read or modify data in the\r\n\t * parent scope.\r\n\t *\r\n\t * The 'isolate' scope takes an object hash which defines a set of local scope properties\r\n\t * derived from the parent scope. These local properties are useful for aliasing values for\r\n\t * templates. Locals definition is a hash of local scope property to its source:\r\n\t *\r\n\t * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is\r\n\t * always a string since DOM attributes are strings. If no `attr` name is specified then the\r\n\t * attribute name is assumed to be the same as the local name.\r\n\t * Given `<widget my-attr=\"hello {{name}}\">` and widget definition\r\n\t * of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect\r\n\t * the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the\r\n\t * `localName` property on the widget scope. The `name` is read from the parent scope (not\r\n\t * component scope).\r\n\t *\r\n\t * * `=` or `=attr` - set up bi-directional binding between a local scope property and the\r\n\t * parent scope property of name defined via the value of the `attr` attribute. If no `attr`\r\n\t * name is specified then the attribute name is assumed to be the same as the local name.\r\n\t * Given `<widget my-attr=\"parentModel\">` and widget definition of\r\n\t * `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the\r\n\t * value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected\r\n\t * in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent\r\n\t * scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You\r\n\t * can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional.\r\n\t *\r\n\t * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope.\r\n\t * If no `attr` name is specified then the attribute name is assumed to be the same as the\r\n\t * local name. Given `<widget my-attr=\"count = count + value\">` and widget definition of\r\n\t * `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to\r\n\t * a function wrapper for the `count = count + value` expression. Often it's desirable to\r\n\t * pass data from the isolated scope via an expression and to the parent scope, this can be\r\n\t * done by passing a map of local variable names and values into the expression wrapper fn.\r\n\t * For example, if the expression is `increment(amount)` then we can specify the amount value\r\n\t * by calling the `localFn` as `localFn({amount: 22})`.\r\n\t *\r\n\t *\r\n\t *\r\n\t * #### `controller`\r\n\t * Controller constructor function. The controller is instantiated before the\r\n\t * pre-linking phase and it is shared with other directives (see\r\n\t * `require` attribute). This allows the directives to communicate with each other and augment\r\n\t * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals:\r\n\t *\r\n\t * * `$scope` - Current scope associated with the element\r\n\t * * `$element` - Current element\r\n\t * * `$attrs` - Current attributes object for the element\r\n\t * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope.\r\n\t * The scope can be overridden by an optional first argument.\r\n\t * `function([scope], cloneLinkingFn)`.\r\n\t *\r\n\t *\r\n\t * #### `require`\r\n\t * Require another directive and inject its controller as the fourth argument to the linking function. The\r\n\t * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the\r\n\t * injected argument will be an array in corresponding order. If no such directive can be\r\n\t * found, or if the directive does not have a controller, then an error is raised. The name can be prefixed with:\r\n\t *\r\n\t * * (no prefix) - Locate the required controller on the current element. Throw an error if not found.\r\n\t * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.\r\n\t * * `^` - Locate the required controller by searching the element's parents. Throw an error if not found.\r\n\t * * `?^` - Attempt to locate the required controller by searching the element's parents or pass `null` to the\r\n\t * `link` fn if not found.\r\n\t *\r\n\t *\r\n\t * #### `controllerAs`\r\n\t * Controller alias at the directive scope. An alias for the controller so it\r\n\t * can be referenced at the directive template. The directive needs to define a scope for this\r\n\t * configuration to be used. Useful in the case when directive is used as component.\r\n\t *\r\n\t *\r\n\t * #### `restrict`\r\n\t * String of subset of `EACM` which restricts the directive to a specific directive\r\n\t * declaration style. If omitted, the default (attributes only) is used.\r\n\t *\r\n\t * * `E` - Element name: `<my-directive></my-directive>`\r\n\t * * `A` - Attribute (default): `<div my-directive=\"exp\"></div>`\r\n\t * * `C` - Class: `<div class=\"my-directive: exp;\"></div>`\r\n\t * * `M` - Comment: `<!-- directive: my-directive exp -->`\r\n\t *\r\n\t *\r\n\t * #### `template`\r\n\t * replace the current element with the contents of the HTML. The replacement process\r\n\t * migrates all of the attributes / classes from the old element to the new one. See the\r\n\t * {@link guide/directive#creating-custom-directives_creating-directives_template-expanding-directive\r\n\t * Directives Guide} for an example.\r\n\t *\r\n\t * You can specify `template` as a string representing the template or as a function which takes\r\n\t * two arguments `tElement` and `tAttrs` (described in the `compile` function api below) and\r\n\t * returns a string value representing the template.\r\n\t *\r\n\t *\r\n\t * #### `templateUrl`\r\n\t * Same as `template` but the template is loaded from the specified URL. Because\r\n\t * the template loading is asynchronous the compilation/linking is suspended until the template\r\n\t * is loaded.\r\n\t *\r\n\t * You can specify `templateUrl` as a string representing the URL or as a function which takes two\r\n\t * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns\r\n\t * a string value representing the url. In either case, the template URL is passed through {@link\r\n\t * api/ng.$sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}.\r\n\t *\r\n\t *\r\n\t * #### `replace` ([*DEPRECATED*!], will be removed in next major release)\r\n\t * specify where the template should be inserted. Defaults to `false`.\r\n\t *\r\n\t * * `true` - the template will replace the current element.\r\n\t * * `false` - the template will replace the contents of the current element.\r\n\t *\r\n\t *\r\n\t * #### `transclude`\r\n\t * compile the content of the element and make it available to the directive.\r\n\t * Typically used with {@link ng.directive:ngTransclude\r\n\t * ngTransclude}. The advantage of transclusion is that the linking function receives a\r\n\t * transclusion function which is pre-bound to the correct scope. In a typical setup the widget\r\n\t * creates an `isolate` scope, but the transclusion is not a child, but a sibling of the `isolate`\r\n\t * scope. This makes it possible for the widget to have private state, and the transclusion to\r\n\t * be bound to the parent (pre-`isolate`) scope.\r\n\t *\r\n\t * * `true` - transclude the content of the directive.\r\n\t * * `'element'` - transclude the whole element including any directives defined at lower priority.\r\n\t *\r\n\t *\r\n\t * #### `compile`\r\n\t *\r\n\t * ```js\r\n\t * function compile(tElement, tAttrs, transclude) { ... }\r\n\t * ```\r\n\t *\r\n\t * The compile function deals with transforming the template DOM. Since most directives do not do\r\n\t * template transformation, it is not used often. The compile function takes the following arguments:\r\n\t *\r\n\t * * `tElement` - template element - The element where the directive has been declared. It is\r\n\t * safe to do template transformation on the element and child elements only.\r\n\t *\r\n\t * * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared\r\n\t * between all directive compile functions.\r\n\t *\r\n\t * * `transclude` - [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)`\r\n\t *\r\n\t * <div class=\"alert alert-warning\">\r\n\t * **Note:** The template instance and the link instance may be different objects if the template has\r\n\t * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that\r\n\t * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration\r\n\t * should be done in a linking function rather than in a compile function.\r\n\t * </div>\r\n\t\r\n\t * <div class=\"alert alert-warning\">\r\n\t * **Note:** The compile function cannot handle directives that recursively use themselves in their\r\n\t * own templates or compile functions. Compiling these directives results in an infinite loop and a\r\n\t * stack overflow errors.\r\n\t *\r\n\t * This can be avoided by manually using $compile in the postLink function to imperatively compile\r\n\t * a directive's template instead of relying on automatic template compilation via `template` or\r\n\t * `templateUrl` declaration or manual compilation inside the compile function.\r\n\t * </div>\r\n\t *\r\n\t * <div class=\"alert alert-error\">\r\n\t * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it\r\n\t * e.g. does not know about the right outer scope. Please use the transclude function that is passed\r\n\t * to the link function instead.\r\n\t * </div>\r\n\t\r\n\t * A compile function can have a return value which can be either a function or an object.\r\n\t *\r\n\t * * returning a (post-link) function - is equivalent to registering the linking function via the\r\n\t * `link` property of the config object when the compile function is empty.\r\n\t *\r\n\t * * returning an object with function(s) registered via `pre` and `post` properties - allows you to\r\n\t * control when a linking function should be called during the linking phase. See info about\r\n\t * pre-linking and post-linking functions below.\r\n\t *\r\n\t *\r\n\t * #### `link`\r\n\t * This property is used only if the `compile` property is not defined.\r\n\t *\r\n\t * ```js\r\n\t * function link(scope, iElement, iAttrs, controller, transcludeFn) { ... }\r\n\t * ```\r\n\t *\r\n\t * The link function is responsible for registering DOM listeners as well as updating the DOM. It is\r\n\t * executed after the template has been cloned. This is where most of the directive logic will be\r\n\t * put.\r\n\t *\r\n\t * * `scope` - {@link ng.$rootScope.Scope Scope} - The scope to be used by the\r\n\t * directive for registering {@link ng.$rootScope.Scope#$watch watches}.\r\n\t *\r\n\t * * `iElement` - instance element - The element where the directive is to be used. It is safe to\r\n\t * manipulate the children of the element only in `postLink` function since the children have\r\n\t * already been linked.\r\n\t *\r\n\t * * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared\r\n\t * between all directive linking functions.\r\n\t *\r\n\t * * `controller` - a controller instance - A controller instance if at least one directive on the\r\n\t * element defines a controller. The controller is shared among all the directives, which allows\r\n\t * the directives to use the controllers as a communication channel.\r\n\t *\r\n\t * * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope.\r\n\t * The scope can be overridden by an optional first argument. This is the same as the `$transclude`\r\n\t * parameter of directive controllers.\r\n\t * `function([scope], cloneLinkingFn)`.\r\n\t *\r\n\t *\r\n\t * #### Pre-linking function\r\n\t *\r\n\t * Executed before the child elements are linked. Not safe to do DOM transformation since the\r\n\t * compiler linking function will fail to locate the correct elements for linking.\r\n\t *\r\n\t * #### Post-linking function\r\n\t *\r\n\t * Executed after the child elements are linked. It is safe to do DOM transformation in the post-linking function.\r\n\t *\r\n\t * <a name=\"Attributes\"></a>\r\n\t * ### Attributes\r\n\t *\r\n\t * The {@link ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the\r\n\t * `link()` or `compile()` functions. It has a variety of uses.\r\n\t *\r\n\t * accessing *Normalized attribute names:*\r\n\t * Directives like 'ngBind' can be expressed in many ways: 'ng:bind', `data-ng-bind`, or 'x-ng-bind'.\r\n\t * the attributes object allows for normalized access to\r\n\t * the attributes.\r\n\t *\r\n\t * * *Directive inter-communication:* All directives share the same instance of the attributes\r\n\t * object which allows the directives to use the attributes object as inter directive\r\n\t * communication.\r\n\t *\r\n\t * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object\r\n\t * allowing other directives to read the interpolated value.\r\n\t *\r\n\t * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes\r\n\t * that contain interpolation (e.g. `src=\"{{bar}}\"`). Not only is this very efficient but it's also\r\n\t * the only way to easily get the actual value because during the linking phase the interpolation\r\n\t * hasn't been evaluated yet and so the value is at this time set to `undefined`.\r\n\t *\r\n\t * ```js\r\n\t * function linkingFn(scope, elm, attrs, ctrl) {\r\n\t * // get the attribute value\r\n\t * console.log(attrs.ngModel);\r\n\t *\r\n\t * // change the attribute\r\n\t * attrs.$set('ngModel', 'new value');\r\n\t *\r\n\t * // observe changes to interpolated attribute\r\n\t * attrs.$observe('ngModel', function(value) {\r\n\t * console.log('ngModel has changed value to ' + value);\r\n\t * });\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * Below is an example using `$compileProvider`.\r\n\t *\r\n\t * <div class=\"alert alert-warning\">\r\n\t * **Note**: Typically directives are registered with `module.directive`. The example below is\r\n\t * to illustrate how `$compile` works.\r\n\t * </div>\r\n\t *\r\n\t <example module=\"compile\">\r\n\t <file name=\"index.html\">\r\n\t\t<script>\r\n\t\t angular.module('compile', [], function($compileProvider) {\r\n\t\t\t// configure new 'compile' directive by passing a directive\r\n\t\t\t// factory function. The factory function injects the '$compile'\r\n\t\t\t$compileProvider.directive('compile', function($compile) {\r\n\t\t\t // directive factory creates a link function\r\n\t\t\t return function(scope, element, attrs) {\r\n\t\t\t\tscope.$watch(\r\n\t\t\t\t function(scope) {\r\n\t\t\t\t\t // watch the 'compile' expression for changes\r\n\t\t\t\t\treturn scope.$eval(attrs.compile);\r\n\t\t\t\t },\r\n\t\t\t\t function(value) {\r\n\t\t\t\t\t// when the 'compile' expression changes\r\n\t\t\t\t\t// assign it into the current DOM\r\n\t\t\t\t\telement.html(value);\r\n\t\r\n\t\t\t\t\t// compile the new DOM and link it to the current\r\n\t\t\t\t\t// scope.\r\n\t\t\t\t\t// NOTE: we only compile .childNodes so that\r\n\t\t\t\t\t// we don't get into infinite loop compiling ourselves\r\n\t\t\t\t\t$compile(element.contents())(scope);\r\n\t\t\t\t }\r\n\t\t\t\t);\r\n\t\t\t };\r\n\t\t\t})\r\n\t\t });\r\n\t\r\n\t\t function Ctrl($scope) {\r\n\t\t\t$scope.name = 'Angular';\r\n\t\t\t$scope.html = 'Hello {{name}}';\r\n\t\t }\r\n\t\t</script>\r\n\t\t<div ng-controller=\"Ctrl\">\r\n\t\t <input ng-model=\"name\"> <br>\r\n\t\t <textarea ng-model=\"html\"></textarea> <br>\r\n\t\t <div compile=\"html\"></div>\r\n\t\t</div>\r\n\t </file>\r\n\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should auto compile', function() {\r\n\t\t var textarea = $('textarea');\r\n\t\t var output = $('div[compile]');\r\n\t\t // The initial state reads 'Hello Angular'.\r\n\t\t expect(output.getText()).toBe('Hello Angular');\r\n\t\t textarea.clear();\r\n\t\t textarea.sendKeys('{{name}}!');\r\n\t\t expect(output.getText()).toBe('Angular!');\r\n\t\t });\r\n\t </file>\r\n\t </example>\r\n\t\r\n\t *\r\n\t *\r\n\t * @param {string|DOMElement} element Element or HTML string to compile into a template function.\r\n\t * @param {function(angular.Scope, cloneAttachFn=)} transclude function available to directives.\r\n\t * @param {number} maxPriority only apply directives lower than given priority (Only effects the\r\n\t * root element(s), not their children)\r\n\t * @returns {function(scope, cloneAttachFn=)} a link function which is used to bind template\r\n\t * (a DOM element/tree) to a scope. Where:\r\n\t *\r\n\t * * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to.\r\n\t * * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the\r\n\t * `template` and call the `cloneAttachFn` function allowing the caller to attach the\r\n\t * cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is\r\n\t * called as: <br> `cloneAttachFn(clonedElement, scope)` where:\r\n\t *\r\n\t * * `clonedElement` - is a clone of the original `element` passed into the compiler.\r\n\t * * `scope` - is the current scope with which the linking function is working with.\r\n\t *\r\n\t * Calling the linking function returns the element of the template. It is either the original\r\n\t * element passed in, or the clone of the element if the `cloneAttachFn` is provided.\r\n\t *\r\n\t * After linking the view is not updated until after a call to $digest which typically is done by\r\n\t * Angular automatically.\r\n\t *\r\n\t * If you need access to the bound view, there are two ways to do it:\r\n\t *\r\n\t * - If you are not asking the linking function to clone the template, create the DOM element(s)\r\n\t * before you send them to the compiler and keep this reference around.\r\n\t * ```js\r\n\t * var element = $compile('<p>{{total}}</p>')(scope);\r\n\t * ```\r\n\t *\r\n\t * - if on the other hand, you need the element to be cloned, the view reference from the original\r\n\t * example would not point to the clone, but rather to the original template that was cloned. In\r\n\t * this case, you can access the clone via the cloneAttachFn:\r\n\t * ```js\r\n\t * var templateElement = angular.element('<p>{{total}}</p>'),\r\n\t * scope = ....;\r\n\t *\r\n\t * var clonedElement = $compile(templateElement)(scope, function(clonedElement, scope) {\r\n\t * //attach the clone to DOM document at the right place\r\n\t * });\r\n\t *\r\n\t * //now we have reference to the cloned DOM via `clonedElement`\r\n\t * ```\r\n\t *\r\n\t *\r\n\t * For information on how the compiler works, see the\r\n\t * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide.\r\n\t */\r\n\r\n\tvar $compileMinErr = minErr('$compile');\r\n\r\n\t/**\r\n\t * @ngdoc provider\r\n\t * @name $compileProvider\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t */\r\n\t$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider'];\r\n\tfunction $CompileProvider($provide, $$sanitizeUriProvider) {\r\n\t\tvar hasDirectives = {},\r\n\t\t\tSuffix = 'Directive',\r\n\t\t\tCOMMENT_DIRECTIVE_REGEXP = /^\\s*directive\\:\\s*([\\d\\w_\\-]+)\\s+(.*)$/,\r\n\t\t\tCLASS_DIRECTIVE_REGEXP = /(([\\d\\w_\\-]+)(?:\\:([^;]+))?;?)/;\r\n\r\n\t\t// Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes\r\n\t\t// The assumption is that future DOM event attribute names will begin with\r\n\t\t// 'on' and be composed of only English letters.\r\n\t\tvar EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/;\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $compileProvider#directive\r\n\t\t * @kind function\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Register a new directive with the compiler.\r\n\t\t *\r\n\t\t * @param {string|Object} name Name of the directive in camel-case (i.e. <code>ngBind</code> which\r\n\t\t * will match as <code>ng-bind</code>), or an object map of directives where the keys are the\r\n\t\t * names and the values are the factories.\r\n\t\t * @param {Function|Array} directiveFactory An injectable directive factory function. See\r\n\t\t * {@link guide/directive} for more info.\r\n\t\t * @returns {ng.$compileProvider} Self for chaining.\r\n\t\t */\r\n\t\tthis.directive = function registerDirective(name, directiveFactory) {\r\n\t\t\tassertNotHasOwnProperty(name, 'directive');\r\n\t\t\tif (isString(name)) {\r\n\t\t\t\tassertArg(directiveFactory, 'directiveFactory');\r\n\t\t\t\tif (!hasDirectives.hasOwnProperty(name)) {\r\n\t\t\t\t\thasDirectives[name] = [];\r\n\t\t\t\t\t$provide.factory(name + Suffix, ['$injector', '$exceptionHandler',\r\n\t\t\t\t\t function ($injector, $exceptionHandler) {\r\n\t\t\t\t\t \tvar directives = [];\r\n\t\t\t\t\t \tforEach(hasDirectives[name], function (directiveFactory, index) {\r\n\t\t\t\t\t \t\ttry {\r\n\t\t\t\t\t \t\t\tvar directive = $injector.invoke(directiveFactory);\r\n\t\t\t\t\t \t\t\tif (isFunction(directive)) {\r\n\t\t\t\t\t \t\t\t\tdirective = { compile: valueFn(directive) };\r\n\t\t\t\t\t \t\t\t} else if (!directive.compile && directive.link) {\r\n\t\t\t\t\t \t\t\t\tdirective.compile = valueFn(directive.link);\r\n\t\t\t\t\t \t\t\t}\r\n\t\t\t\t\t \t\t\tdirective.priority = directive.priority || 0;\r\n\t\t\t\t\t \t\t\tdirective.index = index;\r\n\t\t\t\t\t \t\t\tdirective.name = directive.name || name;\r\n\t\t\t\t\t \t\t\tdirective.require = directive.require || (directive.controller && directive.name);\r\n\t\t\t\t\t \t\t\tdirective.restrict = directive.restrict || 'A';\r\n\t\t\t\t\t \t\t\tdirectives.push(directive);\r\n\t\t\t\t\t \t\t} catch (e) {\r\n\t\t\t\t\t \t\t\t$exceptionHandler(e);\r\n\t\t\t\t\t \t\t}\r\n\t\t\t\t\t \t});\r\n\t\t\t\t\t \treturn directives;\r\n\t\t\t\t\t }]);\r\n\t\t\t\t}\r\n\t\t\t\thasDirectives[name].push(directiveFactory);\r\n\t\t\t} else {\r\n\t\t\t\tforEach(name, reverseParams(registerDirective));\r\n\t\t\t}\r\n\t\t\treturn this;\r\n\t\t};\r\n\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $compileProvider#aHrefSanitizationWhitelist\r\n\t\t * @kind function\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Retrieves or overrides the default regular expression that is used for whitelisting of safe\r\n\t\t * urls during a[href] sanitization.\r\n\t\t *\r\n\t\t * The sanitization is a security measure aimed at prevent XSS attacks via html links.\r\n\t\t *\r\n\t\t * Any url about to be assigned to a[href] via data-binding is first normalized and turned into\r\n\t\t * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`\r\n\t\t * regular expression. If a match is found, the original url is written into the dom. Otherwise,\r\n\t\t * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\r\n\t\t *\r\n\t\t * @param {RegExp=} regexp New regexp to whitelist urls with.\r\n\t\t * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\r\n\t\t * chaining otherwise.\r\n\t\t */\r\n\t\tthis.aHrefSanitizationWhitelist = function (regexp) {\r\n\t\t\tif (isDefined(regexp)) {\r\n\t\t\t\t$$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp);\r\n\t\t\t\treturn this;\r\n\t\t\t} else {\r\n\t\t\t\treturn $$sanitizeUriProvider.aHrefSanitizationWhitelist();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $compileProvider#imgSrcSanitizationWhitelist\r\n\t\t * @kind function\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Retrieves or overrides the default regular expression that is used for whitelisting of safe\r\n\t\t * urls during img[src] sanitization.\r\n\t\t *\r\n\t\t * The sanitization is a security measure aimed at prevent XSS attacks via html links.\r\n\t\t *\r\n\t\t * Any url about to be assigned to img[src] via data-binding is first normalized and turned into\r\n\t\t * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`\r\n\t\t * regular expression. If a match is found, the original url is written into the dom. Otherwise,\r\n\t\t * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\r\n\t\t *\r\n\t\t * @param {RegExp=} regexp New regexp to whitelist urls with.\r\n\t\t * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\r\n\t\t * chaining otherwise.\r\n\t\t */\r\n\t\tthis.imgSrcSanitizationWhitelist = function (regexp) {\r\n\t\t\tif (isDefined(regexp)) {\r\n\t\t\t\t$$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp);\r\n\t\t\t\treturn this;\r\n\t\t\t} else {\r\n\t\t\t\treturn $$sanitizeUriProvider.imgSrcSanitizationWhitelist();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis.$get = [\r\n\t\t\t\t '$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse',\r\n\t\t\t\t '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri',\r\n\t\t function ($injector, $interpolate, $exceptionHandler, $http, $templateCache, $parse,\r\n\t\t\t\t $controller, $rootScope, $document, $sce, $animate, $$sanitizeUri) {\r\n\r\n\t\t \tvar Attributes = function (element, attr) {\r\n\t\t \t\tthis.$$element = element;\r\n\t\t \t\tthis.$attr = attr || {};\r\n\t\t \t};\r\n\r\n\t\t \tAttributes.prototype = {\r\n\t\t \t\t$normalize: directiveNormalize,\r\n\r\n\r\n\t\t \t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $compile.directive.Attributes#$addClass\r\n\t\t\t\t * @kind function\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Adds the CSS class value specified by the classVal parameter to the element. If animations\r\n\t\t\t\t * are enabled then an animation will be triggered for the class addition.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {string} classVal The className value that will be added to the element\r\n\t\t\t\t */\r\n\t\t \t\t$addClass: function (classVal) {\r\n\t\t \t\t\tif (classVal && classVal.length > 0) {\r\n\t\t \t\t\t\t$animate.addClass(this.$$element, classVal);\r\n\t\t \t\t\t}\r\n\t\t \t\t},\r\n\r\n\t\t \t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $compile.directive.Attributes#$removeClass\r\n\t\t\t\t * @kind function\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Removes the CSS class value specified by the classVal parameter from the element. If\r\n\t\t\t\t * animations are enabled then an animation will be triggered for the class removal.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {string} classVal The className value that will be removed from the element\r\n\t\t\t\t */\r\n\t\t \t\t$removeClass: function (classVal) {\r\n\t\t \t\t\tif (classVal && classVal.length > 0) {\r\n\t\t \t\t\t\t$animate.removeClass(this.$$element, classVal);\r\n\t\t \t\t\t}\r\n\t\t \t\t},\r\n\r\n\t\t \t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $compile.directive.Attributes#$updateClass\r\n\t\t\t\t * @kind function\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Adds and removes the appropriate CSS class values to the element based on the difference\r\n\t\t\t\t * between the new and old CSS class values (specified as newClasses and oldClasses).\r\n\t\t\t\t *\r\n\t\t\t\t * @param {string} newClasses The current CSS className value\r\n\t\t\t\t * @param {string} oldClasses The former CSS className value\r\n\t\t\t\t */\r\n\t\t \t\t$updateClass: function (newClasses, oldClasses) {\r\n\t\t \t\t\tvar toAdd = tokenDifference(newClasses, oldClasses);\r\n\t\t \t\t\tvar toRemove = tokenDifference(oldClasses, newClasses);\r\n\r\n\t\t \t\t\tif (toAdd.length === 0) {\r\n\t\t \t\t\t\t$animate.removeClass(this.$$element, toRemove);\r\n\t\t \t\t\t} else if (toRemove.length === 0) {\r\n\t\t \t\t\t\t$animate.addClass(this.$$element, toAdd);\r\n\t\t \t\t\t} else {\r\n\t\t \t\t\t\t$animate.setClass(this.$$element, toAdd, toRemove);\r\n\t\t \t\t\t}\r\n\t\t \t\t},\r\n\r\n\t\t \t\t/**\r\n\t\t\t\t * Set a normalized attribute on the element in a way such that all directives\r\n\t\t\t\t * can share the attribute. This function properly handles boolean attributes.\r\n\t\t\t\t * @param {string} key Normalized key. (ie ngAttribute)\r\n\t\t\t\t * @param {string|boolean} value The value to set. If `null` attribute will be deleted.\r\n\t\t\t\t * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute.\r\n\t\t\t\t * Defaults to true.\r\n\t\t\t\t * @param {string=} attrName Optional none normalized name. Defaults to key.\r\n\t\t\t\t */\r\n\t\t \t\t$set: function (key, value, writeAttr, attrName) {\r\n\t\t \t\t\t// TODO: decide whether or not to throw an error if \"class\"\r\n\t\t \t\t\t//is set through this function since it may cause $updateClass to\r\n\t\t \t\t\t//become unstable.\r\n\r\n\t\t \t\t\tvar booleanKey = getBooleanAttrName(this.$$element[0], key),\r\n\t\t\t\t\t\tnormalizedVal,\r\n\t\t\t\t\t\tnodeName;\r\n\r\n\t\t \t\t\tif (booleanKey) {\r\n\t\t \t\t\t\tthis.$$element.prop(key, value);\r\n\t\t \t\t\t\tattrName = booleanKey;\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\tthis[key] = value;\r\n\r\n\t\t \t\t\t// translate normalized key to actual key\r\n\t\t \t\t\tif (attrName) {\r\n\t\t \t\t\t\tthis.$attr[key] = attrName;\r\n\t\t \t\t\t} else {\r\n\t\t \t\t\t\tattrName = this.$attr[key];\r\n\t\t \t\t\t\tif (!attrName) {\r\n\t\t \t\t\t\t\tthis.$attr[key] = attrName = snake_case(key, '-');\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\tnodeName = nodeName_(this.$$element);\r\n\r\n\t\t \t\t\t// sanitize a[href] and img[src] values\r\n\t\t \t\t\tif ((nodeName === 'A' && key === 'href') ||\r\n\t\t\t\t\t\t(nodeName === 'IMG' && key === 'src')) {\r\n\t\t \t\t\t\tthis[key] = value = $$sanitizeUri(value, key === 'src');\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\tif (writeAttr !== false) {\r\n\t\t \t\t\t\tif (value === null || value === undefined) {\r\n\t\t \t\t\t\t\tthis.$$element.removeAttr(attrName);\r\n\t\t \t\t\t\t} else {\r\n\t\t \t\t\t\t\tthis.$$element.attr(attrName, value);\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\t// fire observers\r\n\t\t \t\t\tvar $$observers = this.$$observers;\r\n\t\t \t\t\t$$observers && forEach($$observers[key], function (fn) {\r\n\t\t \t\t\t\ttry {\r\n\t\t \t\t\t\t\tfn(value);\r\n\t\t \t\t\t\t} catch (e) {\r\n\t\t \t\t\t\t\t$exceptionHandler(e);\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t});\r\n\t\t \t\t},\r\n\r\n\r\n\t\t \t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $compile.directive.Attributes#$observe\r\n\t\t\t\t * @kind function\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Observes an interpolated attribute.\r\n\t\t\t\t *\r\n\t\t\t\t * The observer function will be invoked once during the next `$digest` following\r\n\t\t\t\t * compilation. The observer is then invoked whenever the interpolated value\r\n\t\t\t\t * changes.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {string} key Normalized key. (ie ngAttribute) .\r\n\t\t\t\t * @param {function(interpolatedValue)} fn Function that will be called whenever\r\n\t\t\t\t\t\t the interpolated value of the attribute changes.\r\n\t\t\t\t * See the {@link guide/directive#Attributes Directives} guide for more info.\r\n\t\t\t\t * @returns {function()} the `fn` parameter.\r\n\t\t\t\t */\r\n\t\t \t\t$observe: function (key, fn) {\r\n\t\t \t\t\tvar attrs = this,\r\n\t\t\t\t\t\t$$observers = (attrs.$$observers || (attrs.$$observers = {})),\r\n\t\t\t\t\t\tlisteners = ($$observers[key] || ($$observers[key] = []));\r\n\r\n\t\t \t\t\tlisteners.push(fn);\r\n\t\t \t\t\t$rootScope.$evalAsync(function () {\r\n\t\t \t\t\t\tif (!listeners.$$inter) {\r\n\t\t \t\t\t\t\t// no one registered attribute interpolation function, so lets call it manually\r\n\t\t \t\t\t\t\tfn(attrs[key]);\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t});\r\n\t\t \t\t\treturn fn;\r\n\t\t \t\t}\r\n\t\t \t};\r\n\r\n\t\t \tvar startSymbol = $interpolate.startSymbol(),\r\n\t\t\t\tendSymbol = $interpolate.endSymbol(),\r\n\t\t\t\tdenormalizeTemplate = (startSymbol == '{{' || endSymbol == '}}')\r\n\t\t\t\t\t? identity\r\n\t\t\t\t\t: function denormalizeTemplate(template) {\r\n\t\t\t\t\t\treturn template.replace(/\\{\\{/g, startSymbol).replace(/}}/g, endSymbol);\r\n\t\t\t\t\t},\r\n\t\t\t\tNG_ATTR_BINDING = /^ngAttr[A-Z]/;\r\n\r\n\r\n\t\t \treturn compile;\r\n\r\n\t\t \t//================================\r\n\r\n\t\t \tfunction compile($compileNodes, transcludeFn, maxPriority, ignoreDirective,\r\n\t\t\t\t\t\t\t\tpreviousCompileContext) {\r\n\t\t \t\tif (!($compileNodes instanceof jqLite)) {\r\n\t\t \t\t\t// jquery always rewraps, whereas we need to preserve the original selector so that we can\r\n\t\t \t\t\t// modify it.\r\n\t\t \t\t\t$compileNodes = jqLite($compileNodes);\r\n\t\t \t\t}\r\n\t\t \t\t// We can not compile top level text elements since text nodes can be merged and we will\r\n\t\t \t\t// not be able to attach scope data to them, so we will wrap them in <span>\r\n\t\t \t\tforEach($compileNodes, function (node, index) {\r\n\t\t \t\t\tif (node.nodeType == 3 /* text node */ && node.nodeValue.match(/\\S+/) /* non-empty */) {\r\n\t\t \t\t\t\t$compileNodes[index] = node = jqLite(node).wrap('<span></span>').parent()[0];\r\n\t\t \t\t\t}\r\n\t\t \t\t});\r\n\t\t \t\tvar compositeLinkFn =\r\n\t\t\t\t\t\tcompileNodes($compileNodes, transcludeFn, $compileNodes,\r\n\t\t\t\t\t\t\t\t\t maxPriority, ignoreDirective, previousCompileContext);\r\n\t\t \t\tsafeAddClass($compileNodes, 'ng-scope');\r\n\t\t \t\treturn function publicLinkFn(scope, cloneConnectFn, transcludeControllers, parentBoundTranscludeFn) {\r\n\t\t \t\t\tassertArg(scope, 'scope');\r\n\t\t \t\t\t// important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart\r\n\t\t \t\t\t// and sometimes changes the structure of the DOM.\r\n\t\t \t\t\tvar $linkNode = cloneConnectFn\r\n\t\t\t\t\t ? JQLitePrototype.clone.call($compileNodes) // IMPORTANT!!!\r\n\t\t\t\t\t : $compileNodes;\r\n\r\n\t\t \t\t\tforEach(transcludeControllers, function (instance, name) {\r\n\t\t \t\t\t\t$linkNode.data('$' + name + 'Controller', instance);\r\n\t\t \t\t\t});\r\n\r\n\t\t \t\t\t// Attach scope only to non-text nodes.\r\n\t\t \t\t\tfor (var i = 0, ii = $linkNode.length; i < ii; i++) {\r\n\t\t \t\t\t\tvar node = $linkNode[i],\r\n\t\t\t\t\t\t\tnodeType = node.nodeType;\r\n\t\t \t\t\t\tif (nodeType === 1 /* element */ || nodeType === 9 /* document */) {\r\n\t\t \t\t\t\t\t$linkNode.eq(i).data('$scope', scope);\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\tif (cloneConnectFn) cloneConnectFn($linkNode, scope);\r\n\t\t \t\t\tif (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn);\r\n\t\t \t\t\treturn $linkNode;\r\n\t\t \t\t};\r\n\t\t \t}\r\n\r\n\t\t \tfunction safeAddClass($element, className) {\r\n\t\t \t\ttry {\r\n\t\t \t\t\t$element.addClass(className);\r\n\t\t \t\t} catch (e) {\r\n\t\t \t\t\t// ignore, since it means that we are trying to set class on\r\n\t\t \t\t\t// SVG element, where class name is read-only.\r\n\t\t \t\t}\r\n\t\t \t}\r\n\r\n\t\t \t/**\r\n\t\t\t * Compile function matches each node in nodeList against the directives. Once all directives\r\n\t\t\t * for a particular node are collected their compile functions are executed. The compile\r\n\t\t\t * functions return values - the linking functions - are combined into a composite linking\r\n\t\t\t * function, which is the a linking function for the node.\r\n\t\t\t *\r\n\t\t\t * @param {NodeList} nodeList an array of nodes or NodeList to compile\r\n\t\t\t * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the\r\n\t\t\t * scope argument is auto-generated to the new child of the transcluded parent scope.\r\n\t\t\t * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then\r\n\t\t\t * the rootElement must be set the jqLite collection of the compile root. This is\r\n\t\t\t * needed so that the jqLite collection items can be replaced with widgets.\r\n\t\t\t * @param {number=} maxPriority Max directive priority.\r\n\t\t\t * @returns {Function} A composite linking function of all of the matched directives or null.\r\n\t\t\t */\r\n\t\t \tfunction compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective,\r\n\t\t\t\t\t\t\t\t\tpreviousCompileContext) {\r\n\t\t \t\tvar linkFns = [],\r\n\t\t\t\t\tattrs, directives, nodeLinkFn, childNodes, childLinkFn, linkFnFound;\r\n\r\n\t\t \t\tfor (var i = 0; i < nodeList.length; i++) {\r\n\t\t \t\t\tattrs = new Attributes();\r\n\r\n\t\t \t\t\t// we must always refer to nodeList[i] since the nodes can be replaced underneath us.\r\n\t\t \t\t\tdirectives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tignoreDirective);\r\n\r\n\t\t \t\t\tnodeLinkFn = (directives.length)\r\n\t\t\t\t\t\t? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement,\r\n\t\t\t\t\t\t\t\t\t\t\t\t null, [], [], previousCompileContext)\r\n\t\t\t\t\t\t: null;\r\n\r\n\t\t \t\t\tif (nodeLinkFn && nodeLinkFn.scope) {\r\n\t\t \t\t\t\tsafeAddClass(jqLite(nodeList[i]), 'ng-scope');\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\tchildLinkFn = (nodeLinkFn && nodeLinkFn.terminal ||\r\n\t\t\t\t\t\t\t\t !(childNodes = nodeList[i].childNodes) ||\r\n\t\t\t\t\t\t\t\t !childNodes.length)\r\n\t\t\t\t\t\t? null\r\n\t\t\t\t\t\t: compileNodes(childNodes,\r\n\t\t\t\t\t\t\t nodeLinkFn ? (\r\n\t\t\t\t\t\t\t (nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement)\r\n\t\t\t\t\t\t\t\t && nodeLinkFn.transclude) : transcludeFn);\r\n\r\n\t\t \t\t\tlinkFns.push(nodeLinkFn, childLinkFn);\r\n\t\t \t\t\tlinkFnFound = linkFnFound || nodeLinkFn || childLinkFn;\r\n\t\t \t\t\t//use the previous context only for the first element in the virtual group\r\n\t\t \t\t\tpreviousCompileContext = null;\r\n\t\t \t\t}\r\n\r\n\t\t \t\t// return a linking function if we have found anything, null otherwise\r\n\t\t \t\treturn linkFnFound ? compositeLinkFn : null;\r\n\r\n\t\t \t\tfunction compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) {\r\n\t\t \t\t\tvar nodeLinkFn, childLinkFn, node, $node, childScope, i, ii, n, childBoundTranscludeFn;\r\n\r\n\t\t \t\t\t// copy nodeList so that linking doesn't break due to live list updates.\r\n\t\t \t\t\tvar nodeListLength = nodeList.length,\r\n\t\t\t\t\t\tstableNodeList = new Array(nodeListLength);\r\n\t\t \t\t\tfor (i = 0; i < nodeListLength; i++) {\r\n\t\t \t\t\t\tstableNodeList[i] = nodeList[i];\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\tfor (i = 0, n = 0, ii = linkFns.length; i < ii; n++) {\r\n\t\t \t\t\t\tnode = stableNodeList[n];\r\n\t\t \t\t\t\tnodeLinkFn = linkFns[i++];\r\n\t\t \t\t\t\tchildLinkFn = linkFns[i++];\r\n\t\t \t\t\t\t$node = jqLite(node);\r\n\r\n\t\t \t\t\t\tif (nodeLinkFn) {\r\n\t\t \t\t\t\t\tif (nodeLinkFn.scope) {\r\n\t\t \t\t\t\t\t\tchildScope = scope.$new();\r\n\t\t \t\t\t\t\t\t$node.data('$scope', childScope);\r\n\t\t \t\t\t\t\t} else {\r\n\t\t \t\t\t\t\t\tchildScope = scope;\r\n\t\t \t\t\t\t\t}\r\n\r\n\t\t \t\t\t\t\tif (nodeLinkFn.transcludeOnThisElement) {\r\n\t\t \t\t\t\t\t\tchildBoundTranscludeFn = createBoundTranscludeFn(scope, nodeLinkFn.transclude, parentBoundTranscludeFn);\r\n\r\n\t\t \t\t\t\t\t} else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) {\r\n\t\t \t\t\t\t\t\tchildBoundTranscludeFn = parentBoundTranscludeFn;\r\n\r\n\t\t \t\t\t\t\t} else if (!parentBoundTranscludeFn && transcludeFn) {\r\n\t\t \t\t\t\t\t\tchildBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn);\r\n\r\n\t\t \t\t\t\t\t} else {\r\n\t\t \t\t\t\t\t\tchildBoundTranscludeFn = null;\r\n\t\t \t\t\t\t\t}\r\n\r\n\t\t \t\t\t\t\tnodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn);\r\n\r\n\t\t \t\t\t\t} else if (childLinkFn) {\r\n\t\t \t\t\t\t\tchildLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn);\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t}\r\n\t\t \t\t}\r\n\t\t \t}\r\n\r\n\t\t \tfunction createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) {\r\n\r\n\t\t \t\tvar boundTranscludeFn = function (transcludedScope, cloneFn, controllers) {\r\n\t\t \t\t\tvar scopeCreated = false;\r\n\r\n\t\t \t\t\tif (!transcludedScope) {\r\n\t\t \t\t\t\ttranscludedScope = scope.$new();\r\n\t\t \t\t\t\ttranscludedScope.$$transcluded = true;\r\n\t\t \t\t\t\tscopeCreated = true;\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\tvar clone = transcludeFn(transcludedScope, cloneFn, controllers, previousBoundTranscludeFn);\r\n\t\t \t\t\tif (scopeCreated) {\r\n\t\t \t\t\t\tclone.on('$destroy', function () { transcludedScope.$destroy(); });\r\n\t\t \t\t\t}\r\n\t\t \t\t\treturn clone;\r\n\t\t \t\t};\r\n\r\n\t\t \t\treturn boundTranscludeFn;\r\n\t\t \t}\r\n\r\n\t\t \t/**\r\n\t\t\t * Looks for directives on the given node and adds them to the directive collection which is\r\n\t\t\t * sorted.\r\n\t\t\t *\r\n\t\t\t * @param node Node to search.\r\n\t\t\t * @param directives An array to which the directives are added to. This array is sorted before\r\n\t\t\t * the function returns.\r\n\t\t\t * @param attrs The shared attrs object which is used to populate the normalized attributes.\r\n\t\t\t * @param {number=} maxPriority Max directive priority.\r\n\t\t\t */\r\n\t\t \tfunction collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) {\r\n\t\t \t\tvar nodeType = node.nodeType,\r\n\t\t\t\t\tattrsMap = attrs.$attr,\r\n\t\t\t\t\tmatch,\r\n\t\t\t\t\tclassName;\r\n\r\n\t\t \t\tswitch (nodeType) {\r\n\t\t \t\t\tcase 1: /* Element */\r\n\t\t \t\t\t\t// use the node name: <directive>\r\n\t\t \t\t\t\taddDirective(directives,\r\n\t\t\t\t\t\t\tdirectiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority, ignoreDirective);\r\n\r\n\t\t \t\t\t\t// iterate over the attributes\r\n\t\t \t\t\t\tfor (var attr, name, nName, ngAttrName, value, isNgAttr, nAttrs = node.attributes,\r\n\t\t\t\t\t\t\t\t j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {\r\n\t\t \t\t\t\t\tvar attrStartName = false;\r\n\t\t \t\t\t\t\tvar attrEndName = false;\r\n\r\n\t\t \t\t\t\t\tattr = nAttrs[j];\r\n\t\t \t\t\t\t\tif (!msie || msie >= 8 || attr.specified) {\r\n\t\t \t\t\t\t\t\tname = attr.name;\r\n\t\t \t\t\t\t\t\tvalue = trim(attr.value);\r\n\r\n\t\t \t\t\t\t\t\t// support ngAttr attribute binding\r\n\t\t \t\t\t\t\t\tngAttrName = directiveNormalize(name);\r\n\t\t \t\t\t\t\t\tif (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) {\r\n\t\t \t\t\t\t\t\t\tname = snake_case(ngAttrName.substr(6), '-');\r\n\t\t \t\t\t\t\t\t}\r\n\r\n\t\t \t\t\t\t\t\tvar directiveNName = ngAttrName.replace(/(Start|End)$/, '');\r\n\t\t \t\t\t\t\t\tif (ngAttrName === directiveNName + 'Start') {\r\n\t\t \t\t\t\t\t\t\tattrStartName = name;\r\n\t\t \t\t\t\t\t\t\tattrEndName = name.substr(0, name.length - 5) + 'end';\r\n\t\t \t\t\t\t\t\t\tname = name.substr(0, name.length - 6);\r\n\t\t \t\t\t\t\t\t}\r\n\r\n\t\t \t\t\t\t\t\tnName = directiveNormalize(name.toLowerCase());\r\n\t\t \t\t\t\t\t\tattrsMap[nName] = name;\r\n\t\t \t\t\t\t\t\tif (isNgAttr || !attrs.hasOwnProperty(nName)) {\r\n\t\t \t\t\t\t\t\t\tattrs[nName] = value;\r\n\t\t \t\t\t\t\t\t\tif (getBooleanAttrName(node, nName)) {\r\n\t\t \t\t\t\t\t\t\t\tattrs[nName] = true; // presence means true\r\n\t\t \t\t\t\t\t\t\t}\r\n\t\t \t\t\t\t\t\t}\r\n\t\t \t\t\t\t\t\taddAttrInterpolateDirective(node, directives, value, nName);\r\n\t\t \t\t\t\t\t\taddDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,\r\n\t\t\t\t\t\t\t\t\t\t\t attrEndName);\r\n\t\t \t\t\t\t\t}\r\n\t\t \t\t\t\t}\r\n\r\n\t\t \t\t\t\t// use class as directive\r\n\t\t \t\t\t\tclassName = node.className;\r\n\t\t \t\t\t\tif (isString(className) && className !== '') {\r\n\t\t \t\t\t\t\twhile (match = CLASS_DIRECTIVE_REGEXP.exec(className)) {\r\n\t\t \t\t\t\t\t\tnName = directiveNormalize(match[2]);\r\n\t\t \t\t\t\t\t\tif (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) {\r\n\t\t \t\t\t\t\t\t\tattrs[nName] = trim(match[3]);\r\n\t\t \t\t\t\t\t\t}\r\n\t\t \t\t\t\t\t\tclassName = className.substr(match.index + match[0].length);\r\n\t\t \t\t\t\t\t}\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t\tbreak;\r\n\t\t \t\t\tcase 3: /* Text Node */\r\n\t\t \t\t\t\taddTextInterpolateDirective(directives, node.nodeValue);\r\n\t\t \t\t\t\tbreak;\r\n\t\t \t\t\tcase 8: /* Comment */\r\n\t\t \t\t\t\ttry {\r\n\t\t \t\t\t\t\tmatch = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);\r\n\t\t \t\t\t\t\tif (match) {\r\n\t\t \t\t\t\t\t\tnName = directiveNormalize(match[1]);\r\n\t\t \t\t\t\t\t\tif (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) {\r\n\t\t \t\t\t\t\t\t\tattrs[nName] = trim(match[2]);\r\n\t\t \t\t\t\t\t\t}\r\n\t\t \t\t\t\t\t}\r\n\t\t \t\t\t\t} catch (e) {\r\n\t\t \t\t\t\t\t// turns out that under some circumstances IE9 throws errors when one attempts to read\r\n\t\t \t\t\t\t\t// comment's node value.\r\n\t\t \t\t\t\t\t// Just ignore it and continue. (Can't seem to reproduce in test case.)\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t\tbreak;\r\n\t\t \t\t}\r\n\r\n\t\t \t\tdirectives.sort(byPriority);\r\n\t\t \t\treturn directives;\r\n\t\t \t}\r\n\r\n\t\t \t/**\r\n\t\t\t * Given a node with an directive-start it collects all of the siblings until it finds\r\n\t\t\t * directive-end.\r\n\t\t\t * @param node\r\n\t\t\t * @param attrStart\r\n\t\t\t * @param attrEnd\r\n\t\t\t * @returns {*}\r\n\t\t\t */\r\n\t\t \tfunction groupScan(node, attrStart, attrEnd) {\r\n\t\t \t\tvar nodes = [];\r\n\t\t \t\tvar depth = 0;\r\n\t\t \t\tif (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) {\r\n\t\t \t\t\tvar startNode = node;\r\n\t\t \t\t\tdo {\r\n\t\t \t\t\t\tif (!node) {\r\n\t\t \t\t\t\t\tthrow $compileMinErr('uterdir',\r\n\t\t\t\t\t\t\t\t\t \"Unterminated attribute, found '{0}' but no matching '{1}' found.\",\r\n\t\t\t\t\t\t\t\t\t attrStart, attrEnd);\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t\tif (node.nodeType == 1 /** Element **/) {\r\n\t\t \t\t\t\t\tif (node.hasAttribute(attrStart)) depth++;\r\n\t\t \t\t\t\t\tif (node.hasAttribute(attrEnd)) depth--;\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t\tnodes.push(node);\r\n\t\t \t\t\t\tnode = node.nextSibling;\r\n\t\t \t\t\t} while (depth > 0);\r\n\t\t \t\t} else {\r\n\t\t \t\t\tnodes.push(node);\r\n\t\t \t\t}\r\n\r\n\t\t \t\treturn jqLite(nodes);\r\n\t\t \t}\r\n\r\n\t\t \t/**\r\n\t\t\t * Wrapper for linking function which converts normal linking function into a grouped\r\n\t\t\t * linking function.\r\n\t\t\t * @param linkFn\r\n\t\t\t * @param attrStart\r\n\t\t\t * @param attrEnd\r\n\t\t\t * @returns {Function}\r\n\t\t\t */\r\n\t\t \tfunction groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) {\r\n\t\t \t\treturn function (scope, element, attrs, controllers, transcludeFn) {\r\n\t\t \t\t\telement = groupScan(element[0], attrStart, attrEnd);\r\n\t\t \t\t\treturn linkFn(scope, element, attrs, controllers, transcludeFn);\r\n\t\t \t\t};\r\n\t\t \t}\r\n\r\n\t\t \t/**\r\n\t\t\t * Once the directives have been collected, their compile functions are executed. This method\r\n\t\t\t * is responsible for inlining directive templates as well as terminating the application\r\n\t\t\t * of the directives if the terminal directive has been reached.\r\n\t\t\t *\r\n\t\t\t * @param {Array} directives Array of collected directives to execute their compile function.\r\n\t\t\t * this needs to be pre-sorted by priority order.\r\n\t\t\t * @param {Node} compileNode The raw DOM node to apply the compile functions to\r\n\t\t\t * @param {Object} templateAttrs The shared attribute function\r\n\t\t\t * @param {function(angular.Scope, cloneAttachFn=)} transcludeFn A linking function, where the\r\n\t\t\t * scope argument is auto-generated to the new\r\n\t\t\t * child of the transcluded parent scope.\r\n\t\t\t * @param {JQLite} jqCollection If we are working on the root of the compile tree then this\r\n\t\t\t * argument has the root jqLite array so that we can replace nodes\r\n\t\t\t * on it.\r\n\t\t\t * @param {Object=} originalReplaceDirective An optional directive that will be ignored when\r\n\t\t\t * compiling the transclusion.\r\n\t\t\t * @param {Array.<Function>} preLinkFns\r\n\t\t\t * @param {Array.<Function>} postLinkFns\r\n\t\t\t * @param {Object} previousCompileContext Context used for previous compilation of the current\r\n\t\t\t * node\r\n\t\t\t * @returns {Function} linkFn\r\n\t\t\t */\r\n\t\t \tfunction applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn,\r\n\t\t\t\t\t\t\t\t\t\t jqCollection, originalReplaceDirective, preLinkFns, postLinkFns,\r\n\t\t\t\t\t\t\t\t\t\t previousCompileContext) {\r\n\t\t \t\tpreviousCompileContext = previousCompileContext || {};\r\n\r\n\t\t \t\tvar terminalPriority = -Number.MAX_VALUE,\r\n\t\t\t\t\tnewScopeDirective,\r\n\t\t\t\t\tcontrollerDirectives = previousCompileContext.controllerDirectives,\r\n\t\t\t\t\tnewIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective,\r\n\t\t\t\t\ttemplateDirective = previousCompileContext.templateDirective,\r\n\t\t\t\t\tnonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective,\r\n\t\t\t\t\thasTranscludeDirective = false,\r\n\t\t\t\t\thasTemplate = false,\r\n\t\t\t\t\thasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective,\r\n\t\t\t\t\t$compileNode = templateAttrs.$$element = jqLite(compileNode),\r\n\t\t\t\t\tdirective,\r\n\t\t\t\t\tdirectiveName,\r\n\t\t\t\t\t$template,\r\n\t\t\t\t\treplaceDirective = originalReplaceDirective,\r\n\t\t\t\t\tchildTranscludeFn = transcludeFn,\r\n\t\t\t\t\tlinkFn,\r\n\t\t\t\t\tdirectiveValue;\r\n\r\n\t\t \t\t// executes all directives on the current element\r\n\t\t \t\tfor (var i = 0, ii = directives.length; i < ii; i++) {\r\n\t\t \t\t\tdirective = directives[i];\r\n\t\t \t\t\tvar attrStart = directive.$$start;\r\n\t\t \t\t\tvar attrEnd = directive.$$end;\r\n\r\n\t\t \t\t\t// collect multiblock sections\r\n\t\t \t\t\tif (attrStart) {\r\n\t\t \t\t\t\t$compileNode = groupScan(compileNode, attrStart, attrEnd);\r\n\t\t \t\t\t}\r\n\t\t \t\t\t$template = undefined;\r\n\r\n\t\t \t\t\tif (terminalPriority > directive.priority) {\r\n\t\t \t\t\t\tbreak; // prevent further processing of directives\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\tif (directiveValue = directive.scope) {\r\n\t\t \t\t\t\tnewScopeDirective = newScopeDirective || directive;\r\n\r\n\t\t \t\t\t\t// skip the check for directives with async templates, we'll check the derived sync\r\n\t\t \t\t\t\t// directive when the template arrives\r\n\t\t \t\t\t\tif (!directive.templateUrl) {\r\n\t\t \t\t\t\t\tassertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive,\r\n\t\t\t\t\t\t\t\t\t\t\t $compileNode);\r\n\t\t \t\t\t\t\tif (isObject(directiveValue)) {\r\n\t\t \t\t\t\t\t\tnewIsolateScopeDirective = directive;\r\n\t\t \t\t\t\t\t}\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\tdirectiveName = directive.name;\r\n\r\n\t\t \t\t\tif (!directive.templateUrl && directive.controller) {\r\n\t\t \t\t\t\tdirectiveValue = directive.controller;\r\n\t\t \t\t\t\tcontrollerDirectives = controllerDirectives || {};\r\n\t\t \t\t\t\tassertNoDuplicate(\"'\" + directiveName + \"' controller\",\r\n\t\t\t\t\t\t\tcontrollerDirectives[directiveName], directive, $compileNode);\r\n\t\t \t\t\t\tcontrollerDirectives[directiveName] = directive;\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\tif (directiveValue = directive.transclude) {\r\n\t\t \t\t\t\thasTranscludeDirective = true;\r\n\r\n\t\t \t\t\t\t// Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion.\r\n\t\t \t\t\t\t// This option should only be used by directives that know how to safely handle element transclusion,\r\n\t\t \t\t\t\t// where the transcluded nodes are added or replaced after linking.\r\n\t\t \t\t\t\tif (!directive.$$tlb) {\r\n\t\t \t\t\t\t\tassertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode);\r\n\t\t \t\t\t\t\tnonTlbTranscludeDirective = directive;\r\n\t\t \t\t\t\t}\r\n\r\n\t\t \t\t\t\tif (directiveValue == 'element') {\r\n\t\t \t\t\t\t\thasElementTranscludeDirective = true;\r\n\t\t \t\t\t\t\tterminalPriority = directive.priority;\r\n\t\t \t\t\t\t\t$template = groupScan(compileNode, attrStart, attrEnd);\r\n\t\t \t\t\t\t\t$compileNode = templateAttrs.$$element =\r\n\t\t\t\t\t\t\t\tjqLite(document.createComment(' ' + directiveName + ': ' +\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t templateAttrs[directiveName] + ' '));\r\n\t\t \t\t\t\t\tcompileNode = $compileNode[0];\r\n\t\t \t\t\t\t\treplaceWith(jqCollection, jqLite(sliceArgs($template)), compileNode);\r\n\r\n\t\t \t\t\t\t\tchildTranscludeFn = compile($template, transcludeFn, terminalPriority,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treplaceDirective && replaceDirective.name, {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// Don't pass in:\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// - controllerDirectives - otherwise we'll create duplicates controllers\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// - newIsolateScopeDirective or templateDirective - combining templates with\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// element transclusion doesn't make sense.\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t//\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// We need only nonTlbTranscludeDirective so that we prevent putting transclusion\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t// on the same element more than once.\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tnonTlbTranscludeDirective: nonTlbTranscludeDirective\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t \t\t\t\t} else {\r\n\t\t \t\t\t\t\t$template = jqLite(jqLiteClone(compileNode)).contents();\r\n\t\t \t\t\t\t\t$compileNode.empty(); // clear contents\r\n\t\t \t\t\t\t\tchildTranscludeFn = compile($template, transcludeFn);\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\tif (directive.template) {\r\n\t\t \t\t\t\thasTemplate = true;\r\n\t\t \t\t\t\tassertNoDuplicate('template', templateDirective, directive, $compileNode);\r\n\t\t \t\t\t\ttemplateDirective = directive;\r\n\r\n\t\t \t\t\t\tdirectiveValue = (isFunction(directive.template))\r\n\t\t\t\t\t\t\t? directive.template($compileNode, templateAttrs)\r\n\t\t\t\t\t\t\t: directive.template;\r\n\r\n\t\t \t\t\t\tdirectiveValue = denormalizeTemplate(directiveValue);\r\n\r\n\t\t \t\t\t\tif (directive.replace) {\r\n\t\t \t\t\t\t\treplaceDirective = directive;\r\n\t\t \t\t\t\t\tif (jqLiteIsTextNode(directiveValue)) {\r\n\t\t \t\t\t\t\t\t$template = [];\r\n\t\t \t\t\t\t\t} else {\r\n\t\t \t\t\t\t\t\t$template = jqLite(trim(directiveValue));\r\n\t\t \t\t\t\t\t}\r\n\t\t \t\t\t\t\tcompileNode = $template[0];\r\n\r\n\t\t \t\t\t\t\tif ($template.length != 1 || compileNode.nodeType !== 1) {\r\n\t\t \t\t\t\t\t\tthrow $compileMinErr('tplrt',\r\n\t\t\t\t\t\t\t\t\t\"Template for directive '{0}' must have exactly one root element. {1}\",\r\n\t\t\t\t\t\t\t\t\tdirectiveName, '');\r\n\t\t \t\t\t\t\t}\r\n\r\n\t\t \t\t\t\t\treplaceWith(jqCollection, $compileNode, compileNode);\r\n\r\n\t\t \t\t\t\t\tvar newTemplateAttrs = { $attr: {} };\r\n\r\n\t\t \t\t\t\t\t// combine directives from the original node and from the template:\r\n\t\t \t\t\t\t\t// - take the array of directives for this element\r\n\t\t \t\t\t\t\t// - split it into two parts, those that already applied (processed) and those that weren't (unprocessed)\r\n\t\t \t\t\t\t\t// - collect directives from the template and sort them by priority\r\n\t\t \t\t\t\t\t// - combine directives as: processed + template + unprocessed\r\n\t\t \t\t\t\t\tvar templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs);\r\n\t\t \t\t\t\t\tvar unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1));\r\n\r\n\t\t \t\t\t\t\tif (newIsolateScopeDirective) {\r\n\t\t \t\t\t\t\t\tmarkDirectivesAsIsolate(templateDirectives);\r\n\t\t \t\t\t\t\t}\r\n\t\t \t\t\t\t\tdirectives = directives.concat(templateDirectives).concat(unprocessedDirectives);\r\n\t\t \t\t\t\t\tmergeTemplateAttributes(templateAttrs, newTemplateAttrs);\r\n\r\n\t\t \t\t\t\t\tii = directives.length;\r\n\t\t \t\t\t\t} else {\r\n\t\t \t\t\t\t\t$compileNode.html(directiveValue);\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\tif (directive.templateUrl) {\r\n\t\t \t\t\t\thasTemplate = true;\r\n\t\t \t\t\t\tassertNoDuplicate('template', templateDirective, directive, $compileNode);\r\n\t\t \t\t\t\ttemplateDirective = directive;\r\n\r\n\t\t \t\t\t\tif (directive.replace) {\r\n\t\t \t\t\t\t\treplaceDirective = directive;\r\n\t\t \t\t\t\t}\r\n\r\n\t\t \t\t\t\tnodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode,\r\n\t\t\t\t\t\t\ttemplateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, {\r\n\t\t\t\t\t\t\t\tcontrollerDirectives: controllerDirectives,\r\n\t\t\t\t\t\t\t\tnewIsolateScopeDirective: newIsolateScopeDirective,\r\n\t\t\t\t\t\t\t\ttemplateDirective: templateDirective,\r\n\t\t\t\t\t\t\t\tnonTlbTranscludeDirective: nonTlbTranscludeDirective\r\n\t\t\t\t\t\t\t});\r\n\t\t \t\t\t\tii = directives.length;\r\n\t\t \t\t\t} else if (directive.compile) {\r\n\t\t \t\t\t\ttry {\r\n\t\t \t\t\t\t\tlinkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);\r\n\t\t \t\t\t\t\tif (isFunction(linkFn)) {\r\n\t\t \t\t\t\t\t\taddLinkFns(null, linkFn, attrStart, attrEnd);\r\n\t\t \t\t\t\t\t} else if (linkFn) {\r\n\t\t \t\t\t\t\t\taddLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd);\r\n\t\t \t\t\t\t\t}\r\n\t\t \t\t\t\t} catch (e) {\r\n\t\t \t\t\t\t\t$exceptionHandler(e, startingTag($compileNode));\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\tif (directive.terminal) {\r\n\t\t \t\t\t\tnodeLinkFn.terminal = true;\r\n\t\t \t\t\t\tterminalPriority = Math.max(terminalPriority, directive.priority);\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t}\r\n\r\n\t\t \t\tnodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true;\r\n\t\t \t\tnodeLinkFn.transcludeOnThisElement = hasTranscludeDirective;\r\n\t\t \t\tnodeLinkFn.templateOnThisElement = hasTemplate;\r\n\t\t \t\tnodeLinkFn.transclude = childTranscludeFn;\r\n\r\n\t\t \t\tpreviousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective;\r\n\r\n\t\t \t\t// might be normal or delayed nodeLinkFn depending on if templateUrl is present\r\n\t\t \t\treturn nodeLinkFn;\r\n\r\n\t\t \t\t////////////////////\r\n\r\n\t\t \t\tfunction addLinkFns(pre, post, attrStart, attrEnd) {\r\n\t\t \t\t\tif (pre) {\r\n\t\t \t\t\t\tif (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd);\r\n\t\t \t\t\t\tpre.require = directive.require;\r\n\t\t \t\t\t\tpre.directiveName = directiveName;\r\n\t\t \t\t\t\tif (newIsolateScopeDirective === directive || directive.$$isolateScope) {\r\n\t\t \t\t\t\t\tpre = cloneAndAnnotateFn(pre, { isolateScope: true });\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t\tpreLinkFns.push(pre);\r\n\t\t \t\t\t}\r\n\t\t \t\t\tif (post) {\r\n\t\t \t\t\t\tif (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd);\r\n\t\t \t\t\t\tpost.require = directive.require;\r\n\t\t \t\t\t\tpost.directiveName = directiveName;\r\n\t\t \t\t\t\tif (newIsolateScopeDirective === directive || directive.$$isolateScope) {\r\n\t\t \t\t\t\t\tpost = cloneAndAnnotateFn(post, { isolateScope: true });\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t\tpostLinkFns.push(post);\r\n\t\t \t\t\t}\r\n\t\t \t\t}\r\n\r\n\r\n\t\t \t\tfunction getControllers(directiveName, require, $element, elementControllers) {\r\n\t\t \t\t\tvar value, retrievalMethod = 'data', optional = false;\r\n\t\t \t\t\tif (isString(require)) {\r\n\t\t \t\t\t\twhile ((value = require.charAt(0)) == '^' || value == '?') {\r\n\t\t \t\t\t\t\trequire = require.substr(1);\r\n\t\t \t\t\t\t\tif (value == '^') {\r\n\t\t \t\t\t\t\t\tretrievalMethod = 'inheritedData';\r\n\t\t \t\t\t\t\t}\r\n\t\t \t\t\t\t\toptional = optional || value == '?';\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t\tvalue = null;\r\n\r\n\t\t \t\t\t\tif (elementControllers && retrievalMethod === 'data') {\r\n\t\t \t\t\t\t\tvalue = elementControllers[require];\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t\tvalue = value || $element[retrievalMethod]('$' + require + 'Controller');\r\n\r\n\t\t \t\t\t\tif (!value && !optional) {\r\n\t\t \t\t\t\t\tthrow $compileMinErr('ctreq',\r\n\t\t\t\t\t\t\t\t\"Controller '{0}', required by directive '{1}', can't be found!\",\r\n\t\t\t\t\t\t\t\trequire, directiveName);\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t\treturn value;\r\n\t\t \t\t\t} else if (isArray(require)) {\r\n\t\t \t\t\t\tvalue = [];\r\n\t\t \t\t\t\tforEach(require, function (require) {\r\n\t\t \t\t\t\t\tvalue.push(getControllers(directiveName, require, $element, elementControllers));\r\n\t\t \t\t\t\t});\r\n\t\t \t\t\t}\r\n\t\t \t\t\treturn value;\r\n\t\t \t\t}\r\n\r\n\r\n\t\t \t\tfunction nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {\r\n\t\t \t\t\tvar attrs, $element, i, ii, linkFn, controller, isolateScope, elementControllers = {}, transcludeFn;\r\n\r\n\t\t \t\t\tif (compileNode === linkNode) {\r\n\t\t \t\t\t\tattrs = templateAttrs;\r\n\t\t \t\t\t} else {\r\n\t\t \t\t\t\tattrs = shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr));\r\n\t\t \t\t\t}\r\n\t\t \t\t\t$element = attrs.$$element;\r\n\r\n\t\t \t\t\tif (newIsolateScopeDirective) {\r\n\t\t \t\t\t\tvar LOCAL_REGEXP = /^\\s*([@=&])(\\??)\\s*(\\w*)\\s*$/;\r\n\t\t \t\t\t\tvar $linkNode = jqLite(linkNode);\r\n\r\n\t\t \t\t\t\tisolateScope = scope.$new(true);\r\n\r\n\t\t \t\t\t\tif (templateDirective && (templateDirective === newIsolateScopeDirective ||\r\n\t\t\t\t\t\t\ttemplateDirective === newIsolateScopeDirective.$$originalDirective)) {\r\n\t\t \t\t\t\t\t$linkNode.data('$isolateScope', isolateScope);\r\n\t\t \t\t\t\t} else {\r\n\t\t \t\t\t\t\t$linkNode.data('$isolateScopeNoTemplate', isolateScope);\r\n\t\t \t\t\t\t}\r\n\r\n\r\n\r\n\t\t \t\t\t\tsafeAddClass($linkNode, 'ng-isolate-scope');\r\n\r\n\t\t \t\t\t\tforEach(newIsolateScopeDirective.scope, function (definition, scopeName) {\r\n\t\t \t\t\t\t\tvar match = definition.match(LOCAL_REGEXP) || [],\r\n\t\t\t\t\t\t\t\tattrName = match[3] || scopeName,\r\n\t\t\t\t\t\t\t\toptional = (match[2] == '?'),\r\n\t\t\t\t\t\t\t\tmode = match[1], // @, =, or &\r\n\t\t\t\t\t\t\t\tlastValue,\r\n\t\t\t\t\t\t\t\tparentGet, parentSet, compare;\r\n\r\n\t\t \t\t\t\t\tisolateScope.$$isolateBindings[scopeName] = mode + attrName;\r\n\r\n\t\t \t\t\t\t\tswitch (mode) {\r\n\r\n\t\t \t\t\t\t\t\tcase '@':\r\n\t\t \t\t\t\t\t\t\tattrs.$observe(attrName, function (value) {\r\n\t\t \t\t\t\t\t\t\t\tisolateScope[scopeName] = value;\r\n\t\t \t\t\t\t\t\t\t});\r\n\t\t \t\t\t\t\t\t\tattrs.$$observers[attrName].$$scope = scope;\r\n\t\t \t\t\t\t\t\t\tif (attrs[attrName]) {\r\n\t\t \t\t\t\t\t\t\t\t// If the attribute has been provided then we trigger an interpolation to ensure\r\n\t\t \t\t\t\t\t\t\t\t// the value is there for use in the link fn\r\n\t\t \t\t\t\t\t\t\t\tisolateScope[scopeName] = $interpolate(attrs[attrName])(scope);\r\n\t\t \t\t\t\t\t\t\t}\r\n\t\t \t\t\t\t\t\t\tbreak;\r\n\r\n\t\t \t\t\t\t\t\tcase '=':\r\n\t\t \t\t\t\t\t\t\tif (optional && !attrs[attrName]) {\r\n\t\t \t\t\t\t\t\t\t\treturn;\r\n\t\t \t\t\t\t\t\t\t}\r\n\t\t \t\t\t\t\t\t\tparentGet = $parse(attrs[attrName]);\r\n\t\t \t\t\t\t\t\t\tif (parentGet.literal) {\r\n\t\t \t\t\t\t\t\t\t\tcompare = equals;\r\n\t\t \t\t\t\t\t\t\t} else {\r\n\t\t \t\t\t\t\t\t\t\tcompare = function (a, b) { return a === b; };\r\n\t\t \t\t\t\t\t\t\t}\r\n\t\t \t\t\t\t\t\t\tparentSet = parentGet.assign || function () {\r\n\t\t \t\t\t\t\t\t\t\t// reset the change, or we will throw this exception on every $digest\r\n\t\t \t\t\t\t\t\t\t\tlastValue = isolateScope[scopeName] = parentGet(scope);\r\n\t\t \t\t\t\t\t\t\t\tthrow $compileMinErr('nonassign',\r\n\t\t\t\t\t\t\t\t\t\t\t\"Expression '{0}' used with directive '{1}' is non-assignable!\",\r\n\t\t\t\t\t\t\t\t\t\t\tattrs[attrName], newIsolateScopeDirective.name);\r\n\t\t \t\t\t\t\t\t\t};\r\n\t\t \t\t\t\t\t\t\tlastValue = isolateScope[scopeName] = parentGet(scope);\r\n\t\t \t\t\t\t\t\t\tisolateScope.$watch(function parentValueWatch() {\r\n\t\t \t\t\t\t\t\t\t\tvar parentValue = parentGet(scope);\r\n\t\t \t\t\t\t\t\t\t\tif (!compare(parentValue, isolateScope[scopeName])) {\r\n\t\t \t\t\t\t\t\t\t\t\t// we are out of sync and need to copy\r\n\t\t \t\t\t\t\t\t\t\t\tif (!compare(parentValue, lastValue)) {\r\n\t\t \t\t\t\t\t\t\t\t\t\t// parent changed and it has precedence\r\n\t\t \t\t\t\t\t\t\t\t\t\tisolateScope[scopeName] = parentValue;\r\n\t\t \t\t\t\t\t\t\t\t\t} else {\r\n\t\t \t\t\t\t\t\t\t\t\t\t// if the parent can be assigned then do so\r\n\t\t \t\t\t\t\t\t\t\t\t\tparentSet(scope, parentValue = isolateScope[scopeName]);\r\n\t\t \t\t\t\t\t\t\t\t\t}\r\n\t\t \t\t\t\t\t\t\t\t}\r\n\t\t \t\t\t\t\t\t\t\treturn lastValue = parentValue;\r\n\t\t \t\t\t\t\t\t\t}, null, parentGet.literal);\r\n\t\t \t\t\t\t\t\t\tbreak;\r\n\r\n\t\t \t\t\t\t\t\tcase '&':\r\n\t\t \t\t\t\t\t\t\tparentGet = $parse(attrs[attrName]);\r\n\t\t \t\t\t\t\t\t\tisolateScope[scopeName] = function (locals) {\r\n\t\t \t\t\t\t\t\t\t\treturn parentGet(scope, locals);\r\n\t\t \t\t\t\t\t\t\t};\r\n\t\t \t\t\t\t\t\t\tbreak;\r\n\r\n\t\t \t\t\t\t\t\tdefault:\r\n\t\t \t\t\t\t\t\t\tthrow $compileMinErr('iscp',\r\n\t\t\t\t\t\t\t\t\t\t\"Invalid isolate scope definition for directive '{0}'.\" +\r\n\t\t\t\t\t\t\t\t\t\t\" Definition: {... {1}: '{2}' ...}\",\r\n\t\t\t\t\t\t\t\t\t\tnewIsolateScopeDirective.name, scopeName, definition);\r\n\t\t \t\t\t\t\t}\r\n\t\t \t\t\t\t});\r\n\t\t \t\t\t}\r\n\t\t \t\t\ttranscludeFn = boundTranscludeFn && controllersBoundTransclude;\r\n\t\t \t\t\tif (controllerDirectives) {\r\n\t\t \t\t\t\tforEach(controllerDirectives, function (directive) {\r\n\t\t \t\t\t\t\tvar locals = {\r\n\t\t \t\t\t\t\t\t$scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope,\r\n\t\t \t\t\t\t\t\t$element: $element,\r\n\t\t \t\t\t\t\t\t$attrs: attrs,\r\n\t\t \t\t\t\t\t\t$transclude: transcludeFn\r\n\t\t \t\t\t\t\t}, controllerInstance;\r\n\r\n\t\t \t\t\t\t\tcontroller = directive.controller;\r\n\t\t \t\t\t\t\tif (controller == '@') {\r\n\t\t \t\t\t\t\t\tcontroller = attrs[directive.name];\r\n\t\t \t\t\t\t\t}\r\n\r\n\t\t \t\t\t\t\tcontrollerInstance = $controller(controller, locals);\r\n\t\t \t\t\t\t\t// For directives with element transclusion the element is a comment,\r\n\t\t \t\t\t\t\t// but jQuery .data doesn't support attaching data to comment nodes as it's hard to\r\n\t\t \t\t\t\t\t// clean up (http://bugs.jquery.com/ticket/8335).\r\n\t\t \t\t\t\t\t// Instead, we save the controllers for the element in a local hash and attach to .data\r\n\t\t \t\t\t\t\t// later, once we have the actual element.\r\n\t\t \t\t\t\t\telementControllers[directive.name] = controllerInstance;\r\n\t\t \t\t\t\t\tif (!hasElementTranscludeDirective) {\r\n\t\t \t\t\t\t\t\t$element.data('$' + directive.name + 'Controller', controllerInstance);\r\n\t\t \t\t\t\t\t}\r\n\r\n\t\t \t\t\t\t\tif (directive.controllerAs) {\r\n\t\t \t\t\t\t\t\tlocals.$scope[directive.controllerAs] = controllerInstance;\r\n\t\t \t\t\t\t\t}\r\n\t\t \t\t\t\t});\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\t// PRELINKING\r\n\t\t \t\t\tfor (i = 0, ii = preLinkFns.length; i < ii; i++) {\r\n\t\t \t\t\t\ttry {\r\n\t\t \t\t\t\t\tlinkFn = preLinkFns[i];\r\n\t\t \t\t\t\t\tlinkFn(linkFn.isolateScope ? isolateScope : scope, $element, attrs,\r\n\t\t\t\t\t\t\t\tlinkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), transcludeFn);\r\n\t\t \t\t\t\t} catch (e) {\r\n\t\t \t\t\t\t\t$exceptionHandler(e, startingTag($element));\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\t// RECURSION\r\n\t\t \t\t\t// We only pass the isolate scope, if the isolate directive has a template,\r\n\t\t \t\t\t// otherwise the child elements do not belong to the isolate directive.\r\n\t\t \t\t\tvar scopeToChild = scope;\r\n\t\t \t\t\tif (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) {\r\n\t\t \t\t\t\tscopeToChild = isolateScope;\r\n\t\t \t\t\t}\r\n\t\t \t\t\tchildLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn);\r\n\r\n\t\t \t\t\t// POSTLINKING\r\n\t\t \t\t\tfor (i = postLinkFns.length - 1; i >= 0; i--) {\r\n\t\t \t\t\t\ttry {\r\n\t\t \t\t\t\t\tlinkFn = postLinkFns[i];\r\n\t\t \t\t\t\t\tlinkFn(linkFn.isolateScope ? isolateScope : scope, $element, attrs,\r\n\t\t\t\t\t\t\t\tlinkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), transcludeFn);\r\n\t\t \t\t\t\t} catch (e) {\r\n\t\t \t\t\t\t\t$exceptionHandler(e, startingTag($element));\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t}\r\n\r\n\t\t \t\t\t// This is the function that is injected as `$transclude`.\r\n\t\t \t\t\tfunction controllersBoundTransclude(scope, cloneAttachFn) {\r\n\t\t \t\t\t\tvar transcludeControllers;\r\n\r\n\t\t \t\t\t\t// no scope passed\r\n\t\t \t\t\t\tif (arguments.length < 2) {\r\n\t\t \t\t\t\t\tcloneAttachFn = scope;\r\n\t\t \t\t\t\t\tscope = undefined;\r\n\t\t \t\t\t\t}\r\n\r\n\t\t \t\t\t\tif (hasElementTranscludeDirective) {\r\n\t\t \t\t\t\t\ttranscludeControllers = elementControllers;\r\n\t\t \t\t\t\t}\r\n\r\n\t\t \t\t\t\treturn boundTranscludeFn(scope, cloneAttachFn, transcludeControllers);\r\n\t\t \t\t\t}\r\n\t\t \t\t}\r\n\t\t \t}\r\n\r\n\t\t \tfunction markDirectivesAsIsolate(directives) {\r\n\t\t \t\t// mark all directives as needing isolate scope.\r\n\t\t \t\tfor (var j = 0, jj = directives.length; j < jj; j++) {\r\n\t\t \t\t\tdirectives[j] = inherit(directives[j], { $$isolateScope: true });\r\n\t\t \t\t}\r\n\t\t \t}\r\n\r\n\t\t \t/**\r\n\t\t\t * looks up the directive and decorates it with exception handling and proper parameters. We\r\n\t\t\t * call this the boundDirective.\r\n\t\t\t *\r\n\t\t\t * @param {string} name name of the directive to look up.\r\n\t\t\t * @param {string} location The directive must be found in specific format.\r\n\t\t\t * String containing any of theses characters:\r\n\t\t\t *\r\n\t\t\t * * `E`: element name\r\n\t\t\t * * `A': attribute\r\n\t\t\t * * `C`: class\r\n\t\t\t * * `M`: comment\r\n\t\t\t * @returns {boolean} true if directive was added.\r\n\t\t\t */\r\n\t\t \tfunction addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName,\r\n\t\t\t\t\t\t\t\t endAttrName) {\r\n\t\t \t\tif (name === ignoreDirective) return null;\r\n\t\t \t\tvar match = null;\r\n\t\t \t\tif (hasDirectives.hasOwnProperty(name)) {\r\n\t\t \t\t\tfor (var directive, directives = $injector.get(name + Suffix),\r\n\t\t\t\t\t\ti = 0, ii = directives.length; i < ii; i++) {\r\n\t\t \t\t\t\ttry {\r\n\t\t \t\t\t\t\tdirective = directives[i];\r\n\t\t \t\t\t\t\tif ((maxPriority === undefined || maxPriority > directive.priority) &&\r\n\t\t\t\t\t\t\t\t directive.restrict.indexOf(location) != -1) {\r\n\t\t \t\t\t\t\t\tif (startAttrName) {\r\n\t\t \t\t\t\t\t\t\tdirective = inherit(directive, { $$start: startAttrName, $$end: endAttrName });\r\n\t\t \t\t\t\t\t\t}\r\n\t\t \t\t\t\t\t\ttDirectives.push(directive);\r\n\t\t \t\t\t\t\t\tmatch = directive;\r\n\t\t \t\t\t\t\t}\r\n\t\t \t\t\t\t} catch (e) { $exceptionHandler(e); }\r\n\t\t \t\t\t}\r\n\t\t \t\t}\r\n\t\t \t\treturn match;\r\n\t\t \t}\r\n\r\n\r\n\t\t \t/**\r\n\t\t\t * When the element is replaced with HTML template then the new attributes\r\n\t\t\t * on the template need to be merged with the existing attributes in the DOM.\r\n\t\t\t * The desired effect is to have both of the attributes present.\r\n\t\t\t *\r\n\t\t\t * @param {object} dst destination attributes (original DOM)\r\n\t\t\t * @param {object} src source attributes (from the directive template)\r\n\t\t\t */\r\n\t\t \tfunction mergeTemplateAttributes(dst, src) {\r\n\t\t \t\tvar srcAttr = src.$attr,\r\n\t\t\t\t\tdstAttr = dst.$attr,\r\n\t\t\t\t\t$element = dst.$$element;\r\n\r\n\t\t \t\t// reapply the old attributes to the new element\r\n\t\t \t\tforEach(dst, function (value, key) {\r\n\t\t \t\t\tif (key.charAt(0) != '$') {\r\n\t\t \t\t\t\tif (src[key] && src[key] !== value) {\r\n\t\t \t\t\t\t\tvalue += (key === 'style' ? ';' : ' ') + src[key];\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t\tdst.$set(key, value, true, srcAttr[key]);\r\n\t\t \t\t\t}\r\n\t\t \t\t});\r\n\r\n\t\t \t\t// copy the new attributes on the old attrs object\r\n\t\t \t\tforEach(src, function (value, key) {\r\n\t\t \t\t\tif (key == 'class') {\r\n\t\t \t\t\t\tsafeAddClass($element, value);\r\n\t\t \t\t\t\tdst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value;\r\n\t\t \t\t\t} else if (key == 'style') {\r\n\t\t \t\t\t\t$element.attr('style', $element.attr('style') + ';' + value);\r\n\t\t \t\t\t\tdst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value;\r\n\t\t \t\t\t\t// `dst` will never contain hasOwnProperty as DOM parser won't let it.\r\n\t\t \t\t\t\t// You will get an \"InvalidCharacterError: DOM Exception 5\" error if you\r\n\t\t \t\t\t\t// have an attribute like \"has-own-property\" or \"data-has-own-property\", etc.\r\n\t\t \t\t\t} else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) {\r\n\t\t \t\t\t\tdst[key] = value;\r\n\t\t \t\t\t\tdstAttr[key] = srcAttr[key];\r\n\t\t \t\t\t}\r\n\t\t \t\t});\r\n\t\t \t}\r\n\r\n\r\n\t\t \tfunction compileTemplateUrl(directives, $compileNode, tAttrs,\r\n\t\t\t\t$rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) {\r\n\t\t \t\tvar linkQueue = [],\r\n\t\t\t\t\tafterTemplateNodeLinkFn,\r\n\t\t\t\t\tafterTemplateChildLinkFn,\r\n\t\t\t\t\tbeforeTemplateCompileNode = $compileNode[0],\r\n\t\t\t\t\torigAsyncDirective = directives.shift(),\r\n\t\t\t\t\t// The fact that we have to copy and patch the directive seems wrong!\r\n\t\t\t\t\tderivedSyncDirective = extend({}, origAsyncDirective, {\r\n\t\t\t\t\t\ttemplateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective\r\n\t\t\t\t\t}),\r\n\t\t\t\t\ttemplateUrl = (isFunction(origAsyncDirective.templateUrl))\r\n\t\t\t\t\t\t? origAsyncDirective.templateUrl($compileNode, tAttrs)\r\n\t\t\t\t\t\t: origAsyncDirective.templateUrl;\r\n\r\n\t\t \t\t$compileNode.empty();\r\n\r\n\t\t \t\t$http.get($sce.getTrustedResourceUrl(templateUrl), { cache: $templateCache }).\r\n\t\t\t\t success(function (content) {\r\n\t\t\t\t \tvar compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn;\r\n\r\n\t\t\t\t \tcontent = denormalizeTemplate(content);\r\n\r\n\t\t\t\t \tif (origAsyncDirective.replace) {\r\n\t\t\t\t \t\tif (jqLiteIsTextNode(content)) {\r\n\t\t\t\t \t\t\t$template = [];\r\n\t\t\t\t \t\t} else {\r\n\t\t\t\t \t\t\t$template = jqLite(trim(content));\r\n\t\t\t\t \t\t}\r\n\t\t\t\t \t\tcompileNode = $template[0];\r\n\r\n\t\t\t\t \t\tif ($template.length != 1 || compileNode.nodeType !== 1) {\r\n\t\t\t\t \t\t\tthrow $compileMinErr('tplrt',\r\n\t\t\t\t\t\t\t\t\"Template for directive '{0}' must have exactly one root element. {1}\",\r\n\t\t\t\t\t\t\t\torigAsyncDirective.name, templateUrl);\r\n\t\t\t\t \t\t}\r\n\r\n\t\t\t\t \t\ttempTemplateAttrs = { $attr: {} };\r\n\t\t\t\t \t\treplaceWith($rootElement, $compileNode, compileNode);\r\n\t\t\t\t \t\tvar templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs);\r\n\r\n\t\t\t\t \t\tif (isObject(origAsyncDirective.scope)) {\r\n\t\t\t\t \t\t\tmarkDirectivesAsIsolate(templateDirectives);\r\n\t\t\t\t \t\t}\r\n\t\t\t\t \t\tdirectives = templateDirectives.concat(directives);\r\n\t\t\t\t \t\tmergeTemplateAttributes(tAttrs, tempTemplateAttrs);\r\n\t\t\t\t \t} else {\r\n\t\t\t\t \t\tcompileNode = beforeTemplateCompileNode;\r\n\t\t\t\t \t\t$compileNode.html(content);\r\n\t\t\t\t \t}\r\n\r\n\t\t\t\t \tdirectives.unshift(derivedSyncDirective);\r\n\r\n\t\t\t\t \tafterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs,\r\n\t\t\t\t\t\tchildTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns,\r\n\t\t\t\t\t\tpreviousCompileContext);\r\n\t\t\t\t \tforEach($rootElement, function (node, i) {\r\n\t\t\t\t \t\tif (node == compileNode) {\r\n\t\t\t\t \t\t\t$rootElement[i] = $compileNode[0];\r\n\t\t\t\t \t\t}\r\n\t\t\t\t \t});\r\n\t\t\t\t \tafterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn);\r\n\r\n\t\t\t\t \twhile (linkQueue.length) {\r\n\t\t\t\t \t\tvar scope = linkQueue.shift(),\r\n\t\t\t\t\t\t\tbeforeTemplateLinkNode = linkQueue.shift(),\r\n\t\t\t\t\t\t\tlinkRootElement = linkQueue.shift(),\r\n\t\t\t\t\t\t\tboundTranscludeFn = linkQueue.shift(),\r\n\t\t\t\t\t\t\tlinkNode = $compileNode[0];\r\n\r\n\t\t\t\t \t\tif (beforeTemplateLinkNode !== beforeTemplateCompileNode) {\r\n\t\t\t\t \t\t\tvar oldClasses = beforeTemplateLinkNode.className;\r\n\r\n\t\t\t\t \t\t\tif (!(previousCompileContext.hasElementTranscludeDirective &&\r\n\t\t\t\t\t\t\t\torigAsyncDirective.replace)) {\r\n\t\t\t\t \t\t\t\t// it was cloned therefore we have to clone as well.\r\n\t\t\t\t \t\t\t\tlinkNode = jqLiteClone(compileNode);\r\n\t\t\t\t \t\t\t}\r\n\r\n\t\t\t\t \t\t\treplaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode);\r\n\r\n\t\t\t\t \t\t\t// Copy in CSS classes from original node\r\n\t\t\t\t \t\t\tsafeAddClass(jqLite(linkNode), oldClasses);\r\n\t\t\t\t \t\t}\r\n\t\t\t\t \t\tif (afterTemplateNodeLinkFn.transcludeOnThisElement) {\r\n\t\t\t\t \t\t\tchildBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);\r\n\t\t\t\t \t\t} else {\r\n\t\t\t\t \t\t\tchildBoundTranscludeFn = boundTranscludeFn;\r\n\t\t\t\t \t\t}\r\n\t\t\t\t \t\tafterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement,\r\n\t\t\t\t\t\t childBoundTranscludeFn);\r\n\t\t\t\t \t}\r\n\t\t\t\t \tlinkQueue = null;\r\n\t\t\t\t }).\r\n\t\t\t\t error(function (response, code, headers, config) {\r\n\t\t\t\t \tthrow $compileMinErr('tpload', 'Failed to load template: {0}', config.url);\r\n\t\t\t\t });\r\n\r\n\t\t \t\treturn function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) {\r\n\t\t \t\t\tvar childBoundTranscludeFn = boundTranscludeFn;\r\n\t\t \t\t\tif (linkQueue) {\r\n\t\t \t\t\t\tlinkQueue.push(scope);\r\n\t\t \t\t\t\tlinkQueue.push(node);\r\n\t\t \t\t\t\tlinkQueue.push(rootElement);\r\n\t\t \t\t\t\tlinkQueue.push(childBoundTranscludeFn);\r\n\t\t \t\t\t} else {\r\n\t\t \t\t\t\tif (afterTemplateNodeLinkFn.transcludeOnThisElement) {\r\n\t\t \t\t\t\t\tchildBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t\tafterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn);\r\n\t\t \t\t\t}\r\n\t\t \t\t};\r\n\t\t \t}\r\n\r\n\r\n\t\t \t/**\r\n\t\t\t * Sorting function for bound directives.\r\n\t\t\t */\r\n\t\t \tfunction byPriority(a, b) {\r\n\t\t \t\tvar diff = b.priority - a.priority;\r\n\t\t \t\tif (diff !== 0) return diff;\r\n\t\t \t\tif (a.name !== b.name) return (a.name < b.name) ? -1 : 1;\r\n\t\t \t\treturn a.index - b.index;\r\n\t\t \t}\r\n\r\n\r\n\t\t \tfunction assertNoDuplicate(what, previousDirective, directive, element) {\r\n\t\t \t\tif (previousDirective) {\r\n\t\t \t\t\tthrow $compileMinErr('multidir', 'Multiple directives [{0}, {1}] asking for {2} on: {3}',\r\n\t\t\t\t\t\tpreviousDirective.name, directive.name, what, startingTag(element));\r\n\t\t \t\t}\r\n\t\t \t}\r\n\r\n\r\n\t\t \tfunction addTextInterpolateDirective(directives, text) {\r\n\t\t \t\tvar interpolateFn = $interpolate(text, true);\r\n\t\t \t\tif (interpolateFn) {\r\n\t\t \t\t\tdirectives.push({\r\n\t\t \t\t\t\tpriority: 0,\r\n\t\t \t\t\t\tcompile: function textInterpolateCompileFn(templateNode) {\r\n\t\t \t\t\t\t\t// when transcluding a template that has bindings in the root\r\n\t\t \t\t\t\t\t// then we don't have a parent and should do this in the linkFn\r\n\t\t \t\t\t\t\tvar parent = templateNode.parent(), hasCompileParent = parent.length;\r\n\t\t \t\t\t\t\tif (hasCompileParent) safeAddClass(templateNode.parent(), 'ng-binding');\r\n\r\n\t\t \t\t\t\t\treturn function textInterpolateLinkFn(scope, node) {\r\n\t\t \t\t\t\t\t\tvar parent = node.parent(),\r\n\t\t\t\t\t\t\t\t bindings = parent.data('$binding') || [];\r\n\t\t \t\t\t\t\t\tbindings.push(interpolateFn);\r\n\t\t \t\t\t\t\t\tparent.data('$binding', bindings);\r\n\t\t \t\t\t\t\t\tif (!hasCompileParent) safeAddClass(parent, 'ng-binding');\r\n\t\t \t\t\t\t\t\tscope.$watch(interpolateFn, function interpolateFnWatchAction(value) {\r\n\t\t \t\t\t\t\t\t\tnode[0].nodeValue = value;\r\n\t\t \t\t\t\t\t\t});\r\n\t\t \t\t\t\t\t};\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t});\r\n\t\t \t\t}\r\n\t\t \t}\r\n\r\n\r\n\t\t \tfunction getTrustedContext(node, attrNormalizedName) {\r\n\t\t \t\tif (attrNormalizedName == \"srcdoc\") {\r\n\t\t \t\t\treturn $sce.HTML;\r\n\t\t \t\t}\r\n\t\t \t\tvar tag = nodeName_(node);\r\n\t\t \t\t// maction[xlink:href] can source SVG. It's not limited to <maction>.\r\n\t\t \t\tif (attrNormalizedName == \"xlinkHref\" ||\r\n\t\t\t\t\t(tag == \"FORM\" && attrNormalizedName == \"action\") ||\r\n\t\t\t\t\t(tag != \"IMG\" && (attrNormalizedName == \"src\" ||\r\n\t\t\t\t\t\t\t\t\t attrNormalizedName == \"ngSrc\"))) {\r\n\t\t \t\t\treturn $sce.RESOURCE_URL;\r\n\t\t \t\t}\r\n\t\t \t}\r\n\r\n\r\n\t\t \tfunction addAttrInterpolateDirective(node, directives, value, name) {\r\n\t\t \t\tvar interpolateFn = $interpolate(value, true);\r\n\r\n\t\t \t\t// no interpolation found -> ignore\r\n\t\t \t\tif (!interpolateFn) return;\r\n\r\n\r\n\t\t \t\tif (name === \"multiple\" && nodeName_(node) === \"SELECT\") {\r\n\t\t \t\t\tthrow $compileMinErr(\"selmulti\",\r\n\t\t\t\t\t\t\"Binding to the 'multiple' attribute is not supported. Element: {0}\",\r\n\t\t\t\t\t\tstartingTag(node));\r\n\t\t \t\t}\r\n\r\n\t\t \t\tdirectives.push({\r\n\t\t \t\t\tpriority: 100,\r\n\t\t \t\t\tcompile: function () {\r\n\t\t \t\t\t\treturn {\r\n\t\t \t\t\t\t\tpre: function attrInterpolatePreLinkFn(scope, element, attr) {\r\n\t\t \t\t\t\t\t\tvar $$observers = (attr.$$observers || (attr.$$observers = {}));\r\n\r\n\t\t \t\t\t\t\t\tif (EVENT_HANDLER_ATTR_REGEXP.test(name)) {\r\n\t\t \t\t\t\t\t\t\tthrow $compileMinErr('nodomevents',\r\n\t\t\t\t\t\t\t\t\t\t\"Interpolations for HTML DOM event attributes are disallowed. Please use the \" +\r\n\t\t\t\t\t\t\t\t\t\t\t\"ng- versions (such as ng-click instead of onclick) instead.\");\r\n\t\t \t\t\t\t\t\t}\r\n\r\n\t\t \t\t\t\t\t\t// we need to interpolate again, in case the attribute value has been updated\r\n\t\t \t\t\t\t\t\t// (e.g. by another directive's compile function)\r\n\t\t \t\t\t\t\t\tinterpolateFn = $interpolate(attr[name], true, getTrustedContext(node, name));\r\n\r\n\t\t \t\t\t\t\t\t// if attribute was updated so that there is no interpolation going on we don't want to\r\n\t\t \t\t\t\t\t\t// register any observers\r\n\t\t \t\t\t\t\t\tif (!interpolateFn) return;\r\n\r\n\t\t \t\t\t\t\t\t// TODO(i): this should likely be attr.$set(name, iterpolateFn(scope) so that we reset the\r\n\t\t \t\t\t\t\t\t// actual attr value\r\n\t\t \t\t\t\t\t\tattr[name] = interpolateFn(scope);\r\n\t\t \t\t\t\t\t\t($$observers[name] || ($$observers[name] = [])).$$inter = true;\r\n\t\t \t\t\t\t\t\t(attr.$$observers && attr.$$observers[name].$$scope || scope).\r\n\t\t\t\t\t\t\t\t $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) {\r\n\t\t\t\t\t\t\t\t \t//special case for class attribute addition + removal\r\n\t\t\t\t\t\t\t\t \t//so that class changes can tap into the animation\r\n\t\t\t\t\t\t\t\t \t//hooks provided by the $animate service. Be sure to\r\n\t\t\t\t\t\t\t\t \t//skip animations when the first digest occurs (when\r\n\t\t\t\t\t\t\t\t \t//both the new and the old values are the same) since\r\n\t\t\t\t\t\t\t\t \t//the CSS classes are the non-interpolated values\r\n\t\t\t\t\t\t\t\t \tif (name === 'class' && newValue != oldValue) {\r\n\t\t\t\t\t\t\t\t \t\tattr.$updateClass(newValue, oldValue);\r\n\t\t\t\t\t\t\t\t \t} else {\r\n\t\t\t\t\t\t\t\t \t\tattr.$set(name, newValue);\r\n\t\t\t\t\t\t\t\t \t}\r\n\t\t\t\t\t\t\t\t });\r\n\t\t \t\t\t\t\t}\r\n\t\t \t\t\t\t};\r\n\t\t \t\t\t}\r\n\t\t \t\t});\r\n\t\t \t}\r\n\r\n\r\n\t\t \t/**\r\n\t\t\t * This is a special jqLite.replaceWith, which can replace items which\r\n\t\t\t * have no parents, provided that the containing jqLite collection is provided.\r\n\t\t\t *\r\n\t\t\t * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes\r\n\t\t\t * in the root of the tree.\r\n\t\t\t * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep\r\n\t\t\t * the shell, but replace its DOM node reference.\r\n\t\t\t * @param {Node} newNode The new DOM node.\r\n\t\t\t */\r\n\t\t \tfunction replaceWith($rootElement, elementsToRemove, newNode) {\r\n\t\t \t\tvar firstElementToRemove = elementsToRemove[0],\r\n\t\t\t\t\tremoveCount = elementsToRemove.length,\r\n\t\t\t\t\tparent = firstElementToRemove.parentNode,\r\n\t\t\t\t\ti, ii;\r\n\r\n\t\t \t\tif ($rootElement) {\r\n\t\t \t\t\tfor (i = 0, ii = $rootElement.length; i < ii; i++) {\r\n\t\t \t\t\t\tif ($rootElement[i] == firstElementToRemove) {\r\n\t\t \t\t\t\t\t$rootElement[i++] = newNode;\r\n\t\t \t\t\t\t\tfor (var j = i, j2 = j + removeCount - 1,\r\n\t\t\t\t\t\t\t\t\t jj = $rootElement.length;\r\n\t\t\t\t\t\t\t\t j < jj; j++, j2++) {\r\n\t\t \t\t\t\t\t\tif (j2 < jj) {\r\n\t\t \t\t\t\t\t\t\t$rootElement[j] = $rootElement[j2];\r\n\t\t \t\t\t\t\t\t} else {\r\n\t\t \t\t\t\t\t\t\tdelete $rootElement[j];\r\n\t\t \t\t\t\t\t\t}\r\n\t\t \t\t\t\t\t}\r\n\t\t \t\t\t\t\t$rootElement.length -= removeCount - 1;\r\n\t\t \t\t\t\t\tbreak;\r\n\t\t \t\t\t\t}\r\n\t\t \t\t\t}\r\n\t\t \t\t}\r\n\r\n\t\t \t\tif (parent) {\r\n\t\t \t\t\tparent.replaceChild(newNode, firstElementToRemove);\r\n\t\t \t\t}\r\n\t\t \t\tvar fragment = document.createDocumentFragment();\r\n\t\t \t\tfragment.appendChild(firstElementToRemove);\r\n\t\t \t\tnewNode[jqLite.expando] = firstElementToRemove[jqLite.expando];\r\n\t\t \t\tfor (var k = 1, kk = elementsToRemove.length; k < kk; k++) {\r\n\t\t \t\t\tvar element = elementsToRemove[k];\r\n\t\t \t\t\tjqLite(element).remove(); // must do this way to clean up expando\r\n\t\t \t\t\tfragment.appendChild(element);\r\n\t\t \t\t\tdelete elementsToRemove[k];\r\n\t\t \t\t}\r\n\r\n\t\t \t\telementsToRemove[0] = newNode;\r\n\t\t \t\telementsToRemove.length = 1;\r\n\t\t \t}\r\n\r\n\r\n\t\t \tfunction cloneAndAnnotateFn(fn, annotation) {\r\n\t\t \t\treturn extend(function () { return fn.apply(null, arguments); }, fn, annotation);\r\n\t\t \t}\r\n\t\t }];\r\n\t}\r\n\r\n\tvar PREFIX_REGEXP = /^(x[\\:\\-_]|data[\\:\\-_])/i;\r\n\t/**\r\n\t * Converts all accepted directives format into proper directive name.\r\n\t * All of these will become 'myDirective':\r\n\t * my:Directive\r\n\t * my-directive\r\n\t * x-my-directive\r\n\t * data-my:directive\r\n\t *\r\n\t * Also there is special case for Moz prefix starting with upper case letter.\r\n\t * @param name Name to normalize\r\n\t */\r\n\tfunction directiveNormalize(name) {\r\n\t\treturn camelCase(name.replace(PREFIX_REGEXP, ''));\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc type\r\n\t * @name $compile.directive.Attributes\r\n\t *\r\n\t * @description\r\n\t * A shared object between directive compile / linking functions which contains normalized DOM\r\n\t * element attributes. The values reflect current binding state `{{ }}`. The normalization is\r\n\t * needed since all of these are treated as equivalent in Angular:\r\n\t *\r\n\t * ```\r\n\t * <span ng:bind=\"a\" ng-bind=\"a\" data-ng-bind=\"a\" x-ng-bind=\"a\">\r\n\t * ```\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc property\r\n\t * @name $compile.directive.Attributes#$attr\r\n\t * @returns {object} A map of DOM element attribute names to the normalized name. This is\r\n\t * needed to do reverse lookup from normalized name back to actual name.\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $compile.directive.Attributes#$set\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Set DOM element attribute value.\r\n\t *\r\n\t *\r\n\t * @param {string} name Normalized element attribute name of the property to modify. The name is\r\n\t * reverse-translated using the {@link ng.$compile.directive.Attributes#$attr $attr}\r\n\t * property to the original name.\r\n\t * @param {string} value Value to set the attribute to. The value can be an interpolated string.\r\n\t */\r\n\r\n\r\n\r\n\t/**\r\n\t * Closure compiler type information\r\n\t */\r\n\r\n\tfunction nodesetLinkingFn(\r\n\t /* angular.Scope */ scope,\r\n\t /* NodeList */ nodeList,\r\n\t /* Element */ rootElement,\r\n\t /* function(Function) */ boundTranscludeFn\r\n\t) { }\r\n\r\n\tfunction directiveLinkingFn(\r\n\t /* nodesetLinkingFn */ nodesetLinkingFn,\r\n\t /* angular.Scope */ scope,\r\n\t /* Node */ node,\r\n\t /* Element */ rootElement,\r\n\t /* function(Function) */ boundTranscludeFn\r\n\t) { }\r\n\r\n\tfunction tokenDifference(str1, str2) {\r\n\t\tvar values = '',\r\n\t\t\ttokens1 = str1.split(/\\s+/),\r\n\t\t\ttokens2 = str2.split(/\\s+/);\r\n\r\n\t\touter:\r\n\t\t\tfor (var i = 0; i < tokens1.length; i++) {\r\n\t\t\t\tvar token = tokens1[i];\r\n\t\t\t\tfor (var j = 0; j < tokens2.length; j++) {\r\n\t\t\t\t\tif (token == tokens2[j]) continue outer;\r\n\t\t\t\t}\r\n\t\t\t\tvalues += (values.length > 0 ? ' ' : '') + token;\r\n\t\t\t}\r\n\t\treturn values;\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc provider\r\n\t * @name $controllerProvider\r\n\t * @description\r\n\t * The {@link ng.$controller $controller service} is used by Angular to create new\r\n\t * controllers.\r\n\t *\r\n\t * This provider allows controller registration via the\r\n\t * {@link ng.$controllerProvider#register register} method.\r\n\t */\r\n\tfunction $ControllerProvider() {\r\n\t\tvar controllers = {},\r\n\t\t\tCNTRL_REG = /^(\\S+)(\\s+as\\s+(\\w+))?$/;\r\n\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $controllerProvider#register\r\n\t\t * @param {string|Object} name Controller name, or an object map of controllers where the keys are\r\n\t\t * the names and the values are the constructors.\r\n\t\t * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI\r\n\t\t * annotations in the array notation).\r\n\t\t */\r\n\t\tthis.register = function (name, constructor) {\r\n\t\t\tassertNotHasOwnProperty(name, 'controller');\r\n\t\t\tif (isObject(name)) {\r\n\t\t\t\textend(controllers, name);\r\n\t\t\t} else {\r\n\t\t\t\tcontrollers[name] = constructor;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.$get = ['$injector', '$window', function ($injector, $window) {\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc service\r\n\t\t\t * @name $controller\r\n\t\t\t * @requires $injector\r\n\t\t\t *\r\n\t\t\t * @param {Function|string} constructor If called with a function then it's considered to be the\r\n\t\t\t * controller constructor function. Otherwise it's considered to be a string which is used\r\n\t\t\t * to retrieve the controller constructor using the following steps:\r\n\t\t\t *\r\n\t\t\t * * check if a controller with given name is registered via `$controllerProvider`\r\n\t\t\t * * check if evaluating the string on the current scope returns a constructor\r\n\t\t\t * * check `window[constructor]` on the global `window` object\r\n\t\t\t *\r\n\t\t\t * @param {Object} locals Injection locals for Controller.\r\n\t\t\t * @return {Object} Instance of given controller.\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * `$controller` service is responsible for instantiating controllers.\r\n\t\t\t *\r\n\t\t\t * It's just a simple call to {@link auto.$injector $injector}, but extracted into\r\n\t\t\t * a service, so that one can override this service with [BC version](https://gist.github.com/1649788).\r\n\t\t\t */\r\n\t\t\treturn function (expression, locals) {\r\n\t\t\t\tvar instance, match, constructor, identifier;\r\n\r\n\t\t\t\tif (isString(expression)) {\r\n\t\t\t\t\tmatch = expression.match(CNTRL_REG),\r\n\t\t\t\t\tconstructor = match[1],\r\n\t\t\t\t\tidentifier = match[3];\r\n\t\t\t\t\texpression = controllers.hasOwnProperty(constructor)\r\n\t\t\t\t\t\t? controllers[constructor]\r\n\t\t\t\t\t\t: getter(locals.$scope, constructor, true) || getter($window, constructor, true);\r\n\r\n\t\t\t\t\tassertArgFn(expression, constructor, true);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tinstance = $injector.instantiate(expression, locals);\r\n\r\n\t\t\t\tif (identifier) {\r\n\t\t\t\t\tif (!(locals && typeof locals.$scope === 'object')) {\r\n\t\t\t\t\t\tthrow minErr('$controller')('noscp',\r\n\t\t\t\t\t\t\t\"Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.\",\r\n\t\t\t\t\t\t\tconstructor || expression.name, identifier);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tlocals.$scope[identifier] = instance;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn instance;\r\n\t\t\t};\r\n\t\t}];\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $document\r\n\t * @requires $window\r\n\t *\r\n\t * @description\r\n\t * A {@link angular.element jQuery or jqLite} wrapper for the browser's `window.document` object.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <div ng-controller=\"MainCtrl\">\r\n\t\t\t <p>$document title: <b ng-bind=\"title\"></b></p>\r\n\t\t\t <p>window.document title: <b ng-bind=\"windowTitle\"></b></p>\r\n\t\t </div>\r\n\t\t </file>\r\n\t\t <file name=\"script.js\">\r\n\t\t function MainCtrl($scope, $document) {\r\n\t\t\t $scope.title = $document[0].title;\r\n\t\t\t $scope.windowTitle = angular.element(window.document)[0].title;\r\n\t\t }\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tfunction $DocumentProvider() {\r\n\t\tthis.$get = ['$window', function (window) {\r\n\t\t\treturn jqLite(window.document);\r\n\t\t}];\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $exceptionHandler\r\n\t * @requires ng.$log\r\n\t *\r\n\t * @description\r\n\t * Any uncaught exception in angular expressions is delegated to this service.\r\n\t * The default implementation simply delegates to `$log.error` which logs it into\r\n\t * the browser console.\r\n\t *\r\n\t * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by\r\n\t * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing.\r\n\t *\r\n\t * ## Example:\r\n\t *\r\n\t * ```js\r\n\t * angular.module('exceptionOverride', []).factory('$exceptionHandler', function () {\r\n\t * return function (exception, cause) {\r\n\t * exception.message += ' (caused by \"' + cause + '\")';\r\n\t * throw exception;\r\n\t * };\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * This example will override the normal action of `$exceptionHandler`, to make angular\r\n\t * exceptions fail hard when they happen, instead of just logging to the console.\r\n\t *\r\n\t * @param {Error} exception Exception associated with the error.\r\n\t * @param {string=} cause optional information about the context in which\r\n\t * the error was thrown.\r\n\t *\r\n\t */\r\n\tfunction $ExceptionHandlerProvider() {\r\n\t\tthis.$get = ['$log', function ($log) {\r\n\t\t\treturn function (exception, cause) {\r\n\t\t\t\t$log.error.apply($log, arguments);\r\n\t\t\t};\r\n\t\t}];\r\n\t}\r\n\r\n\t/**\r\n\t * Parse headers into key value object\r\n\t *\r\n\t * @param {string} headers Raw headers as a string\r\n\t * @returns {Object} Parsed headers as key value object\r\n\t */\r\n\tfunction parseHeaders(headers) {\r\n\t\tvar parsed = {}, key, val, i;\r\n\r\n\t\tif (!headers) return parsed;\r\n\r\n\t\tforEach(headers.split('\\n'), function (line) {\r\n\t\t\ti = line.indexOf(':');\r\n\t\t\tkey = lowercase(trim(line.substr(0, i)));\r\n\t\t\tval = trim(line.substr(i + 1));\r\n\r\n\t\t\tif (key) {\r\n\t\t\t\tif (parsed[key]) {\r\n\t\t\t\t\tparsed[key] += ', ' + val;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tparsed[key] = val;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn parsed;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Returns a function that provides access to parsed headers.\r\n\t *\r\n\t * Headers are lazy parsed when first requested.\r\n\t * @see parseHeaders\r\n\t *\r\n\t * @param {(string|Object)} headers Headers to provide access to.\r\n\t * @returns {function(string=)} Returns a getter function which if called with:\r\n\t *\r\n\t * - if called with single an argument returns a single header value or null\r\n\t * - if called with no arguments returns an object containing all headers.\r\n\t */\r\n\tfunction headersGetter(headers) {\r\n\t\tvar headersObj = isObject(headers) ? headers : undefined;\r\n\r\n\t\treturn function (name) {\r\n\t\t\tif (!headersObj) headersObj = parseHeaders(headers);\r\n\r\n\t\t\tif (name) {\r\n\t\t\t\treturn headersObj[lowercase(name)] || null;\r\n\t\t\t}\r\n\r\n\t\t\treturn headersObj;\r\n\t\t};\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Chain all given functions\r\n\t *\r\n\t * This function is used for both request and response transforming\r\n\t *\r\n\t * @param {*} data Data to transform.\r\n\t * @param {function(string=)} headers Http headers getter fn.\r\n\t * @param {(Function|Array.<Function>)} fns Function or an array of functions.\r\n\t * @returns {*} Transformed data.\r\n\t */\r\n\tfunction transformData(data, headers, fns) {\r\n\t\tif (isFunction(fns))\r\n\t\t\treturn fns(data, headers);\r\n\r\n\t\tforEach(fns, function (fn) {\r\n\t\t\tdata = fn(data, headers);\r\n\t\t});\r\n\r\n\t\treturn data;\r\n\t}\r\n\r\n\r\n\tfunction isSuccess(status) {\r\n\t\treturn 200 <= status && status < 300;\r\n\t}\r\n\r\n\r\n\tfunction $HttpProvider() {\r\n\t\tvar JSON_START = /^\\s*(\\[|\\{[^\\{])/,\r\n\t\t\tJSON_END = /[\\}\\]]\\s*$/,\r\n\t\t\tPROTECTION_PREFIX = /^\\)\\]\\}',?\\n/,\r\n\t\t\tCONTENT_TYPE_APPLICATION_JSON = { 'Content-Type': 'application/json;charset=utf-8' };\r\n\r\n\t\tvar defaults = this.defaults = {\r\n\t\t\t// transform incoming response data\r\n\t\t\ttransformResponse: [function (data) {\r\n\t\t\t\tif (isString(data)) {\r\n\t\t\t\t\t// strip json vulnerability protection prefix\r\n\t\t\t\t\tdata = data.replace(PROTECTION_PREFIX, '');\r\n\t\t\t\t\tif (JSON_START.test(data) && JSON_END.test(data))\r\n\t\t\t\t\t\tdata = fromJson(data);\r\n\t\t\t\t}\r\n\t\t\t\treturn data;\r\n\t\t\t}],\r\n\r\n\t\t\t// transform outgoing request data\r\n\t\t\ttransformRequest: [function (d) {\r\n\t\t\t\treturn isObject(d) && !isFile(d) && !isBlob(d) ? toJson(d) : d;\r\n\t\t\t}],\r\n\r\n\t\t\t// default headers\r\n\t\t\theaders: {\r\n\t\t\t\tcommon: {\r\n\t\t\t\t\t'Accept': 'application/json, text/plain, */*'\r\n\t\t\t\t},\r\n\t\t\t\tpost: shallowCopy(CONTENT_TYPE_APPLICATION_JSON),\r\n\t\t\t\tput: shallowCopy(CONTENT_TYPE_APPLICATION_JSON),\r\n\t\t\t\tpatch: shallowCopy(CONTENT_TYPE_APPLICATION_JSON)\r\n\t\t\t},\r\n\r\n\t\t\txsrfCookieName: 'XSRF-TOKEN',\r\n\t\t\txsrfHeaderName: 'X-XSRF-TOKEN'\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Are ordered by request, i.e. they are applied in the same order as the\r\n\t\t * array, on request, but reverse order, on response.\r\n\t\t */\r\n\t\tvar interceptorFactories = this.interceptors = [];\r\n\r\n\t\t/**\r\n\t\t * For historical reasons, response interceptors are ordered by the order in which\r\n\t\t * they are applied to the response. (This is the opposite of interceptorFactories)\r\n\t\t */\r\n\t\tvar responseInterceptorFactories = this.responseInterceptors = [];\r\n\r\n\t\tthis.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector',\r\n\t\t\tfunction ($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) {\r\n\r\n\t\t\t\tvar defaultCache = $cacheFactory('$http');\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * Interceptors stored in reverse order. Inner interceptors before outer interceptors.\r\n\t\t\t\t * The reversal is needed so that we can build up the interception chain around the\r\n\t\t\t\t * server request.\r\n\t\t\t\t */\r\n\t\t\t\tvar reversedInterceptors = [];\r\n\r\n\t\t\t\tforEach(interceptorFactories, function (interceptorFactory) {\r\n\t\t\t\t\treversedInterceptors.unshift(isString(interceptorFactory)\r\n\t\t\t\t\t\t? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));\r\n\t\t\t\t});\r\n\r\n\t\t\t\tforEach(responseInterceptorFactories, function (interceptorFactory, index) {\r\n\t\t\t\t\tvar responseFn = isString(interceptorFactory)\r\n\t\t\t\t\t\t? $injector.get(interceptorFactory)\r\n\t\t\t\t\t\t: $injector.invoke(interceptorFactory);\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Response interceptors go before \"around\" interceptors (no real reason, just\r\n\t\t\t\t\t * had to pick one.) But they are already reversed, so we can't use unshift, hence\r\n\t\t\t\t\t * the splice.\r\n\t\t\t\t\t */\r\n\t\t\t\t\treversedInterceptors.splice(index, 0, {\r\n\t\t\t\t\t\tresponse: function (response) {\r\n\t\t\t\t\t\t\treturn responseFn($q.when(response));\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tresponseError: function (response) {\r\n\t\t\t\t\t\t\treturn responseFn($q.reject(response));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc service\r\n\t\t\t\t * @kind function\r\n\t\t\t\t * @name $http\r\n\t\t\t\t * @requires ng.$httpBackend\r\n\t\t\t\t * @requires $cacheFactory\r\n\t\t\t\t * @requires $rootScope\r\n\t\t\t\t * @requires $q\r\n\t\t\t\t * @requires $injector\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * The `$http` service is a core Angular service that facilitates communication with the remote\r\n\t\t\t\t * HTTP servers via the browser's [XMLHttpRequest](https://developer.mozilla.org/en/xmlhttprequest)\r\n\t\t\t\t * object or via [JSONP](http://en.wikipedia.org/wiki/JSONP).\r\n\t\t\t\t *\r\n\t\t\t\t * For unit testing applications that use `$http` service, see\r\n\t\t\t\t * {@link ngMock.$httpBackend $httpBackend mock}.\r\n\t\t\t\t *\r\n\t\t\t\t * For a higher level of abstraction, please check out the {@link ngResource.$resource\r\n\t\t\t\t * $resource} service.\r\n\t\t\t\t *\r\n\t\t\t\t * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by\r\n\t\t\t\t * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage\r\n\t\t\t\t * it is important to familiarize yourself with these APIs and the guarantees they provide.\r\n\t\t\t\t *\r\n\t\t\t\t *\r\n\t\t\t\t * # General usage\r\n\t\t\t\t * The `$http` service is a function which takes a single argument — a configuration object —\r\n\t\t\t\t * that is used to generate an HTTP request and returns a {@link ng.$q promise}\r\n\t\t\t\t * with two $http specific methods: `success` and `error`.\r\n\t\t\t\t *\r\n\t\t\t\t * ```js\r\n\t\t\t\t * $http({method: 'GET', url: '/someUrl'}).\r\n\t\t\t\t * success(function(data, status, headers, config) {\r\n\t\t\t\t * // this callback will be called asynchronously\r\n\t\t\t\t * // when the response is available\r\n\t\t\t\t * }).\r\n\t\t\t\t * error(function(data, status, headers, config) {\r\n\t\t\t\t * // called asynchronously if an error occurs\r\n\t\t\t\t * // or server returns response with an error status.\r\n\t\t\t\t * });\r\n\t\t\t\t * ```\r\n\t\t\t\t *\r\n\t\t\t\t * Since the returned value of calling the $http function is a `promise`, you can also use\r\n\t\t\t\t * the `then` method to register callbacks, and these callbacks will receive a single argument –\r\n\t\t\t\t * an object representing the response. See the API signature and type info below for more\r\n\t\t\t\t * details.\r\n\t\t\t\t *\r\n\t\t\t\t * A response status code between 200 and 299 is considered a success status and\r\n\t\t\t\t * will result in the success callback being called. Note that if the response is a redirect,\r\n\t\t\t\t * XMLHttpRequest will transparently follow it, meaning that the error callback will not be\r\n\t\t\t\t * called for such responses.\r\n\t\t\t\t *\r\n\t\t\t\t * # Writing Unit Tests that use $http\r\n\t\t\t\t * When unit testing (using {@link ngMock ngMock}), it is necessary to call\r\n\t\t\t\t * {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending\r\n\t\t\t\t * request using trained responses.\r\n\t\t\t\t *\r\n\t\t\t\t * ```\r\n\t\t\t\t * $httpBackend.expectGET(...);\r\n\t\t\t\t * $http.get(...);\r\n\t\t\t\t * $httpBackend.flush();\r\n\t\t\t\t * ```\r\n\t\t\t\t *\r\n\t\t\t\t * # Shortcut methods\r\n\t\t\t\t *\r\n\t\t\t\t * Shortcut methods are also available. All shortcut methods require passing in the URL, and\r\n\t\t\t\t * request data must be passed in for POST/PUT requests.\r\n\t\t\t\t *\r\n\t\t\t\t * ```js\r\n\t\t\t\t * $http.get('/someUrl').success(successCallback);\r\n\t\t\t\t * $http.post('/someUrl', data).success(successCallback);\r\n\t\t\t\t * ```\r\n\t\t\t\t *\r\n\t\t\t\t * Complete list of shortcut methods:\r\n\t\t\t\t *\r\n\t\t\t\t * - {@link ng.$http#get $http.get}\r\n\t\t\t\t * - {@link ng.$http#head $http.head}\r\n\t\t\t\t * - {@link ng.$http#post $http.post}\r\n\t\t\t\t * - {@link ng.$http#put $http.put}\r\n\t\t\t\t * - {@link ng.$http#delete $http.delete}\r\n\t\t\t\t * - {@link ng.$http#jsonp $http.jsonp}\r\n\t\t\t\t *\r\n\t\t\t\t *\r\n\t\t\t\t * # Setting HTTP Headers\r\n\t\t\t\t *\r\n\t\t\t\t * The $http service will automatically add certain HTTP headers to all requests. These defaults\r\n\t\t\t\t * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration\r\n\t\t\t\t * object, which currently contains this default configuration:\r\n\t\t\t\t *\r\n\t\t\t\t * - `$httpProvider.defaults.headers.common` (headers that are common for all requests):\r\n\t\t\t\t * - `Accept: application/json, text/plain, * / *`\r\n\t\t\t\t * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests)\r\n\t\t\t\t * - `Content-Type: application/json`\r\n\t\t\t\t * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests)\r\n\t\t\t\t * - `Content-Type: application/json`\r\n\t\t\t\t *\r\n\t\t\t\t * To add or overwrite these defaults, simply add or remove a property from these configuration\r\n\t\t\t\t * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object\r\n\t\t\t\t * with the lowercased HTTP method name as the key, e.g.\r\n\t\t\t\t * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }.\r\n\t\t\t\t *\r\n\t\t\t\t * The defaults can also be set at runtime via the `$http.defaults` object in the same\r\n\t\t\t\t * fashion. For example:\r\n\t\t\t\t *\r\n\t\t\t\t * ```\r\n\t\t\t\t * module.run(function($http) {\r\n\t\t\t\t * $http.defaults.headers.common.Authorization = 'Basic YmVlcDpib29w'\r\n\t\t\t\t * });\r\n\t\t\t\t * ```\r\n\t\t\t\t *\r\n\t\t\t\t * In addition, you can supply a `headers` property in the config object passed when\r\n\t\t\t\t * calling `$http(config)`, which overrides the defaults without changing them globally.\r\n\t\t\t\t *\r\n\t\t\t\t *\r\n\t\t\t\t * # Transforming Requests and Responses\r\n\t\t\t\t *\r\n\t\t\t\t * Both requests and responses can be transformed using transform functions. By default, Angular\r\n\t\t\t\t * applies these transformations:\r\n\t\t\t\t *\r\n\t\t\t\t * Request transformations:\r\n\t\t\t\t *\r\n\t\t\t\t * - If the `data` property of the request configuration object contains an object, serialize it\r\n\t\t\t\t * into JSON format.\r\n\t\t\t\t *\r\n\t\t\t\t * Response transformations:\r\n\t\t\t\t *\r\n\t\t\t\t * - If XSRF prefix is detected, strip it (see Security Considerations section below).\r\n\t\t\t\t * - If JSON response is detected, deserialize it using a JSON parser.\r\n\t\t\t\t *\r\n\t\t\t\t * To globally augment or override the default transforms, modify the\r\n\t\t\t\t * `$httpProvider.defaults.transformRequest` and `$httpProvider.defaults.transformResponse`\r\n\t\t\t\t * properties. These properties are by default an array of transform functions, which allows you\r\n\t\t\t\t * to `push` or `unshift` a new transformation function into the transformation chain. You can\r\n\t\t\t\t * also decide to completely override any default transformations by assigning your\r\n\t\t\t\t * transformation functions to these properties directly without the array wrapper. These defaults\r\n\t\t\t\t * are again available on the $http factory at run-time, which may be useful if you have run-time\r\n\t\t\t\t * services you wish to be involved in your transformations.\r\n\t\t\t\t *\r\n\t\t\t\t * Similarly, to locally override the request/response transforms, augment the\r\n\t\t\t\t * `transformRequest` and/or `transformResponse` properties of the configuration object passed\r\n\t\t\t\t * into `$http`.\r\n\t\t\t\t *\r\n\t\t\t\t *\r\n\t\t\t\t * # Caching\r\n\t\t\t\t *\r\n\t\t\t\t * To enable caching, set the request configuration `cache` property to `true` (to use default\r\n\t\t\t\t * cache) or to a custom cache object (built with {@link ng.$cacheFactory `$cacheFactory`}).\r\n\t\t\t\t * When the cache is enabled, `$http` stores the response from the server in the specified\r\n\t\t\t\t * cache. The next time the same request is made, the response is served from the cache without\r\n\t\t\t\t * sending a request to the server.\r\n\t\t\t\t *\r\n\t\t\t\t * Note that even if the response is served from cache, delivery of the data is asynchronous in\r\n\t\t\t\t * the same way that real requests are.\r\n\t\t\t\t *\r\n\t\t\t\t * If there are multiple GET requests for the same URL that should be cached using the same\r\n\t\t\t\t * cache, but the cache is not populated yet, only one request to the server will be made and\r\n\t\t\t\t * the remaining requests will be fulfilled using the response from the first request.\r\n\t\t\t\t *\r\n\t\t\t\t * You can change the default cache to a new object (built with\r\n\t\t\t\t * {@link ng.$cacheFactory `$cacheFactory`}) by updating the\r\n\t\t\t\t * {@link ng.$http#properties_defaults `$http.defaults.cache`} property. All requests who set\r\n\t\t\t\t * their `cache` property to `true` will now use this cache object.\r\n\t\t\t\t *\r\n\t\t\t\t * If you set the default cache to `false` then only requests that specify their own custom\r\n\t\t\t\t * cache object will be cached.\r\n\t\t\t\t *\r\n\t\t\t\t * # Interceptors\r\n\t\t\t\t *\r\n\t\t\t\t * Before you start creating interceptors, be sure to understand the\r\n\t\t\t\t * {@link ng.$q $q and deferred/promise APIs}.\r\n\t\t\t\t *\r\n\t\t\t\t * For purposes of global error handling, authentication, or any kind of synchronous or\r\n\t\t\t\t * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be\r\n\t\t\t\t * able to intercept requests before they are handed to the server and\r\n\t\t\t\t * responses before they are handed over to the application code that\r\n\t\t\t\t * initiated these requests. The interceptors leverage the {@link ng.$q\r\n\t\t\t\t * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing.\r\n\t\t\t\t *\r\n\t\t\t\t * The interceptors are service factories that are registered with the `$httpProvider` by\r\n\t\t\t\t * adding them to the `$httpProvider.interceptors` array. The factory is called and\r\n\t\t\t\t * injected with dependencies (if specified) and returns the interceptor.\r\n\t\t\t\t *\r\n\t\t\t\t * There are two kinds of interceptors (and two kinds of rejection interceptors):\r\n\t\t\t\t *\r\n\t\t\t\t * * `request`: interceptors get called with a http `config` object. The function is free to\r\n\t\t\t\t * modify the `config` object or create a new one. The function needs to return the `config`\r\n\t\t\t\t * object directly, or a promise containing the `config` or a new `config` object.\r\n\t\t\t\t * * `requestError`: interceptor gets called when a previous interceptor threw an error or\r\n\t\t\t\t * resolved with a rejection.\r\n\t\t\t\t * * `response`: interceptors get called with http `response` object. The function is free to\r\n\t\t\t\t * modify the `response` object or create a new one. The function needs to return the `response`\r\n\t\t\t\t * object directly, or as a promise containing the `response` or a new `response` object.\r\n\t\t\t\t * * `responseError`: interceptor gets called when a previous interceptor threw an error or\r\n\t\t\t\t * resolved with a rejection.\r\n\t\t\t\t *\r\n\t\t\t\t *\r\n\t\t\t\t * ```js\r\n\t\t\t\t * // register the interceptor as a service\r\n\t\t\t\t * $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {\r\n\t\t\t\t * return {\r\n\t\t\t\t * // optional method\r\n\t\t\t\t * 'request': function(config) {\r\n\t\t\t\t * // do something on success\r\n\t\t\t\t * return config;\r\n\t\t\t\t * },\r\n\t\t\t\t *\r\n\t\t\t\t * // optional method\r\n\t\t\t\t * 'requestError': function(rejection) {\r\n\t\t\t\t * // do something on error\r\n\t\t\t\t * if (canRecover(rejection)) {\r\n\t\t\t\t * return responseOrNewPromise\r\n\t\t\t\t * }\r\n\t\t\t\t * return $q.reject(rejection);\r\n\t\t\t\t * },\r\n\t\t\t\t *\r\n\t\t\t\t *\r\n\t\t\t\t *\r\n\t\t\t\t * // optional method\r\n\t\t\t\t * 'response': function(response) {\r\n\t\t\t\t * // do something on success\r\n\t\t\t\t * return response;\r\n\t\t\t\t * },\r\n\t\t\t\t *\r\n\t\t\t\t * // optional method\r\n\t\t\t\t * 'responseError': function(rejection) {\r\n\t\t\t\t * // do something on error\r\n\t\t\t\t * if (canRecover(rejection)) {\r\n\t\t\t\t * return responseOrNewPromise\r\n\t\t\t\t * }\r\n\t\t\t\t * return $q.reject(rejection);\r\n\t\t\t\t * }\r\n\t\t\t\t * };\r\n\t\t\t\t * });\r\n\t\t\t\t *\r\n\t\t\t\t * $httpProvider.interceptors.push('myHttpInterceptor');\r\n\t\t\t\t *\r\n\t\t\t\t *\r\n\t\t\t\t * // alternatively, register the interceptor via an anonymous factory\r\n\t\t\t\t * $httpProvider.interceptors.push(function($q, dependency1, dependency2) {\r\n\t\t\t\t * return {\r\n\t\t\t\t * 'request': function(config) {\r\n\t\t\t\t * // same as above\r\n\t\t\t\t * },\r\n\t\t\t\t *\r\n\t\t\t\t * 'response': function(response) {\r\n\t\t\t\t * // same as above\r\n\t\t\t\t * }\r\n\t\t\t\t * };\r\n\t\t\t\t * });\r\n\t\t\t\t * ```\r\n\t\t\t\t *\r\n\t\t\t\t * # Response interceptors (DEPRECATED)\r\n\t\t\t\t *\r\n\t\t\t\t * Before you start creating interceptors, be sure to understand the\r\n\t\t\t\t * {@link ng.$q $q and deferred/promise APIs}.\r\n\t\t\t\t *\r\n\t\t\t\t * For purposes of global error handling, authentication or any kind of synchronous or\r\n\t\t\t\t * asynchronous preprocessing of received responses, it is desirable to be able to intercept\r\n\t\t\t\t * responses for http requests before they are handed over to the application code that\r\n\t\t\t\t * initiated these requests. The response interceptors leverage the {@link ng.$q\r\n\t\t\t\t * promise apis} to fulfil this need for both synchronous and asynchronous preprocessing.\r\n\t\t\t\t *\r\n\t\t\t\t * The interceptors are service factories that are registered with the $httpProvider by\r\n\t\t\t\t * adding them to the `$httpProvider.responseInterceptors` array. The factory is called and\r\n\t\t\t\t * injected with dependencies (if specified) and returns the interceptor — a function that\r\n\t\t\t\t * takes a {@link ng.$q promise} and returns the original or a new promise.\r\n\t\t\t\t *\r\n\t\t\t\t * ```js\r\n\t\t\t\t * // register the interceptor as a service\r\n\t\t\t\t * $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {\r\n\t\t\t\t * return function(promise) {\r\n\t\t\t\t * return promise.then(function(response) {\r\n\t\t\t\t * // do something on success\r\n\t\t\t\t * return response;\r\n\t\t\t\t * }, function(response) {\r\n\t\t\t\t * // do something on error\r\n\t\t\t\t * if (canRecover(response)) {\r\n\t\t\t\t * return responseOrNewPromise\r\n\t\t\t\t * }\r\n\t\t\t\t * return $q.reject(response);\r\n\t\t\t\t * });\r\n\t\t\t\t * }\r\n\t\t\t\t * });\r\n\t\t\t\t *\r\n\t\t\t\t * $httpProvider.responseInterceptors.push('myHttpInterceptor');\r\n\t\t\t\t *\r\n\t\t\t\t *\r\n\t\t\t\t * // register the interceptor via an anonymous factory\r\n\t\t\t\t * $httpProvider.responseInterceptors.push(function($q, dependency1, dependency2) {\r\n\t\t\t\t * return function(promise) {\r\n\t\t\t\t * // same as above\r\n\t\t\t\t * }\r\n\t\t\t\t * });\r\n\t\t\t\t * ```\r\n\t\t\t\t *\r\n\t\t\t\t *\r\n\t\t\t\t * # Security Considerations\r\n\t\t\t\t *\r\n\t\t\t\t * When designing web applications, consider security threats from:\r\n\t\t\t\t *\r\n\t\t\t\t * - [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)\r\n\t\t\t\t * - [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery)\r\n\t\t\t\t *\r\n\t\t\t\t * Both server and the client must cooperate in order to eliminate these threats. Angular comes\r\n\t\t\t\t * pre-configured with strategies that address these issues, but for this to work backend server\r\n\t\t\t\t * cooperation is required.\r\n\t\t\t\t *\r\n\t\t\t\t * ## JSON Vulnerability Protection\r\n\t\t\t\t *\r\n\t\t\t\t * A [JSON vulnerability](http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx)\r\n\t\t\t\t * allows third party website to turn your JSON resource URL into\r\n\t\t\t\t * [JSONP](http://en.wikipedia.org/wiki/JSONP) request under some conditions. To\r\n\t\t\t\t * counter this your server can prefix all JSON requests with following string `\")]}',\\n\"`.\r\n\t\t\t\t * Angular will automatically strip the prefix before processing it as JSON.\r\n\t\t\t\t *\r\n\t\t\t\t * For example if your server needs to return:\r\n\t\t\t\t * ```js\r\n\t\t\t\t * ['one','two']\r\n\t\t\t\t * ```\r\n\t\t\t\t *\r\n\t\t\t\t * which is vulnerable to attack, your server can return:\r\n\t\t\t\t * ```js\r\n\t\t\t\t * )]}',\r\n\t\t\t\t * ['one','two']\r\n\t\t\t\t * ```\r\n\t\t\t\t *\r\n\t\t\t\t * Angular will strip the prefix, before processing the JSON.\r\n\t\t\t\t *\r\n\t\t\t\t *\r\n\t\t\t\t * ## Cross Site Request Forgery (XSRF) Protection\r\n\t\t\t\t *\r\n\t\t\t\t * [XSRF](http://en.wikipedia.org/wiki/Cross-site_request_forgery) is a technique by which\r\n\t\t\t\t * an unauthorized site can gain your user's private data. Angular provides a mechanism\r\n\t\t\t\t * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie\r\n\t\t\t\t * (by default, `XSRF-TOKEN`) and sets it as an HTTP header (`X-XSRF-TOKEN`). Since only\r\n\t\t\t\t * JavaScript that runs on your domain could read the cookie, your server can be assured that\r\n\t\t\t\t * the XHR came from JavaScript running on your domain. The header will not be set for\r\n\t\t\t\t * cross-domain requests.\r\n\t\t\t\t *\r\n\t\t\t\t * To take advantage of this, your server needs to set a token in a JavaScript readable session\r\n\t\t\t\t * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the\r\n\t\t\t\t * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure\r\n\t\t\t\t * that only JavaScript running on your domain could have sent the request. The token must be\r\n\t\t\t\t * unique for each user and must be verifiable by the server (to prevent the JavaScript from\r\n\t\t\t\t * making up its own tokens). We recommend that the token is a digest of your site's\r\n\t\t\t\t * authentication cookie with a [salt](https://en.wikipedia.org/wiki/Salt_(cryptography))\r\n\t\t\t\t * for added security.\r\n\t\t\t\t *\r\n\t\t\t\t * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName\r\n\t\t\t\t * properties of either $httpProvider.defaults at config-time, $http.defaults at run-time,\r\n\t\t\t\t * or the per-request config object.\r\n\t\t\t\t *\r\n\t\t\t\t *\r\n\t\t\t\t * @param {object} config Object describing the request to be made and how it should be\r\n\t\t\t\t * processed. The object has following properties:\r\n\t\t\t\t *\r\n\t\t\t\t * - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc)\r\n\t\t\t\t * - **url** – `{string}` – Absolute or relative URL of the resource that is being requested.\r\n\t\t\t\t * - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be turned\r\n\t\t\t\t * to `?key1=value1&key2=value2` after the url. If the value is not a string, it will be\r\n\t\t\t\t * JSONified.\r\n\t\t\t\t * - **data** – `{string|Object}` – Data to be sent as the request message data.\r\n\t\t\t\t * - **headers** – `{Object}` – Map of strings or functions which return strings representing\r\n\t\t\t\t * HTTP headers to send to the server. If the return value of a function is null, the\r\n\t\t\t\t * header will not be sent.\r\n\t\t\t\t * - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token.\r\n\t\t\t\t * - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token.\r\n\t\t\t\t * - **transformRequest** –\r\n\t\t\t\t * `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\r\n\t\t\t\t * transform function or an array of such functions. The transform function takes the http\r\n\t\t\t\t * request body and headers and returns its transformed (typically serialized) version.\r\n\t\t\t\t * - **transformResponse** –\r\n\t\t\t\t * `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –\r\n\t\t\t\t * transform function or an array of such functions. The transform function takes the http\r\n\t\t\t\t * response body and headers and returns its transformed (typically deserialized) version.\r\n\t\t\t\t * - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the\r\n\t\t\t\t * GET request, otherwise if a cache instance built with\r\n\t\t\t\t * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for\r\n\t\t\t\t * caching.\r\n\t\t\t\t * - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise}\r\n\t\t\t\t * that should abort the request when resolved.\r\n\t\t\t\t * - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the\r\n\t\t\t\t * XHR object. See [requests with credentials]https://developer.mozilla.org/en/http_access_control#section_5\r\n\t\t\t\t * for more information.\r\n\t\t\t\t * - **responseType** - `{string}` - see\r\n\t\t\t\t * [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType).\r\n\t\t\t\t *\r\n\t\t\t\t * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the\r\n\t\t\t\t * standard `then` method and two http specific methods: `success` and `error`. The `then`\r\n\t\t\t\t * method takes two arguments a success and an error callback which will be called with a\r\n\t\t\t\t * response object. The `success` and `error` methods take a single argument - a function that\r\n\t\t\t\t * will be called when the request succeeds or fails respectively. The arguments passed into\r\n\t\t\t\t * these functions are destructured representation of the response object passed into the\r\n\t\t\t\t * `then` method. The response object has these properties:\r\n\t\t\t\t *\r\n\t\t\t\t * - **data** – `{string|Object}` – The response body transformed with the transform\r\n\t\t\t\t * functions.\r\n\t\t\t\t * - **status** – `{number}` – HTTP status code of the response.\r\n\t\t\t\t * - **headers** – `{function([headerName])}` – Header getter function.\r\n\t\t\t\t * - **config** – `{Object}` – The configuration object that was used to generate the request.\r\n\t\t\t\t * - **statusText** – `{string}` – HTTP status text of the response.\r\n\t\t\t\t *\r\n\t\t\t\t * @property {Array.<Object>} pendingRequests Array of config objects for currently pending\r\n\t\t\t\t * requests. This is primarily meant to be used for debugging purposes.\r\n\t\t\t\t *\r\n\t\t\t\t *\r\n\t\t\t\t * @example\r\n\t\t\t<example>\r\n\t\t\t<file name=\"index.html\">\r\n\t\t\t <div ng-controller=\"FetchCtrl\">\r\n\t\t\t\t<select ng-model=\"method\">\r\n\t\t\t\t <option>GET</option>\r\n\t\t\t\t <option>JSONP</option>\r\n\t\t\t\t</select>\r\n\t\t\t\t<input type=\"text\" ng-model=\"url\" size=\"80\"/>\r\n\t\t\t\t<button id=\"fetchbtn\" ng-click=\"fetch()\">fetch</button><br>\r\n\t\t\t\t<button id=\"samplegetbtn\" ng-click=\"updateModel('GET', 'http-hello.html')\">Sample GET</button>\r\n\t\t\t\t<button id=\"samplejsonpbtn\"\r\n\t\t\t\t ng-click=\"updateModel('JSONP',\r\n\t\t\t\t\t\t\t\t'https://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')\">\r\n\t\t\t\t Sample JSONP\r\n\t\t\t\t</button>\r\n\t\t\t\t<button id=\"invalidjsonpbtn\"\r\n\t\t\t\t ng-click=\"updateModel('JSONP', 'https://angularjs.org/doesntexist&callback=JSON_CALLBACK')\">\r\n\t\t\t\t\tInvalid JSONP\r\n\t\t\t\t </button>\r\n\t\t\t\t<pre>http status code: {{status}}</pre>\r\n\t\t\t\t<pre>http response data: {{data}}</pre>\r\n\t\t\t </div>\r\n\t\t\t</file>\r\n\t\t\t<file name=\"script.js\">\r\n\t\t\t function FetchCtrl($scope, $http, $templateCache) {\r\n\t\t\t\t$scope.method = 'GET';\r\n\t\t\t\t$scope.url = 'http-hello.html';\r\n\t\t\t\r\n\t\t\t\t$scope.fetch = function() {\r\n\t\t\t\t $scope.code = null;\r\n\t\t\t\t $scope.response = null;\r\n\t\t\t\r\n\t\t\t\t $http({method: $scope.method, url: $scope.url, cache: $templateCache}).\r\n\t\t\t\t\tsuccess(function(data, status) {\r\n\t\t\t\t\t $scope.status = status;\r\n\t\t\t\t\t $scope.data = data;\r\n\t\t\t\t\t}).\r\n\t\t\t\t\terror(function(data, status) {\r\n\t\t\t\t\t $scope.data = data || \"Request failed\";\r\n\t\t\t\t\t $scope.status = status;\r\n\t\t\t\t });\r\n\t\t\t\t};\r\n\t\t\t\r\n\t\t\t\t$scope.updateModel = function(method, url) {\r\n\t\t\t\t $scope.method = method;\r\n\t\t\t\t $scope.url = url;\r\n\t\t\t\t};\r\n\t\t\t }\r\n\t\t\t</file>\r\n\t\t\t<file name=\"http-hello.html\">\r\n\t\t\t Hello, $http!\r\n\t\t\t</file>\r\n\t\t\t<file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\t var status = element(by.binding('status'));\r\n\t\t\t var data = element(by.binding('data'));\r\n\t\t\t var fetchBtn = element(by.id('fetchbtn'));\r\n\t\t\t var sampleGetBtn = element(by.id('samplegetbtn'));\r\n\t\t\t var sampleJsonpBtn = element(by.id('samplejsonpbtn'));\r\n\t\t\t var invalidJsonpBtn = element(by.id('invalidjsonpbtn'));\r\n\t\t\t\r\n\t\t\t it('should make an xhr GET request', function() {\r\n\t\t\t\tsampleGetBtn.click();\r\n\t\t\t\tfetchBtn.click();\r\n\t\t\t\texpect(status.getText()).toMatch('200');\r\n\t\t\t\texpect(data.getText()).toMatch(/Hello, \\$http!/);\r\n\t\t\t });\r\n\t\t\t\r\n\t\t\t it('should make a JSONP request to angularjs.org', function() {\r\n\t\t\t\tsampleJsonpBtn.click();\r\n\t\t\t\tfetchBtn.click();\r\n\t\t\t\texpect(status.getText()).toMatch('200');\r\n\t\t\t\texpect(data.getText()).toMatch(/Super Hero!/);\r\n\t\t\t });\r\n\t\t\t\r\n\t\t\t it('should make JSONP request to invalid URL and invoke the error handler',\r\n\t\t\t\t function() {\r\n\t\t\t\tinvalidJsonpBtn.click();\r\n\t\t\t\tfetchBtn.click();\r\n\t\t\t\texpect(status.getText()).toMatch('0');\r\n\t\t\t\texpect(data.getText()).toMatch('Request failed');\r\n\t\t\t });\r\n\t\t\t</file>\r\n\t\t\t</example>\r\n\t\t\t\t */\r\n\t\t\t\tfunction $http(requestConfig) {\r\n\t\t\t\t\tvar config = {\r\n\t\t\t\t\t\tmethod: 'get',\r\n\t\t\t\t\t\ttransformRequest: defaults.transformRequest,\r\n\t\t\t\t\t\ttransformResponse: defaults.transformResponse\r\n\t\t\t\t\t};\r\n\t\t\t\t\tvar headers = mergeHeaders(requestConfig);\r\n\r\n\t\t\t\t\textend(config, requestConfig);\r\n\t\t\t\t\tconfig.headers = headers;\r\n\t\t\t\t\tconfig.method = uppercase(config.method);\r\n\r\n\t\t\t\t\tvar serverRequest = function (config) {\r\n\t\t\t\t\t\theaders = config.headers;\r\n\t\t\t\t\t\tvar reqData = transformData(config.data, headersGetter(headers), config.transformRequest);\r\n\r\n\t\t\t\t\t\t// strip content-type if data is undefined\r\n\t\t\t\t\t\tif (isUndefined(config.data)) {\r\n\t\t\t\t\t\t\tforEach(headers, function (value, header) {\r\n\t\t\t\t\t\t\t\tif (lowercase(header) === 'content-type') {\r\n\t\t\t\t\t\t\t\t\tdelete headers[header];\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) {\r\n\t\t\t\t\t\t\tconfig.withCredentials = defaults.withCredentials;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// send request\r\n\t\t\t\t\t\treturn sendReq(config, reqData, headers).then(transformResponse, transformResponse);\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tvar chain = [serverRequest, undefined];\r\n\t\t\t\t\tvar promise = $q.when(config);\r\n\r\n\t\t\t\t\t// apply interceptors\r\n\t\t\t\t\tforEach(reversedInterceptors, function (interceptor) {\r\n\t\t\t\t\t\tif (interceptor.request || interceptor.requestError) {\r\n\t\t\t\t\t\t\tchain.unshift(interceptor.request, interceptor.requestError);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (interceptor.response || interceptor.responseError) {\r\n\t\t\t\t\t\t\tchain.push(interceptor.response, interceptor.responseError);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\twhile (chain.length) {\r\n\t\t\t\t\t\tvar thenFn = chain.shift();\r\n\t\t\t\t\t\tvar rejectFn = chain.shift();\r\n\r\n\t\t\t\t\t\tpromise = promise.then(thenFn, rejectFn);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tpromise.success = function (fn) {\r\n\t\t\t\t\t\tpromise.then(function (response) {\r\n\t\t\t\t\t\t\tfn(response.data, response.status, response.headers, config);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn promise;\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tpromise.error = function (fn) {\r\n\t\t\t\t\t\tpromise.then(null, function (response) {\r\n\t\t\t\t\t\t\tfn(response.data, response.status, response.headers, config);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn promise;\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\treturn promise;\r\n\r\n\t\t\t\t\tfunction transformResponse(response) {\r\n\t\t\t\t\t\t// make a copy since the response must be cacheable\r\n\t\t\t\t\t\tvar resp = extend({}, response, {\r\n\t\t\t\t\t\t\tdata: transformData(response.data, response.headers, config.transformResponse)\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn (isSuccess(response.status))\r\n\t\t\t\t\t\t ? resp\r\n\t\t\t\t\t\t : $q.reject(resp);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfunction mergeHeaders(config) {\r\n\t\t\t\t\t\tvar defHeaders = defaults.headers,\r\n\t\t\t\t\t\t\treqHeaders = extend({}, config.headers),\r\n\t\t\t\t\t\t\tdefHeaderName, lowercaseDefHeaderName, reqHeaderName;\r\n\r\n\t\t\t\t\t\tdefHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]);\r\n\r\n\t\t\t\t\t\t// execute if header value is function\r\n\t\t\t\t\t\texecHeaders(defHeaders);\r\n\t\t\t\t\t\texecHeaders(reqHeaders);\r\n\r\n\t\t\t\t\t\t// using for-in instead of forEach to avoid unecessary iteration after header has been found\r\n\t\t\t\t\t\tdefaultHeadersIteration:\r\n\t\t\t\t\t\t\tfor (defHeaderName in defHeaders) {\r\n\t\t\t\t\t\t\t\tlowercaseDefHeaderName = lowercase(defHeaderName);\r\n\r\n\t\t\t\t\t\t\t\tfor (reqHeaderName in reqHeaders) {\r\n\t\t\t\t\t\t\t\t\tif (lowercase(reqHeaderName) === lowercaseDefHeaderName) {\r\n\t\t\t\t\t\t\t\t\t\tcontinue defaultHeadersIteration;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\treqHeaders[defHeaderName] = defHeaders[defHeaderName];\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn reqHeaders;\r\n\r\n\t\t\t\t\t\tfunction execHeaders(headers) {\r\n\t\t\t\t\t\t\tvar headerContent;\r\n\r\n\t\t\t\t\t\t\tforEach(headers, function (headerFn, header) {\r\n\t\t\t\t\t\t\t\tif (isFunction(headerFn)) {\r\n\t\t\t\t\t\t\t\t\theaderContent = headerFn();\r\n\t\t\t\t\t\t\t\t\tif (headerContent != null) {\r\n\t\t\t\t\t\t\t\t\t\theaders[header] = headerContent;\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\tdelete headers[header];\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$http.pendingRequests = [];\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $http#get\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Shortcut method to perform `GET` request.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {string} url Relative or absolute URL specifying the destination of the request\r\n\t\t\t\t * @param {Object=} config Optional configuration object\r\n\t\t\t\t * @returns {HttpPromise} Future object\r\n\t\t\t\t */\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $http#delete\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Shortcut method to perform `DELETE` request.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {string} url Relative or absolute URL specifying the destination of the request\r\n\t\t\t\t * @param {Object=} config Optional configuration object\r\n\t\t\t\t * @returns {HttpPromise} Future object\r\n\t\t\t\t */\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $http#head\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Shortcut method to perform `HEAD` request.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {string} url Relative or absolute URL specifying the destination of the request\r\n\t\t\t\t * @param {Object=} config Optional configuration object\r\n\t\t\t\t * @returns {HttpPromise} Future object\r\n\t\t\t\t */\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $http#jsonp\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Shortcut method to perform `JSONP` request.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {string} url Relative or absolute URL specifying the destination of the request.\r\n\t\t\t\t * Should contain `JSON_CALLBACK` string.\r\n\t\t\t\t * @param {Object=} config Optional configuration object\r\n\t\t\t\t * @returns {HttpPromise} Future object\r\n\t\t\t\t */\r\n\t\t\t\tcreateShortMethods('get', 'delete', 'head', 'jsonp');\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $http#post\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Shortcut method to perform `POST` request.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {string} url Relative or absolute URL specifying the destination of the request\r\n\t\t\t\t * @param {*} data Request content\r\n\t\t\t\t * @param {Object=} config Optional configuration object\r\n\t\t\t\t * @returns {HttpPromise} Future object\r\n\t\t\t\t */\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $http#put\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Shortcut method to perform `PUT` request.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {string} url Relative or absolute URL specifying the destination of the request\r\n\t\t\t\t * @param {*} data Request content\r\n\t\t\t\t * @param {Object=} config Optional configuration object\r\n\t\t\t\t * @returns {HttpPromise} Future object\r\n\t\t\t\t */\r\n\t\t\t\tcreateShortMethodsWithData('post', 'put');\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc property\r\n\t\t\t\t * @name $http#defaults\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of\r\n\t\t\t\t * default headers, withCredentials as well as request and response transformations.\r\n\t\t\t\t *\r\n\t\t\t\t * See \"Setting HTTP Headers\" and \"Transforming Requests and Responses\" sections above.\r\n\t\t\t\t */\r\n\t\t\t\t$http.defaults = defaults;\r\n\r\n\r\n\t\t\t\treturn $http;\r\n\r\n\r\n\t\t\t\tfunction createShortMethods(names) {\r\n\t\t\t\t\tforEach(arguments, function (name) {\r\n\t\t\t\t\t\t$http[name] = function (url, config) {\r\n\t\t\t\t\t\t\treturn $http(extend(config || {}, {\r\n\t\t\t\t\t\t\t\tmethod: name,\r\n\t\t\t\t\t\t\t\turl: url\r\n\t\t\t\t\t\t\t}));\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\r\n\t\t\t\tfunction createShortMethodsWithData(name) {\r\n\t\t\t\t\tforEach(arguments, function (name) {\r\n\t\t\t\t\t\t$http[name] = function (url, data, config) {\r\n\t\t\t\t\t\t\treturn $http(extend(config || {}, {\r\n\t\t\t\t\t\t\t\tmethod: name,\r\n\t\t\t\t\t\t\t\turl: url,\r\n\t\t\t\t\t\t\t\tdata: data\r\n\t\t\t\t\t\t\t}));\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * Makes the request.\r\n\t\t\t\t *\r\n\t\t\t\t * !!! ACCESSES CLOSURE VARS:\r\n\t\t\t\t * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests\r\n\t\t\t\t */\r\n\t\t\t\tfunction sendReq(config, reqData, reqHeaders) {\r\n\t\t\t\t\tvar deferred = $q.defer(),\r\n\t\t\t\t\t\tpromise = deferred.promise,\r\n\t\t\t\t\t\tcache,\r\n\t\t\t\t\t\tcachedResp,\r\n\t\t\t\t\t\turl = buildUrl(config.url, config.params);\r\n\r\n\t\t\t\t\t$http.pendingRequests.push(config);\r\n\t\t\t\t\tpromise.then(removePendingReq, removePendingReq);\r\n\r\n\r\n\t\t\t\t\tif ((config.cache || defaults.cache) && config.cache !== false && config.method == 'GET') {\r\n\t\t\t\t\t\tcache = isObject(config.cache) ? config.cache\r\n\t\t\t\t\t\t\t : isObject(defaults.cache) ? defaults.cache\r\n\t\t\t\t\t\t\t : defaultCache;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (cache) {\r\n\t\t\t\t\t\tcachedResp = cache.get(url);\r\n\t\t\t\t\t\tif (isDefined(cachedResp)) {\r\n\t\t\t\t\t\t\tif (cachedResp.then) {\r\n\t\t\t\t\t\t\t\t// cached request has already been sent, but there is no response yet\r\n\t\t\t\t\t\t\t\tcachedResp.then(removePendingReq, removePendingReq);\r\n\t\t\t\t\t\t\t\treturn cachedResp;\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t// serving from cache\r\n\t\t\t\t\t\t\t\tif (isArray(cachedResp)) {\r\n\t\t\t\t\t\t\t\t\tresolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tresolvePromise(cachedResp, 200, {}, 'OK');\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// put the promise for the non-transformed response into cache as a placeholder\r\n\t\t\t\t\t\t\tcache.put(url, promise);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\t// if we won't have the response in cache, set the xsrf headers and\r\n\t\t\t\t\t// send the request to the backend\r\n\t\t\t\t\tif (isUndefined(cachedResp)) {\r\n\t\t\t\t\t\tvar xsrfValue = urlIsSameOrigin(config.url)\r\n\t\t\t\t\t\t\t? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName]\r\n\t\t\t\t\t\t\t: undefined;\r\n\t\t\t\t\t\tif (xsrfValue) {\r\n\t\t\t\t\t\t\treqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t$httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,\r\n\t\t\t\t\t\t\tconfig.withCredentials, config.responseType);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn promise;\r\n\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Callback registered to $httpBackend():\r\n\t\t\t\t\t * - caches the response if desired\r\n\t\t\t\t\t * - resolves the raw $http promise\r\n\t\t\t\t\t * - calls $apply\r\n\t\t\t\t\t */\r\n\t\t\t\t\tfunction done(status, response, headersString, statusText) {\r\n\t\t\t\t\t\tif (cache) {\r\n\t\t\t\t\t\t\tif (isSuccess(status)) {\r\n\t\t\t\t\t\t\t\tcache.put(url, [status, response, parseHeaders(headersString), statusText]);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t// remove promise from the cache\r\n\t\t\t\t\t\t\t\tcache.remove(url);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tresolvePromise(response, status, headersString, statusText);\r\n\t\t\t\t\t\tif (!$rootScope.$$phase) $rootScope.$apply();\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * Resolves the raw $http promise.\r\n\t\t\t\t\t */\r\n\t\t\t\t\tfunction resolvePromise(response, status, headers, statusText) {\r\n\t\t\t\t\t\t// normalize internal statuses to 0\r\n\t\t\t\t\t\tstatus = Math.max(status, 0);\r\n\r\n\t\t\t\t\t\t(isSuccess(status) ? deferred.resolve : deferred.reject)({\r\n\t\t\t\t\t\t\tdata: response,\r\n\t\t\t\t\t\t\tstatus: status,\r\n\t\t\t\t\t\t\theaders: headersGetter(headers),\r\n\t\t\t\t\t\t\tconfig: config,\r\n\t\t\t\t\t\t\tstatusText: statusText\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\tfunction removePendingReq() {\r\n\t\t\t\t\t\tvar idx = indexOf($http.pendingRequests, config);\r\n\t\t\t\t\t\tif (idx !== -1) $http.pendingRequests.splice(idx, 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\r\n\t\t\t\tfunction buildUrl(url, params) {\r\n\t\t\t\t\tif (!params) return url;\r\n\t\t\t\t\tvar parts = [];\r\n\t\t\t\t\tforEachSorted(params, function (value, key) {\r\n\t\t\t\t\t\tif (value === null || isUndefined(value)) return;\r\n\t\t\t\t\t\tif (!isArray(value)) value = [value];\r\n\r\n\t\t\t\t\t\tforEach(value, function (v) {\r\n\t\t\t\t\t\t\tif (isObject(v)) {\r\n\t\t\t\t\t\t\t\tv = toJson(v);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tparts.push(encodeUriQuery(key) + '=' +\r\n\t\t\t\t\t\t\t\t\t encodeUriQuery(v));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif (parts.length > 0) {\r\n\t\t\t\t\t\turl += ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn url;\r\n\t\t\t\t}\r\n\r\n\r\n\t\t\t}];\r\n\t}\r\n\r\n\tfunction createXhr(method) {\r\n\t\t//if IE and the method is not RFC2616 compliant, or if XMLHttpRequest\r\n\t\t//is not available, try getting an ActiveXObject. Otherwise, use XMLHttpRequest\r\n\t\t//if it is available\r\n\t\tif (msie <= 8 && (!method.match(/^(get|post|head|put|delete|options)$/i) ||\r\n\t\t !window.XMLHttpRequest)) {\r\n\t\t\treturn new window.ActiveXObject(\"Microsoft.XMLHTTP\");\r\n\t\t} else if (window.XMLHttpRequest) {\r\n\t\t\treturn new window.XMLHttpRequest();\r\n\t\t}\r\n\r\n\t\tthrow minErr('$httpBackend')('noxhr', \"This browser does not support XMLHttpRequest.\");\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $httpBackend\r\n\t * @requires $window\r\n\t * @requires $document\r\n\t *\r\n\t * @description\r\n\t * HTTP backend used by the {@link ng.$http service} that delegates to\r\n\t * XMLHttpRequest object or JSONP and deals with browser incompatibilities.\r\n\t *\r\n\t * You should never need to use this service directly, instead use the higher-level abstractions:\r\n\t * {@link ng.$http $http} or {@link ngResource.$resource $resource}.\r\n\t *\r\n\t * During testing this implementation is swapped with {@link ngMock.$httpBackend mock\r\n\t * $httpBackend} which can be trained with responses.\r\n\t */\r\n\tfunction $HttpBackendProvider() {\r\n\t\tthis.$get = ['$browser', '$window', '$document', function ($browser, $window, $document) {\r\n\t\t\treturn createHttpBackend($browser, createXhr, $browser.defer, $window.angular.callbacks, $document[0]);\r\n\t\t}];\r\n\t}\r\n\r\n\tfunction createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDocument) {\r\n\t\tvar ABORTED = -1;\r\n\r\n\t\t// TODO(vojta): fix the signature\r\n\t\treturn function (method, url, post, callback, headers, timeout, withCredentials, responseType) {\r\n\t\t\tvar status;\r\n\t\t\t$browser.$$incOutstandingRequestCount();\r\n\t\t\turl = url || $browser.url();\r\n\r\n\t\t\tif (lowercase(method) == 'jsonp') {\r\n\t\t\t\tvar callbackId = '_' + (callbacks.counter++).toString(36);\r\n\t\t\t\tcallbacks[callbackId] = function (data) {\r\n\t\t\t\t\tcallbacks[callbackId].data = data;\r\n\t\t\t\t\tcallbacks[callbackId].called = true;\r\n\t\t\t\t};\r\n\r\n\t\t\t\tvar jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId),\r\n\t\t\t\t\tcallbackId, function (status, text) {\r\n\t\t\t\t\t\tcompleteRequest(callback, status, callbacks[callbackId].data, \"\", text);\r\n\t\t\t\t\t\tcallbacks[callbackId] = noop;\r\n\t\t\t\t\t});\r\n\t\t\t} else {\r\n\r\n\t\t\t\tvar xhr = createXhr(method);\r\n\r\n\t\t\t\txhr.open(method, url, true);\r\n\t\t\t\tforEach(headers, function (value, key) {\r\n\t\t\t\t\tif (isDefined(value)) {\r\n\t\t\t\t\t\txhr.setRequestHeader(key, value);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// In IE6 and 7, this might be called synchronously when xhr.send below is called and the\r\n\t\t\t\t// response is in the cache. the promise api will ensure that to the app code the api is\r\n\t\t\t\t// always async\r\n\t\t\t\txhr.onreadystatechange = function () {\r\n\t\t\t\t\t// onreadystatechange might get called multiple times with readyState === 4 on mobile webkit caused by\r\n\t\t\t\t\t// xhrs that are resolved while the app is in the background (see #5426).\r\n\t\t\t\t\t// since calling completeRequest sets the `xhr` variable to null, we just check if it's not null before\r\n\t\t\t\t\t// continuing\r\n\t\t\t\t\t//\r\n\t\t\t\t\t// we can't set xhr.onreadystatechange to undefined or delete it because that breaks IE8 (method=PATCH) and\r\n\t\t\t\t\t// Safari respectively.\r\n\t\t\t\t\tif (xhr && xhr.readyState == 4) {\r\n\t\t\t\t\t\tvar responseHeaders = null,\r\n\t\t\t\t\t\t\tresponse = null,\r\n\t\t\t\t\t\t\tstatusText = '';\r\n\r\n\t\t\t\t\t\tif (status !== ABORTED) {\r\n\t\t\t\t\t\t\tresponseHeaders = xhr.getAllResponseHeaders();\r\n\r\n\t\t\t\t\t\t\t// responseText is the old-school way of retrieving response (supported by IE8 & 9)\r\n\t\t\t\t\t\t\t// response/responseType properties were introduced in XHR Level2 spec (supported by IE10)\r\n\t\t\t\t\t\t\tresponse = ('response' in xhr) ? xhr.response : xhr.responseText;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Accessing statusText on an aborted xhr object will\r\n\t\t\t\t\t\t// throw an 'c00c023f error' in IE9 and lower, don't touch it.\r\n\t\t\t\t\t\tif (!(status === ABORTED && msie < 10)) {\r\n\t\t\t\t\t\t\tstatusText = xhr.statusText;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tcompleteRequest(callback,\r\n\t\t\t\t\t\t\tstatus || xhr.status,\r\n\t\t\t\t\t\t\tresponse,\r\n\t\t\t\t\t\t\tresponseHeaders,\r\n\t\t\t\t\t\t\tstatusText);\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\tif (withCredentials) {\r\n\t\t\t\t\txhr.withCredentials = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (responseType) {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\txhr.responseType = responseType;\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t// WebKit added support for the json responseType value on 09/03/2013\r\n\t\t\t\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are\r\n\t\t\t\t\t\t// known to throw when setting the value \"json\" as the response type. Other older\r\n\t\t\t\t\t\t// browsers implementing the responseType\r\n\t\t\t\t\t\t//\r\n\t\t\t\t\t\t// The json response type can be ignored if not supported, because JSON payloads are\r\n\t\t\t\t\t\t// parsed on the client-side regardless.\r\n\t\t\t\t\t\tif (responseType !== 'json') {\r\n\t\t\t\t\t\t\tthrow e;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\txhr.send(post || null);\r\n\t\t\t}\r\n\r\n\t\t\tif (timeout > 0) {\r\n\t\t\t\tvar timeoutId = $browserDefer(timeoutRequest, timeout);\r\n\t\t\t} else if (timeout && timeout.then) {\r\n\t\t\t\ttimeout.then(timeoutRequest);\r\n\t\t\t}\r\n\r\n\r\n\t\t\tfunction timeoutRequest() {\r\n\t\t\t\tstatus = ABORTED;\r\n\t\t\t\tjsonpDone && jsonpDone();\r\n\t\t\t\txhr && xhr.abort();\r\n\t\t\t}\r\n\r\n\t\t\tfunction completeRequest(callback, status, response, headersString, statusText) {\r\n\t\t\t\t// cancel timeout and subsequent timeout promise resolution\r\n\t\t\t\ttimeoutId && $browserDefer.cancel(timeoutId);\r\n\t\t\t\tjsonpDone = xhr = null;\r\n\r\n\t\t\t\t// fix status code when it is 0 (0 status is undocumented).\r\n\t\t\t\t// Occurs when accessing file resources or on Android 4.1 stock browser\r\n\t\t\t\t// while retrieving files from application cache.\r\n\t\t\t\tif (status === 0) {\r\n\t\t\t\t\tstatus = response ? 200 : urlResolve(url).protocol == 'file' ? 404 : 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// normalize IE bug (http://bugs.jquery.com/ticket/1450)\r\n\t\t\t\tstatus = status === 1223 ? 204 : status;\r\n\t\t\t\tstatusText = statusText || '';\r\n\r\n\t\t\t\tcallback(status, response, headersString, statusText);\r\n\t\t\t\t$browser.$$completeOutstandingRequest(noop);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tfunction jsonpReq(url, callbackId, done) {\r\n\t\t\t// we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.:\r\n\t\t\t// - fetches local scripts via XHR and evals them\r\n\t\t\t// - adds and immediately removes script elements from the document\r\n\t\t\tvar script = rawDocument.createElement('script'), callback = null;\r\n\t\t\tscript.type = \"text/javascript\";\r\n\t\t\tscript.src = url;\r\n\t\t\tscript.async = true;\r\n\r\n\t\t\tcallback = function (event) {\r\n\t\t\t\tremoveEventListenerFn(script, \"load\", callback);\r\n\t\t\t\tremoveEventListenerFn(script, \"error\", callback);\r\n\t\t\t\trawDocument.body.removeChild(script);\r\n\t\t\t\tscript = null;\r\n\t\t\t\tvar status = -1;\r\n\t\t\t\tvar text = \"unknown\";\r\n\r\n\t\t\t\tif (event) {\r\n\t\t\t\t\tif (event.type === \"load\" && !callbacks[callbackId].called) {\r\n\t\t\t\t\t\tevent = { type: \"error\" };\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttext = event.type;\r\n\t\t\t\t\tstatus = event.type === \"error\" ? 404 : 200;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (done) {\r\n\t\t\t\t\tdone(status, text);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\taddEventListenerFn(script, \"load\", callback);\r\n\t\t\taddEventListenerFn(script, \"error\", callback);\r\n\r\n\t\t\tif (msie <= 8) {\r\n\t\t\t\tscript.onreadystatechange = function () {\r\n\t\t\t\t\tif (isString(script.readyState) && /loaded|complete/.test(script.readyState)) {\r\n\t\t\t\t\t\tscript.onreadystatechange = null;\r\n\t\t\t\t\t\tcallback({\r\n\t\t\t\t\t\t\ttype: 'load'\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\trawDocument.body.appendChild(script);\r\n\t\t\treturn callback;\r\n\t\t}\r\n\t}\r\n\r\n\tvar $interpolateMinErr = minErr('$interpolate');\r\n\r\n\t/**\r\n\t * @ngdoc provider\r\n\t * @name $interpolateProvider\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t *\r\n\t * Used for configuring the interpolation markup. Defaults to `{{` and `}}`.\r\n\t *\r\n\t * @example\r\n\t<example module=\"customInterpolationApp\">\r\n\t<file name=\"index.html\">\r\n\t<script>\r\n\t var customInterpolationApp = angular.module('customInterpolationApp', []);\r\n\t\r\n\t customInterpolationApp.config(function($interpolateProvider) {\r\n\t\t$interpolateProvider.startSymbol('//');\r\n\t\t$interpolateProvider.endSymbol('//');\r\n\t });\r\n\t\r\n\t\r\n\t customInterpolationApp.controller('DemoController', function() {\r\n\t\t this.label = \"This binding is brought you by // interpolation symbols.\";\r\n\t });\r\n\t</script>\r\n\t<div ng-app=\"App\" ng-controller=\"DemoController as demo\">\r\n\t\t//demo.label//\r\n\t</div>\r\n\t</file>\r\n\t<file name=\"protractor.js\" type=\"protractor\">\r\n\t it('should interpolate binding with custom symbols', function() {\r\n\t\texpect(element(by.binding('demo.label')).getText()).toBe('This binding is brought you by // interpolation symbols.');\r\n\t });\r\n\t</file>\r\n\t</example>\r\n\t */\r\n\tfunction $InterpolateProvider() {\r\n\t\tvar startSymbol = '{{';\r\n\t\tvar endSymbol = '}}';\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $interpolateProvider#startSymbol\r\n\t\t * @description\r\n\t\t * Symbol to denote start of expression in the interpolated string. Defaults to `{{`.\r\n\t\t *\r\n\t\t * @param {string=} value new value to set the starting symbol to.\r\n\t\t * @returns {string|self} Returns the symbol when used as getter and self if used as setter.\r\n\t\t */\r\n\t\tthis.startSymbol = function (value) {\r\n\t\t\tif (value) {\r\n\t\t\t\tstartSymbol = value;\r\n\t\t\t\treturn this;\r\n\t\t\t} else {\r\n\t\t\t\treturn startSymbol;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $interpolateProvider#endSymbol\r\n\t\t * @description\r\n\t\t * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\r\n\t\t *\r\n\t\t * @param {string=} value new value to set the ending symbol to.\r\n\t\t * @returns {string|self} Returns the symbol when used as getter and self if used as setter.\r\n\t\t */\r\n\t\tthis.endSymbol = function (value) {\r\n\t\t\tif (value) {\r\n\t\t\t\tendSymbol = value;\r\n\t\t\t\treturn this;\r\n\t\t\t} else {\r\n\t\t\t\treturn endSymbol;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.$get = ['$parse', '$exceptionHandler', '$sce', function ($parse, $exceptionHandler, $sce) {\r\n\t\t\tvar startSymbolLength = startSymbol.length,\r\n\t\t\t\tendSymbolLength = endSymbol.length;\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc service\r\n\t\t\t * @name $interpolate\r\n\t\t\t * @kind function\r\n\t\t\t *\r\n\t\t\t * @requires $parse\r\n\t\t\t * @requires $sce\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t *\r\n\t\t\t * Compiles a string with markup into an interpolation function. This service is used by the\r\n\t\t\t * HTML {@link ng.$compile $compile} service for data binding. See\r\n\t\t\t * {@link ng.$interpolateProvider $interpolateProvider} for configuring the\r\n\t\t\t * interpolation markup.\r\n\t\t\t *\r\n\t\t\t *\r\n\t\t\t * ```js\r\n\t\t\t * var $interpolate = ...; // injected\r\n\t\t\t * var exp = $interpolate('Hello {{name | uppercase}}!');\r\n\t\t\t * expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!');\r\n\t\t\t * ```\r\n\t\t\t *\r\n\t\t\t *\r\n\t\t\t * @param {string} text The text with markup to interpolate.\r\n\t\t\t * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have\r\n\t\t\t * embedded expression in order to return an interpolation function. Strings with no\r\n\t\t\t * embedded expression will return null for the interpolation function.\r\n\t\t\t * @param {string=} trustedContext when provided, the returned function passes the interpolated\r\n\t\t\t * result through {@link ng.$sce#getTrusted $sce.getTrusted(interpolatedResult,\r\n\t\t\t * trustedContext)} before returning it. Refer to the {@link ng.$sce $sce} service that\r\n\t\t\t * provides Strict Contextual Escaping for details.\r\n\t\t\t * @returns {function(context)} an interpolation function which is used to compute the\r\n\t\t\t * interpolated string. The function has these parameters:\r\n\t\t\t *\r\n\t\t\t * * `context`: an object against which any expressions embedded in the strings are evaluated\r\n\t\t\t * against.\r\n\t\t\t *\r\n\t\t\t */\r\n\t\t\tfunction $interpolate(text, mustHaveExpression, trustedContext) {\r\n\t\t\t\tvar startIndex,\r\n\t\t\t\t\tendIndex,\r\n\t\t\t\t\tindex = 0,\r\n\t\t\t\t\tparts = [],\r\n\t\t\t\t\tlength = text.length,\r\n\t\t\t\t\thasInterpolation = false,\r\n\t\t\t\t\tfn,\r\n\t\t\t\t\texp,\r\n\t\t\t\t\tconcat = [];\r\n\r\n\t\t\t\twhile (index < length) {\r\n\t\t\t\t\tif (((startIndex = text.indexOf(startSymbol, index)) != -1) &&\r\n\t\t\t\t\t\t ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1)) {\r\n\t\t\t\t\t\t(index != startIndex) && parts.push(text.substring(index, startIndex));\r\n\t\t\t\t\t\tparts.push(fn = $parse(exp = text.substring(startIndex + startSymbolLength, endIndex)));\r\n\t\t\t\t\t\tfn.exp = exp;\r\n\t\t\t\t\t\tindex = endIndex + endSymbolLength;\r\n\t\t\t\t\t\thasInterpolation = true;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// we did not find anything, so we have to add the remainder to the parts array\r\n\t\t\t\t\t\t(index != length) && parts.push(text.substring(index));\r\n\t\t\t\t\t\tindex = length;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!(length = parts.length)) {\r\n\t\t\t\t\t// we added, nothing, must have been an empty string.\r\n\t\t\t\t\tparts.push('');\r\n\t\t\t\t\tlength = 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Concatenating expressions makes it hard to reason about whether some combination of\r\n\t\t\t\t// concatenated values are unsafe to use and could easily lead to XSS. By requiring that a\r\n\t\t\t\t// single expression be used for iframe[src], object[src], etc., we ensure that the value\r\n\t\t\t\t// that's used is assigned or constructed by some JS code somewhere that is more testable or\r\n\t\t\t\t// make it obvious that you bound the value to some user controlled value. This helps reduce\r\n\t\t\t\t// the load when auditing for XSS issues.\r\n\t\t\t\tif (trustedContext && parts.length > 1) {\r\n\t\t\t\t\tthrow $interpolateMinErr('noconcat',\r\n\t\t\t\t\t\t\"Error while interpolating: {0}\\nStrict Contextual Escaping disallows \" +\r\n\t\t\t\t\t\t\"interpolations that concatenate multiple expressions when a trusted value is \" +\r\n\t\t\t\t\t\t\"required. See http://docs.angularjs.org/api/ng.$sce\", text);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!mustHaveExpression || hasInterpolation) {\r\n\t\t\t\t\tconcat.length = length;\r\n\t\t\t\t\tfn = function (context) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tfor (var i = 0, ii = length, part; i < ii; i++) {\r\n\t\t\t\t\t\t\t\tif (typeof (part = parts[i]) == 'function') {\r\n\t\t\t\t\t\t\t\t\tpart = part(context);\r\n\t\t\t\t\t\t\t\t\tif (trustedContext) {\r\n\t\t\t\t\t\t\t\t\t\tpart = $sce.getTrusted(trustedContext, part);\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\tpart = $sce.valueOf(part);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tif (part == null) { // null || undefined\r\n\t\t\t\t\t\t\t\t\t\tpart = '';\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\tswitch (typeof part) {\r\n\t\t\t\t\t\t\t\t\t\t\tcase 'string':\r\n\t\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tcase 'number':\r\n\t\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpart = '' + part;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tpart = toJson(part);\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tconcat[i] = part;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn concat.join('');\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcatch (err) {\r\n\t\t\t\t\t\t\tvar newErr = $interpolateMinErr('interr', \"Can't interpolate: {0}\\n{1}\", text,\r\n\t\t\t\t\t\t\t\terr.toString());\r\n\t\t\t\t\t\t\t$exceptionHandler(newErr);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\t\t\t\t\tfn.exp = text;\r\n\t\t\t\t\tfn.parts = parts;\r\n\t\t\t\t\treturn fn;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $interpolate#startSymbol\r\n\t\t\t * @description\r\n\t\t\t * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`.\r\n\t\t\t *\r\n\t\t\t * Use {@link ng.$interpolateProvider#startSymbol $interpolateProvider#startSymbol} to change\r\n\t\t\t * the symbol.\r\n\t\t\t *\r\n\t\t\t * @returns {string} start symbol.\r\n\t\t\t */\r\n\t\t\t$interpolate.startSymbol = function () {\r\n\t\t\t\treturn startSymbol;\r\n\t\t\t};\r\n\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $interpolate#endSymbol\r\n\t\t\t * @description\r\n\t\t\t * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.\r\n\t\t\t *\r\n\t\t\t * Use {@link ng.$interpolateProvider#endSymbol $interpolateProvider#endSymbol} to change\r\n\t\t\t * the symbol.\r\n\t\t\t *\r\n\t\t\t * @returns {string} end symbol.\r\n\t\t\t */\r\n\t\t\t$interpolate.endSymbol = function () {\r\n\t\t\t\treturn endSymbol;\r\n\t\t\t};\r\n\r\n\t\t\treturn $interpolate;\r\n\t\t}];\r\n\t}\r\n\r\n\tfunction $IntervalProvider() {\r\n\t\tthis.$get = ['$rootScope', '$window', '$q',\r\n\t\t\t function ($rootScope, $window, $q) {\r\n\t\t\t \tvar intervals = {};\r\n\r\n\r\n\t\t\t \t/**\r\n\t\t\t\t * @ngdoc service\r\n\t\t\t\t * @name $interval\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay`\r\n\t\t\t\t * milliseconds.\r\n\t\t\t\t *\r\n\t\t\t\t * The return value of registering an interval function is a promise. This promise will be\r\n\t\t\t\t * notified upon each tick of the interval, and will be resolved after `count` iterations, or\r\n\t\t\t\t * run indefinitely if `count` is not defined. The value of the notification will be the\r\n\t\t\t\t * number of iterations that have run.\r\n\t\t\t\t * To cancel an interval, call `$interval.cancel(promise)`.\r\n\t\t\t\t *\r\n\t\t\t\t * In tests you can use {@link ngMock.$interval#flush `$interval.flush(millis)`} to\r\n\t\t\t\t * move forward by `millis` milliseconds and trigger any functions scheduled to run in that\r\n\t\t\t\t * time.\r\n\t\t\t\t *\r\n\t\t\t\t * <div class=\"alert alert-warning\">\r\n\t\t\t\t * **Note**: Intervals created by this service must be explicitly destroyed when you are finished\r\n\t\t\t\t * with them. In particular they are not automatically destroyed when a controller's scope or a\r\n\t\t\t\t * directive's element are destroyed.\r\n\t\t\t\t * You should take this into consideration and make sure to always cancel the interval at the\r\n\t\t\t\t * appropriate moment. See the example below for more details on how and when to do this.\r\n\t\t\t\t * </div>\r\n\t\t\t\t *\r\n\t\t\t\t * @param {function()} fn A function that should be called repeatedly.\r\n\t\t\t\t * @param {number} delay Number of milliseconds between each function call.\r\n\t\t\t\t * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat\r\n\t\t\t\t * indefinitely.\r\n\t\t\t\t * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\r\n\t\t\t\t * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\r\n\t\t\t\t * @returns {promise} A promise which will be notified on each iteration.\r\n\t\t\t\t *\r\n\t\t\t\t * @example\r\n\t\t\t\t * <example module=\"time\">\r\n\t\t\t\t * <file name=\"index.html\">\r\n\t\t\t\t * <script>\r\n\t\t\t\t * function Ctrl2($scope,$interval) {\r\n\t\t\t\t * $scope.format = 'M/d/yy h:mm:ss a';\r\n\t\t\t\t * $scope.blood_1 = 100;\r\n\t\t\t\t * $scope.blood_2 = 120;\r\n\t\t\t\t *\r\n\t\t\t\t * var stop;\r\n\t\t\t\t * $scope.fight = function() {\r\n\t\t\t\t * // Don't start a new fight if we are already fighting\r\n\t\t\t\t * if ( angular.isDefined(stop) ) return;\r\n\t\t\t\t *\r\n\t\t\t\t * stop = $interval(function() {\r\n\t\t\t\t * if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {\r\n\t\t\t\t * $scope.blood_1 = $scope.blood_1 - 3;\r\n\t\t\t\t * $scope.blood_2 = $scope.blood_2 - 4;\r\n\t\t\t\t * } else {\r\n\t\t\t\t * $scope.stopFight();\r\n\t\t\t\t * }\r\n\t\t\t\t * }, 100);\r\n\t\t\t\t * };\r\n\t\t\t\t *\r\n\t\t\t\t * $scope.stopFight = function() {\r\n\t\t\t\t * if (angular.isDefined(stop)) {\r\n\t\t\t\t * $interval.cancel(stop);\r\n\t\t\t\t * stop = undefined;\r\n\t\t\t\t * }\r\n\t\t\t\t * };\r\n\t\t\t\t *\r\n\t\t\t\t * $scope.resetFight = function() {\r\n\t\t\t\t * $scope.blood_1 = 100;\r\n\t\t\t\t * $scope.blood_2 = 120;\r\n\t\t\t\t * }\r\n\t\t\t\t *\r\n\t\t\t\t * $scope.$on('$destroy', function() {\r\n\t\t\t\t * // Make sure that the interval is destroyed too\r\n\t\t\t\t * $scope.stopFight();\r\n\t\t\t\t * });\r\n\t\t\t\t * }\r\n\t\t\t\t *\r\n\t\t\t\t * angular.module('time', [])\r\n\t\t\t\t * // Register the 'myCurrentTime' directive factory method.\r\n\t\t\t\t * // We inject $interval and dateFilter service since the factory method is DI.\r\n\t\t\t\t * .directive('myCurrentTime', function($interval, dateFilter) {\r\n\t\t\t\t * // return the directive link function. (compile function not needed)\r\n\t\t\t\t * return function(scope, element, attrs) {\r\n\t\t\t\t * var format, // date format\r\n\t\t\t\t * stopTime; // so that we can cancel the time updates\r\n\t\t\t\t *\r\n\t\t\t\t * // used to update the UI\r\n\t\t\t\t * function updateTime() {\r\n\t\t\t\t * element.text(dateFilter(new Date(), format));\r\n\t\t\t\t * }\r\n\t\t\t\t *\r\n\t\t\t\t * // watch the expression, and update the UI on change.\r\n\t\t\t\t * scope.$watch(attrs.myCurrentTime, function(value) {\r\n\t\t\t\t * format = value;\r\n\t\t\t\t * updateTime();\r\n\t\t\t\t * });\r\n\t\t\t\t *\r\n\t\t\t\t * stopTime = $interval(updateTime, 1000);\r\n\t\t\t\t *\r\n\t\t\t\t * // listen on DOM destroy (removal) event, and cancel the next UI update\r\n\t\t\t\t * // to prevent updating time ofter the DOM element was removed.\r\n\t\t\t\t * element.bind('$destroy', function() {\r\n\t\t\t\t * $interval.cancel(stopTime);\r\n\t\t\t\t * });\r\n\t\t\t\t * }\r\n\t\t\t\t * });\r\n\t\t\t\t * </script>\r\n\t\t\t\t *\r\n\t\t\t\t * <div>\r\n\t\t\t\t * <div ng-controller=\"Ctrl2\">\r\n\t\t\t\t * Date format: <input ng-model=\"format\"> <hr/>\r\n\t\t\t\t * Current time is: <span my-current-time=\"format\"></span>\r\n\t\t\t\t * <hr/>\r\n\t\t\t\t * Blood 1 : <font color='red'>{{blood_1}}</font>\r\n\t\t\t\t * Blood 2 : <font color='red'>{{blood_2}}</font>\r\n\t\t\t\t * <button type=\"button\" data-ng-click=\"fight()\">Fight</button>\r\n\t\t\t\t * <button type=\"button\" data-ng-click=\"stopFight()\">StopFight</button>\r\n\t\t\t\t * <button type=\"button\" data-ng-click=\"resetFight()\">resetFight</button>\r\n\t\t\t\t * </div>\r\n\t\t\t\t * </div>\r\n\t\t\t\t *\r\n\t\t\t\t * </file>\r\n\t\t\t\t * </example>\r\n\t\t\t\t */\r\n\t\t\t \tfunction interval(fn, delay, count, invokeApply) {\r\n\t\t\t \t\tvar setInterval = $window.setInterval,\r\n\t\t\t\t\t\tclearInterval = $window.clearInterval,\r\n\t\t\t\t\t\tdeferred = $q.defer(),\r\n\t\t\t\t\t\tpromise = deferred.promise,\r\n\t\t\t\t\t\titeration = 0,\r\n\t\t\t\t\t\tskipApply = (isDefined(invokeApply) && !invokeApply);\r\n\r\n\t\t\t \t\tcount = isDefined(count) ? count : 0;\r\n\r\n\t\t\t \t\tpromise.then(null, null, fn);\r\n\r\n\t\t\t \t\tpromise.$$intervalId = setInterval(function tick() {\r\n\t\t\t \t\t\tdeferred.notify(iteration++);\r\n\r\n\t\t\t \t\t\tif (count > 0 && iteration >= count) {\r\n\t\t\t \t\t\t\tdeferred.resolve(iteration);\r\n\t\t\t \t\t\t\tclearInterval(promise.$$intervalId);\r\n\t\t\t \t\t\t\tdelete intervals[promise.$$intervalId];\r\n\t\t\t \t\t\t}\r\n\r\n\t\t\t \t\t\tif (!skipApply) $rootScope.$apply();\r\n\r\n\t\t\t \t\t}, delay);\r\n\r\n\t\t\t \t\tintervals[promise.$$intervalId] = deferred;\r\n\r\n\t\t\t \t\treturn promise;\r\n\t\t\t \t}\r\n\r\n\r\n\t\t\t \t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $interval#cancel\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Cancels a task associated with the `promise`.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {promise} promise returned by the `$interval` function.\r\n\t\t\t\t * @returns {boolean} Returns `true` if the task was successfully canceled.\r\n\t\t\t\t */\r\n\t\t\t \tinterval.cancel = function (promise) {\r\n\t\t\t \t\tif (promise && promise.$$intervalId in intervals) {\r\n\t\t\t \t\t\tintervals[promise.$$intervalId].reject('canceled');\r\n\t\t\t \t\t\t$window.clearInterval(promise.$$intervalId);\r\n\t\t\t \t\t\tdelete intervals[promise.$$intervalId];\r\n\t\t\t \t\t\treturn true;\r\n\t\t\t \t\t}\r\n\t\t\t \t\treturn false;\r\n\t\t\t \t};\r\n\r\n\t\t\t \treturn interval;\r\n\t\t\t }];\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $locale\r\n\t *\r\n\t * @description\r\n\t * $locale service provides localization rules for various Angular components. As of right now the\r\n\t * only public api is:\r\n\t *\r\n\t * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`)\r\n\t */\r\n\tfunction $LocaleProvider() {\r\n\t\tthis.$get = function () {\r\n\t\t\treturn {\r\n\t\t\t\tid: 'en-us',\r\n\r\n\t\t\t\tNUMBER_FORMATS: {\r\n\t\t\t\t\tDECIMAL_SEP: '.',\r\n\t\t\t\t\tGROUP_SEP: ',',\r\n\t\t\t\t\tPATTERNS: [\r\n\t\t\t\t\t { // Decimal Pattern\r\n\t\t\t\t\t \tminInt: 1,\r\n\t\t\t\t\t \tminFrac: 0,\r\n\t\t\t\t\t \tmaxFrac: 3,\r\n\t\t\t\t\t \tposPre: '',\r\n\t\t\t\t\t \tposSuf: '',\r\n\t\t\t\t\t \tnegPre: '-',\r\n\t\t\t\t\t \tnegSuf: '',\r\n\t\t\t\t\t \tgSize: 3,\r\n\t\t\t\t\t \tlgSize: 3\r\n\t\t\t\t\t }, { //Currency Pattern\r\n\t\t\t\t\t \tminInt: 1,\r\n\t\t\t\t\t \tminFrac: 2,\r\n\t\t\t\t\t \tmaxFrac: 2,\r\n\t\t\t\t\t \tposPre: '\\u00A4',\r\n\t\t\t\t\t \tposSuf: '',\r\n\t\t\t\t\t \tnegPre: '(\\u00A4',\r\n\t\t\t\t\t \tnegSuf: ')',\r\n\t\t\t\t\t \tgSize: 3,\r\n\t\t\t\t\t \tlgSize: 3\r\n\t\t\t\t\t }\r\n\t\t\t\t\t],\r\n\t\t\t\t\tCURRENCY_SYM: '$'\r\n\t\t\t\t},\r\n\r\n\t\t\t\tDATETIME_FORMATS: {\r\n\t\t\t\t\tMONTH:\r\n\t\t\t\t\t\t'January,February,March,April,May,June,July,August,September,October,November,December'\r\n\t\t\t\t\t\t.split(','),\r\n\t\t\t\t\tSHORTMONTH: 'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','),\r\n\t\t\t\t\tDAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','),\r\n\t\t\t\t\tSHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','),\r\n\t\t\t\t\tAMPMS: ['AM', 'PM'],\r\n\t\t\t\t\tmedium: 'MMM d, y h:mm:ss a',\r\n\t\t\t\t\tshort: 'M/d/yy h:mm a',\r\n\t\t\t\t\tfullDate: 'EEEE, MMMM d, y',\r\n\t\t\t\t\tlongDate: 'MMMM d, y',\r\n\t\t\t\t\tmediumDate: 'MMM d, y',\r\n\t\t\t\t\tshortDate: 'M/d/yy',\r\n\t\t\t\t\tmediumTime: 'h:mm:ss a',\r\n\t\t\t\t\tshortTime: 'h:mm a'\r\n\t\t\t\t},\r\n\r\n\t\t\t\tpluralCat: function (num) {\r\n\t\t\t\t\tif (num === 1) {\r\n\t\t\t\t\t\treturn 'one';\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn 'other';\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\t}\r\n\r\n\tvar PATH_MATCH = /^([^\\?#]*)(\\?([^#]*))?(#(.*))?$/,\r\n\t\tDEFAULT_PORTS = { 'http': 80, 'https': 443, 'ftp': 21 };\r\n\tvar $locationMinErr = minErr('$location');\r\n\r\n\r\n\t/**\r\n\t * Encode path using encodeUriSegment, ignoring forward slashes\r\n\t *\r\n\t * @param {string} path Path to encode\r\n\t * @returns {string}\r\n\t */\r\n\tfunction encodePath(path) {\r\n\t\tvar segments = path.split('/'),\r\n\t\t\ti = segments.length;\r\n\r\n\t\twhile (i--) {\r\n\t\t\tsegments[i] = encodeUriSegment(segments[i]);\r\n\t\t}\r\n\r\n\t\treturn segments.join('/');\r\n\t}\r\n\r\n\tfunction parseAbsoluteUrl(absoluteUrl, locationObj, appBase) {\r\n\t\tvar parsedUrl = urlResolve(absoluteUrl, appBase);\r\n\r\n\t\tlocationObj.$$protocol = parsedUrl.protocol;\r\n\t\tlocationObj.$$host = parsedUrl.hostname;\r\n\t\tlocationObj.$$port = int(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null;\r\n\t}\r\n\r\n\r\n\tfunction parseAppUrl(relativeUrl, locationObj, appBase) {\r\n\t\tvar prefixed = (relativeUrl.charAt(0) !== '/');\r\n\t\tif (prefixed) {\r\n\t\t\trelativeUrl = '/' + relativeUrl;\r\n\t\t}\r\n\t\tvar match = urlResolve(relativeUrl, appBase);\r\n\t\tlocationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ?\r\n\t\t\tmatch.pathname.substring(1) : match.pathname);\r\n\t\tlocationObj.$$search = parseKeyValue(match.search);\r\n\t\tlocationObj.$$hash = decodeURIComponent(match.hash);\r\n\r\n\t\t// make sure path starts with '/';\r\n\t\tif (locationObj.$$path && locationObj.$$path.charAt(0) != '/') {\r\n\t\t\tlocationObj.$$path = '/' + locationObj.$$path;\r\n\t\t}\r\n\t}\r\n\r\n\r\n\t/**\r\n\t *\r\n\t * @param {string} begin\r\n\t * @param {string} whole\r\n\t * @returns {string} returns text from whole after begin or undefined if it does not begin with\r\n\t * expected string.\r\n\t */\r\n\tfunction beginsWith(begin, whole) {\r\n\t\tif (whole.indexOf(begin) === 0) {\r\n\t\t\treturn whole.substr(begin.length);\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tfunction stripHash(url) {\r\n\t\tvar index = url.indexOf('#');\r\n\t\treturn index == -1 ? url : url.substr(0, index);\r\n\t}\r\n\r\n\r\n\tfunction stripFile(url) {\r\n\t\treturn url.substr(0, stripHash(url).lastIndexOf('/') + 1);\r\n\t}\r\n\r\n\t/* return the server only (scheme://host:port) */\r\n\tfunction serverBase(url) {\r\n\t\treturn url.substring(0, url.indexOf('/', url.indexOf('//') + 2));\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * LocationHtml5Url represents an url\r\n\t * This object is exposed as $location service when HTML5 mode is enabled and supported\r\n\t *\r\n\t * @constructor\r\n\t * @param {string} appBase application base URL\r\n\t * @param {string} basePrefix url path prefix\r\n\t */\r\n\tfunction LocationHtml5Url(appBase, basePrefix) {\r\n\t\tthis.$$html5 = true;\r\n\t\tbasePrefix = basePrefix || '';\r\n\t\tvar appBaseNoFile = stripFile(appBase);\r\n\t\tparseAbsoluteUrl(appBase, this, appBase);\r\n\r\n\r\n\t\t/**\r\n\t\t * Parse given html5 (regular) url string into properties\r\n\t\t * @param {string} newAbsoluteUrl HTML5 url\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis.$$parse = function (url) {\r\n\t\t\tvar pathUrl = beginsWith(appBaseNoFile, url);\r\n\t\t\tif (!isString(pathUrl)) {\r\n\t\t\t\tthrow $locationMinErr('ipthprfx', 'Invalid url \"{0}\", missing path prefix \"{1}\".', url,\r\n\t\t\t\t\tappBaseNoFile);\r\n\t\t\t}\r\n\r\n\t\t\tparseAppUrl(pathUrl, this, appBase);\r\n\r\n\t\t\tif (!this.$$path) {\r\n\t\t\t\tthis.$$path = '/';\r\n\t\t\t}\r\n\r\n\t\t\tthis.$$compose();\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Compose url and update `absUrl` property\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis.$$compose = function () {\r\n\t\t\tvar search = toKeyValue(this.$$search),\r\n\t\t\t\thash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\r\n\r\n\t\t\tthis.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\r\n\t\t\tthis.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/'\r\n\t\t};\r\n\r\n\t\tthis.$$rewrite = function (url) {\r\n\t\t\tvar appUrl, prevAppUrl;\r\n\r\n\t\t\tif ((appUrl = beginsWith(appBase, url)) !== undefined) {\r\n\t\t\t\tprevAppUrl = appUrl;\r\n\t\t\t\tif ((appUrl = beginsWith(basePrefix, appUrl)) !== undefined) {\r\n\t\t\t\t\treturn appBaseNoFile + (beginsWith('/', appUrl) || appUrl);\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn appBase + prevAppUrl;\r\n\t\t\t\t}\r\n\t\t\t} else if ((appUrl = beginsWith(appBaseNoFile, url)) !== undefined) {\r\n\t\t\t\treturn appBaseNoFile + appUrl;\r\n\t\t\t} else if (appBaseNoFile == url + '/') {\r\n\t\t\t\treturn appBaseNoFile;\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * LocationHashbangUrl represents url\r\n\t * This object is exposed as $location service when developer doesn't opt into html5 mode.\r\n\t * It also serves as the base class for html5 mode fallback on legacy browsers.\r\n\t *\r\n\t * @constructor\r\n\t * @param {string} appBase application base URL\r\n\t * @param {string} hashPrefix hashbang prefix\r\n\t */\r\n\tfunction LocationHashbangUrl(appBase, hashPrefix) {\r\n\t\tvar appBaseNoFile = stripFile(appBase);\r\n\r\n\t\tparseAbsoluteUrl(appBase, this, appBase);\r\n\r\n\r\n\t\t/**\r\n\t\t * Parse given hashbang url into properties\r\n\t\t * @param {string} url Hashbang url\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis.$$parse = function (url) {\r\n\t\t\tvar withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url);\r\n\t\t\tvar withoutHashUrl = withoutBaseUrl.charAt(0) == '#'\r\n\t\t\t\t? beginsWith(hashPrefix, withoutBaseUrl)\r\n\t\t\t\t: (this.$$html5)\r\n\t\t\t\t ? withoutBaseUrl\r\n\t\t\t\t : '';\r\n\r\n\t\t\tif (!isString(withoutHashUrl)) {\r\n\t\t\t\tthrow $locationMinErr('ihshprfx', 'Invalid url \"{0}\", missing hash prefix \"{1}\".', url,\r\n\t\t\t\t\thashPrefix);\r\n\t\t\t}\r\n\t\t\tparseAppUrl(withoutHashUrl, this, appBase);\r\n\r\n\t\t\tthis.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);\r\n\r\n\t\t\tthis.$$compose();\r\n\r\n\t\t\t/*\r\n\t\t\t * In Windows, on an anchor node on documents loaded from\r\n\t\t\t * the filesystem, the browser will return a pathname\r\n\t\t\t * prefixed with the drive name ('/C:/path') when a\r\n\t\t\t * pathname without a drive is set:\r\n\t\t\t * * a.setAttribute('href', '/foo')\r\n\t\t\t * * a.pathname === '/C:/foo' //true\r\n\t\t\t *\r\n\t\t\t * Inside of Angular, we're always using pathnames that\r\n\t\t\t * do not include drive names for routing.\r\n\t\t\t */\r\n\t\t\tfunction removeWindowsDriveName(path, url, base) {\r\n\t\t\t\t/*\r\n\t\t\t\tMatches paths for file protocol on windows,\r\n\t\t\t\tsuch as /C:/foo/bar, and captures only /foo/bar.\r\n\t\t\t\t*/\r\n\t\t\t\tvar windowsFilePathExp = /^\\/[A-Z]:(\\/.*)/;\r\n\r\n\t\t\t\tvar firstPathSegmentMatch;\r\n\r\n\t\t\t\t//Get the relative path from the input URL.\r\n\t\t\t\tif (url.indexOf(base) === 0) {\r\n\t\t\t\t\turl = url.replace(base, '');\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// The input URL intentionally contains a first path segment that ends with a colon.\r\n\t\t\t\tif (windowsFilePathExp.exec(url)) {\r\n\t\t\t\t\treturn path;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfirstPathSegmentMatch = windowsFilePathExp.exec(path);\r\n\t\t\t\treturn firstPathSegmentMatch ? firstPathSegmentMatch[1] : path;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Compose hashbang url and update `absUrl` property\r\n\t\t * @private\r\n\t\t */\r\n\t\tthis.$$compose = function () {\r\n\t\t\tvar search = toKeyValue(this.$$search),\r\n\t\t\t\thash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\r\n\r\n\t\t\tthis.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\r\n\t\t\tthis.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : '');\r\n\t\t};\r\n\r\n\t\tthis.$$rewrite = function (url) {\r\n\t\t\tif (stripHash(appBase) == stripHash(url)) {\r\n\t\t\t\treturn url;\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * LocationHashbangUrl represents url\r\n\t * This object is exposed as $location service when html5 history api is enabled but the browser\r\n\t * does not support it.\r\n\t *\r\n\t * @constructor\r\n\t * @param {string} appBase application base URL\r\n\t * @param {string} hashPrefix hashbang prefix\r\n\t */\r\n\tfunction LocationHashbangInHtml5Url(appBase, hashPrefix) {\r\n\t\tthis.$$html5 = true;\r\n\t\tLocationHashbangUrl.apply(this, arguments);\r\n\r\n\t\tvar appBaseNoFile = stripFile(appBase);\r\n\r\n\t\tthis.$$rewrite = function (url) {\r\n\t\t\tvar appUrl;\r\n\r\n\t\t\tif (appBase == stripHash(url)) {\r\n\t\t\t\treturn url;\r\n\t\t\t} else if ((appUrl = beginsWith(appBaseNoFile, url))) {\r\n\t\t\t\treturn appBase + hashPrefix + appUrl;\r\n\t\t\t} else if (appBaseNoFile === url + '/') {\r\n\t\t\t\treturn appBaseNoFile;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis.$$compose = function () {\r\n\t\t\tvar search = toKeyValue(this.$$search),\r\n\t\t\t\thash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';\r\n\r\n\t\t\tthis.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;\r\n\t\t\t// include hashPrefix in $$absUrl when $$url is empty so IE8 & 9 do not reload page because of removal of '#'\r\n\t\t\tthis.$$absUrl = appBase + hashPrefix + this.$$url;\r\n\t\t};\r\n\r\n\t}\r\n\r\n\r\n\tLocationHashbangInHtml5Url.prototype =\r\n\t LocationHashbangUrl.prototype =\r\n\t LocationHtml5Url.prototype = {\r\n\r\n\t \t/**\r\n\t\t * Are we in html5 mode?\r\n\t\t * @private\r\n\t\t */\r\n\t \t$$html5: false,\r\n\r\n\t \t/**\r\n\t\t * Has any change been replacing ?\r\n\t\t * @private\r\n\t\t */\r\n\t \t$$replace: false,\r\n\r\n\t \t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $location#absUrl\r\n\t\t *\r\n\t\t * @description\r\n\t\t * This method is getter only.\r\n\t\t *\r\n\t\t * Return full url representation with all segments encoded according to rules specified in\r\n\t\t * [RFC 3986](http://www.ietf.org/rfc/rfc3986.txt).\r\n\t\t *\r\n\t\t * @return {string} full url\r\n\t\t */\r\n\t \tabsUrl: locationGetter('$$absUrl'),\r\n\r\n\t \t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $location#url\r\n\t\t *\r\n\t\t * @description\r\n\t\t * This method is getter / setter.\r\n\t\t *\r\n\t\t * Return url (e.g. `/path?a=b#hash`) when called without any parameter.\r\n\t\t *\r\n\t\t * Change path, search and hash, when called with parameter and return `$location`.\r\n\t\t *\r\n\t\t * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`)\r\n\t\t * @param {string=} replace The path that will be changed\r\n\t\t * @return {string} url\r\n\t\t */\r\n\t \turl: function (url, replace) {\r\n\t \t\tif (isUndefined(url))\r\n\t \t\t\treturn this.$$url;\r\n\r\n\t \t\tvar match = PATH_MATCH.exec(url);\r\n\t \t\tif (match[1]) this.path(decodeURIComponent(match[1]));\r\n\t \t\tif (match[2] || match[1]) this.search(match[3] || '');\r\n\t \t\tthis.hash(match[5] || '', replace);\r\n\r\n\t \t\treturn this;\r\n\t \t},\r\n\r\n\t \t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $location#protocol\r\n\t\t *\r\n\t\t * @description\r\n\t\t * This method is getter only.\r\n\t\t *\r\n\t\t * Return protocol of current url.\r\n\t\t *\r\n\t\t * @return {string} protocol of current url\r\n\t\t */\r\n\t \tprotocol: locationGetter('$$protocol'),\r\n\r\n\t \t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $location#host\r\n\t\t *\r\n\t\t * @description\r\n\t\t * This method is getter only.\r\n\t\t *\r\n\t\t * Return host of current url.\r\n\t\t *\r\n\t\t * @return {string} host of current url.\r\n\t\t */\r\n\t \thost: locationGetter('$$host'),\r\n\r\n\t \t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $location#port\r\n\t\t *\r\n\t\t * @description\r\n\t\t * This method is getter only.\r\n\t\t *\r\n\t\t * Return port of current url.\r\n\t\t *\r\n\t\t * @return {Number} port\r\n\t\t */\r\n\t \tport: locationGetter('$$port'),\r\n\r\n\t \t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $location#path\r\n\t\t *\r\n\t\t * @description\r\n\t\t * This method is getter / setter.\r\n\t\t *\r\n\t\t * Return path of current url when called without any parameter.\r\n\t\t *\r\n\t\t * Change path when called with parameter and return `$location`.\r\n\t\t *\r\n\t\t * Note: Path should always begin with forward slash (/), this method will add the forward slash\r\n\t\t * if it is missing.\r\n\t\t *\r\n\t\t * @param {string=} path New path\r\n\t\t * @return {string} path\r\n\t\t */\r\n\t \tpath: locationGetterSetter('$$path', function (path) {\r\n\t \t\treturn path.charAt(0) == '/' ? path : '/' + path;\r\n\t \t}),\r\n\r\n\t \t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $location#search\r\n\t\t *\r\n\t\t * @description\r\n\t\t * This method is getter / setter.\r\n\t\t *\r\n\t\t * Return search part (as object) of current url when called without any parameter.\r\n\t\t *\r\n\t\t * Change search part when called with parameter and return `$location`.\r\n\t\t *\r\n\t\t *\r\n\t\t * ```js\r\n\t\t * // given url http://example.com/#/some/path?foo=bar&baz=xoxo\r\n\t\t * var searchObject = $location.search();\r\n\t\t * // => {foo: 'bar', baz: 'xoxo'}\r\n\t\t *\r\n\t\t *\r\n\t\t * // set foo to 'yipee'\r\n\t\t * $location.search('foo', 'yipee');\r\n\t\t * // => $location\r\n\t\t * ```\r\n\t\t *\r\n\t\t * @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or\r\n\t\t * hash object.\r\n\t\t *\r\n\t\t * When called with a single argument the method acts as a setter, setting the `search` component\r\n\t\t * of `$location` to the specified value.\r\n\t\t *\r\n\t\t * If the argument is a hash object containing an array of values, these values will be encoded\r\n\t\t * as duplicate search parameters in the url.\r\n\t\t *\r\n\t\t * @param {(string|Array<string>)=} paramValue If `search` is a string, then `paramValue` will\r\n\t\t * override only a single search property.\r\n\t\t *\r\n\t\t * If `paramValue` is an array, it will override the property of the `search` component of\r\n\t\t * `$location` specified via the first argument.\r\n\t\t *\r\n\t\t * If `paramValue` is `null`, the property specified via the first argument will be deleted.\r\n\t\t *\r\n\t\t * @return {Object} If called with no arguments returns the parsed `search` object. If called with\r\n\t\t * one or more arguments returns `$location` object itself.\r\n\t\t */\r\n\t \tsearch: function (search, paramValue) {\r\n\t \t\tswitch (arguments.length) {\r\n\t \t\t\tcase 0:\r\n\t \t\t\t\treturn this.$$search;\r\n\t \t\t\tcase 1:\r\n\t \t\t\t\tif (isString(search)) {\r\n\t \t\t\t\t\tthis.$$search = parseKeyValue(search);\r\n\t \t\t\t\t} else if (isObject(search)) {\r\n\t \t\t\t\t\tthis.$$search = search;\r\n\t \t\t\t\t} else {\r\n\t \t\t\t\t\tthrow $locationMinErr('isrcharg',\r\n\t\t\t\t\t\t\t'The first argument of the `$location#search()` call must be a string or an object.');\r\n\t \t\t\t\t}\r\n\t \t\t\t\tbreak;\r\n\t \t\t\tdefault:\r\n\t \t\t\t\tif (isUndefined(paramValue) || paramValue === null) {\r\n\t \t\t\t\t\tdelete this.$$search[search];\r\n\t \t\t\t\t} else {\r\n\t \t\t\t\t\tthis.$$search[search] = paramValue;\r\n\t \t\t\t\t}\r\n\t \t\t}\r\n\r\n\t \t\tthis.$$compose();\r\n\t \t\treturn this;\r\n\t \t},\r\n\r\n\t \t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $location#hash\r\n\t\t *\r\n\t\t * @description\r\n\t\t * This method is getter / setter.\r\n\t\t *\r\n\t\t * Return hash fragment when called without any parameter.\r\n\t\t *\r\n\t\t * Change hash fragment when called with parameter and return `$location`.\r\n\t\t *\r\n\t\t * @param {string=} hash New hash fragment\r\n\t\t * @return {string} hash\r\n\t\t */\r\n\t \thash: locationGetterSetter('$$hash', identity),\r\n\r\n\t \t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $location#replace\r\n\t\t *\r\n\t\t * @description\r\n\t\t * If called, all changes to $location during current `$digest` will be replacing current history\r\n\t\t * record, instead of adding new one.\r\n\t\t */\r\n\t \treplace: function () {\r\n\t \t\tthis.$$replace = true;\r\n\t \t\treturn this;\r\n\t \t}\r\n\t };\r\n\r\n\tfunction locationGetter(property) {\r\n\t\treturn function () {\r\n\t\t\treturn this[property];\r\n\t\t};\r\n\t}\r\n\r\n\r\n\tfunction locationGetterSetter(property, preprocess) {\r\n\t\treturn function (value) {\r\n\t\t\tif (isUndefined(value))\r\n\t\t\t\treturn this[property];\r\n\r\n\t\t\tthis[property] = preprocess(value);\r\n\t\t\tthis.$$compose();\r\n\r\n\t\t\treturn this;\r\n\t\t};\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $location\r\n\t *\r\n\t * @requires $rootElement\r\n\t *\r\n\t * @description\r\n\t * The $location service parses the URL in the browser address bar (based on the\r\n\t * [window.location](https://developer.mozilla.org/en/window.location)) and makes the URL\r\n\t * available to your application. Changes to the URL in the address bar are reflected into\r\n\t * $location service and changes to $location are reflected into the browser address bar.\r\n\t *\r\n\t * **The $location service:**\r\n\t *\r\n\t * - Exposes the current URL in the browser address bar, so you can\r\n\t * - Watch and observe the URL.\r\n\t * - Change the URL.\r\n\t * - Synchronizes the URL with the browser when the user\r\n\t * - Changes the address bar.\r\n\t * - Clicks the back or forward button (or clicks a History link).\r\n\t * - Clicks on a link.\r\n\t * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash).\r\n\t *\r\n\t * For more information see {@link guide/$location Developer Guide: Using $location}\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc provider\r\n\t * @name $locationProvider\r\n\t * @description\r\n\t * Use the `$locationProvider` to configure how the application deep linking paths are stored.\r\n\t */\r\n\tfunction $LocationProvider() {\r\n\t\tvar hashPrefix = '',\r\n\t\t\thtml5Mode = false;\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $locationProvider#hashPrefix\r\n\t\t * @description\r\n\t\t * @param {string=} prefix Prefix for hash part (containing path and search)\r\n\t\t * @returns {*} current value if used as getter or itself (chaining) if used as setter\r\n\t\t */\r\n\t\tthis.hashPrefix = function (prefix) {\r\n\t\t\tif (isDefined(prefix)) {\r\n\t\t\t\thashPrefix = prefix;\r\n\t\t\t\treturn this;\r\n\t\t\t} else {\r\n\t\t\t\treturn hashPrefix;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $locationProvider#html5Mode\r\n\t\t * @description\r\n\t\t * @param {boolean=} mode Use HTML5 strategy if available.\r\n\t\t * @returns {*} current value if used as getter or itself (chaining) if used as setter\r\n\t\t */\r\n\t\tthis.html5Mode = function (mode) {\r\n\t\t\tif (isDefined(mode)) {\r\n\t\t\t\thtml5Mode = mode;\r\n\t\t\t\treturn this;\r\n\t\t\t} else {\r\n\t\t\t\treturn html5Mode;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * @ngdoc event\r\n\t\t * @name $location#$locationChangeStart\r\n\t\t * @eventType broadcast on root scope\r\n\t\t * @description\r\n\t\t * Broadcasted before a URL will change. This change can be prevented by calling\r\n\t\t * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more\r\n\t\t * details about event object. Upon successful change\r\n\t\t * {@link ng.$location#events_$locationChangeSuccess $locationChangeSuccess} is fired.\r\n\t\t *\r\n\t\t * @param {Object} angularEvent Synthetic event object.\r\n\t\t * @param {string} newUrl New URL\r\n\t\t * @param {string=} oldUrl URL that was before it was changed.\r\n\t\t */\r\n\r\n\t\t/**\r\n\t\t * @ngdoc event\r\n\t\t * @name $location#$locationChangeSuccess\r\n\t\t * @eventType broadcast on root scope\r\n\t\t * @description\r\n\t\t * Broadcasted after a URL was changed.\r\n\t\t *\r\n\t\t * @param {Object} angularEvent Synthetic event object.\r\n\t\t * @param {string} newUrl New URL\r\n\t\t * @param {string=} oldUrl URL that was before it was changed.\r\n\t\t */\r\n\r\n\t\tthis.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement',\r\n\t\t\tfunction ($rootScope, $browser, $sniffer, $rootElement) {\r\n\t\t\t\tvar $location,\r\n\t\t\t\t\tLocationMode,\r\n\t\t\t\t\tbaseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''\r\n\t\t\t\t\tinitialUrl = $browser.url(),\r\n\t\t\t\t\tappBase;\r\n\r\n\t\t\t\tif (html5Mode) {\r\n\t\t\t\t\tappBase = serverBase(initialUrl) + (baseHref || '/');\r\n\t\t\t\t\tLocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tappBase = stripHash(initialUrl);\r\n\t\t\t\t\tLocationMode = LocationHashbangUrl;\r\n\t\t\t\t}\r\n\t\t\t\t$location = new LocationMode(appBase, '#' + hashPrefix);\r\n\t\t\t\t$location.$$parse($location.$$rewrite(initialUrl));\r\n\r\n\t\t\t\t$rootElement.on('click', function (event) {\r\n\t\t\t\t\t// TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)\r\n\t\t\t\t\t// currently we open nice url link and redirect then\r\n\r\n\t\t\t\t\tif (event.ctrlKey || event.metaKey || event.which == 2) return;\r\n\r\n\t\t\t\t\tvar elm = jqLite(event.target);\r\n\r\n\t\t\t\t\t// traverse the DOM up to find first A tag\r\n\t\t\t\t\twhile (lowercase(elm[0].nodeName) !== 'a') {\r\n\t\t\t\t\t\t// ignore rewriting if no A tag (reached root element, or no parent - removed from document)\r\n\t\t\t\t\t\tif (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar absHref = elm.prop('href');\r\n\r\n\t\t\t\t\tif (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') {\r\n\t\t\t\t\t\t// SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during\r\n\t\t\t\t\t\t// an animation.\r\n\t\t\t\t\t\tabsHref = urlResolve(absHref.animVal).href;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Make relative links work in HTML5 mode for legacy browsers (or at least IE8 & 9)\r\n\t\t\t\t\t// The href should be a regular url e.g. /link/somewhere or link/somewhere or ../somewhere or\r\n\t\t\t\t\t// somewhere#anchor or http://example.com/somewhere\r\n\t\t\t\t\tif (LocationMode === LocationHashbangInHtml5Url) {\r\n\t\t\t\t\t\t// get the actual href attribute - see\r\n\t\t\t\t\t\t// http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx\r\n\t\t\t\t\t\tvar href = elm.attr('href') || elm.attr('xlink:href');\r\n\r\n\t\t\t\t\t\tif (href.indexOf('://') < 0) { // Ignore absolute URLs\r\n\t\t\t\t\t\t\tvar prefix = '#' + hashPrefix;\r\n\t\t\t\t\t\t\tif (href[0] == '/') {\r\n\t\t\t\t\t\t\t\t// absolute path - replace old path\r\n\t\t\t\t\t\t\t\tabsHref = appBase + prefix + href;\r\n\t\t\t\t\t\t\t} else if (href[0] == '#') {\r\n\t\t\t\t\t\t\t\t// local anchor\r\n\t\t\t\t\t\t\t\tabsHref = appBase + prefix + ($location.path() || '/') + href;\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t// relative path - join with current path\r\n\t\t\t\t\t\t\t\tvar stack = $location.path().split(\"/\"),\r\n\t\t\t\t\t\t\t\t parts = href.split(\"/\");\r\n\t\t\t\t\t\t\t\tfor (var i = 0; i < parts.length; i++) {\r\n\t\t\t\t\t\t\t\t\tif (parts[i] == \".\")\r\n\t\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t\telse if (parts[i] == \"..\")\r\n\t\t\t\t\t\t\t\t\t\tstack.pop();\r\n\t\t\t\t\t\t\t\t\telse if (parts[i].length)\r\n\t\t\t\t\t\t\t\t\t\tstack.push(parts[i]);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tabsHref = appBase + prefix + stack.join('/');\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar rewrittenUrl = $location.$$rewrite(absHref);\r\n\r\n\t\t\t\t\tif (absHref && !elm.attr('target') && rewrittenUrl && !event.isDefaultPrevented()) {\r\n\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\tif (rewrittenUrl != $browser.url()) {\r\n\t\t\t\t\t\t\t// update location manually\r\n\t\t\t\t\t\t\t$location.$$parse(rewrittenUrl);\r\n\t\t\t\t\t\t\t$rootScope.$apply();\r\n\t\t\t\t\t\t\t// hack to work around FF6 bug 684208 when scenario runner clicks on links\r\n\t\t\t\t\t\t\twindow.angular['ff-684208-preventDefault'] = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\r\n\t\t\t\t// rewrite hashbang url <> html5 url\r\n\t\t\t\tif ($location.absUrl() != initialUrl) {\r\n\t\t\t\t\t$browser.url($location.absUrl(), true);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// update $location when $browser url changes\r\n\t\t\t\t$browser.onUrlChange(function (newUrl) {\r\n\t\t\t\t\tif ($location.absUrl() != newUrl) {\r\n\t\t\t\t\t\t$rootScope.$evalAsync(function () {\r\n\t\t\t\t\t\t\tvar oldUrl = $location.absUrl();\r\n\r\n\t\t\t\t\t\t\t$location.$$parse(newUrl);\r\n\t\t\t\t\t\t\tif ($rootScope.$broadcast('$locationChangeStart', newUrl,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t oldUrl).defaultPrevented) {\r\n\t\t\t\t\t\t\t\t$location.$$parse(oldUrl);\r\n\t\t\t\t\t\t\t\t$browser.url(oldUrl);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tafterLocationChange(oldUrl);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tif (!$rootScope.$$phase) $rootScope.$digest();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// update browser\r\n\t\t\t\tvar changeCounter = 0;\r\n\t\t\t\t$rootScope.$watch(function $locationWatch() {\r\n\t\t\t\t\tvar oldUrl = $browser.url();\r\n\t\t\t\t\tvar currentReplace = $location.$$replace;\r\n\r\n\t\t\t\t\tif (!changeCounter || oldUrl != $location.absUrl()) {\r\n\t\t\t\t\t\tchangeCounter++;\r\n\t\t\t\t\t\t$rootScope.$evalAsync(function () {\r\n\t\t\t\t\t\t\tif ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).\r\n\t\t\t\t\t\t\t\tdefaultPrevented) {\r\n\t\t\t\t\t\t\t\t$location.$$parse(oldUrl);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t$browser.url($location.absUrl(), currentReplace);\r\n\t\t\t\t\t\t\t\tafterLocationChange(oldUrl);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$location.$$replace = false;\r\n\r\n\t\t\t\t\treturn changeCounter;\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn $location;\r\n\r\n\t\t\t\tfunction afterLocationChange(oldUrl) {\r\n\t\t\t\t\t$rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl);\r\n\t\t\t\t}\r\n\t\t\t}];\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $log\r\n\t * @requires $window\r\n\t *\r\n\t * @description\r\n\t * Simple service for logging. Default implementation safely writes the message\r\n\t * into the browser's console (if present).\r\n\t *\r\n\t * The main purpose of this service is to simplify debugging and troubleshooting.\r\n\t *\r\n\t * The default is to log `debug` messages. You can use\r\n\t * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"script.js\">\r\n\t\t function LogCtrl($scope, $log) {\r\n\t\t\t $scope.$log = $log;\r\n\t\t\t $scope.message = 'Hello World!';\r\n\t\t }\r\n\t\t </file>\r\n\t\t <file name=\"index.html\">\r\n\t\t <div ng-controller=\"LogCtrl\">\r\n\t\t\t <p>Reload this page with open console, enter text and hit the log button...</p>\r\n\t\t\t Message:\r\n\t\t\t <input type=\"text\" ng-model=\"message\"/>\r\n\t\t\t <button ng-click=\"$log.log(message)\">log</button>\r\n\t\t\t <button ng-click=\"$log.warn(message)\">warn</button>\r\n\t\t\t <button ng-click=\"$log.info(message)\">info</button>\r\n\t\t\t <button ng-click=\"$log.error(message)\">error</button>\r\n\t\t </div>\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc provider\r\n\t * @name $logProvider\r\n\t * @description\r\n\t * Use the `$logProvider` to configure how the application logs messages\r\n\t */\r\n\tfunction $LogProvider() {\r\n\t\tvar debug = true,\r\n\t\t\tself = this;\r\n\r\n\t\t/**\r\n\t\t * @ngdoc property\r\n\t\t * @name $logProvider#debugEnabled\r\n\t\t * @description\r\n\t\t * @param {boolean=} flag enable or disable debug level messages\r\n\t\t * @returns {*} current value if used as getter or itself (chaining) if used as setter\r\n\t\t */\r\n\t\tthis.debugEnabled = function (flag) {\r\n\t\t\tif (isDefined(flag)) {\r\n\t\t\t\tdebug = flag;\r\n\t\t\t\treturn this;\r\n\t\t\t} else {\r\n\t\t\t\treturn debug;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tthis.$get = ['$window', function ($window) {\r\n\t\t\treturn {\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $log#log\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Write a log message\r\n\t\t\t\t */\r\n\t\t\t\tlog: consoleLog('log'),\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $log#info\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Write an information message\r\n\t\t\t\t */\r\n\t\t\t\tinfo: consoleLog('info'),\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $log#warn\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Write a warning message\r\n\t\t\t\t */\r\n\t\t\t\twarn: consoleLog('warn'),\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $log#error\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Write an error message\r\n\t\t\t\t */\r\n\t\t\t\terror: consoleLog('error'),\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $log#debug\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Write a debug message\r\n\t\t\t\t */\r\n\t\t\t\tdebug: (function () {\r\n\t\t\t\t\tvar fn = consoleLog('debug');\r\n\r\n\t\t\t\t\treturn function () {\r\n\t\t\t\t\t\tif (debug) {\r\n\t\t\t\t\t\t\tfn.apply(self, arguments);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\t\t\t\t}())\r\n\t\t\t};\r\n\r\n\t\t\tfunction formatError(arg) {\r\n\t\t\t\tif (arg instanceof Error) {\r\n\t\t\t\t\tif (arg.stack) {\r\n\t\t\t\t\t\targ = (arg.message && arg.stack.indexOf(arg.message) === -1)\r\n\t\t\t\t\t\t\t? 'Error: ' + arg.message + '\\n' + arg.stack\r\n\t\t\t\t\t\t\t: arg.stack;\r\n\t\t\t\t\t} else if (arg.sourceURL) {\r\n\t\t\t\t\t\targ = arg.message + '\\n' + arg.sourceURL + ':' + arg.line;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn arg;\r\n\t\t\t}\r\n\r\n\t\t\tfunction consoleLog(type) {\r\n\t\t\t\tvar console = $window.console || {},\r\n\t\t\t\t\tlogFn = console[type] || console.log || noop,\r\n\t\t\t\t\thasApply = false;\r\n\r\n\t\t\t\t// Note: reading logFn.apply throws an error in IE11 in IE8 document mode.\r\n\t\t\t\t// The reason behind this is that console.log has type \"object\" in IE8...\r\n\t\t\t\ttry {\r\n\t\t\t\t\thasApply = !!logFn.apply;\r\n\t\t\t\t} catch (e) { }\r\n\r\n\t\t\t\tif (hasApply) {\r\n\t\t\t\t\treturn function () {\r\n\t\t\t\t\t\tvar args = [];\r\n\t\t\t\t\t\tforEach(arguments, function (arg) {\r\n\t\t\t\t\t\t\targs.push(formatError(arg));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\treturn logFn.apply(console, args);\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// we are IE which either doesn't have window.console => this is noop and we do nothing,\r\n\t\t\t\t// or we are IE where console.log doesn't have apply so we log at least first 2 args\r\n\t\t\t\treturn function (arg1, arg2) {\r\n\t\t\t\t\tlogFn(arg1, arg2 == null ? '' : arg2);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}];\r\n\t}\r\n\r\n\tvar $parseMinErr = minErr('$parse');\r\n\tvar promiseWarningCache = {};\r\n\tvar promiseWarning;\r\n\r\n\t// Sandboxing Angular Expressions\r\n\t// ------------------------------\r\n\t// Angular expressions are generally considered safe because these expressions only have direct\r\n\t// access to $scope and locals. However, one can obtain the ability to execute arbitrary JS code by\r\n\t// obtaining a reference to native JS functions such as the Function constructor.\r\n\t//\r\n\t// As an example, consider the following Angular expression:\r\n\t//\r\n\t// {}.toString.constructor('alert(\"evil JS code\")')\r\n\t//\r\n\t// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits\r\n\t// against the expression language, but not to prevent exploits that were enabled by exposing\r\n\t// sensitive JavaScript or browser apis on Scope. Exposing such objects on a Scope is never a good\r\n\t// practice and therefore we are not even trying to protect against interaction with an object\r\n\t// explicitly exposed in this way.\r\n\t//\r\n\t// In general, it is not possible to access a Window object from an angular expression unless a\r\n\t// window or some DOM object that has a reference to window is published onto a Scope.\r\n\t// Similarly we prevent invocations of function known to be dangerous, as well as assignments to\r\n\t// native objects.\r\n\r\n\r\n\tfunction ensureSafeMemberName(name, fullExpression) {\r\n\t\tif (name === \"__defineGetter__\" || name === \"__defineSetter__\"\r\n\t\t\t|| name === \"__lookupGetter__\" || name === \"__lookupSetter__\"\r\n\t\t\t|| name === \"__proto__\") {\r\n\t\t\tthrow $parseMinErr('isecfld',\r\n\t\t\t\t'Attempting to access a disallowed field in Angular expressions! '\r\n\t\t\t\t+ 'Expression: {0}', fullExpression);\r\n\t\t}\r\n\t\treturn name;\r\n\t}\r\n\r\n\tfunction ensureSafeObject(obj, fullExpression) {\r\n\t\t// nifty check if obj is Function that is fast and works across iframes and other contexts\r\n\t\tif (obj) {\r\n\t\t\tif (obj.constructor === obj) {\r\n\t\t\t\tthrow $parseMinErr('isecfn',\r\n\t\t\t\t\t'Referencing Function in Angular expressions is disallowed! Expression: {0}',\r\n\t\t\t\t\tfullExpression);\r\n\t\t\t} else if (// isWindow(obj)\r\n\t\t\t\tobj.document && obj.location && obj.alert && obj.setInterval) {\r\n\t\t\t\tthrow $parseMinErr('isecwindow',\r\n\t\t\t\t\t'Referencing the Window in Angular expressions is disallowed! Expression: {0}',\r\n\t\t\t\t\tfullExpression);\r\n\t\t\t} else if (// isElement(obj)\r\n\t\t\t\tobj.children && (obj.nodeName || (obj.prop && obj.attr && obj.find))) {\r\n\t\t\t\tthrow $parseMinErr('isecdom',\r\n\t\t\t\t\t'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',\r\n\t\t\t\t\tfullExpression);\r\n\t\t\t} else if (// block Object so that we can't get hold of dangerous Object.* methods\r\n\t\t\t\tobj === Object) {\r\n\t\t\t\tthrow $parseMinErr('isecobj',\r\n\t\t\t\t\t'Referencing Object in Angular expressions is disallowed! Expression: {0}',\r\n\t\t\t\t\tfullExpression);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn obj;\r\n\t}\r\n\r\n\tvar CALL = Function.prototype.call;\r\n\tvar APPLY = Function.prototype.apply;\r\n\tvar BIND = Function.prototype.bind;\r\n\r\n\tfunction ensureSafeFunction(obj, fullExpression) {\r\n\t\tif (obj) {\r\n\t\t\tif (obj.constructor === obj) {\r\n\t\t\t\tthrow $parseMinErr('isecfn',\r\n\t\t\t\t 'Referencing Function in Angular expressions is disallowed! Expression: {0}',\r\n\t\t\t\t fullExpression);\r\n\t\t\t} else if (obj === CALL || obj === APPLY || (BIND && obj === BIND)) {\r\n\t\t\t\tthrow $parseMinErr('isecff',\r\n\t\t\t\t 'Referencing call, apply or bind in Angular expressions is disallowed! Expression: {0}',\r\n\t\t\t\t fullExpression);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tvar OPERATORS = {\r\n\t\t/* jshint bitwise : false */\r\n\t\t'null': function () { return null; },\r\n\t\t'true': function () { return true; },\r\n\t\t'false': function () { return false; },\r\n\t\tundefined: noop,\r\n\t\t'+': function (self, locals, a, b) {\r\n\t\t\ta = a(self, locals); b = b(self, locals);\r\n\t\t\tif (isDefined(a)) {\r\n\t\t\t\tif (isDefined(b)) {\r\n\t\t\t\t\treturn a + b;\r\n\t\t\t\t}\r\n\t\t\t\treturn a;\r\n\t\t\t}\r\n\t\t\treturn isDefined(b) ? b : undefined;\r\n\t\t},\r\n\t\t'-': function (self, locals, a, b) {\r\n\t\t\ta = a(self, locals); b = b(self, locals);\r\n\t\t\treturn (isDefined(a) ? a : 0) - (isDefined(b) ? b : 0);\r\n\t\t},\r\n\t\t'*': function (self, locals, a, b) { return a(self, locals) * b(self, locals); },\r\n\t\t'/': function (self, locals, a, b) { return a(self, locals) / b(self, locals); },\r\n\t\t'%': function (self, locals, a, b) { return a(self, locals) % b(self, locals); },\r\n\t\t'^': function (self, locals, a, b) { return a(self, locals) ^ b(self, locals); },\r\n\t\t'=': noop,\r\n\t\t'===': function (self, locals, a, b) { return a(self, locals) === b(self, locals); },\r\n\t\t'!==': function (self, locals, a, b) { return a(self, locals) !== b(self, locals); },\r\n\t\t'==': function (self, locals, a, b) { return a(self, locals) == b(self, locals); },\r\n\t\t'!=': function (self, locals, a, b) { return a(self, locals) != b(self, locals); },\r\n\t\t'<': function (self, locals, a, b) { return a(self, locals) < b(self, locals); },\r\n\t\t'>': function (self, locals, a, b) { return a(self, locals) > b(self, locals); },\r\n\t\t'<=': function (self, locals, a, b) { return a(self, locals) <= b(self, locals); },\r\n\t\t'>=': function (self, locals, a, b) { return a(self, locals) >= b(self, locals); },\r\n\t\t'&&': function (self, locals, a, b) { return a(self, locals) && b(self, locals); },\r\n\t\t'||': function (self, locals, a, b) { return a(self, locals) || b(self, locals); },\r\n\t\t'&': function (self, locals, a, b) { return a(self, locals) & b(self, locals); },\r\n\t\t// '|':function(self, locals, a,b){return a|b;},\r\n\t\t'|': function (self, locals, a, b) { return b(self, locals)(self, locals, a(self, locals)); },\r\n\t\t'!': function (self, locals, a) { return !a(self, locals); }\r\n\t};\r\n\t/* jshint bitwise: true */\r\n\tvar ESCAPE = { \"n\": \"\\n\", \"f\": \"\\f\", \"r\": \"\\r\", \"t\": \"\\t\", \"v\": \"\\v\", \"'\": \"'\", '\"': '\"' };\r\n\r\n\r\n\t/////////////////////////////////////////\r\n\r\n\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tvar Lexer = function (options) {\r\n\t\tthis.options = options;\r\n\t};\r\n\r\n\tLexer.prototype = {\r\n\t\tconstructor: Lexer,\r\n\r\n\t\tlex: function (text) {\r\n\t\t\tthis.text = text;\r\n\r\n\t\t\tthis.index = 0;\r\n\t\t\tthis.ch = undefined;\r\n\t\t\tthis.lastCh = ':'; // can start regexp\r\n\r\n\t\t\tthis.tokens = [];\r\n\r\n\t\t\twhile (this.index < this.text.length) {\r\n\t\t\t\tthis.ch = this.text.charAt(this.index);\r\n\t\t\t\tif (this.is('\"\\'')) {\r\n\t\t\t\t\tthis.readString(this.ch);\r\n\t\t\t\t} else if (this.isNumber(this.ch) || this.is('.') && this.isNumber(this.peek())) {\r\n\t\t\t\t\tthis.readNumber();\r\n\t\t\t\t} else if (this.isIdent(this.ch)) {\r\n\t\t\t\t\tthis.readIdent();\r\n\t\t\t\t} else if (this.is('(){}[].,;:?')) {\r\n\t\t\t\t\tthis.tokens.push({\r\n\t\t\t\t\t\tindex: this.index,\r\n\t\t\t\t\t\ttext: this.ch\r\n\t\t\t\t\t});\r\n\t\t\t\t\tthis.index++;\r\n\t\t\t\t} else if (this.isWhitespace(this.ch)) {\r\n\t\t\t\t\tthis.index++;\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar ch2 = this.ch + this.peek();\r\n\t\t\t\t\tvar ch3 = ch2 + this.peek(2);\r\n\t\t\t\t\tvar fn = OPERATORS[this.ch];\r\n\t\t\t\t\tvar fn2 = OPERATORS[ch2];\r\n\t\t\t\t\tvar fn3 = OPERATORS[ch3];\r\n\t\t\t\t\tif (fn3) {\r\n\t\t\t\t\t\tthis.tokens.push({ index: this.index, text: ch3, fn: fn3 });\r\n\t\t\t\t\t\tthis.index += 3;\r\n\t\t\t\t\t} else if (fn2) {\r\n\t\t\t\t\t\tthis.tokens.push({ index: this.index, text: ch2, fn: fn2 });\r\n\t\t\t\t\t\tthis.index += 2;\r\n\t\t\t\t\t} else if (fn) {\r\n\t\t\t\t\t\tthis.tokens.push({\r\n\t\t\t\t\t\t\tindex: this.index,\r\n\t\t\t\t\t\t\ttext: this.ch,\r\n\t\t\t\t\t\t\tfn: fn\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tthis.index += 1;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.throwError('Unexpected next character ', this.index, this.index + 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthis.lastCh = this.ch;\r\n\t\t\t}\r\n\t\t\treturn this.tokens;\r\n\t\t},\r\n\r\n\t\tis: function (chars) {\r\n\t\t\treturn chars.indexOf(this.ch) !== -1;\r\n\t\t},\r\n\r\n\t\twas: function (chars) {\r\n\t\t\treturn chars.indexOf(this.lastCh) !== -1;\r\n\t\t},\r\n\r\n\t\tpeek: function (i) {\r\n\t\t\tvar num = i || 1;\r\n\t\t\treturn (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false;\r\n\t\t},\r\n\r\n\t\tisNumber: function (ch) {\r\n\t\t\treturn ('0' <= ch && ch <= '9');\r\n\t\t},\r\n\r\n\t\tisWhitespace: function (ch) {\r\n\t\t\t// IE treats non-breaking space as \\u00A0\r\n\t\t\treturn (ch === ' ' || ch === '\\r' || ch === '\\t' ||\r\n\t\t\t\t\tch === '\\n' || ch === '\\v' || ch === '\\u00A0');\r\n\t\t},\r\n\r\n\t\tisIdent: function (ch) {\r\n\t\t\treturn ('a' <= ch && ch <= 'z' ||\r\n\t\t\t\t\t'A' <= ch && ch <= 'Z' ||\r\n\t\t\t\t\t'_' === ch || ch === '$');\r\n\t\t},\r\n\r\n\t\tisExpOperator: function (ch) {\r\n\t\t\treturn (ch === '-' || ch === '+' || this.isNumber(ch));\r\n\t\t},\r\n\r\n\t\tthrowError: function (error, start, end) {\r\n\t\t\tend = end || this.index;\r\n\t\t\tvar colStr = (isDefined(start)\r\n\t\t\t\t\t? 's ' + start + '-' + this.index + ' [' + this.text.substring(start, end) + ']'\r\n\t\t\t\t\t: ' ' + end);\r\n\t\t\tthrow $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].',\r\n\t\t\t\terror, colStr, this.text);\r\n\t\t},\r\n\r\n\t\treadNumber: function () {\r\n\t\t\tvar number = '';\r\n\t\t\tvar start = this.index;\r\n\t\t\twhile (this.index < this.text.length) {\r\n\t\t\t\tvar ch = lowercase(this.text.charAt(this.index));\r\n\t\t\t\tif (ch == '.' || this.isNumber(ch)) {\r\n\t\t\t\t\tnumber += ch;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar peekCh = this.peek();\r\n\t\t\t\t\tif (ch == 'e' && this.isExpOperator(peekCh)) {\r\n\t\t\t\t\t\tnumber += ch;\r\n\t\t\t\t\t} else if (this.isExpOperator(ch) &&\r\n\t\t\t\t\t\tpeekCh && this.isNumber(peekCh) &&\r\n\t\t\t\t\t\tnumber.charAt(number.length - 1) == 'e') {\r\n\t\t\t\t\t\tnumber += ch;\r\n\t\t\t\t\t} else if (this.isExpOperator(ch) &&\r\n\t\t\t\t\t\t(!peekCh || !this.isNumber(peekCh)) &&\r\n\t\t\t\t\t\tnumber.charAt(number.length - 1) == 'e') {\r\n\t\t\t\t\t\tthis.throwError('Invalid exponent');\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tthis.index++;\r\n\t\t\t}\r\n\t\t\tnumber = 1 * number;\r\n\t\t\tthis.tokens.push({\r\n\t\t\t\tindex: start,\r\n\t\t\t\ttext: number,\r\n\t\t\t\tliteral: true,\r\n\t\t\t\tconstant: true,\r\n\t\t\t\tfn: function () { return number; }\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\treadIdent: function () {\r\n\t\t\tvar parser = this;\r\n\r\n\t\t\tvar ident = '';\r\n\t\t\tvar start = this.index;\r\n\r\n\t\t\tvar lastDot, peekIndex, methodName, ch;\r\n\r\n\t\t\twhile (this.index < this.text.length) {\r\n\t\t\t\tch = this.text.charAt(this.index);\r\n\t\t\t\tif (ch === '.' || this.isIdent(ch) || this.isNumber(ch)) {\r\n\t\t\t\t\tif (ch === '.') lastDot = this.index;\r\n\t\t\t\t\tident += ch;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tthis.index++;\r\n\t\t\t}\r\n\r\n\t\t\t//check if this is not a method invocation and if it is back out to last dot\r\n\t\t\tif (lastDot) {\r\n\t\t\t\tpeekIndex = this.index;\r\n\t\t\t\twhile (peekIndex < this.text.length) {\r\n\t\t\t\t\tch = this.text.charAt(peekIndex);\r\n\t\t\t\t\tif (ch === '(') {\r\n\t\t\t\t\t\tmethodName = ident.substr(lastDot - start + 1);\r\n\t\t\t\t\t\tident = ident.substr(0, lastDot - start);\r\n\t\t\t\t\t\tthis.index = peekIndex;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (this.isWhitespace(ch)) {\r\n\t\t\t\t\t\tpeekIndex++;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\tvar token = {\r\n\t\t\t\tindex: start,\r\n\t\t\t\ttext: ident\r\n\t\t\t};\r\n\r\n\t\t\t// OPERATORS is our own object so we don't need to use special hasOwnPropertyFn\r\n\t\t\tif (OPERATORS.hasOwnProperty(ident)) {\r\n\t\t\t\ttoken.fn = OPERATORS[ident];\r\n\t\t\t\ttoken.literal = true;\r\n\t\t\t\ttoken.constant = true;\r\n\t\t\t} else {\r\n\t\t\t\tvar getter = getterFn(ident, this.options, this.text);\r\n\t\t\t\ttoken.fn = extend(function (self, locals) {\r\n\t\t\t\t\treturn (getter(self, locals));\r\n\t\t\t\t}, {\r\n\t\t\t\t\tassign: function (self, value) {\r\n\t\t\t\t\t\treturn setter(self, ident, value, parser.text, parser.options);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis.tokens.push(token);\r\n\r\n\t\t\tif (methodName) {\r\n\t\t\t\tthis.tokens.push({\r\n\t\t\t\t\tindex: lastDot,\r\n\t\t\t\t\ttext: '.'\r\n\t\t\t\t});\r\n\t\t\t\tthis.tokens.push({\r\n\t\t\t\t\tindex: lastDot + 1,\r\n\t\t\t\t\ttext: methodName\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\treadString: function (quote) {\r\n\t\t\tvar start = this.index;\r\n\t\t\tthis.index++;\r\n\t\t\tvar string = '';\r\n\t\t\tvar rawString = quote;\r\n\t\t\tvar escape = false;\r\n\t\t\twhile (this.index < this.text.length) {\r\n\t\t\t\tvar ch = this.text.charAt(this.index);\r\n\t\t\t\trawString += ch;\r\n\t\t\t\tif (escape) {\r\n\t\t\t\t\tif (ch === 'u') {\r\n\t\t\t\t\t\tvar hex = this.text.substring(this.index + 1, this.index + 5);\r\n\t\t\t\t\t\tif (!hex.match(/[\\da-f]{4}/i))\r\n\t\t\t\t\t\t\tthis.throwError('Invalid unicode escape [\\\\u' + hex + ']');\r\n\t\t\t\t\t\tthis.index += 4;\r\n\t\t\t\t\t\tstring += String.fromCharCode(parseInt(hex, 16));\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tvar rep = ESCAPE[ch];\r\n\t\t\t\t\t\tif (rep) {\r\n\t\t\t\t\t\t\tstring += rep;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tstring += ch;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tescape = false;\r\n\t\t\t\t} else if (ch === '\\\\') {\r\n\t\t\t\t\tescape = true;\r\n\t\t\t\t} else if (ch === quote) {\r\n\t\t\t\t\tthis.index++;\r\n\t\t\t\t\tthis.tokens.push({\r\n\t\t\t\t\t\tindex: start,\r\n\t\t\t\t\t\ttext: rawString,\r\n\t\t\t\t\t\tstring: string,\r\n\t\t\t\t\t\tliteral: true,\r\n\t\t\t\t\t\tconstant: true,\r\n\t\t\t\t\t\tfn: function () { return string; }\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstring += ch;\r\n\t\t\t\t}\r\n\t\t\t\tthis.index++;\r\n\t\t\t}\r\n\t\t\tthis.throwError('Unterminated quote', start);\r\n\t\t}\r\n\t};\r\n\r\n\r\n\t/**\r\n\t * @constructor\r\n\t */\r\n\tvar Parser = function (lexer, $filter, options) {\r\n\t\tthis.lexer = lexer;\r\n\t\tthis.$filter = $filter;\r\n\t\tthis.options = options;\r\n\t};\r\n\r\n\tParser.ZERO = extend(function () {\r\n\t\treturn 0;\r\n\t}, {\r\n\t\tconstant: true\r\n\t});\r\n\r\n\tParser.prototype = {\r\n\t\tconstructor: Parser,\r\n\r\n\t\tparse: function (text) {\r\n\t\t\tthis.text = text;\r\n\r\n\t\t\tthis.tokens = this.lexer.lex(text);\r\n\r\n\t\t\tvar value = this.statements();\r\n\r\n\t\t\tif (this.tokens.length !== 0) {\r\n\t\t\t\tthis.throwError('is an unexpected token', this.tokens[0]);\r\n\t\t\t}\r\n\r\n\t\t\tvalue.literal = !!value.literal;\r\n\t\t\tvalue.constant = !!value.constant;\r\n\r\n\t\t\treturn value;\r\n\t\t},\r\n\r\n\t\tprimary: function () {\r\n\t\t\tvar primary;\r\n\t\t\tif (this.expect('(')) {\r\n\t\t\t\tprimary = this.filterChain();\r\n\t\t\t\tthis.consume(')');\r\n\t\t\t} else if (this.expect('[')) {\r\n\t\t\t\tprimary = this.arrayDeclaration();\r\n\t\t\t} else if (this.expect('{')) {\r\n\t\t\t\tprimary = this.object();\r\n\t\t\t} else {\r\n\t\t\t\tvar token = this.expect();\r\n\t\t\t\tprimary = token.fn;\r\n\t\t\t\tif (!primary) {\r\n\t\t\t\t\tthis.throwError('not a primary expression', token);\r\n\t\t\t\t}\r\n\t\t\t\tprimary.literal = !!token.literal;\r\n\t\t\t\tprimary.constant = !!token.constant;\r\n\t\t\t}\r\n\r\n\t\t\tvar next, context;\r\n\t\t\twhile ((next = this.expect('(', '[', '.'))) {\r\n\t\t\t\tif (next.text === '(') {\r\n\t\t\t\t\tprimary = this.functionCall(primary, context);\r\n\t\t\t\t\tcontext = null;\r\n\t\t\t\t} else if (next.text === '[') {\r\n\t\t\t\t\tcontext = primary;\r\n\t\t\t\t\tprimary = this.objectIndex(primary);\r\n\t\t\t\t} else if (next.text === '.') {\r\n\t\t\t\t\tcontext = primary;\r\n\t\t\t\t\tprimary = this.fieldAccess(primary);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.throwError('IMPOSSIBLE');\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn primary;\r\n\t\t},\r\n\r\n\t\tthrowError: function (msg, token) {\r\n\t\t\tthrow $parseMinErr('syntax',\r\n\t\t\t\t'Syntax Error: Token \\'{0}\\' {1} at column {2} of the expression [{3}] starting at [{4}].',\r\n\t\t\t\t token.text, msg, (token.index + 1), this.text, this.text.substring(token.index));\r\n\t\t},\r\n\r\n\t\tpeekToken: function () {\r\n\t\t\tif (this.tokens.length === 0)\r\n\t\t\t\tthrow $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);\r\n\t\t\treturn this.tokens[0];\r\n\t\t},\r\n\r\n\t\tpeek: function (e1, e2, e3, e4) {\r\n\t\t\tif (this.tokens.length > 0) {\r\n\t\t\t\tvar token = this.tokens[0];\r\n\t\t\t\tvar t = token.text;\r\n\t\t\t\tif (t === e1 || t === e2 || t === e3 || t === e4 ||\r\n\t\t\t\t\t(!e1 && !e2 && !e3 && !e4)) {\r\n\t\t\t\t\treturn token;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t},\r\n\r\n\t\texpect: function (e1, e2, e3, e4) {\r\n\t\t\tvar token = this.peek(e1, e2, e3, e4);\r\n\t\t\tif (token) {\r\n\t\t\t\tthis.tokens.shift();\r\n\t\t\t\treturn token;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t},\r\n\r\n\t\tconsume: function (e1) {\r\n\t\t\tif (!this.expect(e1)) {\r\n\t\t\t\tthis.throwError('is unexpected, expecting [' + e1 + ']', this.peek());\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tunaryFn: function (fn, right) {\r\n\t\t\treturn extend(function (self, locals) {\r\n\t\t\t\treturn fn(self, locals, right);\r\n\t\t\t}, {\r\n\t\t\t\tconstant: right.constant\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tternaryFn: function (left, middle, right) {\r\n\t\t\treturn extend(function (self, locals) {\r\n\t\t\t\treturn left(self, locals) ? middle(self, locals) : right(self, locals);\r\n\t\t\t}, {\r\n\t\t\t\tconstant: left.constant && middle.constant && right.constant\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tbinaryFn: function (left, fn, right) {\r\n\t\t\treturn extend(function (self, locals) {\r\n\t\t\t\treturn fn(self, locals, left, right);\r\n\t\t\t}, {\r\n\t\t\t\tconstant: left.constant && right.constant\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tstatements: function () {\r\n\t\t\tvar statements = [];\r\n\t\t\twhile (true) {\r\n\t\t\t\tif (this.tokens.length > 0 && !this.peek('}', ')', ';', ']'))\r\n\t\t\t\t\tstatements.push(this.filterChain());\r\n\t\t\t\tif (!this.expect(';')) {\r\n\t\t\t\t\t// optimize for the common case where there is only one statement.\r\n\t\t\t\t\t// TODO(size): maybe we should not support multiple statements?\r\n\t\t\t\t\treturn (statements.length === 1)\r\n\t\t\t\t\t\t? statements[0]\r\n\t\t\t\t\t\t: function (self, locals) {\r\n\t\t\t\t\t\t\tvar value;\r\n\t\t\t\t\t\t\tfor (var i = 0; i < statements.length; i++) {\r\n\t\t\t\t\t\t\t\tvar statement = statements[i];\r\n\t\t\t\t\t\t\t\tif (statement) {\r\n\t\t\t\t\t\t\t\t\tvalue = statement(self, locals);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn value;\r\n\t\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tfilterChain: function () {\r\n\t\t\tvar left = this.expression();\r\n\t\t\tvar token;\r\n\t\t\twhile (true) {\r\n\t\t\t\tif ((token = this.expect('|'))) {\r\n\t\t\t\t\tleft = this.binaryFn(left, token.fn, this.filter());\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn left;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tfilter: function () {\r\n\t\t\tvar token = this.expect();\r\n\t\t\tvar fn = this.$filter(token.text);\r\n\t\t\tvar argsFn = [];\r\n\t\t\twhile (true) {\r\n\t\t\t\tif ((token = this.expect(':'))) {\r\n\t\t\t\t\targsFn.push(this.expression());\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar fnInvoke = function (self, locals, input) {\r\n\t\t\t\t\t\tvar args = [input];\r\n\t\t\t\t\t\tfor (var i = 0; i < argsFn.length; i++) {\r\n\t\t\t\t\t\t\targs.push(argsFn[i](self, locals));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn fn.apply(self, args);\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn function () {\r\n\t\t\t\t\t\treturn fnInvoke;\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\texpression: function () {\r\n\t\t\treturn this.assignment();\r\n\t\t},\r\n\r\n\t\tassignment: function () {\r\n\t\t\tvar left = this.ternary();\r\n\t\t\tvar right;\r\n\t\t\tvar token;\r\n\t\t\tif ((token = this.expect('='))) {\r\n\t\t\t\tif (!left.assign) {\r\n\t\t\t\t\tthis.throwError('implies assignment but [' +\r\n\t\t\t\t\t\tthis.text.substring(0, token.index) + '] can not be assigned to', token);\r\n\t\t\t\t}\r\n\t\t\t\tright = this.ternary();\r\n\t\t\t\treturn function (scope, locals) {\r\n\t\t\t\t\treturn left.assign(scope, right(scope, locals), locals);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\treturn left;\r\n\t\t},\r\n\r\n\t\tternary: function () {\r\n\t\t\tvar left = this.logicalOR();\r\n\t\t\tvar middle;\r\n\t\t\tvar token;\r\n\t\t\tif ((token = this.expect('?'))) {\r\n\t\t\t\tmiddle = this.ternary();\r\n\t\t\t\tif ((token = this.expect(':'))) {\r\n\t\t\t\t\treturn this.ternaryFn(left, middle, this.ternary());\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.throwError('expected :', token);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\treturn left;\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tlogicalOR: function () {\r\n\t\t\tvar left = this.logicalAND();\r\n\t\t\tvar token;\r\n\t\t\twhile (true) {\r\n\t\t\t\tif ((token = this.expect('||'))) {\r\n\t\t\t\t\tleft = this.binaryFn(left, token.fn, this.logicalAND());\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn left;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tlogicalAND: function () {\r\n\t\t\tvar left = this.equality();\r\n\t\t\tvar token;\r\n\t\t\tif ((token = this.expect('&&'))) {\r\n\t\t\t\tleft = this.binaryFn(left, token.fn, this.logicalAND());\r\n\t\t\t}\r\n\t\t\treturn left;\r\n\t\t},\r\n\r\n\t\tequality: function () {\r\n\t\t\tvar left = this.relational();\r\n\t\t\tvar token;\r\n\t\t\tif ((token = this.expect('==', '!=', '===', '!=='))) {\r\n\t\t\t\tleft = this.binaryFn(left, token.fn, this.equality());\r\n\t\t\t}\r\n\t\t\treturn left;\r\n\t\t},\r\n\r\n\t\trelational: function () {\r\n\t\t\tvar left = this.additive();\r\n\t\t\tvar token;\r\n\t\t\tif ((token = this.expect('<', '>', '<=', '>='))) {\r\n\t\t\t\tleft = this.binaryFn(left, token.fn, this.relational());\r\n\t\t\t}\r\n\t\t\treturn left;\r\n\t\t},\r\n\r\n\t\tadditive: function () {\r\n\t\t\tvar left = this.multiplicative();\r\n\t\t\tvar token;\r\n\t\t\twhile ((token = this.expect('+', '-'))) {\r\n\t\t\t\tleft = this.binaryFn(left, token.fn, this.multiplicative());\r\n\t\t\t}\r\n\t\t\treturn left;\r\n\t\t},\r\n\r\n\t\tmultiplicative: function () {\r\n\t\t\tvar left = this.unary();\r\n\t\t\tvar token;\r\n\t\t\twhile ((token = this.expect('*', '/', '%'))) {\r\n\t\t\t\tleft = this.binaryFn(left, token.fn, this.unary());\r\n\t\t\t}\r\n\t\t\treturn left;\r\n\t\t},\r\n\r\n\t\tunary: function () {\r\n\t\t\tvar token;\r\n\t\t\tif (this.expect('+')) {\r\n\t\t\t\treturn this.primary();\r\n\t\t\t} else if ((token = this.expect('-'))) {\r\n\t\t\t\treturn this.binaryFn(Parser.ZERO, token.fn, this.unary());\r\n\t\t\t} else if ((token = this.expect('!'))) {\r\n\t\t\t\treturn this.unaryFn(token.fn, this.unary());\r\n\t\t\t} else {\r\n\t\t\t\treturn this.primary();\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tfieldAccess: function (object) {\r\n\t\t\tvar parser = this;\r\n\t\t\tvar field = this.expect().text;\r\n\t\t\tvar getter = getterFn(field, this.options, this.text);\r\n\r\n\t\t\treturn extend(function (scope, locals, self) {\r\n\t\t\t\treturn getter(self || object(scope, locals));\r\n\t\t\t}, {\r\n\t\t\t\tassign: function (scope, value, locals) {\r\n\t\t\t\t\treturn setter(object(scope, locals), field, value, parser.text, parser.options);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tobjectIndex: function (obj) {\r\n\t\t\tvar parser = this;\r\n\r\n\t\t\tvar indexFn = this.expression();\r\n\t\t\tthis.consume(']');\r\n\r\n\t\t\treturn extend(function (self, locals) {\r\n\t\t\t\tvar o = obj(self, locals),\r\n\t\t\t\t\ti = indexFn(self, locals),\r\n\t\t\t\t\tv, p;\r\n\r\n\t\t\t\tensureSafeMemberName(i, parser.text);\r\n\t\t\t\tif (!o) return undefined;\r\n\t\t\t\tv = ensureSafeObject(o[i], parser.text);\r\n\t\t\t\tif (v && v.then && parser.options.unwrapPromises) {\r\n\t\t\t\t\tp = v;\r\n\t\t\t\t\tif (!('$$v' in v)) {\r\n\t\t\t\t\t\tp.$$v = undefined;\r\n\t\t\t\t\t\tp.then(function (val) { p.$$v = val; });\r\n\t\t\t\t\t}\r\n\t\t\t\t\tv = v.$$v;\r\n\t\t\t\t}\r\n\t\t\t\treturn v;\r\n\t\t\t}, {\r\n\t\t\t\tassign: function (self, value, locals) {\r\n\t\t\t\t\tvar key = indexFn(self, locals);\r\n\t\t\t\t\t// prevent overwriting of Function.constructor which would break ensureSafeObject check\r\n\t\t\t\t\tvar safe = ensureSafeObject(obj(self, locals), parser.text);\r\n\t\t\t\t\treturn safe[key] = value;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tfunctionCall: function (fn, contextGetter) {\r\n\t\t\tvar argsFn = [];\r\n\t\t\tif (this.peekToken().text !== ')') {\r\n\t\t\t\tdo {\r\n\t\t\t\t\targsFn.push(this.expression());\r\n\t\t\t\t} while (this.expect(','));\r\n\t\t\t}\r\n\t\t\tthis.consume(')');\r\n\r\n\t\t\tvar parser = this;\r\n\r\n\t\t\treturn function (scope, locals) {\r\n\t\t\t\tvar args = [];\r\n\t\t\t\tvar context = contextGetter ? contextGetter(scope, locals) : scope;\r\n\r\n\t\t\t\tfor (var i = 0; i < argsFn.length; i++) {\r\n\t\t\t\t\targs.push(argsFn[i](scope, locals));\r\n\t\t\t\t}\r\n\t\t\t\tvar fnPtr = fn(scope, locals, context) || noop;\r\n\r\n\t\t\t\tensureSafeObject(context, parser.text);\r\n\t\t\t\tensureSafeFunction(fnPtr, parser.text);\r\n\r\n\t\t\t\t// IE stupidity! (IE doesn't have apply for some native functions)\r\n\t\t\t\tvar v = fnPtr.apply\r\n\t\t\t\t\t ? fnPtr.apply(context, args)\r\n\t\t\t\t\t : fnPtr(args[0], args[1], args[2], args[3], args[4]);\r\n\r\n\t\t\t\treturn ensureSafeObject(v, parser.text);\r\n\t\t\t};\r\n\t\t},\r\n\r\n\t\t// This is used with json array declaration\r\n\t\tarrayDeclaration: function () {\r\n\t\t\tvar elementFns = [];\r\n\t\t\tvar allConstant = true;\r\n\t\t\tif (this.peekToken().text !== ']') {\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (this.peek(']')) {\r\n\t\t\t\t\t\t// Support trailing commas per ES5.1.\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar elementFn = this.expression();\r\n\t\t\t\t\telementFns.push(elementFn);\r\n\t\t\t\t\tif (!elementFn.constant) {\r\n\t\t\t\t\t\tallConstant = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t} while (this.expect(','));\r\n\t\t\t}\r\n\t\t\tthis.consume(']');\r\n\r\n\t\t\treturn extend(function (self, locals) {\r\n\t\t\t\tvar array = [];\r\n\t\t\t\tfor (var i = 0; i < elementFns.length; i++) {\r\n\t\t\t\t\tarray.push(elementFns[i](self, locals));\r\n\t\t\t\t}\r\n\t\t\t\treturn array;\r\n\t\t\t}, {\r\n\t\t\t\tliteral: true,\r\n\t\t\t\tconstant: allConstant\r\n\t\t\t});\r\n\t\t},\r\n\r\n\t\tobject: function () {\r\n\t\t\tvar keyValues = [];\r\n\t\t\tvar allConstant = true;\r\n\t\t\tif (this.peekToken().text !== '}') {\r\n\t\t\t\tdo {\r\n\t\t\t\t\tif (this.peek('}')) {\r\n\t\t\t\t\t\t// Support trailing commas per ES5.1.\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tvar token = this.expect(),\r\n\t\t\t\t\tkey = token.string || token.text;\r\n\t\t\t\t\tthis.consume(':');\r\n\t\t\t\t\tvar value = this.expression();\r\n\t\t\t\t\tkeyValues.push({ key: key, value: value });\r\n\t\t\t\t\tif (!value.constant) {\r\n\t\t\t\t\t\tallConstant = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t} while (this.expect(','));\r\n\t\t\t}\r\n\t\t\tthis.consume('}');\r\n\r\n\t\t\treturn extend(function (self, locals) {\r\n\t\t\t\tvar object = {};\r\n\t\t\t\tfor (var i = 0; i < keyValues.length; i++) {\r\n\t\t\t\t\tvar keyValue = keyValues[i];\r\n\t\t\t\t\tobject[keyValue.key] = keyValue.value(self, locals);\r\n\t\t\t\t}\r\n\t\t\t\treturn object;\r\n\t\t\t}, {\r\n\t\t\t\tliteral: true,\r\n\t\t\t\tconstant: allConstant\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\r\n\t//////////////////////////////////////////////////\r\n\t// Parser helper functions\r\n\t//////////////////////////////////////////////////\r\n\r\n\tfunction setter(obj, path, setValue, fullExp, options) {\r\n\t\t//needed?\r\n\t\toptions = options || {};\r\n\r\n\t\tvar element = path.split('.'), key;\r\n\t\tfor (var i = 0; element.length > 1; i++) {\r\n\t\t\tkey = ensureSafeMemberName(element.shift(), fullExp);\r\n\t\t\tvar propertyObj = obj[key];\r\n\t\t\tif (!propertyObj) {\r\n\t\t\t\tpropertyObj = {};\r\n\t\t\t\tobj[key] = propertyObj;\r\n\t\t\t}\r\n\t\t\tobj = propertyObj;\r\n\t\t\tif (obj.then && options.unwrapPromises) {\r\n\t\t\t\tpromiseWarning(fullExp);\r\n\t\t\t\tif (!(\"$$v\" in obj)) {\r\n\t\t\t\t\t(function (promise) {\r\n\t\t\t\t\t\tpromise.then(function (val) { promise.$$v = val; });\r\n\t\t\t\t\t}\r\n\t\t\t\t\t)(obj);\r\n\t\t\t\t}\r\n\t\t\t\tif (obj.$$v === undefined) {\r\n\t\t\t\t\tobj.$$v = {};\r\n\t\t\t\t}\r\n\t\t\t\tobj = obj.$$v;\r\n\t\t\t}\r\n\t\t}\r\n\t\tkey = ensureSafeMemberName(element.shift(), fullExp);\r\n\t\tensureSafeObject(obj, fullExp);\r\n\t\tensureSafeObject(obj[key], fullExp);\r\n\t\tobj[key] = setValue;\r\n\t\treturn setValue;\r\n\t}\r\n\r\n\tvar getterFnCache = {};\r\n\r\n\t/**\r\n\t * Implementation of the \"Black Hole\" variant from:\r\n\t * - http://jsperf.com/angularjs-parse-getter/4\r\n\t * - http://jsperf.com/path-evaluation-simplified/7\r\n\t */\r\n\tfunction cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {\r\n\t\tensureSafeMemberName(key0, fullExp);\r\n\t\tensureSafeMemberName(key1, fullExp);\r\n\t\tensureSafeMemberName(key2, fullExp);\r\n\t\tensureSafeMemberName(key3, fullExp);\r\n\t\tensureSafeMemberName(key4, fullExp);\r\n\r\n\t\treturn !options.unwrapPromises\r\n\t\t\t? function cspSafeGetter(scope, locals) {\r\n\t\t\t\tvar pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope;\r\n\r\n\t\t\t\tif (pathVal == null) return pathVal;\r\n\t\t\t\tpathVal = pathVal[key0];\r\n\r\n\t\t\t\tif (!key1) return pathVal;\r\n\t\t\t\tif (pathVal == null) return undefined;\r\n\t\t\t\tpathVal = pathVal[key1];\r\n\r\n\t\t\t\tif (!key2) return pathVal;\r\n\t\t\t\tif (pathVal == null) return undefined;\r\n\t\t\t\tpathVal = pathVal[key2];\r\n\r\n\t\t\t\tif (!key3) return pathVal;\r\n\t\t\t\tif (pathVal == null) return undefined;\r\n\t\t\t\tpathVal = pathVal[key3];\r\n\r\n\t\t\t\tif (!key4) return pathVal;\r\n\t\t\t\tif (pathVal == null) return undefined;\r\n\t\t\t\tpathVal = pathVal[key4];\r\n\r\n\t\t\t\treturn pathVal;\r\n\t\t\t}\r\n\t\t\t: function cspSafePromiseEnabledGetter(scope, locals) {\r\n\t\t\t\tvar pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope,\r\n\t\t\t\t\tpromise;\r\n\r\n\t\t\t\tif (pathVal == null) return pathVal;\r\n\r\n\t\t\t\tpathVal = pathVal[key0];\r\n\t\t\t\tif (pathVal && pathVal.then) {\r\n\t\t\t\t\tpromiseWarning(fullExp);\r\n\t\t\t\t\tif (!(\"$$v\" in pathVal)) {\r\n\t\t\t\t\t\tpromise = pathVal;\r\n\t\t\t\t\t\tpromise.$$v = undefined;\r\n\t\t\t\t\t\tpromise.then(function (val) { promise.$$v = val; });\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpathVal = pathVal.$$v;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!key1) return pathVal;\r\n\t\t\t\tif (pathVal == null) return undefined;\r\n\t\t\t\tpathVal = pathVal[key1];\r\n\t\t\t\tif (pathVal && pathVal.then) {\r\n\t\t\t\t\tpromiseWarning(fullExp);\r\n\t\t\t\t\tif (!(\"$$v\" in pathVal)) {\r\n\t\t\t\t\t\tpromise = pathVal;\r\n\t\t\t\t\t\tpromise.$$v = undefined;\r\n\t\t\t\t\t\tpromise.then(function (val) { promise.$$v = val; });\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpathVal = pathVal.$$v;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!key2) return pathVal;\r\n\t\t\t\tif (pathVal == null) return undefined;\r\n\t\t\t\tpathVal = pathVal[key2];\r\n\t\t\t\tif (pathVal && pathVal.then) {\r\n\t\t\t\t\tpromiseWarning(fullExp);\r\n\t\t\t\t\tif (!(\"$$v\" in pathVal)) {\r\n\t\t\t\t\t\tpromise = pathVal;\r\n\t\t\t\t\t\tpromise.$$v = undefined;\r\n\t\t\t\t\t\tpromise.then(function (val) { promise.$$v = val; });\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpathVal = pathVal.$$v;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!key3) return pathVal;\r\n\t\t\t\tif (pathVal == null) return undefined;\r\n\t\t\t\tpathVal = pathVal[key3];\r\n\t\t\t\tif (pathVal && pathVal.then) {\r\n\t\t\t\t\tpromiseWarning(fullExp);\r\n\t\t\t\t\tif (!(\"$$v\" in pathVal)) {\r\n\t\t\t\t\t\tpromise = pathVal;\r\n\t\t\t\t\t\tpromise.$$v = undefined;\r\n\t\t\t\t\t\tpromise.then(function (val) { promise.$$v = val; });\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpathVal = pathVal.$$v;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!key4) return pathVal;\r\n\t\t\t\tif (pathVal == null) return undefined;\r\n\t\t\t\tpathVal = pathVal[key4];\r\n\t\t\t\tif (pathVal && pathVal.then) {\r\n\t\t\t\t\tpromiseWarning(fullExp);\r\n\t\t\t\t\tif (!(\"$$v\" in pathVal)) {\r\n\t\t\t\t\t\tpromise = pathVal;\r\n\t\t\t\t\t\tpromise.$$v = undefined;\r\n\t\t\t\t\t\tpromise.then(function (val) { promise.$$v = val; });\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpathVal = pathVal.$$v;\r\n\t\t\t\t}\r\n\t\t\t\treturn pathVal;\r\n\t\t\t};\r\n\t}\r\n\r\n\tfunction simpleGetterFn1(key0, fullExp) {\r\n\t\tensureSafeMemberName(key0, fullExp);\r\n\r\n\t\treturn function simpleGetterFn1(scope, locals) {\r\n\t\t\tif (scope == null) return undefined;\r\n\t\t\treturn ((locals && locals.hasOwnProperty(key0)) ? locals : scope)[key0];\r\n\t\t};\r\n\t}\r\n\r\n\tfunction simpleGetterFn2(key0, key1, fullExp) {\r\n\t\tensureSafeMemberName(key0, fullExp);\r\n\t\tensureSafeMemberName(key1, fullExp);\r\n\r\n\t\treturn function simpleGetterFn2(scope, locals) {\r\n\t\t\tif (scope == null) return undefined;\r\n\t\t\tscope = ((locals && locals.hasOwnProperty(key0)) ? locals : scope)[key0];\r\n\t\t\treturn scope == null ? undefined : scope[key1];\r\n\t\t};\r\n\t}\r\n\r\n\tfunction getterFn(path, options, fullExp) {\r\n\t\t// Check whether the cache has this getter already.\r\n\t\t// We can use hasOwnProperty directly on the cache because we ensure,\r\n\t\t// see below, that the cache never stores a path called 'hasOwnProperty'\r\n\t\tif (getterFnCache.hasOwnProperty(path)) {\r\n\t\t\treturn getterFnCache[path];\r\n\t\t}\r\n\r\n\t\tvar pathKeys = path.split('.'),\r\n\t\t\tpathKeysLength = pathKeys.length,\r\n\t\t\tfn;\r\n\r\n\t\t// When we have only 1 or 2 tokens, use optimized special case closures.\r\n\t\t// http://jsperf.com/angularjs-parse-getter/6\r\n\t\tif (!options.unwrapPromises && pathKeysLength === 1) {\r\n\t\t\tfn = simpleGetterFn1(pathKeys[0], fullExp);\r\n\t\t} else if (!options.unwrapPromises && pathKeysLength === 2) {\r\n\t\t\tfn = simpleGetterFn2(pathKeys[0], pathKeys[1], fullExp);\r\n\t\t} else if (options.csp) {\r\n\t\t\tif (pathKeysLength < 6) {\r\n\t\t\t\tfn = cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp,\r\n\t\t\t\t\t\t\t\t\toptions);\r\n\t\t\t} else {\r\n\t\t\t\tfn = function (scope, locals) {\r\n\t\t\t\t\tvar i = 0, val;\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tval = cspSafeGetterFn(pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++],\r\n\t\t\t\t\t\t\t\t\t\t\t pathKeys[i++], fullExp, options)(scope, locals);\r\n\r\n\t\t\t\t\t\tlocals = undefined; // clear after first iteration\r\n\t\t\t\t\t\tscope = val;\r\n\t\t\t\t\t} while (i < pathKeysLength);\r\n\t\t\t\t\treturn val;\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tvar code = 'var p;\\n';\r\n\t\t\tforEach(pathKeys, function (key, index) {\r\n\t\t\t\tensureSafeMemberName(key, fullExp);\r\n\t\t\t\tcode += 'if(s == null) return undefined;\\n' +\r\n\t\t\t\t\t\t's=' + (index\r\n\t\t\t\t\t\t\t\t// we simply dereference 's' on any .dot notation\r\n\t\t\t\t\t\t\t\t? 's'\r\n\t\t\t\t\t\t\t\t// but if we are first then we check locals first, and if so read it first\r\n\t\t\t\t\t\t\t\t: '((k&&k.hasOwnProperty(\"' + key + '\"))?k:s)') + '[\"' + key + '\"]' + ';\\n' +\r\n\t\t\t\t\t\t(options.unwrapPromises\r\n\t\t\t\t\t\t ? 'if (s && s.then) {\\n' +\r\n\t\t\t\t\t\t\t' pw(\"' + fullExp.replace(/([\"\\r\\n])/g, '\\\\$1') + '\");\\n' +\r\n\t\t\t\t\t\t\t' if (!(\"$$v\" in s)) {\\n' +\r\n\t\t\t\t\t\t\t ' p=s;\\n' +\r\n\t\t\t\t\t\t\t ' p.$$v = undefined;\\n' +\r\n\t\t\t\t\t\t\t ' p.then(function(v) {p.$$v=v;});\\n' +\r\n\t\t\t\t\t\t\t '}\\n' +\r\n\t\t\t\t\t\t\t' s=s.$$v\\n' +\r\n\t\t\t\t\t\t '}\\n'\r\n\t\t\t\t\t\t : '');\r\n\t\t\t});\r\n\t\t\tcode += 'return s;';\r\n\r\n\t\t\t/* jshint -W054 */\r\n\t\t\tvar evaledFnGetter = new Function('s', 'k', 'pw', code); // s=scope, k=locals, pw=promiseWarning\r\n\t\t\t/* jshint +W054 */\r\n\t\t\tevaledFnGetter.toString = valueFn(code);\r\n\t\t\tfn = options.unwrapPromises ? function (scope, locals) {\r\n\t\t\t\treturn evaledFnGetter(scope, locals, promiseWarning);\r\n\t\t\t} : evaledFnGetter;\r\n\t\t}\r\n\r\n\t\t// Only cache the value if it's not going to mess up the cache object\r\n\t\t// This is more performant that using Object.prototype.hasOwnProperty.call\r\n\t\tif (path !== 'hasOwnProperty') {\r\n\t\t\tgetterFnCache[path] = fn;\r\n\t\t}\r\n\t\treturn fn;\r\n\t}\r\n\r\n\t///////////////////////////////////\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $parse\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t *\r\n\t * Converts Angular {@link guide/expression expression} into a function.\r\n\t *\r\n\t * ```js\r\n\t * var getter = $parse('user.name');\r\n\t * var setter = getter.assign;\r\n\t * var context = {user:{name:'angular'}};\r\n\t * var locals = {user:{name:'local'}};\r\n\t *\r\n\t * expect(getter(context)).toEqual('angular');\r\n\t * setter(context, 'newValue');\r\n\t * expect(context.user.name).toEqual('newValue');\r\n\t * expect(getter(context, locals)).toEqual('local');\r\n\t * ```\r\n\t *\r\n\t *\r\n\t * @param {string} expression String expression to compile.\r\n\t * @returns {function(context, locals)} a function which represents the compiled expression:\r\n\t *\r\n\t * * `context` – `{object}` – an object against which any expressions embedded in the strings\r\n\t * are evaluated against (typically a scope object).\r\n\t * * `locals` – `{object=}` – local variables context object, useful for overriding values in\r\n\t * `context`.\r\n\t *\r\n\t * The returned function also has the following properties:\r\n\t * * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript\r\n\t * literal.\r\n\t * * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript\r\n\t * constant literals.\r\n\t * * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be\r\n\t * set to a function to change its value on the given context.\r\n\t *\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc provider\r\n\t * @name $parseProvider\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse}\r\n\t * service.\r\n\t */\r\n\tfunction $ParseProvider() {\r\n\t\tvar cache = {};\r\n\r\n\t\tvar $parseOptions = {\r\n\t\t\tcsp: false,\r\n\t\t\tunwrapPromises: false,\r\n\t\t\tlogPromiseWarnings: true\r\n\t\t};\r\n\r\n\r\n\t\t/**\r\n\t\t * @deprecated Promise unwrapping via $parse is deprecated and will be removed in the future.\r\n\t\t *\r\n\t\t * @ngdoc method\r\n\t\t * @name $parseProvider#unwrapPromises\r\n\t\t * @description\r\n\t\t *\r\n\t\t * **This feature is deprecated, see deprecation notes below for more info**\r\n\t\t *\r\n\t\t * If set to true (default is false), $parse will unwrap promises automatically when a promise is\r\n\t\t * found at any part of the expression. In other words, if set to true, the expression will always\r\n\t\t * result in a non-promise value.\r\n\t\t *\r\n\t\t * While the promise is unresolved, it's treated as undefined, but once resolved and fulfilled,\r\n\t\t * the fulfillment value is used in place of the promise while evaluating the expression.\r\n\t\t *\r\n\t\t * **Deprecation notice**\r\n\t\t *\r\n\t\t * This is a feature that didn't prove to be wildly useful or popular, primarily because of the\r\n\t\t * dichotomy between data access in templates (accessed as raw values) and controller code\r\n\t\t * (accessed as promises).\r\n\t\t *\r\n\t\t * In most code we ended up resolving promises manually in controllers anyway and thus unifying\r\n\t\t * the model access there.\r\n\t\t *\r\n\t\t * Other downsides of automatic promise unwrapping:\r\n\t\t *\r\n\t\t * - when building components it's often desirable to receive the raw promises\r\n\t\t * - adds complexity and slows down expression evaluation\r\n\t\t * - makes expression code pre-generation unattractive due to the amount of code that needs to be\r\n\t\t * generated\r\n\t\t * - makes IDE auto-completion and tool support hard\r\n\t\t *\r\n\t\t * **Warning Logs**\r\n\t\t *\r\n\t\t * If the unwrapping is enabled, Angular will log a warning about each expression that unwraps a\r\n\t\t * promise (to reduce the noise, each expression is logged only once). To disable this logging use\r\n\t\t * `$parseProvider.logPromiseWarnings(false)` api.\r\n\t\t *\r\n\t\t *\r\n\t\t * @param {boolean=} value New value.\r\n\t\t * @returns {boolean|self} Returns the current setting when used as getter and self if used as\r\n\t\t * setter.\r\n\t\t */\r\n\t\tthis.unwrapPromises = function (value) {\r\n\t\t\tif (isDefined(value)) {\r\n\t\t\t\t$parseOptions.unwrapPromises = !!value;\r\n\t\t\t\treturn this;\r\n\t\t\t} else {\r\n\t\t\t\treturn $parseOptions.unwrapPromises;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\t/**\r\n\t\t * @deprecated Promise unwrapping via $parse is deprecated and will be removed in the future.\r\n\t\t *\r\n\t\t * @ngdoc method\r\n\t\t * @name $parseProvider#logPromiseWarnings\r\n\t\t * @description\r\n\t\t *\r\n\t\t * Controls whether Angular should log a warning on any encounter of a promise in an expression.\r\n\t\t *\r\n\t\t * The default is set to `true`.\r\n\t\t *\r\n\t\t * This setting applies only if `$parseProvider.unwrapPromises` setting is set to true as well.\r\n\t\t *\r\n\t\t * @param {boolean=} value New value.\r\n\t\t * @returns {boolean|self} Returns the current setting when used as getter and self if used as\r\n\t\t * setter.\r\n\t\t */\r\n\t\tthis.logPromiseWarnings = function (value) {\r\n\t\t\tif (isDefined(value)) {\r\n\t\t\t\t$parseOptions.logPromiseWarnings = value;\r\n\t\t\t\treturn this;\r\n\t\t\t} else {\r\n\t\t\t\treturn $parseOptions.logPromiseWarnings;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\r\n\t\tthis.$get = ['$filter', '$sniffer', '$log', function ($filter, $sniffer, $log) {\r\n\t\t\t$parseOptions.csp = $sniffer.csp;\r\n\r\n\t\t\tpromiseWarning = function promiseWarningFn(fullExp) {\r\n\t\t\t\tif (!$parseOptions.logPromiseWarnings || promiseWarningCache.hasOwnProperty(fullExp)) return;\r\n\t\t\t\tpromiseWarningCache[fullExp] = true;\r\n\t\t\t\t$log.warn('[$parse] Promise found in the expression `' + fullExp + '`. ' +\r\n\t\t\t\t\t'Automatic unwrapping of promises in Angular expressions is deprecated.');\r\n\t\t\t};\r\n\r\n\t\t\treturn function (exp) {\r\n\t\t\t\tvar parsedExpression;\r\n\r\n\t\t\t\tswitch (typeof exp) {\r\n\t\t\t\t\tcase 'string':\r\n\r\n\t\t\t\t\t\tif (cache.hasOwnProperty(exp)) {\r\n\t\t\t\t\t\t\treturn cache[exp];\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tvar lexer = new Lexer($parseOptions);\r\n\t\t\t\t\t\tvar parser = new Parser(lexer, $filter, $parseOptions);\r\n\t\t\t\t\t\tparsedExpression = parser.parse(exp);\r\n\r\n\t\t\t\t\t\tif (exp !== 'hasOwnProperty') {\r\n\t\t\t\t\t\t\t// Only cache the value if it's not going to mess up the cache object\r\n\t\t\t\t\t\t\t// This is more performant that using Object.prototype.hasOwnProperty.call\r\n\t\t\t\t\t\t\tcache[exp] = parsedExpression;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn parsedExpression;\r\n\r\n\t\t\t\t\tcase 'function':\r\n\t\t\t\t\t\treturn exp;\r\n\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\treturn noop;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}];\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $q\r\n\t * @requires $rootScope\r\n\t *\r\n\t * @description\r\n\t * A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q).\r\n\t *\r\n\t * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an\r\n\t * interface for interacting with an object that represents the result of an action that is\r\n\t * performed asynchronously, and may or may not be finished at any given point in time.\r\n\t *\r\n\t * From the perspective of dealing with error handling, deferred and promise APIs are to\r\n\t * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming.\r\n\t *\r\n\t * ```js\r\n\t * // for the purpose of this example let's assume that variables `$q`, `scope` and `okToGreet`\r\n\t * // are available in the current lexical scope (they could have been injected or passed in).\r\n\t *\r\n\t * function asyncGreet(name) {\r\n\t * var deferred = $q.defer();\r\n\t *\r\n\t * setTimeout(function() {\r\n\t * deferred.notify('About to greet ' + name + '.');\r\n\t *\r\n\t * if (okToGreet(name)) {\r\n\t * deferred.resolve('Hello, ' + name + '!');\r\n\t * } else {\r\n\t * deferred.reject('Greeting ' + name + ' is not allowed.');\r\n\t * }\r\n\t * }, 1000);\r\n\t *\r\n\t * return deferred.promise;\r\n\t * }\r\n\t *\r\n\t * var promise = asyncGreet('Robin Hood');\r\n\t * promise.then(function(greeting) {\r\n\t * alert('Success: ' + greeting);\r\n\t * }, function(reason) {\r\n\t * alert('Failed: ' + reason);\r\n\t * }, function(update) {\r\n\t * alert('Got notification: ' + update);\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t * At first it might not be obvious why this extra complexity is worth the trouble. The payoff\r\n\t * comes in the way of guarantees that promise and deferred APIs make, see\r\n\t * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md.\r\n\t *\r\n\t * Additionally the promise api allows for composition that is very hard to do with the\r\n\t * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach.\r\n\t * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the\r\n\t * section on serial or parallel joining of promises.\r\n\t *\r\n\t *\r\n\t * # The Deferred API\r\n\t *\r\n\t * A new instance of deferred is constructed by calling `$q.defer()`.\r\n\t *\r\n\t * The purpose of the deferred object is to expose the associated Promise instance as well as APIs\r\n\t * that can be used for signaling the successful or unsuccessful completion, as well as the status\r\n\t * of the task.\r\n\t *\r\n\t * **Methods**\r\n\t *\r\n\t * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection\r\n\t * constructed via `$q.reject`, the promise will be rejected instead.\r\n\t * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to\r\n\t * resolving it with a rejection constructed via `$q.reject`.\r\n\t * - `notify(value)` - provides updates on the status of the promise's execution. This may be called\r\n\t * multiple times before the promise is either resolved or rejected.\r\n\t *\r\n\t * **Properties**\r\n\t *\r\n\t * - promise – `{Promise}` – promise object associated with this deferred.\r\n\t *\r\n\t *\r\n\t * # The Promise API\r\n\t *\r\n\t * A new promise instance is created when a deferred instance is created and can be retrieved by\r\n\t * calling `deferred.promise`.\r\n\t *\r\n\t * The purpose of the promise object is to allow for interested parties to get access to the result\r\n\t * of the deferred task when it completes.\r\n\t *\r\n\t * **Methods**\r\n\t *\r\n\t * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or\r\n\t * will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously\r\n\t * as soon as the result is available. The callbacks are called with a single argument: the result\r\n\t * or rejection reason. Additionally, the notify callback may be called zero or more times to\r\n\t * provide a progress indication, before the promise is resolved or rejected.\r\n\t *\r\n\t * This method *returns a new promise* which is resolved or rejected via the return value of the\r\n\t * `successCallback`, `errorCallback`. It also notifies via the return value of the\r\n\t * `notifyCallback` method. The promise can not be resolved or rejected from the notifyCallback\r\n\t * method.\r\n\t *\r\n\t * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)`\r\n\t *\r\n\t * - `finally(callback)` – allows you to observe either the fulfillment or rejection of a promise,\r\n\t * but to do so without modifying the final value. This is useful to release resources or do some\r\n\t * clean-up that needs to be done whether the promise was rejected or resolved. See the [full\r\n\t * specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for\r\n\t * more information.\r\n\t *\r\n\t * Because `finally` is a reserved word in JavaScript and reserved keywords are not supported as\r\n\t * property names by ES3, you'll need to invoke the method like `promise['finally'](callback)` to\r\n\t * make your code IE8 and Android 2.x compatible.\r\n\t *\r\n\t * # Chaining promises\r\n\t *\r\n\t * Because calling the `then` method of a promise returns a new derived promise, it is easily\r\n\t * possible to create a chain of promises:\r\n\t *\r\n\t * ```js\r\n\t * promiseB = promiseA.then(function(result) {\r\n\t * return result + 1;\r\n\t * });\r\n\t *\r\n\t * // promiseB will be resolved immediately after promiseA is resolved and its value\r\n\t * // will be the result of promiseA incremented by 1\r\n\t * ```\r\n\t *\r\n\t * It is possible to create chains of any length and since a promise can be resolved with another\r\n\t * promise (which will defer its resolution further), it is possible to pause/defer resolution of\r\n\t * the promises at any point in the chain. This makes it possible to implement powerful APIs like\r\n\t * $http's response interceptors.\r\n\t *\r\n\t *\r\n\t * # Differences between Kris Kowal's Q and $q\r\n\t *\r\n\t * There are two main differences:\r\n\t *\r\n\t * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation\r\n\t * mechanism in angular, which means faster propagation of resolution or rejection into your\r\n\t * models and avoiding unnecessary browser repaints, which would result in flickering UI.\r\n\t * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains\r\n\t * all the important functionality needed for common async tasks.\r\n\t *\r\n\t * # Testing\r\n\t *\r\n\t * ```js\r\n\t * it('should simulate promise', inject(function($q, $rootScope) {\r\n\t * var deferred = $q.defer();\r\n\t * var promise = deferred.promise;\r\n\t * var resolvedValue;\r\n\t *\r\n\t * promise.then(function(value) { resolvedValue = value; });\r\n\t * expect(resolvedValue).toBeUndefined();\r\n\t *\r\n\t * // Simulate resolving of promise\r\n\t * deferred.resolve(123);\r\n\t * // Note that the 'then' function does not get called synchronously.\r\n\t * // This is because we want the promise API to always be async, whether or not\r\n\t * // it got called synchronously or asynchronously.\r\n\t * expect(resolvedValue).toBeUndefined();\r\n\t *\r\n\t * // Propagate promise resolution to 'then' functions using $apply().\r\n\t * $rootScope.$apply();\r\n\t * expect(resolvedValue).toEqual(123);\r\n\t * }));\r\n\t * ```\r\n\t */\r\n\tfunction $QProvider() {\r\n\r\n\t\tthis.$get = ['$rootScope', '$exceptionHandler', function ($rootScope, $exceptionHandler) {\r\n\t\t\treturn qFactory(function (callback) {\r\n\t\t\t\t$rootScope.$evalAsync(callback);\r\n\t\t\t}, $exceptionHandler);\r\n\t\t}];\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * Constructs a promise manager.\r\n\t *\r\n\t * @param {function(Function)} nextTick Function for executing functions in the next turn.\r\n\t * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for\r\n\t * debugging purposes.\r\n\t * @returns {object} Promise manager.\r\n\t */\r\n\tfunction qFactory(nextTick, exceptionHandler) {\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $q#defer\r\n\t\t * @kind function\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Creates a `Deferred` object which represents a task which will finish in the future.\r\n\t\t *\r\n\t\t * @returns {Deferred} Returns a new instance of deferred.\r\n\t\t */\r\n\t\tvar defer = function () {\r\n\t\t\tvar pending = [],\r\n\t\t\t\tvalue, deferred;\r\n\r\n\t\t\tdeferred = {\r\n\r\n\t\t\t\tresolve: function (val) {\r\n\t\t\t\t\tif (pending) {\r\n\t\t\t\t\t\tvar callbacks = pending;\r\n\t\t\t\t\t\tpending = undefined;\r\n\t\t\t\t\t\tvalue = ref(val);\r\n\r\n\t\t\t\t\t\tif (callbacks.length) {\r\n\t\t\t\t\t\t\tnextTick(function () {\r\n\t\t\t\t\t\t\t\tvar callback;\r\n\t\t\t\t\t\t\t\tfor (var i = 0, ii = callbacks.length; i < ii; i++) {\r\n\t\t\t\t\t\t\t\t\tcallback = callbacks[i];\r\n\t\t\t\t\t\t\t\t\tvalue.then(callback[0], callback[1], callback[2]);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\r\n\t\t\t\treject: function (reason) {\r\n\t\t\t\t\tdeferred.resolve(createInternalRejectedPromise(reason));\r\n\t\t\t\t},\r\n\r\n\r\n\t\t\t\tnotify: function (progress) {\r\n\t\t\t\t\tif (pending) {\r\n\t\t\t\t\t\tvar callbacks = pending;\r\n\r\n\t\t\t\t\t\tif (pending.length) {\r\n\t\t\t\t\t\t\tnextTick(function () {\r\n\t\t\t\t\t\t\t\tvar callback;\r\n\t\t\t\t\t\t\t\tfor (var i = 0, ii = callbacks.length; i < ii; i++) {\r\n\t\t\t\t\t\t\t\t\tcallback = callbacks[i];\r\n\t\t\t\t\t\t\t\t\tcallback[2](progress);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\r\n\r\n\t\t\t\tpromise: {\r\n\t\t\t\t\tthen: function (callback, errback, progressback) {\r\n\t\t\t\t\t\tvar result = defer();\r\n\r\n\t\t\t\t\t\tvar wrappedCallback = function (value) {\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tresult.resolve((isFunction(callback) ? callback : defaultCallback)(value));\r\n\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\tresult.reject(e);\r\n\t\t\t\t\t\t\t\texceptionHandler(e);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\tvar wrappedErrback = function (reason) {\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tresult.resolve((isFunction(errback) ? errback : defaultErrback)(reason));\r\n\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\tresult.reject(e);\r\n\t\t\t\t\t\t\t\texceptionHandler(e);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\tvar wrappedProgressback = function (progress) {\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tresult.notify((isFunction(progressback) ? progressback : defaultCallback)(progress));\r\n\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\texceptionHandler(e);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\tif (pending) {\r\n\t\t\t\t\t\t\tpending.push([wrappedCallback, wrappedErrback, wrappedProgressback]);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tvalue.then(wrappedCallback, wrappedErrback, wrappedProgressback);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn result.promise;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t\"catch\": function (callback) {\r\n\t\t\t\t\t\treturn this.then(null, callback);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t\"finally\": function (callback) {\r\n\r\n\t\t\t\t\t\tfunction makePromise(value, resolved) {\r\n\t\t\t\t\t\t\tvar result = defer();\r\n\t\t\t\t\t\t\tif (resolved) {\r\n\t\t\t\t\t\t\t\tresult.resolve(value);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tresult.reject(value);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn result.promise;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfunction handleCallback(value, isResolved) {\r\n\t\t\t\t\t\t\tvar callbackOutput = null;\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tcallbackOutput = (callback || defaultCallback)();\r\n\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\treturn makePromise(e, false);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (callbackOutput && isFunction(callbackOutput.then)) {\r\n\t\t\t\t\t\t\t\treturn callbackOutput.then(function () {\r\n\t\t\t\t\t\t\t\t\treturn makePromise(value, isResolved);\r\n\t\t\t\t\t\t\t\t}, function (error) {\r\n\t\t\t\t\t\t\t\t\treturn makePromise(error, false);\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\treturn makePromise(value, isResolved);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn this.then(function (value) {\r\n\t\t\t\t\t\t\treturn handleCallback(value, true);\r\n\t\t\t\t\t\t}, function (error) {\r\n\t\t\t\t\t\t\treturn handleCallback(error, false);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\treturn deferred;\r\n\t\t};\r\n\r\n\r\n\t\tvar ref = function (value) {\r\n\t\t\tif (value && isFunction(value.then)) return value;\r\n\t\t\treturn {\r\n\t\t\t\tthen: function (callback) {\r\n\t\t\t\t\tvar result = defer();\r\n\t\t\t\t\tnextTick(function () {\r\n\t\t\t\t\t\tresult.resolve(callback(value));\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn result.promise;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $q#reject\r\n\t\t * @kind function\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Creates a promise that is resolved as rejected with the specified `reason`. This api should be\r\n\t\t * used to forward rejection in a chain of promises. If you are dealing with the last promise in\r\n\t\t * a promise chain, you don't need to worry about it.\r\n\t\t *\r\n\t\t * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of\r\n\t\t * `reject` as the `throw` keyword in JavaScript. This also means that if you \"catch\" an error via\r\n\t\t * a promise error callback and you want to forward the error to the promise derived from the\r\n\t\t * current promise, you have to \"rethrow\" the error by returning a rejection constructed via\r\n\t\t * `reject`.\r\n\t\t *\r\n\t\t * ```js\r\n\t\t * promiseB = promiseA.then(function(result) {\r\n\t\t * // success: do something and resolve promiseB\r\n\t\t * // with the old or a new result\r\n\t\t * return result;\r\n\t\t * }, function(reason) {\r\n\t\t * // error: handle the error if possible and\r\n\t\t * // resolve promiseB with newPromiseOrValue,\r\n\t\t * // otherwise forward the rejection to promiseB\r\n\t\t * if (canHandle(reason)) {\r\n\t\t * // handle the error and recover\r\n\t\t * return newPromiseOrValue;\r\n\t\t * }\r\n\t\t * return $q.reject(reason);\r\n\t\t * });\r\n\t\t * ```\r\n\t\t *\r\n\t\t * @param {*} reason Constant, message, exception or an object representing the rejection reason.\r\n\t\t * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.\r\n\t\t */\r\n\t\tvar reject = function (reason) {\r\n\t\t\tvar result = defer();\r\n\t\t\tresult.reject(reason);\r\n\t\t\treturn result.promise;\r\n\t\t};\r\n\r\n\t\tvar createInternalRejectedPromise = function (reason) {\r\n\t\t\treturn {\r\n\t\t\t\tthen: function (callback, errback) {\r\n\t\t\t\t\tvar result = defer();\r\n\t\t\t\t\tnextTick(function () {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tresult.resolve((isFunction(errback) ? errback : defaultErrback)(reason));\r\n\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\tresult.reject(e);\r\n\t\t\t\t\t\t\texceptionHandler(e);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn result.promise;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $q#when\r\n\t\t * @kind function\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.\r\n\t\t * This is useful when you are dealing with an object that might or might not be a promise, or if\r\n\t\t * the promise comes from a source that can't be trusted.\r\n\t\t *\r\n\t\t * @param {*} value Value or a promise\r\n\t\t * @returns {Promise} Returns a promise of the passed value or promise\r\n\t\t */\r\n\t\tvar when = function (value, callback, errback, progressback) {\r\n\t\t\tvar result = defer(),\r\n\t\t\t\tdone;\r\n\r\n\t\t\tvar wrappedCallback = function (value) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\treturn (isFunction(callback) ? callback : defaultCallback)(value);\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\texceptionHandler(e);\r\n\t\t\t\t\treturn reject(e);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tvar wrappedErrback = function (reason) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\treturn (isFunction(errback) ? errback : defaultErrback)(reason);\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\texceptionHandler(e);\r\n\t\t\t\t\treturn reject(e);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tvar wrappedProgressback = function (progress) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\treturn (isFunction(progressback) ? progressback : defaultCallback)(progress);\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\texceptionHandler(e);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tnextTick(function () {\r\n\t\t\t\tref(value).then(function (value) {\r\n\t\t\t\t\tif (done) return;\r\n\t\t\t\t\tdone = true;\r\n\t\t\t\t\tresult.resolve(ref(value).then(wrappedCallback, wrappedErrback, wrappedProgressback));\r\n\t\t\t\t}, function (reason) {\r\n\t\t\t\t\tif (done) return;\r\n\t\t\t\t\tdone = true;\r\n\t\t\t\t\tresult.resolve(wrappedErrback(reason));\r\n\t\t\t\t}, function (progress) {\r\n\t\t\t\t\tif (done) return;\r\n\t\t\t\t\tresult.notify(wrappedProgressback(progress));\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\treturn result.promise;\r\n\t\t};\r\n\r\n\r\n\t\tfunction defaultCallback(value) {\r\n\t\t\treturn value;\r\n\t\t}\r\n\r\n\r\n\t\tfunction defaultErrback(reason) {\r\n\t\t\treturn reject(reason);\r\n\t\t}\r\n\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $q#all\r\n\t\t * @kind function\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Combines multiple promises into a single promise that is resolved when all of the input\r\n\t\t * promises are resolved.\r\n\t\t *\r\n\t\t * @param {Array.<Promise>|Object.<Promise>} promises An array or hash of promises.\r\n\t\t * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values,\r\n\t\t * each value corresponding to the promise at the same index/key in the `promises` array/hash.\r\n\t\t * If any of the promises is resolved with a rejection, this resulting promise will be rejected\r\n\t\t * with the same rejection value.\r\n\t\t */\r\n\t\tfunction all(promises) {\r\n\t\t\tvar deferred = defer(),\r\n\t\t\t\tcounter = 0,\r\n\t\t\t\tresults = isArray(promises) ? [] : {};\r\n\r\n\t\t\tforEach(promises, function (promise, key) {\r\n\t\t\t\tcounter++;\r\n\t\t\t\tref(promise).then(function (value) {\r\n\t\t\t\t\tif (results.hasOwnProperty(key)) return;\r\n\t\t\t\t\tresults[key] = value;\r\n\t\t\t\t\tif (!(--counter)) deferred.resolve(results);\r\n\t\t\t\t}, function (reason) {\r\n\t\t\t\t\tif (results.hasOwnProperty(key)) return;\r\n\t\t\t\t\tdeferred.reject(reason);\r\n\t\t\t\t});\r\n\t\t\t});\r\n\r\n\t\t\tif (counter === 0) {\r\n\t\t\t\tdeferred.resolve(results);\r\n\t\t\t}\r\n\r\n\t\t\treturn deferred.promise;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tdefer: defer,\r\n\t\t\treject: reject,\r\n\t\t\twhen: when,\r\n\t\t\tall: all\r\n\t\t};\r\n\t}\r\n\r\n\tfunction $$RAFProvider() { //rAF\r\n\t\tthis.$get = ['$window', '$timeout', function ($window, $timeout) {\r\n\t\t\tvar requestAnimationFrame = $window.requestAnimationFrame ||\r\n\t\t\t\t\t\t\t\t\t\t$window.webkitRequestAnimationFrame ||\r\n\t\t\t\t\t\t\t\t\t\t$window.mozRequestAnimationFrame;\r\n\r\n\t\t\tvar cancelAnimationFrame = $window.cancelAnimationFrame ||\r\n\t\t\t\t\t\t\t\t\t $window.webkitCancelAnimationFrame ||\r\n\t\t\t\t\t\t\t\t\t $window.mozCancelAnimationFrame ||\r\n\t\t\t\t\t\t\t\t\t $window.webkitCancelRequestAnimationFrame;\r\n\r\n\t\t\tvar rafSupported = !!requestAnimationFrame;\r\n\t\t\tvar raf = rafSupported\r\n\t\t\t ? function (fn) {\r\n\t\t\t \tvar id = requestAnimationFrame(fn);\r\n\t\t\t \treturn function () {\r\n\t\t\t \t\tcancelAnimationFrame(id);\r\n\t\t\t \t};\r\n\t\t\t }\r\n\t\t\t : function (fn) {\r\n\t\t\t \tvar timer = $timeout(fn, 16.66, false); // 1000 / 60 = 16.666\r\n\t\t\t \treturn function () {\r\n\t\t\t \t\t$timeout.cancel(timer);\r\n\t\t\t \t};\r\n\t\t\t };\r\n\r\n\t\t\traf.supported = rafSupported;\r\n\r\n\t\t\treturn raf;\r\n\t\t}];\r\n\t}\r\n\r\n\t/**\r\n\t * DESIGN NOTES\r\n\t *\r\n\t * The design decisions behind the scope are heavily favored for speed and memory consumption.\r\n\t *\r\n\t * The typical use of scope is to watch the expressions, which most of the time return the same\r\n\t * value as last time so we optimize the operation.\r\n\t *\r\n\t * Closures construction is expensive in terms of speed as well as memory:\r\n\t * - No closures, instead use prototypical inheritance for API\r\n\t * - Internal state needs to be stored on scope directly, which means that private state is\r\n\t * exposed as $$____ properties\r\n\t *\r\n\t * Loop operations are optimized by using while(count--) { ... }\r\n\t * - this means that in order to keep the same order of execution as addition we have to add\r\n\t * items to the array at the beginning (unshift) instead of at the end (push)\r\n\t *\r\n\t * Child scopes are created and removed often\r\n\t * - Using an array would be slow since inserts in middle are expensive so we use linked list\r\n\t *\r\n\t * There are few watches then a lot of observers. This is why you don't want the observer to be\r\n\t * implemented in the same way as watch. Watch requires return of initialization function which\r\n\t * are expensive to construct.\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc provider\r\n\t * @name $rootScopeProvider\r\n\t * @description\r\n\t *\r\n\t * Provider for the $rootScope service.\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $rootScopeProvider#digestTtl\r\n\t * @description\r\n\t *\r\n\t * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and\r\n\t * assuming that the model is unstable.\r\n\t *\r\n\t * The current default is 10 iterations.\r\n\t *\r\n\t * In complex applications it's possible that the dependencies between `$watch`s will result in\r\n\t * several digest iterations. However if an application needs more than the default 10 digest\r\n\t * iterations for its model to stabilize then you should investigate what is causing the model to\r\n\t * continuously change during the digest.\r\n\t *\r\n\t * Increasing the TTL could have performance implications, so you should not change it without\r\n\t * proper justification.\r\n\t *\r\n\t * @param {number} limit The number of digest iterations.\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $rootScope\r\n\t * @description\r\n\t *\r\n\t * Every application has a single root {@link ng.$rootScope.Scope scope}.\r\n\t * All other scopes are descendant scopes of the root scope. Scopes provide separation\r\n\t * between the model and the view, via a mechanism for watching the model for changes.\r\n\t * They also provide an event emission/broadcast and subscription facility. See the\r\n\t * {@link guide/scope developer guide on scopes}.\r\n\t */\r\n\tfunction $RootScopeProvider() {\r\n\t\tvar TTL = 10;\r\n\t\tvar $rootScopeMinErr = minErr('$rootScope');\r\n\t\tvar lastDirtyWatch = null;\r\n\r\n\t\tthis.digestTtl = function (value) {\r\n\t\t\tif (arguments.length) {\r\n\t\t\t\tTTL = value;\r\n\t\t\t}\r\n\t\t\treturn TTL;\r\n\t\t};\r\n\r\n\t\tthis.$get = ['$injector', '$exceptionHandler', '$parse', '$browser',\r\n\t\t\tfunction ($injector, $exceptionHandler, $parse, $browser) {\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc type\r\n\t\t\t\t * @name $rootScope.Scope\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the\r\n\t\t\t\t * {@link auto.$injector $injector}. Child scopes are created using the\r\n\t\t\t\t * {@link ng.$rootScope.Scope#$new $new()} method. (Most scopes are created automatically when\r\n\t\t\t\t * compiled HTML template is executed.)\r\n\t\t\t\t *\r\n\t\t\t\t * Here is a simple scope snippet to show how you can interact with the scope.\r\n\t\t\t\t * ```html\r\n\t\t\t\t * <file src=\"./test/ng/rootScopeSpec.js\" tag=\"docs1\" />\r\n\t\t\t\t * ```\r\n\t\t\t\t *\r\n\t\t\t\t * # Inheritance\r\n\t\t\t\t * A scope can inherit from a parent scope, as in this example:\r\n\t\t\t\t * ```js\r\n\t\t\t\t\t var parent = $rootScope;\r\n\t\t\t\t\t var child = parent.$new();\r\n\t\t\t\r\n\t\t\t\t\t parent.salutation = \"Hello\";\r\n\t\t\t\t\t child.name = \"World\";\r\n\t\t\t\t\t expect(child.salutation).toEqual('Hello');\r\n\t\t\t\r\n\t\t\t\t\t child.salutation = \"Welcome\";\r\n\t\t\t\t\t expect(child.salutation).toEqual('Welcome');\r\n\t\t\t\t\t expect(parent.salutation).toEqual('Hello');\r\n\t\t\t\t * ```\r\n\t\t\t\t *\r\n\t\t\t\t *\r\n\t\t\t\t * @param {Object.<string, function()>=} providers Map of service factory which need to be\r\n\t\t\t\t * provided for the current scope. Defaults to {@link ng}.\r\n\t\t\t\t * @param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should\r\n\t\t\t\t * append/override services provided by `providers`. This is handy\r\n\t\t\t\t * when unit-testing and having the need to override a default\r\n\t\t\t\t * service.\r\n\t\t\t\t * @returns {Object} Newly created scope.\r\n\t\t\t\t *\r\n\t\t\t\t */\r\n\t\t\t\tfunction Scope() {\r\n\t\t\t\t\tthis.$id = nextUid();\r\n\t\t\t\t\tthis.$$phase = this.$parent = this.$$watchers =\r\n\t\t\t\t\t\t\t\t this.$$nextSibling = this.$$prevSibling =\r\n\t\t\t\t\t\t\t\t this.$$childHead = this.$$childTail = null;\r\n\t\t\t\t\tthis['this'] = this.$root = this;\r\n\t\t\t\t\tthis.$$destroyed = false;\r\n\t\t\t\t\tthis.$$asyncQueue = [];\r\n\t\t\t\t\tthis.$$postDigestQueue = [];\r\n\t\t\t\t\tthis.$$listeners = {};\r\n\t\t\t\t\tthis.$$listenerCount = {};\r\n\t\t\t\t\tthis.$$isolateBindings = {};\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * @ngdoc property\r\n\t\t\t\t * @name $rootScope.Scope#$id\r\n\t\t\t\t * @returns {number} Unique scope ID (monotonically increasing alphanumeric sequence) useful for\r\n\t\t\t\t * debugging.\r\n\t\t\t\t */\r\n\r\n\r\n\t\t\t\tScope.prototype = {\r\n\t\t\t\t\tconstructor: Scope,\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $rootScope.Scope#$new\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Creates a new child {@link ng.$rootScope.Scope scope}.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * The parent scope will propagate the {@link ng.$rootScope.Scope#$digest $digest()} and\r\n\t\t\t\t\t * {@link ng.$rootScope.Scope#$digest $digest()} events. The scope can be removed from the\r\n\t\t\t\t\t * scope hierarchy using {@link ng.$rootScope.Scope#$destroy $destroy()}.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * {@link ng.$rootScope.Scope#$destroy $destroy()} must be called on a scope when it is\r\n\t\t\t\t\t * desired for the scope and its child scopes to be permanently detached from the parent and\r\n\t\t\t\t\t * thus stop participating in model change detection and listener notification by invoking.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {boolean} isolate If true, then the scope does not prototypically inherit from the\r\n\t\t\t\t\t * parent scope. The scope is isolated, as it can not see parent scope properties.\r\n\t\t\t\t\t * When creating widgets, it is useful for the widget to not accidentally read parent\r\n\t\t\t\t\t * state.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @returns {Object} The newly created child scope.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t */\r\n\t\t\t\t\t$new: function (isolate) {\r\n\t\t\t\t\t\tvar ChildScope,\r\n\t\t\t\t\t\t\tchild;\r\n\r\n\t\t\t\t\t\tif (isolate) {\r\n\t\t\t\t\t\t\tchild = new Scope();\r\n\t\t\t\t\t\t\tchild.$root = this.$root;\r\n\t\t\t\t\t\t\t// ensure that there is just one async queue per $rootScope and its children\r\n\t\t\t\t\t\t\tchild.$$asyncQueue = this.$$asyncQueue;\r\n\t\t\t\t\t\t\tchild.$$postDigestQueue = this.$$postDigestQueue;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// Only create a child scope class if somebody asks for one,\r\n\t\t\t\t\t\t\t// but cache it to allow the VM to optimize lookups.\r\n\t\t\t\t\t\t\tif (!this.$$childScopeClass) {\r\n\t\t\t\t\t\t\t\tthis.$$childScopeClass = function () {\r\n\t\t\t\t\t\t\t\t\tthis.$$watchers = this.$$nextSibling =\r\n\t\t\t\t\t\t\t\t\t\tthis.$$childHead = this.$$childTail = null;\r\n\t\t\t\t\t\t\t\t\tthis.$$listeners = {};\r\n\t\t\t\t\t\t\t\t\tthis.$$listenerCount = {};\r\n\t\t\t\t\t\t\t\t\tthis.$id = nextUid();\r\n\t\t\t\t\t\t\t\t\tthis.$$childScopeClass = null;\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\tthis.$$childScopeClass.prototype = this;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tchild = new this.$$childScopeClass();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tchild['this'] = child;\r\n\t\t\t\t\t\tchild.$parent = this;\r\n\t\t\t\t\t\tchild.$$prevSibling = this.$$childTail;\r\n\t\t\t\t\t\tif (this.$$childHead) {\r\n\t\t\t\t\t\t\tthis.$$childTail.$$nextSibling = child;\r\n\t\t\t\t\t\t\tthis.$$childTail = child;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tthis.$$childHead = this.$$childTail = child;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn child;\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $rootScope.Scope#$watch\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Registers a `listener` callback to be executed whenever the `watchExpression` changes.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest\r\n\t\t\t\t\t * $digest()} and should return the value that will be watched. (Since\r\n\t\t\t\t\t * {@link ng.$rootScope.Scope#$digest $digest()} reruns when it detects changes the\r\n\t\t\t\t\t * `watchExpression` can execute multiple times per\r\n\t\t\t\t\t * {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.)\r\n\t\t\t\t\t * - The `listener` is called only when the value from the current `watchExpression` and the\r\n\t\t\t\t\t * previous call to `watchExpression` are not equal (with the exception of the initial run,\r\n\t\t\t\t\t * see below). Inequality is determined according to reference inequality,\r\n\t\t\t\t\t * [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators)\r\n\t\t\t\t\t * via the `!==` Javascript operator, unless `objectEquality == true`\r\n\t\t\t\t\t * (see next point)\r\n\t\t\t\t\t * - When `objectEquality == true`, inequality of the `watchExpression` is determined\r\n\t\t\t\t\t * according to the {@link angular.equals} function. To save the value of the object for\r\n\t\t\t\t\t * later comparison, the {@link angular.copy} function is used. This therefore means that\r\n\t\t\t\t\t * watching complex objects will have adverse memory and performance implications.\r\n\t\t\t\t\t * - The watch `listener` may change the model, which may trigger other `listener`s to fire.\r\n\t\t\t\t\t * This is achieved by rerunning the watchers until no changes are detected. The rerun\r\n\t\t\t\t\t * iteration limit is 10 to prevent an infinite loop deadlock.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * If you want to be notified whenever {@link ng.$rootScope.Scope#$digest $digest} is called,\r\n\t\t\t\t\t * you can register a `watchExpression` function with no `listener`. (Since `watchExpression`\r\n\t\t\t\t\t * can execute multiple times per {@link ng.$rootScope.Scope#$digest $digest} cycle when a\r\n\t\t\t\t\t * change is detected, be prepared for multiple calls to your listener.)\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * After a watcher is registered with the scope, the `listener` fn is called asynchronously\r\n\t\t\t\t\t * (via {@link ng.$rootScope.Scope#$evalAsync $evalAsync}) to initialize the\r\n\t\t\t\t\t * watcher. In rare cases, this is undesirable because the listener is called when the result\r\n\t\t\t\t\t * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you\r\n\t\t\t\t\t * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the\r\n\t\t\t\t\t * listener was called due to initialization.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * The example below contains an illustration of using a function as your $watch listener\r\n\t\t\t\t\t *\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * # Example\r\n\t\t\t\t\t * ```js\r\n\t\t\t\t\t\t // let's assume that scope was dependency injected as the $rootScope\r\n\t\t\t\t\t\t var scope = $rootScope;\r\n\t\t\t\t\t\t scope.name = 'misko';\r\n\t\t\t\t\t\t scope.counter = 0;\r\n\t\t\t \r\n\t\t\t\t\t\t expect(scope.counter).toEqual(0);\r\n\t\t\t\t\t\t scope.$watch('name', function(newValue, oldValue) {\r\n\t\t\t\t\t\t scope.counter = scope.counter + 1;\r\n\t\t\t\t\t\t });\r\n\t\t\t\t\t\t expect(scope.counter).toEqual(0);\r\n\t\t\t \r\n\t\t\t\t\t\t scope.$digest();\r\n\t\t\t\t\t\t // the listener is always called during the first $digest loop after it was registered\r\n\t\t\t\t\t\t expect(scope.counter).toEqual(1);\r\n\t\t\t \r\n\t\t\t\t\t\t scope.$digest();\r\n\t\t\t\t\t\t // but now it will not be called unless the value changes\r\n\t\t\t\t\t\t expect(scope.counter).toEqual(1);\r\n\t\t\t \r\n\t\t\t\t\t\t scope.name = 'adam';\r\n\t\t\t\t\t\t scope.$digest();\r\n\t\t\t\t\t\t expect(scope.counter).toEqual(2);\r\n\t\t\t \r\n\t\t\t \r\n\t\t\t \r\n\t\t\t\t\t\t // Using a listener function\r\n\t\t\t\t\t\t var food;\r\n\t\t\t\t\t\t scope.foodCounter = 0;\r\n\t\t\t\t\t\t expect(scope.foodCounter).toEqual(0);\r\n\t\t\t\t\t\t scope.$watch(\r\n\t\t\t\t\t\t // This is the listener function\r\n\t\t\t\t\t\t function() { return food; },\r\n\t\t\t\t\t\t // This is the change handler\r\n\t\t\t\t\t\t function(newValue, oldValue) {\r\n\t\t\t\t\t\t\t if ( newValue !== oldValue ) {\r\n\t\t\t\t\t\t\t // Only increment the counter if the value changed\r\n\t\t\t\t\t\t\t scope.foodCounter = scope.foodCounter + 1;\r\n\t\t\t\t\t\t\t }\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t );\r\n\t\t\t\t\t\t // No digest has been run so the counter will be zero\r\n\t\t\t\t\t\t expect(scope.foodCounter).toEqual(0);\r\n\t\t\t \r\n\t\t\t\t\t\t // Run the digest but since food has not changed count will still be zero\r\n\t\t\t\t\t\t scope.$digest();\r\n\t\t\t\t\t\t expect(scope.foodCounter).toEqual(0);\r\n\t\t\t \r\n\t\t\t\t\t\t // Update food and run digest. Now the counter will increment\r\n\t\t\t\t\t\t food = 'cheeseburger';\r\n\t\t\t\t\t\t scope.$digest();\r\n\t\t\t\t\t\t expect(scope.foodCounter).toEqual(1);\r\n\t\t\t \r\n\t\t\t\t\t * ```\r\n\t\t\t\t\t *\r\n\t\t\t\t\t *\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {(function()|string)} watchExpression Expression that is evaluated on each\r\n\t\t\t\t\t * {@link ng.$rootScope.Scope#$digest $digest} cycle. A change in the return value triggers\r\n\t\t\t\t\t * a call to the `listener`.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * - `string`: Evaluated as {@link guide/expression expression}\r\n\t\t\t\t\t * - `function(scope)`: called with current `scope` as a parameter.\r\n\t\t\t\t\t * @param {(function()|string)=} listener Callback called whenever the return value of\r\n\t\t\t\t\t * the `watchExpression` changes.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * - `string`: Evaluated as {@link guide/expression expression}\r\n\t\t\t\t\t * - `function(newValue, oldValue, scope)`: called with current and previous values as\r\n\t\t\t\t\t * parameters.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {boolean=} objectEquality Compare for object equality using {@link angular.equals} instead of\r\n\t\t\t\t\t * comparing for reference equality.\r\n\t\t\t\t\t * @returns {function()} Returns a deregistration function for this listener.\r\n\t\t\t\t\t */\r\n\t\t\t\t\t$watch: function (watchExp, listener, objectEquality) {\r\n\t\t\t\t\t\tvar scope = this,\r\n\t\t\t\t\t\t\tget = compileToFn(watchExp, 'watch'),\r\n\t\t\t\t\t\t\tarray = scope.$$watchers,\r\n\t\t\t\t\t\t\twatcher = {\r\n\t\t\t\t\t\t\t\tfn: listener,\r\n\t\t\t\t\t\t\t\tlast: initWatchVal,\r\n\t\t\t\t\t\t\t\tget: get,\r\n\t\t\t\t\t\t\t\texp: watchExp,\r\n\t\t\t\t\t\t\t\teq: !!objectEquality\r\n\t\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\tlastDirtyWatch = null;\r\n\r\n\t\t\t\t\t\t// in the case user pass string, we need to compile it, do we really need this ?\r\n\t\t\t\t\t\tif (!isFunction(listener)) {\r\n\t\t\t\t\t\t\tvar listenFn = compileToFn(listener || noop, 'listener');\r\n\t\t\t\t\t\t\twatcher.fn = function (newVal, oldVal, scope) { listenFn(scope); };\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (typeof watchExp == 'string' && get.constant) {\r\n\t\t\t\t\t\t\tvar originalFn = watcher.fn;\r\n\t\t\t\t\t\t\twatcher.fn = function (newVal, oldVal, scope) {\r\n\t\t\t\t\t\t\t\toriginalFn.call(this, newVal, oldVal, scope);\r\n\t\t\t\t\t\t\t\tarrayRemove(array, watcher);\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (!array) {\r\n\t\t\t\t\t\t\tarray = scope.$$watchers = [];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// we use unshift since we use a while loop in $digest for speed.\r\n\t\t\t\t\t\t// the while loop reads in reverse order.\r\n\t\t\t\t\t\tarray.unshift(watcher);\r\n\r\n\t\t\t\t\t\treturn function deregisterWatch() {\r\n\t\t\t\t\t\t\tarrayRemove(array, watcher);\r\n\t\t\t\t\t\t\tlastDirtyWatch = null;\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t},\r\n\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $rootScope.Scope#$watchCollection\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Shallow watches the properties of an object and fires whenever any of the properties change\r\n\t\t\t\t\t * (for arrays, this implies watching the array items; for object maps, this implies watching\r\n\t\t\t\t\t * the properties). If a change is detected, the `listener` callback is fired.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * - The `obj` collection is observed via standard $watch operation and is examined on every\r\n\t\t\t\t\t * call to $digest() to see if any items have been added, removed, or moved.\r\n\t\t\t\t\t * - The `listener` is called whenever anything within the `obj` has changed. Examples include\r\n\t\t\t\t\t * adding, removing, and moving items belonging to an object or array.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * # Example\r\n\t\t\t\t\t * ```js\r\n\t\t\t\t\t\t$scope.names = ['igor', 'matias', 'misko', 'james'];\r\n\t\t\t\t\t\t$scope.dataCount = 4;\r\n\t\t\t \r\n\t\t\t\t\t\t$scope.$watchCollection('names', function(newNames, oldNames) {\r\n\t\t\t\t\t\t $scope.dataCount = newNames.length;\r\n\t\t\t\t\t\t});\r\n\t\t\t \r\n\t\t\t\t\t\texpect($scope.dataCount).toEqual(4);\r\n\t\t\t\t\t\t$scope.$digest();\r\n\t\t\t \r\n\t\t\t\t\t\t//still at 4 ... no changes\r\n\t\t\t\t\t\texpect($scope.dataCount).toEqual(4);\r\n\t\t\t \r\n\t\t\t\t\t\t$scope.names.pop();\r\n\t\t\t\t\t\t$scope.$digest();\r\n\t\t\t \r\n\t\t\t\t\t\t//now there's been a change\r\n\t\t\t\t\t\texpect($scope.dataCount).toEqual(3);\r\n\t\t\t\t\t * ```\r\n\t\t\t\t\t *\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {string|function(scope)} obj Evaluated as {@link guide/expression expression}. The\r\n\t\t\t\t\t * expression value should evaluate to an object or an array which is observed on each\r\n\t\t\t\t\t * {@link ng.$rootScope.Scope#$digest $digest} cycle. Any shallow change within the\r\n\t\t\t\t\t * collection will trigger a call to the `listener`.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {function(newCollection, oldCollection, scope)} listener a callback function called\r\n\t\t\t\t\t * when a change is detected.\r\n\t\t\t\t\t * - The `newCollection` object is the newly modified data obtained from the `obj` expression\r\n\t\t\t\t\t * - The `oldCollection` object is a copy of the former collection data.\r\n\t\t\t\t\t * Due to performance considerations, the`oldCollection` value is computed only if the\r\n\t\t\t\t\t * `listener` function declares two or more arguments.\r\n\t\t\t\t\t * - The `scope` argument refers to the current scope.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @returns {function()} Returns a de-registration function for this listener. When the\r\n\t\t\t\t\t * de-registration function is executed, the internal watch operation is terminated.\r\n\t\t\t\t\t */\r\n\t\t\t\t\t$watchCollection: function (obj, listener) {\r\n\t\t\t\t\t\tvar self = this;\r\n\t\t\t\t\t\t// the current value, updated on each dirty-check run\r\n\t\t\t\t\t\tvar newValue;\r\n\t\t\t\t\t\t// a shallow copy of the newValue from the last dirty-check run,\r\n\t\t\t\t\t\t// updated to match newValue during dirty-check run\r\n\t\t\t\t\t\tvar oldValue;\r\n\t\t\t\t\t\t// a shallow copy of the newValue from when the last change happened\r\n\t\t\t\t\t\tvar veryOldValue;\r\n\t\t\t\t\t\t// only track veryOldValue if the listener is asking for it\r\n\t\t\t\t\t\tvar trackVeryOldValue = (listener.length > 1);\r\n\t\t\t\t\t\tvar changeDetected = 0;\r\n\t\t\t\t\t\tvar objGetter = $parse(obj);\r\n\t\t\t\t\t\tvar internalArray = [];\r\n\t\t\t\t\t\tvar internalObject = {};\r\n\t\t\t\t\t\tvar initRun = true;\r\n\t\t\t\t\t\tvar oldLength = 0;\r\n\r\n\t\t\t\t\t\tfunction $watchCollectionWatch() {\r\n\t\t\t\t\t\t\tnewValue = objGetter(self);\r\n\t\t\t\t\t\t\tvar newLength, key;\r\n\r\n\t\t\t\t\t\t\tif (!isObject(newValue)) { // if primitive\r\n\t\t\t\t\t\t\t\tif (oldValue !== newValue) {\r\n\t\t\t\t\t\t\t\t\toldValue = newValue;\r\n\t\t\t\t\t\t\t\t\tchangeDetected++;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else if (isArrayLike(newValue)) {\r\n\t\t\t\t\t\t\t\tif (oldValue !== internalArray) {\r\n\t\t\t\t\t\t\t\t\t// we are transitioning from something which was not an array into array.\r\n\t\t\t\t\t\t\t\t\toldValue = internalArray;\r\n\t\t\t\t\t\t\t\t\toldLength = oldValue.length = 0;\r\n\t\t\t\t\t\t\t\t\tchangeDetected++;\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tnewLength = newValue.length;\r\n\r\n\t\t\t\t\t\t\t\tif (oldLength !== newLength) {\r\n\t\t\t\t\t\t\t\t\t// if lengths do not match we need to trigger change notification\r\n\t\t\t\t\t\t\t\t\tchangeDetected++;\r\n\t\t\t\t\t\t\t\t\toldValue.length = oldLength = newLength;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t// copy the items to oldValue and look for changes.\r\n\t\t\t\t\t\t\t\tfor (var i = 0; i < newLength; i++) {\r\n\t\t\t\t\t\t\t\t\tvar bothNaN = (oldValue[i] !== oldValue[i]) &&\r\n\t\t\t\t\t\t\t\t\t\t(newValue[i] !== newValue[i]);\r\n\t\t\t\t\t\t\t\t\tif (!bothNaN && (oldValue[i] !== newValue[i])) {\r\n\t\t\t\t\t\t\t\t\t\tchangeDetected++;\r\n\t\t\t\t\t\t\t\t\t\toldValue[i] = newValue[i];\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tif (oldValue !== internalObject) {\r\n\t\t\t\t\t\t\t\t\t// we are transitioning from something which was not an object into object.\r\n\t\t\t\t\t\t\t\t\toldValue = internalObject = {};\r\n\t\t\t\t\t\t\t\t\toldLength = 0;\r\n\t\t\t\t\t\t\t\t\tchangeDetected++;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t// copy the items to oldValue and look for changes.\r\n\t\t\t\t\t\t\t\tnewLength = 0;\r\n\t\t\t\t\t\t\t\tfor (key in newValue) {\r\n\t\t\t\t\t\t\t\t\tif (newValue.hasOwnProperty(key)) {\r\n\t\t\t\t\t\t\t\t\t\tnewLength++;\r\n\t\t\t\t\t\t\t\t\t\tif (oldValue.hasOwnProperty(key)) {\r\n\t\t\t\t\t\t\t\t\t\t\tif (oldValue[key] !== newValue[key]) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tchangeDetected++;\r\n\t\t\t\t\t\t\t\t\t\t\t\toldValue[key] = newValue[key];\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t\toldLength++;\r\n\t\t\t\t\t\t\t\t\t\t\toldValue[key] = newValue[key];\r\n\t\t\t\t\t\t\t\t\t\t\tchangeDetected++;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (oldLength > newLength) {\r\n\t\t\t\t\t\t\t\t\t// we used to have more keys, need to find them and destroy them.\r\n\t\t\t\t\t\t\t\t\tchangeDetected++;\r\n\t\t\t\t\t\t\t\t\tfor (key in oldValue) {\r\n\t\t\t\t\t\t\t\t\t\tif (oldValue.hasOwnProperty(key) && !newValue.hasOwnProperty(key)) {\r\n\t\t\t\t\t\t\t\t\t\t\toldLength--;\r\n\t\t\t\t\t\t\t\t\t\t\tdelete oldValue[key];\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn changeDetected;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tfunction $watchCollectionAction() {\r\n\t\t\t\t\t\t\tif (initRun) {\r\n\t\t\t\t\t\t\t\tinitRun = false;\r\n\t\t\t\t\t\t\t\tlistener(newValue, newValue, self);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tlistener(newValue, veryOldValue, self);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t// make a copy for the next time a collection is changed\r\n\t\t\t\t\t\t\tif (trackVeryOldValue) {\r\n\t\t\t\t\t\t\t\tif (!isObject(newValue)) {\r\n\t\t\t\t\t\t\t\t\t//primitive\r\n\t\t\t\t\t\t\t\t\tveryOldValue = newValue;\r\n\t\t\t\t\t\t\t\t} else if (isArrayLike(newValue)) {\r\n\t\t\t\t\t\t\t\t\tveryOldValue = new Array(newValue.length);\r\n\t\t\t\t\t\t\t\t\tfor (var i = 0; i < newValue.length; i++) {\r\n\t\t\t\t\t\t\t\t\t\tveryOldValue[i] = newValue[i];\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t} else { // if object\r\n\t\t\t\t\t\t\t\t\tveryOldValue = {};\r\n\t\t\t\t\t\t\t\t\tfor (var key in newValue) {\r\n\t\t\t\t\t\t\t\t\t\tif (hasOwnProperty.call(newValue, key)) {\r\n\t\t\t\t\t\t\t\t\t\t\tveryOldValue[key] = newValue[key];\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn this.$watch($watchCollectionWatch, $watchCollectionAction);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $rootScope.Scope#$digest\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and\r\n\t\t\t\t\t * its children. Because a {@link ng.$rootScope.Scope#$watch watcher}'s listener can change\r\n\t\t\t\t\t * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#$watch watchers}\r\n\t\t\t\t\t * until no more listeners are firing. This means that it is possible to get into an infinite\r\n\t\t\t\t\t * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of\r\n\t\t\t\t\t * iterations exceeds 10.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * Usually, you don't call `$digest()` directly in\r\n\t\t\t\t\t * {@link ng.directive:ngController controllers} or in\r\n\t\t\t\t\t * {@link ng.$compileProvider#directive directives}.\r\n\t\t\t\t\t * Instead, you should call {@link ng.$rootScope.Scope#$apply $apply()} (typically from within\r\n\t\t\t\t\t * a {@link ng.$compileProvider#directive directives}), which will force a `$digest()`.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * If you want to be notified whenever `$digest()` is called,\r\n\t\t\t\t\t * you can register a `watchExpression` function with\r\n\t\t\t\t\t * {@link ng.$rootScope.Scope#$watch $watch()} with no `listener`.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * In unit tests, you may need to call `$digest()` to simulate the scope life cycle.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * # Example\r\n\t\t\t\t\t * ```js\r\n\t\t\t\t\t\t var scope = ...;\r\n\t\t\t\t\t\t scope.name = 'misko';\r\n\t\t\t\t\t\t scope.counter = 0;\r\n\t\t\t \r\n\t\t\t\t\t\t expect(scope.counter).toEqual(0);\r\n\t\t\t\t\t\t scope.$watch('name', function(newValue, oldValue) {\r\n\t\t\t\t\t\t scope.counter = scope.counter + 1;\r\n\t\t\t\t\t\t });\r\n\t\t\t\t\t\t expect(scope.counter).toEqual(0);\r\n\t\t\t \r\n\t\t\t\t\t\t scope.$digest();\r\n\t\t\t\t\t\t // the listener is always called during the first $digest loop after it was registered\r\n\t\t\t\t\t\t expect(scope.counter).toEqual(1);\r\n\t\t\t \r\n\t\t\t\t\t\t scope.$digest();\r\n\t\t\t\t\t\t // but now it will not be called unless the value changes\r\n\t\t\t\t\t\t expect(scope.counter).toEqual(1);\r\n\t\t\t \r\n\t\t\t\t\t\t scope.name = 'adam';\r\n\t\t\t\t\t\t scope.$digest();\r\n\t\t\t\t\t\t expect(scope.counter).toEqual(2);\r\n\t\t\t\t\t * ```\r\n\t\t\t\t\t *\r\n\t\t\t\t\t */\r\n\t\t\t\t\t$digest: function () {\r\n\t\t\t\t\t\tvar watch, value, last,\r\n\t\t\t\t\t\t\twatchers,\r\n\t\t\t\t\t\t\tasyncQueue = this.$$asyncQueue,\r\n\t\t\t\t\t\t\tpostDigestQueue = this.$$postDigestQueue,\r\n\t\t\t\t\t\t\tlength,\r\n\t\t\t\t\t\t\tdirty, ttl = TTL,\r\n\t\t\t\t\t\t\tnext, current, target = this,\r\n\t\t\t\t\t\t\twatchLog = [],\r\n\t\t\t\t\t\t\tlogIdx, logMsg, asyncTask;\r\n\r\n\t\t\t\t\t\tbeginPhase('$digest');\r\n\r\n\t\t\t\t\t\tlastDirtyWatch = null;\r\n\r\n\t\t\t\t\t\tdo { // \"while dirty\" loop\r\n\t\t\t\t\t\t\tdirty = false;\r\n\t\t\t\t\t\t\tcurrent = target;\r\n\r\n\t\t\t\t\t\t\twhile (asyncQueue.length) {\r\n\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\tasyncTask = asyncQueue.shift();\r\n\t\t\t\t\t\t\t\t\tasyncTask.scope.$eval(asyncTask.expression);\r\n\t\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\t\tclearPhase();\r\n\t\t\t\t\t\t\t\t\t$exceptionHandler(e);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tlastDirtyWatch = null;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\ttraverseScopesLoop:\r\n\t\t\t\t\t\t\t\tdo { // \"traverse the scopes\" loop\r\n\t\t\t\t\t\t\t\t\tif ((watchers = current.$$watchers)) {\r\n\t\t\t\t\t\t\t\t\t\t// process our watches\r\n\t\t\t\t\t\t\t\t\t\tlength = watchers.length;\r\n\t\t\t\t\t\t\t\t\t\twhile (length--) {\r\n\t\t\t\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\t\t\t\twatch = watchers[length];\r\n\t\t\t\t\t\t\t\t\t\t\t\t// Most common watches are on primitives, in which case we can short\r\n\t\t\t\t\t\t\t\t\t\t\t\t// circuit it with === operator, only when === fails do we use .equals\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (watch) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tif ((value = watch.get(current)) !== (last = watch.last) &&\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t!(watch.eq\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? equals(value, last)\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: (typeof value === 'number' && typeof last === 'number'\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t && isNaN(value) && isNaN(last)))) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdirty = true;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tlastDirtyWatch = watch;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twatch.last = watch.eq ? copy(value, null) : value;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\twatch.fn(value, ((last === initWatchVal) ? value : last), current);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (ttl < 5) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlogIdx = 4 - ttl;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tif (!watchLog[logIdx]) watchLog[logIdx] = [];\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlogMsg = (isFunction(watch.exp))\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'fn: ' + (watch.exp.name || watch.exp.toString())\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: watch.exp;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlogMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\twatchLog[logIdx].push(logMsg);\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t} else if (watch === lastDirtyWatch) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// If the most recently dirty watcher is now clean, short circuit since the remaining watchers\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t// have already been tested.\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdirty = false;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak traverseScopesLoop;\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tclearPhase();\r\n\t\t\t\t\t\t\t\t\t\t\t\t$exceptionHandler(e);\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t// Insanity Warning: scope depth-first traversal\r\n\t\t\t\t\t\t\t\t\t// yes, this code is a bit crazy, but it works and we have tests to prove it!\r\n\t\t\t\t\t\t\t\t\t// this piece should be kept in sync with the traversal in $broadcast\r\n\t\t\t\t\t\t\t\t\tif (!(next = (current.$$childHead ||\r\n\t\t\t\t\t\t\t\t\t\t(current !== target && current.$$nextSibling)))) {\r\n\t\t\t\t\t\t\t\t\t\twhile (current !== target && !(next = current.$$nextSibling)) {\r\n\t\t\t\t\t\t\t\t\t\t\tcurrent = current.$parent;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t} while ((current = next));\r\n\r\n\t\t\t\t\t\t\t// `break traverseScopesLoop;` takes us to here\r\n\r\n\t\t\t\t\t\t\tif ((dirty || asyncQueue.length) && !(ttl--)) {\r\n\t\t\t\t\t\t\t\tclearPhase();\r\n\t\t\t\t\t\t\t\tthrow $rootScopeMinErr('infdig',\r\n\t\t\t\t\t\t\t\t\t'{0} $digest() iterations reached. Aborting!\\n' +\r\n\t\t\t\t\t\t\t\t\t'Watchers fired in the last 5 iterations: {1}',\r\n\t\t\t\t\t\t\t\t\tTTL, toJson(watchLog));\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t} while (dirty || asyncQueue.length);\r\n\r\n\t\t\t\t\t\tclearPhase();\r\n\r\n\t\t\t\t\t\twhile (postDigestQueue.length) {\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tpostDigestQueue.shift()();\r\n\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\t$exceptionHandler(e);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc event\r\n\t\t\t\t\t * @name $rootScope.Scope#$destroy\r\n\t\t\t\t\t * @eventType broadcast on scope being destroyed\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Broadcasted when a scope and its children are being destroyed.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to\r\n\t\t\t\t\t * clean up DOM bindings before an element is removed from the DOM.\r\n\t\t\t\t\t */\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $rootScope.Scope#$destroy\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Removes the current scope (and all of its children) from the parent scope. Removal implies\r\n\t\t\t\t\t * that calls to {@link ng.$rootScope.Scope#$digest $digest()} will no longer\r\n\t\t\t\t\t * propagate to the current scope and its children. Removal also implies that the current\r\n\t\t\t\t\t * scope is eligible for garbage collection.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * The `$destroy()` is usually used by directives such as\r\n\t\t\t\t\t * {@link ng.directive:ngRepeat ngRepeat} for managing the\r\n\t\t\t\t\t * unrolling of the loop.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope.\r\n\t\t\t\t\t * Application code can register a `$destroy` event handler that will give it a chance to\r\n\t\t\t\t\t * perform any necessary cleanup.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to\r\n\t\t\t\t\t * clean up DOM bindings before an element is removed from the DOM.\r\n\t\t\t\t\t */\r\n\t\t\t\t\t$destroy: function () {\r\n\t\t\t\t\t\t// we can't destroy the root scope or a scope that has been already destroyed\r\n\t\t\t\t\t\tif (this.$$destroyed) return;\r\n\t\t\t\t\t\tvar parent = this.$parent;\r\n\r\n\t\t\t\t\t\tthis.$broadcast('$destroy');\r\n\t\t\t\t\t\tthis.$$destroyed = true;\r\n\t\t\t\t\t\tif (this === $rootScope) return;\r\n\r\n\t\t\t\t\t\tforEach(this.$$listenerCount, bind(null, decrementListenerCount, this));\r\n\r\n\t\t\t\t\t\t// sever all the references to parent scopes (after this cleanup, the current scope should\r\n\t\t\t\t\t\t// not be retained by any of our references and should be eligible for garbage collection)\r\n\t\t\t\t\t\tif (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling;\r\n\t\t\t\t\t\tif (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling;\r\n\t\t\t\t\t\tif (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling;\r\n\t\t\t\t\t\tif (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling;\r\n\r\n\r\n\t\t\t\t\t\t// All of the code below is bogus code that works around V8's memory leak via optimized code\r\n\t\t\t\t\t\t// and inline caches.\r\n\t\t\t\t\t\t//\r\n\t\t\t\t\t\t// see:\r\n\t\t\t\t\t\t// - https://code.google.com/p/v8/issues/detail?id=2073#c26\r\n\t\t\t\t\t\t// - https://github.com/angular/angular.js/issues/6794#issuecomment-38648909\r\n\t\t\t\t\t\t// - https://github.com/angular/angular.js/issues/1313#issuecomment-10378451\r\n\r\n\t\t\t\t\t\tthis.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead =\r\n\t\t\t\t\t\t\tthis.$$childTail = this.$root = null;\r\n\r\n\t\t\t\t\t\t// don't reset these to null in case some async task tries to register a listener/watch/task\r\n\t\t\t\t\t\tthis.$$listeners = {};\r\n\t\t\t\t\t\tthis.$$watchers = this.$$asyncQueue = this.$$postDigestQueue = [];\r\n\r\n\t\t\t\t\t\t// prevent NPEs since these methods have references to properties we nulled out\r\n\t\t\t\t\t\tthis.$destroy = this.$digest = this.$apply = noop;\r\n\t\t\t\t\t\tthis.$on = this.$watch = function () { return noop; };\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $rootScope.Scope#$eval\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Executes the `expression` on the current scope and returns the result. Any exceptions in\r\n\t\t\t\t\t * the expression are propagated (uncaught). This is useful when evaluating Angular\r\n\t\t\t\t\t * expressions.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * # Example\r\n\t\t\t\t\t * ```js\r\n\t\t\t\t\t\t var scope = ng.$rootScope.Scope();\r\n\t\t\t\t\t\t scope.a = 1;\r\n\t\t\t\t\t\t scope.b = 2;\r\n\t\t\t \r\n\t\t\t\t\t\t expect(scope.$eval('a+b')).toEqual(3);\r\n\t\t\t\t\t\t expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);\r\n\t\t\t\t\t * ```\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {(string|function())=} expression An angular expression to be executed.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * - `string`: execute using the rules as defined in {@link guide/expression expression}.\r\n\t\t\t\t\t * - `function(scope)`: execute the function with the current `scope` parameter.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {(object)=} locals Local variables object, useful for overriding values in scope.\r\n\t\t\t\t\t * @returns {*} The result of evaluating the expression.\r\n\t\t\t\t\t */\r\n\t\t\t\t\t$eval: function (expr, locals) {\r\n\t\t\t\t\t\treturn $parse(expr)(this, locals);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $rootScope.Scope#$evalAsync\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Executes the expression on the current scope at a later point in time.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only\r\n\t\t\t\t\t * that:\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * - it will execute after the function that scheduled the evaluation (preferably before DOM\r\n\t\t\t\t\t * rendering).\r\n\t\t\t\t\t * - at least one {@link ng.$rootScope.Scope#$digest $digest cycle} will be performed after\r\n\t\t\t\t\t * `expression` execution.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * Any exceptions from the execution of the expression are forwarded to the\r\n\t\t\t\t\t * {@link ng.$exceptionHandler $exceptionHandler} service.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle\r\n\t\t\t\t\t * will be scheduled. However, it is encouraged to always call code that changes the model\r\n\t\t\t\t\t * from within an `$apply` call. That includes code evaluated via `$evalAsync`.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {(string|function())=} expression An angular expression to be executed.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * - `string`: execute using the rules as defined in {@link guide/expression expression}.\r\n\t\t\t\t\t * - `function(scope)`: execute the function with the current `scope` parameter.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t */\r\n\t\t\t\t\t$evalAsync: function (expr) {\r\n\t\t\t\t\t\t// if we are outside of an $digest loop and this is the first time we are scheduling async\r\n\t\t\t\t\t\t// task also schedule async auto-flush\r\n\t\t\t\t\t\tif (!$rootScope.$$phase && !$rootScope.$$asyncQueue.length) {\r\n\t\t\t\t\t\t\t$browser.defer(function () {\r\n\t\t\t\t\t\t\t\tif ($rootScope.$$asyncQueue.length) {\r\n\t\t\t\t\t\t\t\t\t$rootScope.$digest();\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tthis.$$asyncQueue.push({ scope: this, expression: expr });\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t$$postDigest: function (fn) {\r\n\t\t\t\t\t\tthis.$$postDigestQueue.push(fn);\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $rootScope.Scope#$apply\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * `$apply()` is used to execute an expression in angular from outside of the angular\r\n\t\t\t\t\t * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries).\r\n\t\t\t\t\t * Because we are calling into the angular framework we need to perform proper scope life\r\n\t\t\t\t\t * cycle of {@link ng.$exceptionHandler exception handling},\r\n\t\t\t\t\t * {@link ng.$rootScope.Scope#$digest executing watches}.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * ## Life cycle\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * # Pseudo-Code of `$apply()`\r\n\t\t\t\t\t * ```js\r\n\t\t\t\t\t\t function $apply(expr) {\r\n\t\t\t\t\t\t try {\r\n\t\t\t\t\t\t\t return $eval(expr);\r\n\t\t\t\t\t\t } catch (e) {\r\n\t\t\t\t\t\t\t $exceptionHandler(e);\r\n\t\t\t\t\t\t } finally {\r\n\t\t\t\t\t\t\t $root.$digest();\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t\t }\r\n\t\t\t\t\t * ```\r\n\t\t\t\t\t *\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * Scope's `$apply()` method transitions through the following stages:\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * 1. The {@link guide/expression expression} is executed using the\r\n\t\t\t\t\t * {@link ng.$rootScope.Scope#$eval $eval()} method.\r\n\t\t\t\t\t * 2. Any exceptions from the execution of the expression are forwarded to the\r\n\t\t\t\t\t * {@link ng.$exceptionHandler $exceptionHandler} service.\r\n\t\t\t\t\t * 3. The {@link ng.$rootScope.Scope#$watch watch} listeners are fired immediately after the\r\n\t\t\t\t\t * expression was executed using the {@link ng.$rootScope.Scope#$digest $digest()} method.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {(string|function())=} exp An angular expression to be executed.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * - `string`: execute using the rules as defined in {@link guide/expression expression}.\r\n\t\t\t\t\t * - `function(scope)`: execute the function with current `scope` parameter.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @returns {*} The result of evaluating the expression.\r\n\t\t\t\t\t */\r\n\t\t\t\t\t$apply: function (expr) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tbeginPhase('$apply');\r\n\t\t\t\t\t\t\treturn this.$eval(expr);\r\n\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t$exceptionHandler(e);\r\n\t\t\t\t\t\t} finally {\r\n\t\t\t\t\t\t\tclearPhase();\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t$rootScope.$digest();\r\n\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\t$exceptionHandler(e);\r\n\t\t\t\t\t\t\t\tthrow e;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t},\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $rootScope.Scope#$on\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for\r\n\t\t\t\t\t * discussion of event life cycle.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * The event listener function format is: `function(event, args...)`. The `event` object\r\n\t\t\t\t\t * passed into the listener has the following attributes:\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or\r\n\t\t\t\t\t * `$broadcast`-ed.\r\n\t\t\t\t\t * - `currentScope` - `{Scope}`: the current scope which is handling the event.\r\n\t\t\t\t\t * - `name` - `{string}`: name of the event.\r\n\t\t\t\t\t * - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel\r\n\t\t\t\t\t * further event propagation (available only for events that were `$emit`-ed).\r\n\t\t\t\t\t * - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag\r\n\t\t\t\t\t * to true.\r\n\t\t\t\t\t * - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {string} name Event name to listen on.\r\n\t\t\t\t\t * @param {function(event, ...args)} listener Function to call when the event is emitted.\r\n\t\t\t\t\t * @returns {function()} Returns a deregistration function for this listener.\r\n\t\t\t\t\t */\r\n\t\t\t\t\t$on: function (name, listener) {\r\n\t\t\t\t\t\tvar namedListeners = this.$$listeners[name];\r\n\t\t\t\t\t\tif (!namedListeners) {\r\n\t\t\t\t\t\t\tthis.$$listeners[name] = namedListeners = [];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tnamedListeners.push(listener);\r\n\r\n\t\t\t\t\t\tvar current = this;\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tif (!current.$$listenerCount[name]) {\r\n\t\t\t\t\t\t\t\tcurrent.$$listenerCount[name] = 0;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tcurrent.$$listenerCount[name]++;\r\n\t\t\t\t\t\t} while ((current = current.$parent));\r\n\r\n\t\t\t\t\t\tvar self = this;\r\n\t\t\t\t\t\treturn function () {\r\n\t\t\t\t\t\t\tnamedListeners[indexOf(namedListeners, listener)] = null;\r\n\t\t\t\t\t\t\tdecrementListenerCount(self, 1, name);\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t},\r\n\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $rootScope.Scope#$emit\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Dispatches an event `name` upwards through the scope hierarchy notifying the\r\n\t\t\t\t\t * registered {@link ng.$rootScope.Scope#$on} listeners.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * The event life cycle starts at the scope on which `$emit` was called. All\r\n\t\t\t\t\t * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get\r\n\t\t\t\t\t * notified. Afterwards, the event traverses upwards toward the root scope and calls all\r\n\t\t\t\t\t * registered listeners along the way. The event will stop propagating if one of the listeners\r\n\t\t\t\t\t * cancels it.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed\r\n\t\t\t\t\t * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {string} name Event name to emit.\r\n\t\t\t\t\t * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.\r\n\t\t\t\t\t * @return {Object} Event object (see {@link ng.$rootScope.Scope#$on}).\r\n\t\t\t\t\t */\r\n\t\t\t\t\t$emit: function (name, args) {\r\n\t\t\t\t\t\tvar empty = [],\r\n\t\t\t\t\t\t\tnamedListeners,\r\n\t\t\t\t\t\t\tscope = this,\r\n\t\t\t\t\t\t\tstopPropagation = false,\r\n\t\t\t\t\t\t\tevent = {\r\n\t\t\t\t\t\t\t\tname: name,\r\n\t\t\t\t\t\t\t\ttargetScope: scope,\r\n\t\t\t\t\t\t\t\tstopPropagation: function () { stopPropagation = true; },\r\n\t\t\t\t\t\t\t\tpreventDefault: function () {\r\n\t\t\t\t\t\t\t\t\tevent.defaultPrevented = true;\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tdefaultPrevented: false\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\tlistenerArgs = concat([event], arguments, 1),\r\n\t\t\t\t\t\t\ti, length;\r\n\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tnamedListeners = scope.$$listeners[name] || empty;\r\n\t\t\t\t\t\t\tevent.currentScope = scope;\r\n\t\t\t\t\t\t\tfor (i = 0, length = namedListeners.length; i < length; i++) {\r\n\r\n\t\t\t\t\t\t\t\t// if listeners were deregistered, defragment the array\r\n\t\t\t\t\t\t\t\tif (!namedListeners[i]) {\r\n\t\t\t\t\t\t\t\t\tnamedListeners.splice(i, 1);\r\n\t\t\t\t\t\t\t\t\ti--;\r\n\t\t\t\t\t\t\t\t\tlength--;\r\n\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\t//allow all listeners attached to the current scope to run\r\n\t\t\t\t\t\t\t\t\tnamedListeners[i].apply(null, listenerArgs);\r\n\t\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\t\t$exceptionHandler(e);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t//if any listener on the current scope stops propagation, prevent bubbling\r\n\t\t\t\t\t\t\tif (stopPropagation) return event;\r\n\t\t\t\t\t\t\t//traverse upwards\r\n\t\t\t\t\t\t\tscope = scope.$parent;\r\n\t\t\t\t\t\t} while (scope);\r\n\r\n\t\t\t\t\t\treturn event;\r\n\t\t\t\t\t},\r\n\r\n\r\n\t\t\t\t\t/**\r\n\t\t\t\t\t * @ngdoc method\r\n\t\t\t\t\t * @name $rootScope.Scope#$broadcast\r\n\t\t\t\t\t * @kind function\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @description\r\n\t\t\t\t\t * Dispatches an event `name` downwards to all child scopes (and their children) notifying the\r\n\t\t\t\t\t * registered {@link ng.$rootScope.Scope#$on} listeners.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * The event life cycle starts at the scope on which `$broadcast` was called. All\r\n\t\t\t\t\t * {@link ng.$rootScope.Scope#$on listeners} listening for `name` event on this scope get\r\n\t\t\t\t\t * notified. Afterwards, the event propagates to all direct and indirect scopes of the current\r\n\t\t\t\t\t * scope and calls all registered listeners along the way. The event cannot be canceled.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * Any exception emitted from the {@link ng.$rootScope.Scope#$on listeners} will be passed\r\n\t\t\t\t\t * onto the {@link ng.$exceptionHandler $exceptionHandler} service.\r\n\t\t\t\t\t *\r\n\t\t\t\t\t * @param {string} name Event name to broadcast.\r\n\t\t\t\t\t * @param {...*} args Optional one or more arguments which will be passed onto the event listeners.\r\n\t\t\t\t\t * @return {Object} Event object, see {@link ng.$rootScope.Scope#$on}\r\n\t\t\t\t\t */\r\n\t\t\t\t\t$broadcast: function (name, args) {\r\n\t\t\t\t\t\tvar target = this,\r\n\t\t\t\t\t\t\tcurrent = target,\r\n\t\t\t\t\t\t\tnext = target,\r\n\t\t\t\t\t\t\tevent = {\r\n\t\t\t\t\t\t\t\tname: name,\r\n\t\t\t\t\t\t\t\ttargetScope: target,\r\n\t\t\t\t\t\t\t\tpreventDefault: function () {\r\n\t\t\t\t\t\t\t\t\tevent.defaultPrevented = true;\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tdefaultPrevented: false\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\tlistenerArgs = concat([event], arguments, 1),\r\n\t\t\t\t\t\t\tlisteners, i, length;\r\n\r\n\t\t\t\t\t\t//down while you can, then up and next sibling or up and next sibling until back at root\r\n\t\t\t\t\t\twhile ((current = next)) {\r\n\t\t\t\t\t\t\tevent.currentScope = current;\r\n\t\t\t\t\t\t\tlisteners = current.$$listeners[name] || [];\r\n\t\t\t\t\t\t\tfor (i = 0, length = listeners.length; i < length; i++) {\r\n\t\t\t\t\t\t\t\t// if listeners were deregistered, defragment the array\r\n\t\t\t\t\t\t\t\tif (!listeners[i]) {\r\n\t\t\t\t\t\t\t\t\tlisteners.splice(i, 1);\r\n\t\t\t\t\t\t\t\t\ti--;\r\n\t\t\t\t\t\t\t\t\tlength--;\r\n\t\t\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\tlisteners[i].apply(null, listenerArgs);\r\n\t\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\t\t$exceptionHandler(e);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t// Insanity Warning: scope depth-first traversal\r\n\t\t\t\t\t\t\t// yes, this code is a bit crazy, but it works and we have tests to prove it!\r\n\t\t\t\t\t\t\t// this piece should be kept in sync with the traversal in $digest\r\n\t\t\t\t\t\t\t// (though it differs due to having the extra check for $$listenerCount)\r\n\t\t\t\t\t\t\tif (!(next = ((current.$$listenerCount[name] && current.$$childHead) ||\r\n\t\t\t\t\t\t\t\t(current !== target && current.$$nextSibling)))) {\r\n\t\t\t\t\t\t\t\twhile (current !== target && !(next = current.$$nextSibling)) {\r\n\t\t\t\t\t\t\t\t\tcurrent = current.$parent;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\treturn event;\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\tvar $rootScope = new Scope();\r\n\r\n\t\t\t\treturn $rootScope;\r\n\r\n\r\n\t\t\t\tfunction beginPhase(phase) {\r\n\t\t\t\t\tif ($rootScope.$$phase) {\r\n\t\t\t\t\t\tthrow $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t$rootScope.$$phase = phase;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction clearPhase() {\r\n\t\t\t\t\t$rootScope.$$phase = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction compileToFn(exp, name) {\r\n\t\t\t\t\tvar fn = $parse(exp);\r\n\t\t\t\t\tassertArgFn(fn, name);\r\n\t\t\t\t\treturn fn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction decrementListenerCount(current, count, name) {\r\n\t\t\t\t\tdo {\r\n\t\t\t\t\t\tcurrent.$$listenerCount[name] -= count;\r\n\r\n\t\t\t\t\t\tif (current.$$listenerCount[name] === 0) {\r\n\t\t\t\t\t\t\tdelete current.$$listenerCount[name];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} while ((current = current.$parent));\r\n\t\t\t\t}\r\n\r\n\t\t\t\t/**\r\n\t\t\t\t * function used as an initial value for watchers.\r\n\t\t\t\t * because it's unique we can easily tell it apart from other values\r\n\t\t\t\t */\r\n\t\t\t\tfunction initWatchVal() { }\r\n\t\t\t}];\r\n\t}\r\n\r\n\t/**\r\n\t * @description\r\n\t * Private service to sanitize uris for links and images. Used by $compile and $sanitize.\r\n\t */\r\n\tfunction $$SanitizeUriProvider() {\r\n\t\tvar aHrefSanitizationWhitelist = /^\\s*(https?|ftp|mailto|tel|file):/,\r\n\t\t imgSrcSanitizationWhitelist = /^\\s*(https?|ftp|file):|data:image\\//;\r\n\r\n\t\t/**\r\n\t\t * @description\r\n\t\t * Retrieves or overrides the default regular expression that is used for whitelisting of safe\r\n\t\t * urls during a[href] sanitization.\r\n\t\t *\r\n\t\t * The sanitization is a security measure aimed at prevent XSS attacks via html links.\r\n\t\t *\r\n\t\t * Any url about to be assigned to a[href] via data-binding is first normalized and turned into\r\n\t\t * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`\r\n\t\t * regular expression. If a match is found, the original url is written into the dom. Otherwise,\r\n\t\t * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\r\n\t\t *\r\n\t\t * @param {RegExp=} regexp New regexp to whitelist urls with.\r\n\t\t * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\r\n\t\t * chaining otherwise.\r\n\t\t */\r\n\t\tthis.aHrefSanitizationWhitelist = function (regexp) {\r\n\t\t\tif (isDefined(regexp)) {\r\n\t\t\t\taHrefSanitizationWhitelist = regexp;\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\t\t\treturn aHrefSanitizationWhitelist;\r\n\t\t};\r\n\r\n\r\n\t\t/**\r\n\t\t * @description\r\n\t\t * Retrieves or overrides the default regular expression that is used for whitelisting of safe\r\n\t\t * urls during img[src] sanitization.\r\n\t\t *\r\n\t\t * The sanitization is a security measure aimed at prevent XSS attacks via html links.\r\n\t\t *\r\n\t\t * Any url about to be assigned to img[src] via data-binding is first normalized and turned into\r\n\t\t * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`\r\n\t\t * regular expression. If a match is found, the original url is written into the dom. Otherwise,\r\n\t\t * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.\r\n\t\t *\r\n\t\t * @param {RegExp=} regexp New regexp to whitelist urls with.\r\n\t\t * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for\r\n\t\t * chaining otherwise.\r\n\t\t */\r\n\t\tthis.imgSrcSanitizationWhitelist = function (regexp) {\r\n\t\t\tif (isDefined(regexp)) {\r\n\t\t\t\timgSrcSanitizationWhitelist = regexp;\r\n\t\t\t\treturn this;\r\n\t\t\t}\r\n\t\t\treturn imgSrcSanitizationWhitelist;\r\n\t\t};\r\n\r\n\t\tthis.$get = function () {\r\n\t\t\treturn function sanitizeUri(uri, isImage) {\r\n\t\t\t\tvar regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist;\r\n\t\t\t\tvar normalizedVal;\r\n\t\t\t\t// NOTE: urlResolve() doesn't support IE < 8 so we don't sanitize for that case.\r\n\t\t\t\tif (!msie || msie >= 8) {\r\n\t\t\t\t\tnormalizedVal = urlResolve(uri).href;\r\n\t\t\t\t\tif (normalizedVal !== '' && !normalizedVal.match(regex)) {\r\n\t\t\t\t\t\treturn 'unsafe:' + normalizedVal;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn uri;\r\n\t\t\t};\r\n\t\t};\r\n\t}\r\n\r\n\tvar $sceMinErr = minErr('$sce');\r\n\r\n\tvar SCE_CONTEXTS = {\r\n\t\tHTML: 'html',\r\n\t\tCSS: 'css',\r\n\t\tURL: 'url',\r\n\t\t// RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a\r\n\t\t// url. (e.g. ng-include, script src, templateUrl)\r\n\t\tRESOURCE_URL: 'resourceUrl',\r\n\t\tJS: 'js'\r\n\t};\r\n\r\n\t// Helper functions follow.\r\n\r\n\t// Copied from:\r\n\t// http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962\r\n\t// Prereq: s is a string.\r\n\tfunction escapeForRegexp(s) {\r\n\t\treturn s.replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g, '\\\\$1').\r\n\t\t\t\t replace(/\\x08/g, '\\\\x08');\r\n\t}\r\n\r\n\r\n\tfunction adjustMatcher(matcher) {\r\n\t\tif (matcher === 'self') {\r\n\t\t\treturn matcher;\r\n\t\t} else if (isString(matcher)) {\r\n\t\t\t// Strings match exactly except for 2 wildcards - '*' and '**'.\r\n\t\t\t// '*' matches any character except those from the set ':/.?&'.\r\n\t\t\t// '**' matches any character (like .* in a RegExp).\r\n\t\t\t// More than 2 *'s raises an error as it's ill defined.\r\n\t\t\tif (matcher.indexOf('***') > -1) {\r\n\t\t\t\tthrow $sceMinErr('iwcard',\r\n\t\t\t\t\t'Illegal sequence *** in string matcher. String: {0}', matcher);\r\n\t\t\t}\r\n\t\t\tmatcher = escapeForRegexp(matcher).\r\n\t\t\t\t\t\t replace('\\\\*\\\\*', '.*').\r\n\t\t\t\t\t\t replace('\\\\*', '[^:/.?&;]*');\r\n\t\t\treturn new RegExp('^' + matcher + '$');\r\n\t\t} else if (isRegExp(matcher)) {\r\n\t\t\t// The only other type of matcher allowed is a Regexp.\r\n\t\t\t// Match entire URL / disallow partial matches.\r\n\t\t\t// Flags are reset (i.e. no global, ignoreCase or multiline)\r\n\t\t\treturn new RegExp('^' + matcher.source + '$');\r\n\t\t} else {\r\n\t\t\tthrow $sceMinErr('imatcher',\r\n\t\t\t\t'Matchers may only be \"self\", string patterns or RegExp objects');\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tfunction adjustMatchers(matchers) {\r\n\t\tvar adjustedMatchers = [];\r\n\t\tif (isDefined(matchers)) {\r\n\t\t\tforEach(matchers, function (matcher) {\r\n\t\t\t\tadjustedMatchers.push(adjustMatcher(matcher));\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn adjustedMatchers;\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $sceDelegate\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t *\r\n\t * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict\r\n\t * Contextual Escaping (SCE)} services to AngularJS.\r\n\t *\r\n\t * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of\r\n\t * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS. This is\r\n\t * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to\r\n\t * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things\r\n\t * work because `$sce` delegates to `$sceDelegate` for these operations.\r\n\t *\r\n\t * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service.\r\n\t *\r\n\t * The default instance of `$sceDelegate` should work out of the box with little pain. While you\r\n\t * can override it completely to change the behavior of `$sce`, the common case would\r\n\t * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting\r\n\t * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as\r\n\t * templates. Refer {@link ng.$sceDelegateProvider#resourceUrlWhitelist\r\n\t * $sceDelegateProvider.resourceUrlWhitelist} and {@link\r\n\t * ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc provider\r\n\t * @name $sceDelegateProvider\r\n\t * @description\r\n\t *\r\n\t * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate\r\n\t * $sceDelegate} service. This allows one to get/set the whitelists and blacklists used to ensure\r\n\t * that the URLs used for sourcing Angular templates are safe. Refer {@link\r\n\t * ng.$sceDelegateProvider#resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and\r\n\t * {@link ng.$sceDelegateProvider#resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}\r\n\t *\r\n\t * For the general details about this service in Angular, read the main page for {@link ng.$sce\r\n\t * Strict Contextual Escaping (SCE)}.\r\n\t *\r\n\t * **Example**: Consider the following case. <a name=\"example\"></a>\r\n\t *\r\n\t * - your app is hosted at url `http://myapp.example.com/`\r\n\t * - but some of your templates are hosted on other domains you control such as\r\n\t * `http://srv01.assets.example.com/`, `http://srv02.assets.example.com/`, etc.\r\n\t * - and you have an open redirect at `http://myapp.example.com/clickThru?...`.\r\n\t *\r\n\t * Here is what a secure configuration for this scenario might look like:\r\n\t *\r\n\t * <pre class=\"prettyprint\">\r\n\t * angular.module('myApp', []).config(function($sceDelegateProvider) {\r\n\t * $sceDelegateProvider.resourceUrlWhitelist([\r\n\t * // Allow same origin resource loads.\r\n\t * 'self',\r\n\t * // Allow loading from our assets domain. Notice the difference between * and **.\r\n\t * 'http://srv*.assets.example.com/**']);\r\n\t *\r\n\t * // The blacklist overrides the whitelist so the open redirect here is blocked.\r\n\t * $sceDelegateProvider.resourceUrlBlacklist([\r\n\t * 'http://myapp.example.com/clickThru**']);\r\n\t * });\r\n\t * </pre>\r\n\t */\r\n\r\n\tfunction $SceDelegateProvider() {\r\n\t\tthis.SCE_CONTEXTS = SCE_CONTEXTS;\r\n\r\n\t\t// Resource URLs can also be trusted by policy.\r\n\t\tvar resourceUrlWhitelist = ['self'],\r\n\t\t\tresourceUrlBlacklist = [];\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $sceDelegateProvider#resourceUrlWhitelist\r\n\t\t * @kind function\r\n\t\t *\r\n\t\t * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value\r\n\t\t * provided. This must be an array or null. A snapshot of this array is used so further\r\n\t\t * changes to the array are ignored.\r\n\t\t *\r\n\t\t * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items\r\n\t\t * allowed in this array.\r\n\t\t *\r\n\t\t * Note: **an empty whitelist array will block all URLs**!\r\n\t\t *\r\n\t\t * @return {Array} the currently set whitelist array.\r\n\t\t *\r\n\t\t * The **default value** when no whitelist has been explicitly set is `['self']` allowing only\r\n\t\t * same origin resource requests.\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Sets/Gets the whitelist of trusted resource URLs.\r\n\t\t */\r\n\t\tthis.resourceUrlWhitelist = function (value) {\r\n\t\t\tif (arguments.length) {\r\n\t\t\t\tresourceUrlWhitelist = adjustMatchers(value);\r\n\t\t\t}\r\n\t\t\treturn resourceUrlWhitelist;\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $sceDelegateProvider#resourceUrlBlacklist\r\n\t\t * @kind function\r\n\t\t *\r\n\t\t * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value\r\n\t\t * provided. This must be an array or null. A snapshot of this array is used so further\r\n\t\t * changes to the array are ignored.\r\n\t\t *\r\n\t\t * Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items\r\n\t\t * allowed in this array.\r\n\t\t *\r\n\t\t * The typical usage for the blacklist is to **block\r\n\t\t * [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as\r\n\t\t * these would otherwise be trusted but actually return content from the redirected domain.\r\n\t\t *\r\n\t\t * Finally, **the blacklist overrides the whitelist** and has the final say.\r\n\t\t *\r\n\t\t * @return {Array} the currently set blacklist array.\r\n\t\t *\r\n\t\t * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there\r\n\t\t * is no blacklist.)\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Sets/Gets the blacklist of trusted resource URLs.\r\n\t\t */\r\n\r\n\t\tthis.resourceUrlBlacklist = function (value) {\r\n\t\t\tif (arguments.length) {\r\n\t\t\t\tresourceUrlBlacklist = adjustMatchers(value);\r\n\t\t\t}\r\n\t\t\treturn resourceUrlBlacklist;\r\n\t\t};\r\n\r\n\t\tthis.$get = ['$injector', function ($injector) {\r\n\r\n\t\t\tvar htmlSanitizer = function htmlSanitizer(html) {\r\n\t\t\t\tthrow $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');\r\n\t\t\t};\r\n\r\n\t\t\tif ($injector.has('$sanitize')) {\r\n\t\t\t\thtmlSanitizer = $injector.get('$sanitize');\r\n\t\t\t}\r\n\r\n\r\n\t\t\tfunction matchUrl(matcher, parsedUrl) {\r\n\t\t\t\tif (matcher === 'self') {\r\n\t\t\t\t\treturn urlIsSameOrigin(parsedUrl);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// definitely a regex. See adjustMatchers()\r\n\t\t\t\t\treturn !!matcher.exec(parsedUrl.href);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfunction isResourceUrlAllowedByPolicy(url) {\r\n\t\t\t\tvar parsedUrl = urlResolve(url.toString());\r\n\t\t\t\tvar i, n, allowed = false;\r\n\t\t\t\t// Ensure that at least one item from the whitelist allows this url.\r\n\t\t\t\tfor (i = 0, n = resourceUrlWhitelist.length; i < n; i++) {\r\n\t\t\t\t\tif (matchUrl(resourceUrlWhitelist[i], parsedUrl)) {\r\n\t\t\t\t\t\tallowed = true;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (allowed) {\r\n\t\t\t\t\t// Ensure that no item from the blacklist blocked this url.\r\n\t\t\t\t\tfor (i = 0, n = resourceUrlBlacklist.length; i < n; i++) {\r\n\t\t\t\t\t\tif (matchUrl(resourceUrlBlacklist[i], parsedUrl)) {\r\n\t\t\t\t\t\t\tallowed = false;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn allowed;\r\n\t\t\t}\r\n\r\n\t\t\tfunction generateHolderType(Base) {\r\n\t\t\t\tvar holderType = function TrustedValueHolderType(trustedValue) {\r\n\t\t\t\t\tthis.$$unwrapTrustedValue = function () {\r\n\t\t\t\t\t\treturn trustedValue;\r\n\t\t\t\t\t};\r\n\t\t\t\t};\r\n\t\t\t\tif (Base) {\r\n\t\t\t\t\tholderType.prototype = new Base();\r\n\t\t\t\t}\r\n\t\t\t\tholderType.prototype.valueOf = function sceValueOf() {\r\n\t\t\t\t\treturn this.$$unwrapTrustedValue();\r\n\t\t\t\t};\r\n\t\t\t\tholderType.prototype.toString = function sceToString() {\r\n\t\t\t\t\treturn this.$$unwrapTrustedValue().toString();\r\n\t\t\t\t};\r\n\t\t\t\treturn holderType;\r\n\t\t\t}\r\n\r\n\t\t\tvar trustedValueHolderBase = generateHolderType(),\r\n\t\t\t\tbyType = {};\r\n\r\n\t\t\tbyType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase);\r\n\t\t\tbyType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase);\r\n\t\t\tbyType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase);\r\n\t\t\tbyType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase);\r\n\t\t\tbyType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]);\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sceDelegate#trustAs\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Returns an object that is trusted by angular for use in specified strict\r\n\t\t\t * contextual escaping contexts (such as ng-bind-html, ng-include, any src\r\n\t\t\t * attribute interpolation, any dom event binding attribute interpolation\r\n\t\t\t * such as for onclick, etc.) that uses the provided value.\r\n\t\t\t * See {@link ng.$sce $sce} for enabling strict contextual escaping.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The kind of context in which this value is safe for use. e.g. url,\r\n\t\t\t * resourceUrl, html, js and css.\r\n\t\t\t * @param {*} value The value that that should be considered trusted/safe.\r\n\t\t\t * @returns {*} A value that can be used to stand in for the provided `value` in places\r\n\t\t\t * where Angular expects a $sce.trustAs() return value.\r\n\t\t\t */\r\n\t\t\tfunction trustAs(type, trustedValue) {\r\n\t\t\t\tvar Constructor = (byType.hasOwnProperty(type) ? byType[type] : null);\r\n\t\t\t\tif (!Constructor) {\r\n\t\t\t\t\tthrow $sceMinErr('icontext',\r\n\t\t\t\t\t\t'Attempted to trust a value in invalid context. Context: {0}; Value: {1}',\r\n\t\t\t\t\t\ttype, trustedValue);\r\n\t\t\t\t}\r\n\t\t\t\tif (trustedValue === null || trustedValue === undefined || trustedValue === '') {\r\n\t\t\t\t\treturn trustedValue;\r\n\t\t\t\t}\r\n\t\t\t\t// All the current contexts in SCE_CONTEXTS happen to be strings. In order to avoid trusting\r\n\t\t\t\t// mutable objects, we ensure here that the value passed in is actually a string.\r\n\t\t\t\tif (typeof trustedValue !== 'string') {\r\n\t\t\t\t\tthrow $sceMinErr('itype',\r\n\t\t\t\t\t\t'Attempted to trust a non-string value in a content requiring a string: Context: {0}',\r\n\t\t\t\t\t\ttype);\r\n\t\t\t\t}\r\n\t\t\t\treturn new Constructor(trustedValue);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sceDelegate#valueOf\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#trustAs\r\n\t\t\t * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link\r\n\t\t\t * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}.\r\n\t\t\t *\r\n\t\t\t * If the passed parameter is not a value that had been returned by {@link\r\n\t\t\t * ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}, returns it as-is.\r\n\t\t\t *\r\n\t\t\t * @param {*} value The result of a prior {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}\r\n\t\t\t * call or anything else.\r\n\t\t\t * @returns {*} The `value` that was originally provided to {@link ng.$sceDelegate#trustAs\r\n\t\t\t * `$sceDelegate.trustAs`} if `value` is the result of such a call. Otherwise, returns\r\n\t\t\t * `value` unchanged.\r\n\t\t\t */\r\n\t\t\tfunction valueOf(maybeTrusted) {\r\n\t\t\t\tif (maybeTrusted instanceof trustedValueHolderBase) {\r\n\t\t\t\t\treturn maybeTrusted.$$unwrapTrustedValue();\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn maybeTrusted;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sceDelegate#getTrusted\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Takes the result of a {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`} call and\r\n\t\t\t * returns the originally supplied value if the queried context type is a supertype of the\r\n\t\t\t * created type. If this condition isn't satisfied, throws an exception.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The kind of context in which this value is to be used.\r\n\t\t\t * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#trustAs\r\n\t\t\t * `$sceDelegate.trustAs`} call.\r\n\t\t\t * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#trustAs\r\n\t\t\t * `$sceDelegate.trustAs`} if valid in this context. Otherwise, throws an exception.\r\n\t\t\t */\r\n\t\t\tfunction getTrusted(type, maybeTrusted) {\r\n\t\t\t\tif (maybeTrusted === null || maybeTrusted === undefined || maybeTrusted === '') {\r\n\t\t\t\t\treturn maybeTrusted;\r\n\t\t\t\t}\r\n\t\t\t\tvar constructor = (byType.hasOwnProperty(type) ? byType[type] : null);\r\n\t\t\t\tif (constructor && maybeTrusted instanceof constructor) {\r\n\t\t\t\t\treturn maybeTrusted.$$unwrapTrustedValue();\r\n\t\t\t\t}\r\n\t\t\t\t// If we get here, then we may only take one of two actions.\r\n\t\t\t\t// 1. sanitize the value for the requested type, or\r\n\t\t\t\t// 2. throw an exception.\r\n\t\t\t\tif (type === SCE_CONTEXTS.RESOURCE_URL) {\r\n\t\t\t\t\tif (isResourceUrlAllowedByPolicy(maybeTrusted)) {\r\n\t\t\t\t\t\treturn maybeTrusted;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthrow $sceMinErr('insecurl',\r\n\t\t\t\t\t\t\t'Blocked loading resource from url not allowed by $sceDelegate policy. URL: {0}',\r\n\t\t\t\t\t\t\tmaybeTrusted.toString());\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (type === SCE_CONTEXTS.HTML) {\r\n\t\t\t\t\treturn htmlSanitizer(maybeTrusted);\r\n\t\t\t\t}\r\n\t\t\t\tthrow $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');\r\n\t\t\t}\r\n\r\n\t\t\treturn {\r\n\t\t\t\ttrustAs: trustAs,\r\n\t\t\t\tgetTrusted: getTrusted,\r\n\t\t\t\tvalueOf: valueOf\r\n\t\t\t};\r\n\t\t}];\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ngdoc provider\r\n\t * @name $sceProvider\r\n\t * @description\r\n\t *\r\n\t * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service.\r\n\t * - enable/disable Strict Contextual Escaping (SCE) in a module\r\n\t * - override the default implementation with a custom delegate\r\n\t *\r\n\t * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}.\r\n\t */\r\n\r\n\t/* jshint maxlen: false*/\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $sce\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t *\r\n\t * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS.\r\n\t *\r\n\t * # Strict Contextual Escaping\r\n\t *\r\n\t * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain\r\n\t * contexts to result in a value that is marked as safe to use for that context. One example of\r\n\t * such a context is binding arbitrary html controlled by the user via `ng-bind-html`. We refer\r\n\t * to these contexts as privileged or SCE contexts.\r\n\t *\r\n\t * As of version 1.2, Angular ships with SCE enabled by default.\r\n\t *\r\n\t * Note: When enabled (the default), IE8 in quirks mode is not supported. In this mode, IE8 allows\r\n\t * one to execute arbitrary javascript by the use of the expression() syntax. Refer\r\n\t * <http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx> to learn more about them.\r\n\t * You can ensure your document is in standards mode and not quirks mode by adding `<!doctype html>`\r\n\t * to the top of your HTML document.\r\n\t *\r\n\t * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for\r\n\t * security vulnerabilities such as XSS, clickjacking, etc. a lot easier.\r\n\t *\r\n\t * Here's an example of a binding in a privileged context:\r\n\t *\r\n\t * <pre class=\"prettyprint\">\r\n\t * <input ng-model=\"userHtml\">\r\n\t * <div ng-bind-html=\"userHtml\">\r\n\t * </pre>\r\n\t *\r\n\t * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user. With SCE\r\n\t * disabled, this application allows the user to render arbitrary HTML into the DIV.\r\n\t * In a more realistic example, one may be rendering user comments, blog articles, etc. via\r\n\t * bindings. (HTML is just one example of a context where rendering user controlled input creates\r\n\t * security vulnerabilities.)\r\n\t *\r\n\t * For the case of HTML, you might use a library, either on the client side, or on the server side,\r\n\t * to sanitize unsafe HTML before binding to the value and rendering it in the document.\r\n\t *\r\n\t * How would you ensure that every place that used these types of bindings was bound to a value that\r\n\t * was sanitized by your library (or returned as safe for rendering by your server?) How can you\r\n\t * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some\r\n\t * properties/fields and forgot to update the binding to the sanitized value?\r\n\t *\r\n\t * To be secure by default, you want to ensure that any such bindings are disallowed unless you can\r\n\t * determine that something explicitly says it's safe to use a value for binding in that\r\n\t * context. You can then audit your code (a simple grep would do) to ensure that this is only done\r\n\t * for those values that you can easily tell are safe - because they were received from your server,\r\n\t * sanitized by your library, etc. You can organize your codebase to help with this - perhaps\r\n\t * allowing only the files in a specific directory to do this. Ensuring that the internal API\r\n\t * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task.\r\n\t *\r\n\t * In the case of AngularJS' SCE service, one uses {@link ng.$sce#trustAs $sce.trustAs}\r\n\t * (and shorthand methods such as {@link ng.$sce#trustAsHtml $sce.trustAsHtml}, etc.) to\r\n\t * obtain values that will be accepted by SCE / privileged contexts.\r\n\t *\r\n\t *\r\n\t * ## How does it work?\r\n\t *\r\n\t * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#getTrusted\r\n\t * $sce.getTrusted(context, value)} rather than to the value directly. Directives use {@link\r\n\t * ng.$sce#parse $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the\r\n\t * {@link ng.$sce#getTrusted $sce.getTrusted} behind the scenes on non-constant literals.\r\n\t *\r\n\t * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link\r\n\t * ng.$sce#parseAsHtml $sce.parseAsHtml(binding expression)}. Here's the actual code (slightly\r\n\t * simplified):\r\n\t *\r\n\t * <pre class=\"prettyprint\">\r\n\t * var ngBindHtmlDirective = ['$sce', function($sce) {\r\n\t * return function(scope, element, attr) {\r\n\t * scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {\r\n\t * element.html(value || '');\r\n\t * });\r\n\t * };\r\n\t * }];\r\n\t * </pre>\r\n\t *\r\n\t * ## Impact on loading templates\r\n\t *\r\n\t * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as\r\n\t * `templateUrl`'s specified by {@link guide/directive directives}.\r\n\t *\r\n\t * By default, Angular only loads templates from the same domain and protocol as the application\r\n\t * document. This is done by calling {@link ng.$sce#getTrustedResourceUrl\r\n\t * $sce.getTrustedResourceUrl} on the template URL. To load templates from other domains and/or\r\n\t * protocols, you may either either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist\r\n\t * them} or {@link ng.$sce#trustAsResourceUrl wrap it} into a trusted value.\r\n\t *\r\n\t * *Please note*:\r\n\t * The browser's\r\n\t * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)\r\n\t * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)\r\n\t * policy apply in addition to this and may further restrict whether the template is successfully\r\n\t * loaded. This means that without the right CORS policy, loading templates from a different domain\r\n\t * won't work on all browsers. Also, loading templates from `file://` URL does not work on some\r\n\t * browsers.\r\n\t *\r\n\t * ## This feels like too much overhead for the developer?\r\n\t *\r\n\t * It's important to remember that SCE only applies to interpolation expressions.\r\n\t *\r\n\t * If your expressions are constant literals, they're automatically trusted and you don't need to\r\n\t * call `$sce.trustAs` on them (remember to include the `ngSanitize` module) (e.g.\r\n\t * `<div ng-bind-html=\"'<b>implicitly trusted</b>'\"></div>`) just works.\r\n\t *\r\n\t * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them\r\n\t * through {@link ng.$sce#getTrusted $sce.getTrusted}. SCE doesn't play a role here.\r\n\t *\r\n\t * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load\r\n\t * templates in `ng-include` from your application's domain without having to even know about SCE.\r\n\t * It blocks loading templates from other domains or loading templates over http from an https\r\n\t * served document. You can change these by setting your own custom {@link\r\n\t * ng.$sceDelegateProvider#resourceUrlWhitelist whitelists} and {@link\r\n\t * ng.$sceDelegateProvider#resourceUrlBlacklist blacklists} for matching such URLs.\r\n\t *\r\n\t * This significantly reduces the overhead. It is far easier to pay the small overhead and have an\r\n\t * application that's secure and can be audited to verify that with much more ease than bolting\r\n\t * security onto an application later.\r\n\t *\r\n\t * <a name=\"contexts\"></a>\r\n\t * ## What trusted context types are supported?\r\n\t *\r\n\t * | Context | Notes |\r\n\t * |---------------------|----------------|\r\n\t * | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. |\r\n\t * | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. |\r\n\t * | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`<a href=` and `<img src=` sanitize their urls and don't constitute an SCE context. |\r\n\t * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application. Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.) <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. |\r\n\t * | `$sce.JS` | For JavaScript that is safe to execute in your application's context. Currently unused. Feel free to use it in your own directives. |\r\n\t *\r\n\t * ## Format of items in {@link ng.$sceDelegateProvider#resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#resourceUrlBlacklist Blacklist} <a name=\"resourceUrlPatternItem\"></a>\r\n\t *\r\n\t * Each element in these arrays must be one of the following:\r\n\t *\r\n\t * - **'self'**\r\n\t * - The special **string**, `'self'`, can be used to match against all URLs of the **same\r\n\t * domain** as the application document using the **same protocol**.\r\n\t * - **String** (except the special value `'self'`)\r\n\t * - The string is matched against the full *normalized / absolute URL* of the resource\r\n\t * being tested (substring matches are not good enough.)\r\n\t * - There are exactly **two wildcard sequences** - `*` and `**`. All other characters\r\n\t * match themselves.\r\n\t * - `*`: matches zero or more occurrences of any character other than one of the following 6\r\n\t * characters: '`:`', '`/`', '`.`', '`?`', '`&`' and ';'. It's a useful wildcard for use\r\n\t * in a whitelist.\r\n\t * - `**`: matches zero or more occurrences of *any* character. As such, it's not\r\n\t * not appropriate to use in for a scheme, domain, etc. as it would match too much. (e.g.\r\n\t * http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might\r\n\t * not have been the intention.) Its usage at the very end of the path is ok. (e.g.\r\n\t * http://foo.example.com/templates/**).\r\n\t * - **RegExp** (*see caveat below*)\r\n\t * - *Caveat*: While regular expressions are powerful and offer great flexibility, their syntax\r\n\t * (and all the inevitable escaping) makes them *harder to maintain*. It's easy to\r\n\t * accidentally introduce a bug when one updates a complex expression (imho, all regexes should\r\n\t * have good test coverage.). For instance, the use of `.` in the regex is correct only in a\r\n\t * small number of cases. A `.` character in the regex used when matching the scheme or a\r\n\t * subdomain could be matched against a `:` or literal `.` that was likely not intended. It\r\n\t * is highly recommended to use the string patterns and only fall back to regular expressions\r\n\t * if they as a last resort.\r\n\t * - The regular expression must be an instance of RegExp (i.e. not a string.) It is\r\n\t * matched against the **entire** *normalized / absolute URL* of the resource being tested\r\n\t * (even when the RegExp did not have the `^` and `$` codes.) In addition, any flags\r\n\t * present on the RegExp (such as multiline, global, ignoreCase) are ignored.\r\n\t * - If you are generating your JavaScript from some other templating engine (not\r\n\t * recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)),\r\n\t * remember to escape your regular expression (and be aware that you might need more than\r\n\t * one level of escaping depending on your templating engine and the way you interpolated\r\n\t * the value.) Do make use of your platform's escaping mechanism as it might be good\r\n\t * enough before coding your own. e.g. Ruby has\r\n\t * [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape)\r\n\t * and Python has [re.escape](http://docs.python.org/library/re.html#re.escape).\r\n\t * Javascript lacks a similar built in function for escaping. Take a look at Google\r\n\t * Closure library's [goog.string.regExpEscape(s)](\r\n\t * http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962).\r\n\t *\r\n\t * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example.\r\n\t *\r\n\t * ## Show me an example using SCE.\r\n\t *\r\n\t * @example\r\n\t<example module=\"mySceApp\" deps=\"angular-sanitize.js\">\r\n\t<file name=\"index.html\">\r\n\t <div ng-controller=\"myAppController as myCtrl\">\r\n\t\t<i ng-bind-html=\"myCtrl.explicitlyTrustedHtml\" id=\"explicitlyTrustedHtml\"></i><br><br>\r\n\t\t<b>User comments</b><br>\r\n\t\tBy default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when\r\n\t\t$sanitize is available. If $sanitize isn't available, this results in an error instead of an\r\n\t\texploit.\r\n\t\t<div class=\"well\">\r\n\t\t <div ng-repeat=\"userComment in myCtrl.userComments\">\r\n\t\t\t<b>{{userComment.name}}</b>:\r\n\t\t\t<span ng-bind-html=\"userComment.htmlComment\" class=\"htmlComment\"></span>\r\n\t\t\t<br>\r\n\t\t </div>\r\n\t\t</div>\r\n\t </div>\r\n\t</file>\r\n\t\r\n\t<file name=\"script.js\">\r\n\t var mySceApp = angular.module('mySceApp', ['ngSanitize']);\r\n\t\r\n\t mySceApp.controller(\"myAppController\", function myAppController($http, $templateCache, $sce) {\r\n\t\tvar self = this;\r\n\t\t$http.get(\"test_data.json\", {cache: $templateCache}).success(function(userComments) {\r\n\t\t self.userComments = userComments;\r\n\t\t});\r\n\t\tself.explicitlyTrustedHtml = $sce.trustAsHtml(\r\n\t\t\t'<span onmouseover=\"this.textContent="Explicitly trusted HTML bypasses ' +\r\n\t\t\t'sanitization."\">Hover over this text.</span>');\r\n\t });\r\n\t</file>\r\n\t\r\n\t<file name=\"test_data.json\">\r\n\t[\r\n\t { \"name\": \"Alice\",\r\n\t\t\"htmlComment\":\r\n\t\t\t\"<span onmouseover='this.textContent=\\\"PWN3D!\\\"'>Is <i>anyone</i> reading this?</span>\"\r\n\t },\r\n\t { \"name\": \"Bob\",\r\n\t\t\"htmlComment\": \"<i>Yes!</i> Am I the only other one?\"\r\n\t }\r\n\t]\r\n\t</file>\r\n\t\r\n\t<file name=\"protractor.js\" type=\"protractor\">\r\n\t describe('SCE doc demo', function() {\r\n\t\tit('should sanitize untrusted values', function() {\r\n\t\t expect(element(by.css('.htmlComment')).getInnerHtml())\r\n\t\t\t .toBe('<span>Is <i>anyone</i> reading this?</span>');\r\n\t\t});\r\n\t\r\n\t\tit('should NOT sanitize explicitly trusted values', function() {\r\n\t\t expect(element(by.id('explicitlyTrustedHtml')).getInnerHtml()).toBe(\r\n\t\t\t '<span onmouseover=\"this.textContent="Explicitly trusted HTML bypasses ' +\r\n\t\t\t 'sanitization."\">Hover over this text.</span>');\r\n\t\t});\r\n\t });\r\n\t</file>\r\n\t</example>\r\n\t *\r\n\t *\r\n\t *\r\n\t * ## Can I disable SCE completely?\r\n\t *\r\n\t * Yes, you can. However, this is strongly discouraged. SCE gives you a lot of security benefits\r\n\t * for little coding overhead. It will be much harder to take an SCE disabled application and\r\n\t * either secure it on your own or enable SCE at a later stage. It might make sense to disable SCE\r\n\t * for cases where you have a lot of existing code that was written before SCE was introduced and\r\n\t * you're migrating them a module at a time.\r\n\t *\r\n\t * That said, here's how you can completely disable SCE:\r\n\t *\r\n\t * <pre class=\"prettyprint\">\r\n\t * angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {\r\n\t * // Completely disable SCE. For demonstration purposes only!\r\n\t * // Do not use in new projects.\r\n\t * $sceProvider.enabled(false);\r\n\t * });\r\n\t * </pre>\r\n\t *\r\n\t */\r\n\t/* jshint maxlen: 100 */\r\n\r\n\tfunction $SceProvider() {\r\n\t\tvar enabled = true;\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $sceProvider#enabled\r\n\t\t * @kind function\r\n\t\t *\r\n\t\t * @param {boolean=} value If provided, then enables/disables SCE.\r\n\t\t * @return {boolean} true if SCE is enabled, false otherwise.\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Enables/disables SCE and returns the current value.\r\n\t\t */\r\n\t\tthis.enabled = function (value) {\r\n\t\t\tif (arguments.length) {\r\n\t\t\t\tenabled = !!value;\r\n\t\t\t}\r\n\t\t\treturn enabled;\r\n\t\t};\r\n\r\n\r\n\t\t/* Design notes on the default implementation for SCE.\r\n\t\t *\r\n\t\t * The API contract for the SCE delegate\r\n\t\t * -------------------------------------\r\n\t\t * The SCE delegate object must provide the following 3 methods:\r\n\t\t *\r\n\t\t * - trustAs(contextEnum, value)\r\n\t\t * This method is used to tell the SCE service that the provided value is OK to use in the\r\n\t\t * contexts specified by contextEnum. It must return an object that will be accepted by\r\n\t\t * getTrusted() for a compatible contextEnum and return this value.\r\n\t\t *\r\n\t\t * - valueOf(value)\r\n\t\t * For values that were not produced by trustAs(), return them as is. For values that were\r\n\t\t * produced by trustAs(), return the corresponding input value to trustAs. Basically, if\r\n\t\t * trustAs is wrapping the given values into some type, this operation unwraps it when given\r\n\t\t * such a value.\r\n\t\t *\r\n\t\t * - getTrusted(contextEnum, value)\r\n\t\t * This function should return the a value that is safe to use in the context specified by\r\n\t\t * contextEnum or throw and exception otherwise.\r\n\t\t *\r\n\t\t * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be\r\n\t\t * opaque or wrapped in some holder object. That happens to be an implementation detail. For\r\n\t\t * instance, an implementation could maintain a registry of all trusted objects by context. In\r\n\t\t * such a case, trustAs() would return the same object that was passed in. getTrusted() would\r\n\t\t * return the same object passed in if it was found in the registry under a compatible context or\r\n\t\t * throw an exception otherwise. An implementation might only wrap values some of the time based\r\n\t\t * on some criteria. getTrusted() might return a value and not throw an exception for special\r\n\t\t * constants or objects even if not wrapped. All such implementations fulfill this contract.\r\n\t\t *\r\n\t\t *\r\n\t\t * A note on the inheritance model for SCE contexts\r\n\t\t * ------------------------------------------------\r\n\t\t * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types. This\r\n\t\t * is purely an implementation details.\r\n\t\t *\r\n\t\t * The contract is simply this:\r\n\t\t *\r\n\t\t * getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value)\r\n\t\t * will also succeed.\r\n\t\t *\r\n\t\t * Inheritance happens to capture this in a natural way. In some future, we\r\n\t\t * may not use inheritance anymore. That is OK because no code outside of\r\n\t\t * sce.js and sceSpecs.js would need to be aware of this detail.\r\n\t\t */\r\n\r\n\t\tthis.$get = ['$parse', '$sniffer', '$sceDelegate', function (\r\n\t\t\t\t\t $parse, $sniffer, $sceDelegate) {\r\n\t\t\t// Prereq: Ensure that we're not running in IE8 quirks mode. In that mode, IE allows\r\n\t\t\t// the \"expression(javascript expression)\" syntax which is insecure.\r\n\t\t\tif (enabled && $sniffer.msie && $sniffer.msieDocumentMode < 8) {\r\n\t\t\t\tthrow $sceMinErr('iequirks',\r\n\t\t\t\t 'Strict Contextual Escaping does not support Internet Explorer version < 9 in quirks ' +\r\n\t\t\t\t 'mode. You can fix this by adding the text <!doctype html> to the top of your HTML ' +\r\n\t\t\t\t 'document. See http://docs.angularjs.org/api/ng.$sce for more information.');\r\n\t\t\t}\r\n\r\n\t\t\tvar sce = shallowCopy(SCE_CONTEXTS);\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#isEnabled\r\n\t\t\t * @kind function\r\n\t\t\t *\r\n\t\t\t * @return {Boolean} true if SCE is enabled, false otherwise. If you want to set the value, you\r\n\t\t\t * have to do it at module config time on {@link ng.$sceProvider $sceProvider}.\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Returns a boolean indicating if SCE is enabled.\r\n\t\t\t */\r\n\t\t\tsce.isEnabled = function () {\r\n\t\t\t\treturn enabled;\r\n\t\t\t};\r\n\t\t\tsce.trustAs = $sceDelegate.trustAs;\r\n\t\t\tsce.getTrusted = $sceDelegate.getTrusted;\r\n\t\t\tsce.valueOf = $sceDelegate.valueOf;\r\n\r\n\t\t\tif (!enabled) {\r\n\t\t\t\tsce.trustAs = sce.getTrusted = function (type, value) { return value; };\r\n\t\t\t\tsce.valueOf = identity;\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#parseAs\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Converts Angular {@link guide/expression expression} into a function. This is like {@link\r\n\t\t\t * ng.$parse $parse} and is identical when the expression is a literal constant. Otherwise, it\r\n\t\t\t * wraps the expression in a call to {@link ng.$sce#getTrusted $sce.getTrusted(*type*,\r\n\t\t\t * *result*)}\r\n\t\t\t *\r\n\t\t\t * @param {string} type The kind of SCE context in which this result will be used.\r\n\t\t\t * @param {string} expression String expression to compile.\r\n\t\t\t * @returns {function(context, locals)} a function which represents the compiled expression:\r\n\t\t\t *\r\n\t\t\t * * `context` – `{object}` – an object against which any expressions embedded in the strings\r\n\t\t\t * are evaluated against (typically a scope object).\r\n\t\t\t * * `locals` – `{object=}` – local variables context object, useful for overriding values in\r\n\t\t\t * `context`.\r\n\t\t\t */\r\n\t\t\tsce.parseAs = function sceParseAs(type, expr) {\r\n\t\t\t\tvar parsed = $parse(expr);\r\n\t\t\t\tif (parsed.literal && parsed.constant) {\r\n\t\t\t\t\treturn parsed;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn function sceParseAsTrusted(self, locals) {\r\n\t\t\t\t\t\treturn sce.getTrusted(type, parsed(self, locals));\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#trustAs\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Delegates to {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs`}. As such,\r\n\t\t\t * returns an object that is trusted by angular for use in specified strict contextual\r\n\t\t\t * escaping contexts (such as ng-bind-html, ng-include, any src attribute\r\n\t\t\t * interpolation, any dom event binding attribute interpolation such as for onclick, etc.)\r\n\t\t\t * that uses the provided value. See * {@link ng.$sce $sce} for enabling strict contextual\r\n\t\t\t * escaping.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The kind of context in which this value is safe for use. e.g. url,\r\n\t\t\t * resource_url, html, js and css.\r\n\t\t\t * @param {*} value The value that that should be considered trusted/safe.\r\n\t\t\t * @returns {*} A value that can be used to stand in for the provided `value` in places\r\n\t\t\t * where Angular expects a $sce.trustAs() return value.\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#trustAsHtml\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Shorthand method. `$sce.trustAsHtml(value)` →\r\n\t\t\t * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.HTML, value)`}\r\n\t\t\t *\r\n\t\t\t * @param {*} value The value to trustAs.\r\n\t\t\t * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedHtml\r\n\t\t\t * $sce.getTrustedHtml(value)} to obtain the original value. (privileged directives\r\n\t\t\t * only accept expressions that are either literal constants or are the\r\n\t\t\t * return value of {@link ng.$sce#trustAs $sce.trustAs}.)\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#trustAsUrl\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Shorthand method. `$sce.trustAsUrl(value)` →\r\n\t\t\t * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.URL, value)`}\r\n\t\t\t *\r\n\t\t\t * @param {*} value The value to trustAs.\r\n\t\t\t * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedUrl\r\n\t\t\t * $sce.getTrustedUrl(value)} to obtain the original value. (privileged directives\r\n\t\t\t * only accept expressions that are either literal constants or are the\r\n\t\t\t * return value of {@link ng.$sce#trustAs $sce.trustAs}.)\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#trustAsResourceUrl\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Shorthand method. `$sce.trustAsResourceUrl(value)` →\r\n\t\t\t * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`}\r\n\t\t\t *\r\n\t\t\t * @param {*} value The value to trustAs.\r\n\t\t\t * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedResourceUrl\r\n\t\t\t * $sce.getTrustedResourceUrl(value)} to obtain the original value. (privileged directives\r\n\t\t\t * only accept expressions that are either literal constants or are the return\r\n\t\t\t * value of {@link ng.$sce#trustAs $sce.trustAs}.)\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#trustAsJs\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Shorthand method. `$sce.trustAsJs(value)` →\r\n\t\t\t * {@link ng.$sceDelegate#trustAs `$sceDelegate.trustAs($sce.JS, value)`}\r\n\t\t\t *\r\n\t\t\t * @param {*} value The value to trustAs.\r\n\t\t\t * @returns {*} An object that can be passed to {@link ng.$sce#getTrustedJs\r\n\t\t\t * $sce.getTrustedJs(value)} to obtain the original value. (privileged directives\r\n\t\t\t * only accept expressions that are either literal constants or are the\r\n\t\t\t * return value of {@link ng.$sce#trustAs $sce.trustAs}.)\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#getTrusted\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Delegates to {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted`}. As such,\r\n\t\t\t * takes the result of a {@link ng.$sce#trustAs `$sce.trustAs`}() call and returns the\r\n\t\t\t * originally supplied value if the queried context type is a supertype of the created type.\r\n\t\t\t * If this condition isn't satisfied, throws an exception.\r\n\t\t\t *\r\n\t\t\t * @param {string} type The kind of context in which this value is to be used.\r\n\t\t\t * @param {*} maybeTrusted The result of a prior {@link ng.$sce#trustAs `$sce.trustAs`}\r\n\t\t\t * call.\r\n\t\t\t * @returns {*} The value the was originally provided to\r\n\t\t\t * {@link ng.$sce#trustAs `$sce.trustAs`} if valid in this context.\r\n\t\t\t * Otherwise, throws an exception.\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#getTrustedHtml\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Shorthand method. `$sce.getTrustedHtml(value)` →\r\n\t\t\t * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`}\r\n\t\t\t *\r\n\t\t\t * @param {*} value The value to pass to `$sce.getTrusted`.\r\n\t\t\t * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)`\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#getTrustedCss\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Shorthand method. `$sce.getTrustedCss(value)` →\r\n\t\t\t * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`}\r\n\t\t\t *\r\n\t\t\t * @param {*} value The value to pass to `$sce.getTrusted`.\r\n\t\t\t * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)`\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#getTrustedUrl\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Shorthand method. `$sce.getTrustedUrl(value)` →\r\n\t\t\t * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.URL, value)`}\r\n\t\t\t *\r\n\t\t\t * @param {*} value The value to pass to `$sce.getTrusted`.\r\n\t\t\t * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)`\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#getTrustedResourceUrl\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Shorthand method. `$sce.getTrustedResourceUrl(value)` →\r\n\t\t\t * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`}\r\n\t\t\t *\r\n\t\t\t * @param {*} value The value to pass to `$sceDelegate.getTrusted`.\r\n\t\t\t * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)`\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#getTrustedJs\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Shorthand method. `$sce.getTrustedJs(value)` →\r\n\t\t\t * {@link ng.$sceDelegate#getTrusted `$sceDelegate.getTrusted($sce.JS, value)`}\r\n\t\t\t *\r\n\t\t\t * @param {*} value The value to pass to `$sce.getTrusted`.\r\n\t\t\t * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)`\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#parseAsHtml\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Shorthand method. `$sce.parseAsHtml(expression string)` →\r\n\t\t\t * {@link ng.$sce#parse `$sce.parseAs($sce.HTML, value)`}\r\n\t\t\t *\r\n\t\t\t * @param {string} expression String expression to compile.\r\n\t\t\t * @returns {function(context, locals)} a function which represents the compiled expression:\r\n\t\t\t *\r\n\t\t\t * * `context` – `{object}` – an object against which any expressions embedded in the strings\r\n\t\t\t * are evaluated against (typically a scope object).\r\n\t\t\t * * `locals` – `{object=}` – local variables context object, useful for overriding values in\r\n\t\t\t * `context`.\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#parseAsCss\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Shorthand method. `$sce.parseAsCss(value)` →\r\n\t\t\t * {@link ng.$sce#parse `$sce.parseAs($sce.CSS, value)`}\r\n\t\t\t *\r\n\t\t\t * @param {string} expression String expression to compile.\r\n\t\t\t * @returns {function(context, locals)} a function which represents the compiled expression:\r\n\t\t\t *\r\n\t\t\t * * `context` – `{object}` – an object against which any expressions embedded in the strings\r\n\t\t\t * are evaluated against (typically a scope object).\r\n\t\t\t * * `locals` – `{object=}` – local variables context object, useful for overriding values in\r\n\t\t\t * `context`.\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#parseAsUrl\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Shorthand method. `$sce.parseAsUrl(value)` →\r\n\t\t\t * {@link ng.$sce#parse `$sce.parseAs($sce.URL, value)`}\r\n\t\t\t *\r\n\t\t\t * @param {string} expression String expression to compile.\r\n\t\t\t * @returns {function(context, locals)} a function which represents the compiled expression:\r\n\t\t\t *\r\n\t\t\t * * `context` – `{object}` – an object against which any expressions embedded in the strings\r\n\t\t\t * are evaluated against (typically a scope object).\r\n\t\t\t * * `locals` – `{object=}` – local variables context object, useful for overriding values in\r\n\t\t\t * `context`.\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#parseAsResourceUrl\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Shorthand method. `$sce.parseAsResourceUrl(value)` →\r\n\t\t\t * {@link ng.$sce#parse `$sce.parseAs($sce.RESOURCE_URL, value)`}\r\n\t\t\t *\r\n\t\t\t * @param {string} expression String expression to compile.\r\n\t\t\t * @returns {function(context, locals)} a function which represents the compiled expression:\r\n\t\t\t *\r\n\t\t\t * * `context` – `{object}` – an object against which any expressions embedded in the strings\r\n\t\t\t * are evaluated against (typically a scope object).\r\n\t\t\t * * `locals` – `{object=}` – local variables context object, useful for overriding values in\r\n\t\t\t * `context`.\r\n\t\t\t */\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name $sce#parseAsJs\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Shorthand method. `$sce.parseAsJs(value)` →\r\n\t\t\t * {@link ng.$sce#parse `$sce.parseAs($sce.JS, value)`}\r\n\t\t\t *\r\n\t\t\t * @param {string} expression String expression to compile.\r\n\t\t\t * @returns {function(context, locals)} a function which represents the compiled expression:\r\n\t\t\t *\r\n\t\t\t * * `context` – `{object}` – an object against which any expressions embedded in the strings\r\n\t\t\t * are evaluated against (typically a scope object).\r\n\t\t\t * * `locals` – `{object=}` – local variables context object, useful for overriding values in\r\n\t\t\t * `context`.\r\n\t\t\t */\r\n\r\n\t\t\t// Shorthand delegations.\r\n\t\t\tvar parse = sce.parseAs,\r\n\t\t\t\tgetTrusted = sce.getTrusted,\r\n\t\t\t\ttrustAs = sce.trustAs;\r\n\r\n\t\t\tforEach(SCE_CONTEXTS, function (enumValue, name) {\r\n\t\t\t\tvar lName = lowercase(name);\r\n\t\t\t\tsce[camelCase(\"parse_as_\" + lName)] = function (expr) {\r\n\t\t\t\t\treturn parse(enumValue, expr);\r\n\t\t\t\t};\r\n\t\t\t\tsce[camelCase(\"get_trusted_\" + lName)] = function (value) {\r\n\t\t\t\t\treturn getTrusted(enumValue, value);\r\n\t\t\t\t};\r\n\t\t\t\tsce[camelCase(\"trust_as_\" + lName)] = function (value) {\r\n\t\t\t\t\treturn trustAs(enumValue, value);\r\n\t\t\t\t};\r\n\t\t\t});\r\n\r\n\t\t\treturn sce;\r\n\t\t}];\r\n\t}\r\n\r\n\t/**\r\n\t * !!! This is an undocumented \"private\" service !!!\r\n\t *\r\n\t * @name $sniffer\r\n\t * @requires $window\r\n\t * @requires $document\r\n\t *\r\n\t * @property {boolean} history Does the browser support html5 history api ?\r\n\t * @property {boolean} hashchange Does the browser support hashchange event ?\r\n\t * @property {boolean} transitions Does the browser support CSS transition events ?\r\n\t * @property {boolean} animations Does the browser support CSS animation events ?\r\n\t *\r\n\t * @description\r\n\t * This is very simple implementation of testing browser's features.\r\n\t */\r\n\tfunction $SnifferProvider() {\r\n\t\tthis.$get = ['$window', '$document', function ($window, $document) {\r\n\t\t\tvar eventSupport = {},\r\n\t\t\t\tandroid =\r\n\t\t\t\t int((/android (\\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]),\r\n\t\t\t\tboxee = /Boxee/i.test(($window.navigator || {}).userAgent),\r\n\t\t\t\tdocument = $document[0] || {},\r\n\t\t\t\tdocumentMode = document.documentMode,\r\n\t\t\t\tvendorPrefix,\r\n\t\t\t\tvendorRegex = /^(Moz|webkit|O|ms)(?=[A-Z])/,\r\n\t\t\t\tbodyStyle = document.body && document.body.style,\r\n\t\t\t\ttransitions = false,\r\n\t\t\t\tanimations = false,\r\n\t\t\t\tmatch;\r\n\r\n\t\t\tif (bodyStyle) {\r\n\t\t\t\tfor (var prop in bodyStyle) {\r\n\t\t\t\t\tif (match = vendorRegex.exec(prop)) {\r\n\t\t\t\t\t\tvendorPrefix = match[0];\r\n\t\t\t\t\t\tvendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!vendorPrefix) {\r\n\t\t\t\t\tvendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit';\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttransitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle));\r\n\t\t\t\tanimations = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle));\r\n\r\n\t\t\t\tif (android && (!transitions || !animations)) {\r\n\t\t\t\t\ttransitions = isString(document.body.style.webkitTransition);\r\n\t\t\t\t\tanimations = isString(document.body.style.webkitAnimation);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\treturn {\r\n\t\t\t\t// Android has history.pushState, but it does not update location correctly\r\n\t\t\t\t// so let's not use the history API at all.\r\n\t\t\t\t// http://code.google.com/p/android/issues/detail?id=17471\r\n\t\t\t\t// https://github.com/angular/angular.js/issues/904\r\n\r\n\t\t\t\t// older webkit browser (533.9) on Boxee box has exactly the same problem as Android has\r\n\t\t\t\t// so let's not use the history API also\r\n\t\t\t\t// We are purposefully using `!(android < 4)` to cover the case when `android` is undefined\r\n\t\t\t\t// jshint -W018\r\n\t\t\t\thistory: !!($window.history && $window.history.pushState && !(android < 4) && !boxee),\r\n\t\t\t\t// jshint +W018\r\n\t\t\t\thashchange: 'onhashchange' in $window &&\r\n\t\t\t\t\t\t\t// IE8 compatible mode lies\r\n\t\t\t\t\t\t\t(!documentMode || documentMode > 7),\r\n\t\t\t\thasEvent: function (event) {\r\n\t\t\t\t\t// IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have\r\n\t\t\t\t\t// it. In particular the event is not fired when backspace or delete key are pressed or\r\n\t\t\t\t\t// when cut operation is performed.\r\n\t\t\t\t\tif (event == 'input' && msie == 9) return false;\r\n\r\n\t\t\t\t\tif (isUndefined(eventSupport[event])) {\r\n\t\t\t\t\t\tvar divElm = document.createElement('div');\r\n\t\t\t\t\t\teventSupport[event] = 'on' + event in divElm;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn eventSupport[event];\r\n\t\t\t\t},\r\n\t\t\t\tcsp: csp(),\r\n\t\t\t\tvendorPrefix: vendorPrefix,\r\n\t\t\t\ttransitions: transitions,\r\n\t\t\t\tanimations: animations,\r\n\t\t\t\tandroid: android,\r\n\t\t\t\tmsie: msie,\r\n\t\t\t\tmsieDocumentMode: documentMode\r\n\t\t\t};\r\n\t\t}];\r\n\t}\r\n\r\n\tfunction $TimeoutProvider() {\r\n\t\tthis.$get = ['$rootScope', '$browser', '$q', '$exceptionHandler',\r\n\t\t\t function ($rootScope, $browser, $q, $exceptionHandler) {\r\n\t\t\t \tvar deferreds = {};\r\n\r\n\r\n\t\t\t \t/**\r\n\t\t\t\t * @ngdoc service\r\n\t\t\t\t * @name $timeout\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch\r\n\t\t\t\t * block and delegates any exceptions to\r\n\t\t\t\t * {@link ng.$exceptionHandler $exceptionHandler} service.\r\n\t\t\t\t *\r\n\t\t\t\t * The return value of registering a timeout function is a promise, which will be resolved when\r\n\t\t\t\t * the timeout is reached and the timeout function is executed.\r\n\t\t\t\t *\r\n\t\t\t\t * To cancel a timeout request, call `$timeout.cancel(promise)`.\r\n\t\t\t\t *\r\n\t\t\t\t * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to\r\n\t\t\t\t * synchronously flush the queue of deferred functions.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {function()} fn A function, whose execution should be delayed.\r\n\t\t\t\t * @param {number=} [delay=0] Delay in milliseconds.\r\n\t\t\t\t * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise\r\n\t\t\t\t * will invoke `fn` within the {@link ng.$rootScope.Scope#$apply $apply} block.\r\n\t\t\t\t * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this\r\n\t\t\t\t * promise will be resolved with is the return value of the `fn` function.\r\n\t\t\t\t *\r\n\t\t\t\t */\r\n\t\t\t \tfunction timeout(fn, delay, invokeApply) {\r\n\t\t\t \t\tvar deferred = $q.defer(),\r\n\t\t\t\t\t\tpromise = deferred.promise,\r\n\t\t\t\t\t\tskipApply = (isDefined(invokeApply) && !invokeApply),\r\n\t\t\t\t\t\ttimeoutId;\r\n\r\n\t\t\t \t\ttimeoutId = $browser.defer(function () {\r\n\t\t\t \t\t\ttry {\r\n\t\t\t \t\t\t\tdeferred.resolve(fn());\r\n\t\t\t \t\t\t} catch (e) {\r\n\t\t\t \t\t\t\tdeferred.reject(e);\r\n\t\t\t \t\t\t\t$exceptionHandler(e);\r\n\t\t\t \t\t\t}\r\n\t\t\t \t\t\tfinally {\r\n\t\t\t \t\t\t\tdelete deferreds[promise.$$timeoutId];\r\n\t\t\t \t\t\t}\r\n\r\n\t\t\t \t\t\tif (!skipApply) $rootScope.$apply();\r\n\t\t\t \t\t}, delay);\r\n\r\n\t\t\t \t\tpromise.$$timeoutId = timeoutId;\r\n\t\t\t \t\tdeferreds[timeoutId] = deferred;\r\n\r\n\t\t\t \t\treturn promise;\r\n\t\t\t \t}\r\n\r\n\r\n\t\t\t \t/**\r\n\t\t\t\t * @ngdoc method\r\n\t\t\t\t * @name $timeout#cancel\r\n\t\t\t\t *\r\n\t\t\t\t * @description\r\n\t\t\t\t * Cancels a task associated with the `promise`. As a result of this, the promise will be\r\n\t\t\t\t * resolved with a rejection.\r\n\t\t\t\t *\r\n\t\t\t\t * @param {Promise=} promise Promise returned by the `$timeout` function.\r\n\t\t\t\t * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully\r\n\t\t\t\t * canceled.\r\n\t\t\t\t */\r\n\t\t\t \ttimeout.cancel = function (promise) {\r\n\t\t\t \t\tif (promise && promise.$$timeoutId in deferreds) {\r\n\t\t\t \t\t\tdeferreds[promise.$$timeoutId].reject('canceled');\r\n\t\t\t \t\t\tdelete deferreds[promise.$$timeoutId];\r\n\t\t\t \t\t\treturn $browser.defer.cancel(promise.$$timeoutId);\r\n\t\t\t \t\t}\r\n\t\t\t \t\treturn false;\r\n\t\t\t \t};\r\n\r\n\t\t\t \treturn timeout;\r\n\t\t\t }];\r\n\t}\r\n\r\n\t// NOTE: The usage of window and document instead of $window and $document here is\r\n\t// deliberate. This service depends on the specific behavior of anchor nodes created by the\r\n\t// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and\r\n\t// cause us to break tests. In addition, when the browser resolves a URL for XHR, it\r\n\t// doesn't know about mocked locations and resolves URLs to the real document - which is\r\n\t// exactly the behavior needed here. There is little value is mocking these out for this\r\n\t// service.\r\n\tvar urlParsingNode = document.createElement(\"a\");\r\n\tvar originUrl = urlResolve(window.location.href, true);\r\n\r\n\r\n\t/**\r\n\t *\r\n\t * Implementation Notes for non-IE browsers\r\n\t * ----------------------------------------\r\n\t * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM,\r\n\t * results both in the normalizing and parsing of the URL. Normalizing means that a relative\r\n\t * URL will be resolved into an absolute URL in the context of the application document.\r\n\t * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related\r\n\t * properties are all populated to reflect the normalized URL. This approach has wide\r\n\t * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc. See\r\n\t * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\r\n\t *\r\n\t * Implementation Notes for IE\r\n\t * ---------------------------\r\n\t * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other\r\n\t * browsers. However, the parsed components will not be set if the URL assigned did not specify\r\n\t * them. (e.g. if you assign a.href = \"foo\", then a.protocol, a.host, etc. will be empty.) We\r\n\t * work around that by performing the parsing in a 2nd step by taking a previously normalized\r\n\t * URL (e.g. by assigning to a.href) and assigning it a.href again. This correctly populates the\r\n\t * properties such as protocol, hostname, port, etc.\r\n\t *\r\n\t * IE7 does not normalize the URL when assigned to an anchor node. (Apparently, it does, if one\r\n\t * uses the inner HTML approach to assign the URL as part of an HTML snippet -\r\n\t * http://stackoverflow.com/a/472729) However, setting img[src] does normalize the URL.\r\n\t * Unfortunately, setting img[src] to something like \"javascript:foo\" on IE throws an exception.\r\n\t * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that\r\n\t * method and IE < 8 is unsupported.\r\n\t *\r\n\t * References:\r\n\t * http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement\r\n\t * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html\r\n\t * http://url.spec.whatwg.org/#urlutils\r\n\t * https://github.com/angular/angular.js/pull/2902\r\n\t * http://james.padolsey.com/javascript/parsing-urls-with-the-dom/\r\n\t *\r\n\t * @kind function\r\n\t * @param {string} url The URL to be parsed.\r\n\t * @description Normalizes and parses a URL.\r\n\t * @returns {object} Returns the normalized URL as a dictionary.\r\n\t *\r\n\t * | member name | Description |\r\n\t * |---------------|----------------|\r\n\t * | href | A normalized version of the provided URL if it was not an absolute URL |\r\n\t * | protocol | The protocol including the trailing colon |\r\n\t * | host | The host and port (if the port is non-default) of the normalizedUrl |\r\n\t * | search | The search params, minus the question mark |\r\n\t * | hash | The hash string, minus the hash symbol\r\n\t * | hostname | The hostname\r\n\t * | port | The port, without \":\"\r\n\t * | pathname | The pathname, beginning with \"/\"\r\n\t *\r\n\t */\r\n\tfunction urlResolve(url, base) {\r\n\t\tvar href = url;\r\n\r\n\t\tif (msie) {\r\n\t\t\t// Normalize before parse. Refer Implementation Notes on why this is\r\n\t\t\t// done in two steps on IE.\r\n\t\t\turlParsingNode.setAttribute(\"href\", href);\r\n\t\t\thref = urlParsingNode.href;\r\n\t\t}\r\n\r\n\t\turlParsingNode.setAttribute('href', href);\r\n\r\n\t\t// urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\r\n\t\treturn {\r\n\t\t\thref: urlParsingNode.href,\r\n\t\t\tprotocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\r\n\t\t\thost: urlParsingNode.host,\r\n\t\t\tsearch: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\r\n\t\t\thash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\r\n\t\t\thostname: urlParsingNode.hostname,\r\n\t\t\tport: urlParsingNode.port,\r\n\t\t\tpathname: (urlParsingNode.pathname.charAt(0) === '/')\r\n\t\t\t ? urlParsingNode.pathname\r\n\t\t\t : '/' + urlParsingNode.pathname\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Parse a request URL and determine whether this is a same-origin request as the application document.\r\n\t *\r\n\t * @param {string|object} requestUrl The url of the request as a string that will be resolved\r\n\t * or a parsed URL object.\r\n\t * @returns {boolean} Whether the request is for the same origin as the application document.\r\n\t */\r\n\tfunction urlIsSameOrigin(requestUrl) {\r\n\t\tvar parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl;\r\n\t\treturn (parsed.protocol === originUrl.protocol &&\r\n\t\t\t\tparsed.host === originUrl.host);\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $window\r\n\t *\r\n\t * @description\r\n\t * A reference to the browser's `window` object. While `window`\r\n\t * is globally available in JavaScript, it causes testability problems, because\r\n\t * it is a global variable. In angular we always refer to it through the\r\n\t * `$window` service, so it may be overridden, removed or mocked for testing.\r\n\t *\r\n\t * Expressions, like the one defined for the `ngClick` directive in the example\r\n\t * below, are evaluated with respect to the current scope. Therefore, there is\r\n\t * no risk of inadvertently coding in a dependency on a global value in such an\r\n\t * expression.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <script>\r\n\t\t\t function Ctrl($scope, $window) {\r\n\t\t\t $scope.greeting = 'Hello, World!';\r\n\t\t\t $scope.doGreeting = function(greeting) {\r\n\t\t\t\t $window.alert(greeting);\r\n\t\t\t };\r\n\t\t\t }\r\n\t\t </script>\r\n\t\t <div ng-controller=\"Ctrl\">\r\n\t\t\t <input type=\"text\" ng-model=\"greeting\" />\r\n\t\t\t <button ng-click=\"doGreeting(greeting)\">ALERT</button>\r\n\t\t </div>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should display the greeting in the input box', function() {\r\n\t\t element(by.model('greeting')).sendKeys('Hello, E2E Tests');\r\n\t\t // If we click the button it will block the test runner\r\n\t\t // element(':button').click();\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tfunction $WindowProvider() {\r\n\t\tthis.$get = valueFn(window);\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc provider\r\n\t * @name $filterProvider\r\n\t * @description\r\n\t *\r\n\t * Filters are just functions which transform input to an output. However filters need to be\r\n\t * Dependency Injected. To achieve this a filter definition consists of a factory function which is\r\n\t * annotated with dependencies and is responsible for creating a filter function.\r\n\t *\r\n\t * ```js\r\n\t * // Filter registration\r\n\t * function MyModule($provide, $filterProvider) {\r\n\t * // create a service to demonstrate injection (not always needed)\r\n\t * $provide.value('greet', function(name){\r\n\t * return 'Hello ' + name + '!';\r\n\t * });\r\n\t *\r\n\t * // register a filter factory which uses the\r\n\t * // greet service to demonstrate DI.\r\n\t * $filterProvider.register('greet', function(greet){\r\n\t * // return the filter function which uses the greet service\r\n\t * // to generate salutation\r\n\t * return function(text) {\r\n\t * // filters need to be forgiving so check input validity\r\n\t * return text && greet(text) || text;\r\n\t * };\r\n\t * });\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * The filter function is registered with the `$injector` under the filter name suffix with\r\n\t * `Filter`.\r\n\t *\r\n\t * ```js\r\n\t * it('should be the same instance', inject(\r\n\t * function($filterProvider) {\r\n\t * $filterProvider.register('reverse', function(){\r\n\t * return ...;\r\n\t * });\r\n\t * },\r\n\t * function($filter, reverseFilter) {\r\n\t * expect($filter('reverse')).toBe(reverseFilter);\r\n\t * });\r\n\t * ```\r\n\t *\r\n\t *\r\n\t * For more information about how angular filters work, and how to create your own filters, see\r\n\t * {@link guide/filter Filters} in the Angular Developer Guide.\r\n\t */\r\n\t/**\r\n\t * @ngdoc method\r\n\t * @name $filterProvider#register\r\n\t * @description\r\n\t * Register filter factory function.\r\n\t *\r\n\t * @param {String} name Name of the filter.\r\n\t * @param {Function} fn The filter factory function which is injectable.\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc service\r\n\t * @name $filter\r\n\t * @kind function\r\n\t * @description\r\n\t * Filters are used for formatting data displayed to the user.\r\n\t *\r\n\t * The general syntax in templates is as follows:\r\n\t *\r\n\t * {{ expression [| filter_name[:parameter_value] ... ] }}\r\n\t *\r\n\t * @param {String} name Name of the filter function to retrieve\r\n\t * @return {Function} the filter function\r\n\t * @example\r\n\t <example name=\"$filter\" module=\"filterExample\">\r\n\t\t <file name=\"index.html\">\r\n\t\t <div ng-controller=\"MainCtrl\">\r\n\t\t\t<h3>{{ originalText }}</h3>\r\n\t\t\t<h3>{{ filteredText }}</h3>\r\n\t\t </div>\r\n\t\t </file>\r\n\t\r\n\t\t <file name=\"script.js\">\r\n\t\t angular.module('filterExample', [])\r\n\t\t .controller('MainCtrl', function($scope, $filter) {\r\n\t\t\t$scope.originalText = 'hello';\r\n\t\t\t$scope.filteredText = $filter('uppercase')($scope.originalText);\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\t$FilterProvider.$inject = ['$provide'];\r\n\tfunction $FilterProvider($provide) {\r\n\t\tvar suffix = 'Filter';\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name $controllerProvider#register\r\n\t\t * @param {string|Object} name Name of the filter function, or an object map of filters where\r\n\t\t * the keys are the filter names and the values are the filter factories.\r\n\t\t * @returns {Object} Registered filter instance, or if a map of filters was provided then a map\r\n\t\t * of the registered filter instances.\r\n\t\t */\r\n\t\tfunction register(name, factory) {\r\n\t\t\tif (isObject(name)) {\r\n\t\t\t\tvar filters = {};\r\n\t\t\t\tforEach(name, function (filter, key) {\r\n\t\t\t\t\tfilters[key] = register(key, filter);\r\n\t\t\t\t});\r\n\t\t\t\treturn filters;\r\n\t\t\t} else {\r\n\t\t\t\treturn $provide.factory(name + suffix, factory);\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.register = register;\r\n\r\n\t\tthis.$get = ['$injector', function ($injector) {\r\n\t\t\treturn function (name) {\r\n\t\t\t\treturn $injector.get(name + suffix);\r\n\t\t\t};\r\n\t\t}];\r\n\r\n\t\t////////////////////////////////////////\r\n\r\n\t\t/* global\r\n\t\t currencyFilter: false,\r\n\t\t dateFilter: false,\r\n\t\t filterFilter: false,\r\n\t\t jsonFilter: false,\r\n\t\t limitToFilter: false,\r\n\t\t lowercaseFilter: false,\r\n\t\t numberFilter: false,\r\n\t\t orderByFilter: false,\r\n\t\t uppercaseFilter: false,\r\n\t\t*/\r\n\r\n\t\tregister('currency', currencyFilter);\r\n\t\tregister('date', dateFilter);\r\n\t\tregister('filter', filterFilter);\r\n\t\tregister('json', jsonFilter);\r\n\t\tregister('limitTo', limitToFilter);\r\n\t\tregister('lowercase', lowercaseFilter);\r\n\t\tregister('number', numberFilter);\r\n\t\tregister('orderBy', orderByFilter);\r\n\t\tregister('uppercase', uppercaseFilter);\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc filter\r\n\t * @name filter\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Selects a subset of items from `array` and returns it as a new array.\r\n\t *\r\n\t * @param {Array} array The source array.\r\n\t * @param {string|Object|function()} expression The predicate to be used for selecting items from\r\n\t * `array`.\r\n\t *\r\n\t * Can be one of:\r\n\t *\r\n\t * - `string`: The string is evaluated as an expression and the resulting value is used for substring match against\r\n\t * the contents of the `array`. All strings or objects with string properties in `array` that contain this string\r\n\t * will be returned. The predicate can be negated by prefixing the string with `!`.\r\n\t *\r\n\t * - `Object`: A pattern object can be used to filter specific properties on objects contained\r\n\t * by `array`. For example `{name:\"M\", phone:\"1\"}` predicate will return an array of items\r\n\t * which have property `name` containing \"M\" and property `phone` containing \"1\". A special\r\n\t * property name `$` can be used (as in `{$:\"text\"}`) to accept a match against any\r\n\t * property of the object. That's equivalent to the simple substring match with a `string`\r\n\t * as described above.\r\n\t *\r\n\t * - `function(value)`: A predicate function can be used to write arbitrary filters. The function is\r\n\t * called for each element of `array`. The final result is an array of those elements that\r\n\t * the predicate returned true for.\r\n\t *\r\n\t * @param {function(actual, expected)|true|undefined} comparator Comparator which is used in\r\n\t * determining if the expected value (from the filter expression) and actual value (from\r\n\t * the object in the array) should be considered a match.\r\n\t *\r\n\t * Can be one of:\r\n\t *\r\n\t * - `function(actual, expected)`:\r\n\t * The function will be given the object value and the predicate value to compare and\r\n\t * should return true if the item should be included in filtered result.\r\n\t *\r\n\t * - `true`: A shorthand for `function(actual, expected) { return angular.equals(expected, actual)}`.\r\n\t * this is essentially strict comparison of expected and actual.\r\n\t *\r\n\t * - `false|undefined`: A short hand for a function which will look for a substring match in case\r\n\t * insensitive way.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <div ng-init=\"friends = [{name:'John', phone:'555-1276'},\r\n\t\t\t\t\t\t\t\t\t{name:'Mary', phone:'800-BIG-MARY'},\r\n\t\t\t\t\t\t\t\t\t{name:'Mike', phone:'555-4321'},\r\n\t\t\t\t\t\t\t\t\t{name:'Adam', phone:'555-5678'},\r\n\t\t\t\t\t\t\t\t\t{name:'Julie', phone:'555-8765'},\r\n\t\t\t\t\t\t\t\t\t{name:'Juliette', phone:'555-5678'}]\"></div>\r\n\t\r\n\t\t Search: <input ng-model=\"searchText\">\r\n\t\t <table id=\"searchTextResults\">\r\n\t\t\t <tr><th>Name</th><th>Phone</th></tr>\r\n\t\t\t <tr ng-repeat=\"friend in friends | filter:searchText\">\r\n\t\t\t <td>{{friend.name}}</td>\r\n\t\t\t <td>{{friend.phone}}</td>\r\n\t\t\t </tr>\r\n\t\t </table>\r\n\t\t <hr>\r\n\t\t Any: <input ng-model=\"search.$\"> <br>\r\n\t\t Name only <input ng-model=\"search.name\"><br>\r\n\t\t Phone only <input ng-model=\"search.phone\"><br>\r\n\t\t Equality <input type=\"checkbox\" ng-model=\"strict\"><br>\r\n\t\t <table id=\"searchObjResults\">\r\n\t\t\t <tr><th>Name</th><th>Phone</th></tr>\r\n\t\t\t <tr ng-repeat=\"friendObj in friends | filter:search:strict\">\r\n\t\t\t <td>{{friendObj.name}}</td>\r\n\t\t\t <td>{{friendObj.phone}}</td>\r\n\t\t\t </tr>\r\n\t\t </table>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t var expectFriendNames = function(expectedNames, key) {\r\n\t\t\t element.all(by.repeater(key + ' in friends').column(key + '.name')).then(function(arr) {\r\n\t\t\t arr.forEach(function(wd, i) {\r\n\t\t\t\t expect(wd.getText()).toMatch(expectedNames[i]);\r\n\t\t\t });\r\n\t\t\t });\r\n\t\t };\r\n\t\r\n\t\t it('should search across all fields when filtering with a string', function() {\r\n\t\t\t var searchText = element(by.model('searchText'));\r\n\t\t\t searchText.clear();\r\n\t\t\t searchText.sendKeys('m');\r\n\t\t\t expectFriendNames(['Mary', 'Mike', 'Adam'], 'friend');\r\n\t\r\n\t\t\t searchText.clear();\r\n\t\t\t searchText.sendKeys('76');\r\n\t\t\t expectFriendNames(['John', 'Julie'], 'friend');\r\n\t\t });\r\n\t\r\n\t\t it('should search in specific fields when filtering with a predicate object', function() {\r\n\t\t\t var searchAny = element(by.model('search.$'));\r\n\t\t\t searchAny.clear();\r\n\t\t\t searchAny.sendKeys('i');\r\n\t\t\t expectFriendNames(['Mary', 'Mike', 'Julie', 'Juliette'], 'friendObj');\r\n\t\t });\r\n\t\t it('should use a equal comparison when comparator is true', function() {\r\n\t\t\t var searchName = element(by.model('search.name'));\r\n\t\t\t var strict = element(by.model('strict'));\r\n\t\t\t searchName.clear();\r\n\t\t\t searchName.sendKeys('Julie');\r\n\t\t\t strict.click();\r\n\t\t\t expectFriendNames(['Julie'], 'friendObj');\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tfunction filterFilter() {\r\n\t\treturn function (array, expression, comparator) {\r\n\t\t\tif (!isArray(array)) return array;\r\n\r\n\t\t\tvar comparatorType = typeof (comparator),\r\n\t\t\t\tpredicates = [];\r\n\r\n\t\t\tpredicates.check = function (value) {\r\n\t\t\t\tfor (var j = 0; j < predicates.length; j++) {\r\n\t\t\t\t\tif (!predicates[j](value)) {\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn true;\r\n\t\t\t};\r\n\r\n\t\t\tif (comparatorType !== 'function') {\r\n\t\t\t\tif (comparatorType === 'boolean' && comparator) {\r\n\t\t\t\t\tcomparator = function (obj, text) {\r\n\t\t\t\t\t\treturn angular.equals(obj, text);\r\n\t\t\t\t\t};\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcomparator = function (obj, text) {\r\n\t\t\t\t\t\tif (obj && text && typeof obj === 'object' && typeof text === 'object') {\r\n\t\t\t\t\t\t\tfor (var objKey in obj) {\r\n\t\t\t\t\t\t\t\tif (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) &&\r\n\t\t\t\t\t\t\t\t\tcomparator(obj[objKey], text[objKey])) {\r\n\t\t\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ttext = ('' + text).toLowerCase();\r\n\t\t\t\t\t\treturn ('' + obj).toLowerCase().indexOf(text) > -1;\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar search = function (obj, text) {\r\n\t\t\t\tif (typeof text == 'string' && text.charAt(0) === '!') {\r\n\t\t\t\t\treturn !search(obj, text.substr(1));\r\n\t\t\t\t}\r\n\t\t\t\tswitch (typeof obj) {\r\n\t\t\t\t\tcase \"boolean\":\r\n\t\t\t\t\tcase \"number\":\r\n\t\t\t\t\tcase \"string\":\r\n\t\t\t\t\t\treturn comparator(obj, text);\r\n\t\t\t\t\tcase \"object\":\r\n\t\t\t\t\t\tswitch (typeof text) {\r\n\t\t\t\t\t\t\tcase \"object\":\r\n\t\t\t\t\t\t\t\treturn comparator(obj, text);\r\n\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\tfor (var objKey in obj) {\r\n\t\t\t\t\t\t\t\t\tif (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {\r\n\t\t\t\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\tcase \"array\":\r\n\t\t\t\t\t\tfor (var i = 0; i < obj.length; i++) {\r\n\t\t\t\t\t\t\tif (search(obj[i], text)) {\r\n\t\t\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\tdefault:\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tswitch (typeof expression) {\r\n\t\t\t\tcase \"boolean\":\r\n\t\t\t\tcase \"number\":\r\n\t\t\t\tcase \"string\":\r\n\t\t\t\t\t// Set up expression object and fall through\r\n\t\t\t\t\texpression = { $: expression };\r\n\t\t\t\t\t// jshint -W086\r\n\t\t\t\tcase \"object\":\r\n\t\t\t\t\t// jshint +W086\r\n\t\t\t\t\tfor (var key in expression) {\r\n\t\t\t\t\t\t(function (path) {\r\n\t\t\t\t\t\t\tif (typeof expression[path] === 'undefined') return;\r\n\t\t\t\t\t\t\tpredicates.push(function (value) {\r\n\t\t\t\t\t\t\t\treturn search(path == '$' ? value : (value && value[path]), expression[path]);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t})(key);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'function':\r\n\t\t\t\t\tpredicates.push(expression);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\treturn array;\r\n\t\t\t}\r\n\t\t\tvar filtered = [];\r\n\t\t\tfor (var j = 0; j < array.length; j++) {\r\n\t\t\t\tvar value = array[j];\r\n\t\t\t\tif (predicates.check(value)) {\r\n\t\t\t\t\tfiltered.push(value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn filtered;\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc filter\r\n\t * @name currency\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default\r\n\t * symbol for current locale is used.\r\n\t *\r\n\t * @param {number} amount Input to filter.\r\n\t * @param {string=} symbol Currency symbol or identifier to be displayed.\r\n\t * @returns {string} Formatted number.\r\n\t *\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <script>\r\n\t\t\t function Ctrl($scope) {\r\n\t\t\t $scope.amount = 1234.56;\r\n\t\t\t }\r\n\t\t </script>\r\n\t\t <div ng-controller=\"Ctrl\">\r\n\t\t\t <input type=\"number\" ng-model=\"amount\"> <br>\r\n\t\t\t default currency symbol ($): <span id=\"currency-default\">{{amount | currency}}</span><br>\r\n\t\t\t custom currency identifier (USD$): <span>{{amount | currency:\"USD$\"}}</span>\r\n\t\t </div>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should init with 1234.56', function() {\r\n\t\t\t expect(element(by.id('currency-default')).getText()).toBe('$1,234.56');\r\n\t\t\t expect(element(by.binding('amount | currency:\"USD$\"')).getText()).toBe('USD$1,234.56');\r\n\t\t });\r\n\t\t it('should update', function() {\r\n\t\t\t if (browser.params.browser == 'safari') {\r\n\t\t\t // Safari does not understand the minus key. See\r\n\t\t\t // https://github.com/angular/protractor/issues/481\r\n\t\t\t return;\r\n\t\t\t }\r\n\t\t\t element(by.model('amount')).clear();\r\n\t\t\t element(by.model('amount')).sendKeys('-1234');\r\n\t\t\t expect(element(by.id('currency-default')).getText()).toBe('($1,234.00)');\r\n\t\t\t expect(element(by.binding('amount | currency:\"USD$\"')).getText()).toBe('(USD$1,234.00)');\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tcurrencyFilter.$inject = ['$locale'];\r\n\tfunction currencyFilter($locale) {\r\n\t\tvar formats = $locale.NUMBER_FORMATS;\r\n\t\treturn function (amount, currencySymbol) {\r\n\t\t\tif (isUndefined(currencySymbol)) currencySymbol = formats.CURRENCY_SYM;\r\n\t\t\treturn formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, 2).\r\n\t\t\t\t\t\treplace(/\\u00A4/g, currencySymbol);\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc filter\r\n\t * @name number\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Formats a number as text.\r\n\t *\r\n\t * If the input is not a number an empty string is returned.\r\n\t *\r\n\t * @param {number|string} number Number to format.\r\n\t * @param {(number|string)=} fractionSize Number of decimal places to round the number to.\r\n\t * If this is not provided then the fraction size is computed from the current locale's number\r\n\t * formatting pattern. In the case of the default locale, it will be 3.\r\n\t * @returns {string} Number rounded to decimalPlaces and places a “,†after each third digit.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <script>\r\n\t\t\t function Ctrl($scope) {\r\n\t\t\t $scope.val = 1234.56789;\r\n\t\t\t }\r\n\t\t </script>\r\n\t\t <div ng-controller=\"Ctrl\">\r\n\t\t\t Enter number: <input ng-model='val'><br>\r\n\t\t\t Default formatting: <span id='number-default'>{{val | number}}</span><br>\r\n\t\t\t No fractions: <span>{{val | number:0}}</span><br>\r\n\t\t\t Negative number: <span>{{-val | number:4}}</span>\r\n\t\t </div>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should format numbers', function() {\r\n\t\t\t expect(element(by.id('number-default')).getText()).toBe('1,234.568');\r\n\t\t\t expect(element(by.binding('val | number:0')).getText()).toBe('1,235');\r\n\t\t\t expect(element(by.binding('-val | number:4')).getText()).toBe('-1,234.5679');\r\n\t\t });\r\n\t\r\n\t\t it('should update', function() {\r\n\t\t\t element(by.model('val')).clear();\r\n\t\t\t element(by.model('val')).sendKeys('3374.333');\r\n\t\t\t expect(element(by.id('number-default')).getText()).toBe('3,374.333');\r\n\t\t\t expect(element(by.binding('val | number:0')).getText()).toBe('3,374');\r\n\t\t\t expect(element(by.binding('-val | number:4')).getText()).toBe('-3,374.3330');\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\r\n\tnumberFilter.$inject = ['$locale'];\r\n\tfunction numberFilter($locale) {\r\n\t\tvar formats = $locale.NUMBER_FORMATS;\r\n\t\treturn function (number, fractionSize) {\r\n\t\t\treturn formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP,\r\n\t\t\t fractionSize);\r\n\t\t};\r\n\t}\r\n\r\n\tvar DECIMAL_SEP = '.';\r\n\tfunction formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {\r\n\t\tif (number == null || !isFinite(number) || isObject(number)) return '';\r\n\r\n\t\tvar isNegative = number < 0;\r\n\t\tnumber = Math.abs(number);\r\n\t\tvar numStr = number + '',\r\n\t\t\tformatedText = '',\r\n\t\t\tparts = [];\r\n\r\n\t\tvar hasExponent = false;\r\n\t\tif (numStr.indexOf('e') !== -1) {\r\n\t\t\tvar match = numStr.match(/([\\d\\.]+)e(-?)(\\d+)/);\r\n\t\t\tif (match && match[2] == '-' && match[3] > fractionSize + 1) {\r\n\t\t\t\tnumStr = '0';\r\n\t\t\t\tnumber = 0;\r\n\t\t\t} else {\r\n\t\t\t\tformatedText = numStr;\r\n\t\t\t\thasExponent = true;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!hasExponent) {\r\n\t\t\tvar fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length;\r\n\r\n\t\t\t// determine fractionSize if it is not specified\r\n\t\t\tif (isUndefined(fractionSize)) {\r\n\t\t\t\tfractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac);\r\n\t\t\t}\r\n\r\n\t\t\t// safely round numbers in JS without hitting imprecisions of floating-point arithmetics\r\n\t\t\t// inspired by:\r\n\t\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round\r\n\t\t\tnumber = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize);\r\n\r\n\t\t\tvar fraction = ('' + number).split(DECIMAL_SEP);\r\n\t\t\tvar whole = fraction[0];\r\n\t\t\tfraction = fraction[1] || '';\r\n\r\n\t\t\tvar i, pos = 0,\r\n\t\t\t\tlgroup = pattern.lgSize,\r\n\t\t\t\tgroup = pattern.gSize;\r\n\r\n\t\t\tif (whole.length >= (lgroup + group)) {\r\n\t\t\t\tpos = whole.length - lgroup;\r\n\t\t\t\tfor (i = 0; i < pos; i++) {\r\n\t\t\t\t\tif ((pos - i) % group === 0 && i !== 0) {\r\n\t\t\t\t\t\tformatedText += groupSep;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tformatedText += whole.charAt(i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tfor (i = pos; i < whole.length; i++) {\r\n\t\t\t\tif ((whole.length - i) % lgroup === 0 && i !== 0) {\r\n\t\t\t\t\tformatedText += groupSep;\r\n\t\t\t\t}\r\n\t\t\t\tformatedText += whole.charAt(i);\r\n\t\t\t}\r\n\r\n\t\t\t// format fraction part.\r\n\t\t\twhile (fraction.length < fractionSize) {\r\n\t\t\t\tfraction += '0';\r\n\t\t\t}\r\n\r\n\t\t\tif (fractionSize && fractionSize !== \"0\") formatedText += decimalSep + fraction.substr(0, fractionSize);\r\n\t\t} else {\r\n\r\n\t\t\tif (fractionSize > 0 && number > -1 && number < 1) {\r\n\t\t\t\tformatedText = number.toFixed(fractionSize);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tparts.push(isNegative ? pattern.negPre : pattern.posPre);\r\n\t\tparts.push(formatedText);\r\n\t\tparts.push(isNegative ? pattern.negSuf : pattern.posSuf);\r\n\t\treturn parts.join('');\r\n\t}\r\n\r\n\tfunction padNumber(num, digits, trim) {\r\n\t\tvar neg = '';\r\n\t\tif (num < 0) {\r\n\t\t\tneg = '-';\r\n\t\t\tnum = -num;\r\n\t\t}\r\n\t\tnum = '' + num;\r\n\t\twhile (num.length < digits) num = '0' + num;\r\n\t\tif (trim)\r\n\t\t\tnum = num.substr(num.length - digits);\r\n\t\treturn neg + num;\r\n\t}\r\n\r\n\r\n\tfunction dateGetter(name, size, offset, trim) {\r\n\t\toffset = offset || 0;\r\n\t\treturn function (date) {\r\n\t\t\tvar value = date['get' + name]();\r\n\t\t\tif (offset > 0 || value > -offset)\r\n\t\t\t\tvalue += offset;\r\n\t\t\tif (value === 0 && offset == -12) value = 12;\r\n\t\t\treturn padNumber(value, size, trim);\r\n\t\t};\r\n\t}\r\n\r\n\tfunction dateStrGetter(name, shortForm) {\r\n\t\treturn function (date, formats) {\r\n\t\t\tvar value = date['get' + name]();\r\n\t\t\tvar get = uppercase(shortForm ? ('SHORT' + name) : name);\r\n\r\n\t\t\treturn formats[get][value];\r\n\t\t};\r\n\t}\r\n\r\n\tfunction timeZoneGetter(date) {\r\n\t\tvar zone = -1 * date.getTimezoneOffset();\r\n\t\tvar paddedZone = (zone >= 0) ? \"+\" : \"\";\r\n\r\n\t\tpaddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) +\r\n\t\t\t\t\t padNumber(Math.abs(zone % 60), 2);\r\n\r\n\t\treturn paddedZone;\r\n\t}\r\n\r\n\tfunction ampmGetter(date, formats) {\r\n\t\treturn date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1];\r\n\t}\r\n\r\n\tvar DATE_FORMATS = {\r\n\t\tyyyy: dateGetter('FullYear', 4),\r\n\t\tyy: dateGetter('FullYear', 2, 0, true),\r\n\t\ty: dateGetter('FullYear', 1),\r\n\t\tMMMM: dateStrGetter('Month'),\r\n\t\tMMM: dateStrGetter('Month', true),\r\n\t\tMM: dateGetter('Month', 2, 1),\r\n\t\tM: dateGetter('Month', 1, 1),\r\n\t\tdd: dateGetter('Date', 2),\r\n\t\td: dateGetter('Date', 1),\r\n\t\tHH: dateGetter('Hours', 2),\r\n\t\tH: dateGetter('Hours', 1),\r\n\t\thh: dateGetter('Hours', 2, -12),\r\n\t\th: dateGetter('Hours', 1, -12),\r\n\t\tmm: dateGetter('Minutes', 2),\r\n\t\tm: dateGetter('Minutes', 1),\r\n\t\tss: dateGetter('Seconds', 2),\r\n\t\ts: dateGetter('Seconds', 1),\r\n\t\t// while ISO 8601 requires fractions to be prefixed with `.` or `,`\r\n\t\t// we can be just safely rely on using `sss` since we currently don't support single or two digit fractions\r\n\t\tsss: dateGetter('Milliseconds', 3),\r\n\t\tEEEE: dateStrGetter('Day'),\r\n\t\tEEE: dateStrGetter('Day', true),\r\n\t\ta: ampmGetter,\r\n\t\tZ: timeZoneGetter\r\n\t};\r\n\r\n\tvar DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,\r\n\t\tNUMBER_STRING = /^\\-?\\d+$/;\r\n\r\n\t/**\r\n\t * @ngdoc filter\r\n\t * @name date\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Formats `date` to a string based on the requested `format`.\r\n\t *\r\n\t * `format` string can be composed of the following elements:\r\n\t *\r\n\t * * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)\r\n\t * * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)\r\n\t * * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)\r\n\t * * `'MMMM'`: Month in year (January-December)\r\n\t * * `'MMM'`: Month in year (Jan-Dec)\r\n\t * * `'MM'`: Month in year, padded (01-12)\r\n\t * * `'M'`: Month in year (1-12)\r\n\t * * `'dd'`: Day in month, padded (01-31)\r\n\t * * `'d'`: Day in month (1-31)\r\n\t * * `'EEEE'`: Day in Week,(Sunday-Saturday)\r\n\t * * `'EEE'`: Day in Week, (Sun-Sat)\r\n\t * * `'HH'`: Hour in day, padded (00-23)\r\n\t * * `'H'`: Hour in day (0-23)\r\n\t * * `'hh'`: Hour in am/pm, padded (01-12)\r\n\t * * `'h'`: Hour in am/pm, (1-12)\r\n\t * * `'mm'`: Minute in hour, padded (00-59)\r\n\t * * `'m'`: Minute in hour (0-59)\r\n\t * * `'ss'`: Second in minute, padded (00-59)\r\n\t * * `'s'`: Second in minute (0-59)\r\n\t * * `'.sss' or ',sss'`: Millisecond in second, padded (000-999)\r\n\t * * `'a'`: am/pm marker\r\n\t * * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)\r\n\t *\r\n\t * `format` string can also be one of the following predefined\r\n\t * {@link guide/i18n localizable formats}:\r\n\t *\r\n\t * * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale\r\n\t * (e.g. Sep 3, 2010 12:05:08 pm)\r\n\t * * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US locale (e.g. 9/3/10 12:05 pm)\r\n\t * * `'fullDate'`: equivalent to `'EEEE, MMMM d,y'` for en_US locale\r\n\t * (e.g. Friday, September 3, 2010)\r\n\t * * `'longDate'`: equivalent to `'MMMM d, y'` for en_US locale (e.g. September 3, 2010)\r\n\t * * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US locale (e.g. Sep 3, 2010)\r\n\t * * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)\r\n\t * * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 pm)\r\n\t * * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 pm)\r\n\t *\r\n\t * `format` string can contain literal values. These need to be quoted with single quotes (e.g.\r\n\t * `\"h 'in the morning'\"`). In order to output single quote, use two single quotes in a sequence\r\n\t * (e.g. `\"h 'o''clock'\"`).\r\n\t *\r\n\t * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or\r\n\t * number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.SSSZ and its\r\n\t * shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is\r\n\t * specified in the string input, the time is considered to be in the local timezone.\r\n\t * @param {string=} format Formatting rules (see Description). If not specified,\r\n\t * `mediumDate` is used.\r\n\t * @returns {string} Formatted string or the input if input is not recognized as date/millis.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>:\r\n\t\t\t <span>{{1288323623006 | date:'medium'}}</span><br>\r\n\t\t <span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:\r\n\t\t\t <span>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span><br>\r\n\t\t <span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>:\r\n\t\t\t <span>{{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}</span><br>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should format date', function() {\r\n\t\t\t expect(element(by.binding(\"1288323623006 | date:'medium'\")).getText()).\r\n\t\t\t\ttoMatch(/Oct 2\\d, 2010 \\d{1,2}:\\d{2}:\\d{2} (AM|PM)/);\r\n\t\t\t expect(element(by.binding(\"1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'\")).getText()).\r\n\t\t\t\ttoMatch(/2010\\-10\\-2\\d \\d{2}:\\d{2}:\\d{2} (\\-|\\+)?\\d{4}/);\r\n\t\t\t expect(element(by.binding(\"'1288323623006' | date:'MM/dd/yyyy @ h:mma'\")).getText()).\r\n\t\t\t\ttoMatch(/10\\/2\\d\\/2010 @ \\d{1,2}:\\d{2}(AM|PM)/);\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tdateFilter.$inject = ['$locale'];\r\n\tfunction dateFilter($locale) {\r\n\r\n\r\n\t\tvar R_ISO8601_STR = /^(\\d{4})-?(\\d\\d)-?(\\d\\d)(?:T(\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(?:\\.(\\d+))?)?)?(Z|([+-])(\\d\\d):?(\\d\\d))?)?$/;\r\n\t\t// 1 2 3 4 5 6 7 8 9 10 11\r\n\t\tfunction jsonStringToDate(string) {\r\n\t\t\tvar match;\r\n\t\t\tif (match = string.match(R_ISO8601_STR)) {\r\n\t\t\t\tvar date = new Date(0),\r\n\t\t\t\t\ttzHour = 0,\r\n\t\t\t\t\ttzMin = 0,\r\n\t\t\t\t\tdateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,\r\n\t\t\t\t\ttimeSetter = match[8] ? date.setUTCHours : date.setHours;\r\n\r\n\t\t\t\tif (match[9]) {\r\n\t\t\t\t\ttzHour = int(match[9] + match[10]);\r\n\t\t\t\t\ttzMin = int(match[9] + match[11]);\r\n\t\t\t\t}\r\n\t\t\t\tdateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3]));\r\n\t\t\t\tvar h = int(match[4] || 0) - tzHour;\r\n\t\t\t\tvar m = int(match[5] || 0) - tzMin;\r\n\t\t\t\tvar s = int(match[6] || 0);\r\n\t\t\t\tvar ms = Math.round(parseFloat('0.' + (match[7] || 0)) * 1000);\r\n\t\t\t\ttimeSetter.call(date, h, m, s, ms);\r\n\t\t\t\treturn date;\r\n\t\t\t}\r\n\t\t\treturn string;\r\n\t\t}\r\n\r\n\r\n\t\treturn function (date, format) {\r\n\t\t\tvar text = '',\r\n\t\t\t\tparts = [],\r\n\t\t\t\tfn, match;\r\n\r\n\t\t\tformat = format || 'mediumDate';\r\n\t\t\tformat = $locale.DATETIME_FORMATS[format] || format;\r\n\t\t\tif (isString(date)) {\r\n\t\t\t\tif (NUMBER_STRING.test(date)) {\r\n\t\t\t\t\tdate = int(date);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdate = jsonStringToDate(date);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (isNumber(date)) {\r\n\t\t\t\tdate = new Date(date);\r\n\t\t\t}\r\n\r\n\t\t\tif (!isDate(date)) {\r\n\t\t\t\treturn date;\r\n\t\t\t}\r\n\r\n\t\t\twhile (format) {\r\n\t\t\t\tmatch = DATE_FORMATS_SPLIT.exec(format);\r\n\t\t\t\tif (match) {\r\n\t\t\t\t\tparts = concat(parts, match, 1);\r\n\t\t\t\t\tformat = parts.pop();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tparts.push(format);\r\n\t\t\t\t\tformat = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tforEach(parts, function (value) {\r\n\t\t\t\tfn = DATE_FORMATS[value];\r\n\t\t\t\ttext += fn ? fn(date, $locale.DATETIME_FORMATS)\r\n\t\t\t\t\t\t : value.replace(/(^'|'$)/g, '').replace(/''/g, \"'\");\r\n\t\t\t});\r\n\r\n\t\t\treturn text;\r\n\t\t};\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ngdoc filter\r\n\t * @name json\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Allows you to convert a JavaScript object into JSON string.\r\n\t *\r\n\t * This filter is mostly useful for debugging. When using the double curly {{value}} notation\r\n\t * the binding is automatically converted to JSON.\r\n\t *\r\n\t * @param {*} object Any JavaScript object (including arrays and primitive types) to filter.\r\n\t * @returns {string} JSON string.\r\n\t *\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <pre>{{ {'name':'value'} | json }}</pre>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should jsonify filtered objects', function() {\r\n\t\t\t expect(element(by.binding(\"{'name':'value'}\")).getText()).toMatch(/\\{\\n \"name\": ?\"value\"\\n}/);\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t *\r\n\t */\r\n\tfunction jsonFilter() {\r\n\t\treturn function (object) {\r\n\t\t\treturn toJson(object, true);\r\n\t\t};\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ngdoc filter\r\n\t * @name lowercase\r\n\t * @kind function\r\n\t * @description\r\n\t * Converts string to lowercase.\r\n\t * @see angular.lowercase\r\n\t */\r\n\tvar lowercaseFilter = valueFn(lowercase);\r\n\r\n\r\n\t/**\r\n\t * @ngdoc filter\r\n\t * @name uppercase\r\n\t * @kind function\r\n\t * @description\r\n\t * Converts string to uppercase.\r\n\t * @see angular.uppercase\r\n\t */\r\n\tvar uppercaseFilter = valueFn(uppercase);\r\n\r\n\t/**\r\n\t * @ngdoc filter\r\n\t * @name limitTo\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Creates a new array or string containing only a specified number of elements. The elements\r\n\t * are taken from either the beginning or the end of the source array or string, as specified by\r\n\t * the value and sign (positive or negative) of `limit`.\r\n\t *\r\n\t * @param {Array|string} input Source array or string to be limited.\r\n\t * @param {string|number} limit The length of the returned array or string. If the `limit` number\r\n\t * is positive, `limit` number of items from the beginning of the source array/string are copied.\r\n\t * If the number is negative, `limit` number of items from the end of the source array/string\r\n\t * are copied. The `limit` will be trimmed if it exceeds `array.length`\r\n\t * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array\r\n\t * had less than `limit` elements.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <script>\r\n\t\t\t function Ctrl($scope) {\r\n\t\t\t $scope.numbers = [1,2,3,4,5,6,7,8,9];\r\n\t\t\t $scope.letters = \"abcdefghi\";\r\n\t\t\t $scope.numLimit = 3;\r\n\t\t\t $scope.letterLimit = 3;\r\n\t\t\t }\r\n\t\t </script>\r\n\t\t <div ng-controller=\"Ctrl\">\r\n\t\t\t Limit {{numbers}} to: <input type=\"integer\" ng-model=\"numLimit\">\r\n\t\t\t <p>Output numbers: {{ numbers | limitTo:numLimit }}</p>\r\n\t\t\t Limit {{letters}} to: <input type=\"integer\" ng-model=\"letterLimit\">\r\n\t\t\t <p>Output letters: {{ letters | limitTo:letterLimit }}</p>\r\n\t\t </div>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t var numLimitInput = element(by.model('numLimit'));\r\n\t\t var letterLimitInput = element(by.model('letterLimit'));\r\n\t\t var limitedNumbers = element(by.binding('numbers | limitTo:numLimit'));\r\n\t\t var limitedLetters = element(by.binding('letters | limitTo:letterLimit'));\r\n\t\r\n\t\t it('should limit the number array to first three items', function() {\r\n\t\t\t expect(numLimitInput.getAttribute('value')).toBe('3');\r\n\t\t\t expect(letterLimitInput.getAttribute('value')).toBe('3');\r\n\t\t\t expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3]');\r\n\t\t\t expect(limitedLetters.getText()).toEqual('Output letters: abc');\r\n\t\t });\r\n\t\r\n\t\t it('should update the output when -3 is entered', function() {\r\n\t\t\t numLimitInput.clear();\r\n\t\t\t numLimitInput.sendKeys('-3');\r\n\t\t\t letterLimitInput.clear();\r\n\t\t\t letterLimitInput.sendKeys('-3');\r\n\t\t\t expect(limitedNumbers.getText()).toEqual('Output numbers: [7,8,9]');\r\n\t\t\t expect(limitedLetters.getText()).toEqual('Output letters: ghi');\r\n\t\t });\r\n\t\r\n\t\t it('should not exceed the maximum size of input array', function() {\r\n\t\t\t numLimitInput.clear();\r\n\t\t\t numLimitInput.sendKeys('100');\r\n\t\t\t letterLimitInput.clear();\r\n\t\t\t letterLimitInput.sendKeys('100');\r\n\t\t\t expect(limitedNumbers.getText()).toEqual('Output numbers: [1,2,3,4,5,6,7,8,9]');\r\n\t\t\t expect(limitedLetters.getText()).toEqual('Output letters: abcdefghi');\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tfunction limitToFilter() {\r\n\t\treturn function (input, limit, begin) {\r\n\t\t\tif (!begin) begin = 0;\r\n\t\t\tif (!isArray(input) && !isString(input)) return input;\r\n\r\n\t\t\tif (Math.abs(Number(limit)) === Infinity) {\r\n\t\t\t\tlimit = Number(limit);\r\n\t\t\t} else {\r\n\t\t\t\tlimit = int(limit);\r\n\t\t\t}\r\n\r\n\t\t\tif (isString(input)) {\r\n\t\t\t\t//NaN check on limit\r\n\t\t\t\tif (limit) {\r\n\t\t\t\t\treturn limit >= 0 ? input.slice(0, limit) : input.slice(limit, input.length);\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn \"\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar out = [],\r\n\t\t\t i, n;\r\n\r\n\t\t\t// if abs(limit) exceeds maximum length, trim it\r\n\t\t\tif (limit > input.length)\r\n\t\t\t\tlimit = input.length;\r\n\t\t\telse if (limit < -input.length)\r\n\t\t\t\tlimit = -input.length;\r\n\r\n\t\t\tif (limit > 0) {\r\n\t\t\t\ti = 0;\r\n\t\t\t\tn = limit;\r\n\t\t\t} else {\r\n\t\t\t\ti = input.length + limit;\r\n\t\t\t\tn = input.length;\r\n\t\t\t}\r\n\r\n\t\t\tfor (; i < n; i++) {\r\n\t\t\t\tif (input[i + begin])\r\n\t\t\t\tout.push(input[i+begin]);\r\n\t\t\t}\r\n\r\n\t\t\treturn out;\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc filter\r\n\t * @name orderBy\r\n\t * @kind function\r\n\t *\r\n\t * @description\r\n\t * Orders a specified `array` by the `expression` predicate. It is ordered alphabetically\r\n\t * for strings and numerically for numbers. Note: if you notice numbers are not being sorted\r\n\t * correctly, make sure they are actually being saved as numbers and not strings.\r\n\t *\r\n\t * @param {Array} array The array to sort.\r\n\t * @param {function(*)|string|Array.<(function(*)|string)>} expression A predicate to be\r\n\t * used by the comparator to determine the order of elements.\r\n\t *\r\n\t * Can be one of:\r\n\t *\r\n\t * - `function`: Getter function. The result of this function will be sorted using the\r\n\t * `<`, `=`, `>` operator.\r\n\t * - `string`: An Angular expression which evaluates to an object to order by, such as 'name'\r\n\t * to sort by a property called 'name'. Optionally prefixed with `+` or `-` to control\r\n\t * ascending or descending sort order (for example, +name or -name).\r\n\t * - `Array`: An array of function or string predicates. The first predicate in the array\r\n\t * is used for sorting, but when two items are equivalent, the next predicate is used.\r\n\t *\r\n\t * @param {boolean=} reverse Reverse the order of the array.\r\n\t * @returns {Array} Sorted copy of the source array.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <script>\r\n\t\t\t function Ctrl($scope) {\r\n\t\t\t $scope.friends =\r\n\t\t\t\t [{name:'John', phone:'555-1212', age:10},\r\n\t\t\t\t\t{name:'Mary', phone:'555-9876', age:19},\r\n\t\t\t\t\t{name:'Mike', phone:'555-4321', age:21},\r\n\t\t\t\t\t{name:'Adam', phone:'555-5678', age:35},\r\n\t\t\t\t\t{name:'Julie', phone:'555-8765', age:29}]\r\n\t\t\t $scope.predicate = '-age';\r\n\t\t\t }\r\n\t\t </script>\r\n\t\t <div ng-controller=\"Ctrl\">\r\n\t\t\t <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>\r\n\t\t\t <hr/>\r\n\t\t\t [ <a href=\"\" ng-click=\"predicate=''\">unsorted</a> ]\r\n\t\t\t <table class=\"friend\">\r\n\t\t\t <tr>\r\n\t\t\t\t <th><a href=\"\" ng-click=\"predicate = 'name'; reverse=false\">Name</a>\r\n\t\t\t\t\t (<a href=\"\" ng-click=\"predicate = '-name'; reverse=false\">^</a>)</th>\r\n\t\t\t\t <th><a href=\"\" ng-click=\"predicate = 'phone'; reverse=!reverse\">Phone Number</a></th>\r\n\t\t\t\t <th><a href=\"\" ng-click=\"predicate = 'age'; reverse=!reverse\">Age</a></th>\r\n\t\t\t </tr>\r\n\t\t\t <tr ng-repeat=\"friend in friends | orderBy:predicate:reverse\">\r\n\t\t\t\t <td>{{friend.name}}</td>\r\n\t\t\t\t <td>{{friend.phone}}</td>\r\n\t\t\t\t <td>{{friend.age}}</td>\r\n\t\t\t </tr>\r\n\t\t\t </table>\r\n\t\t </div>\r\n\t\t </file>\r\n\t </example>\r\n\t *\r\n\t * It's also possible to call the orderBy filter manually, by injecting `$filter`, retrieving the\r\n\t * filter routine with `$filter('orderBy')`, and calling the returned filter routine with the\r\n\t * desired parameters.\r\n\t *\r\n\t * Example:\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t<file name=\"index.html\">\r\n\t\t <div ng-controller=\"Ctrl\">\r\n\t\t\t<table class=\"friend\">\r\n\t\t\t <tr>\r\n\t\t\t\t<th><a href=\"\" ng-click=\"reverse=false;order('name', false)\">Name</a>\r\n\t\t\t\t (<a href=\"\" ng-click=\"order('-name',false)\">^</a>)</th>\r\n\t\t\t\t<th><a href=\"\" ng-click=\"reverse=!reverse;order('phone', reverse)\">Phone Number</a></th>\r\n\t\t\t\t<th><a href=\"\" ng-click=\"reverse=!reverse;order('age',reverse)\">Age</a></th>\r\n\t\t\t </tr>\r\n\t\t\t <tr ng-repeat=\"friend in friends\">\r\n\t\t\t\t<td>{{friend.name}}</td>\r\n\t\t\t\t<td>{{friend.phone}}</td>\r\n\t\t\t\t<td>{{friend.age}}</td>\r\n\t\t\t </tr>\r\n\t\t\t</table>\r\n\t\t </div>\r\n\t\t</file>\r\n\t\r\n\t\t<file name=\"script.js\">\r\n\t\t function Ctrl($scope, $filter) {\r\n\t\t\tvar orderBy = $filter('orderBy');\r\n\t\t\t$scope.friends = [\r\n\t\t\t { name: 'John', phone: '555-1212', age: 10 },\r\n\t\t\t { name: 'Mary', phone: '555-9876', age: 19 },\r\n\t\t\t { name: 'Mike', phone: '555-4321', age: 21 },\r\n\t\t\t { name: 'Adam', phone: '555-5678', age: 35 },\r\n\t\t\t { name: 'Julie', phone: '555-8765', age: 29 }\r\n\t\t\t];\r\n\t\r\n\t\t\t$scope.order = function(predicate, reverse) {\r\n\t\t\t $scope.friends = orderBy($scope.friends, predicate, reverse);\r\n\t\t\t};\r\n\t\t\t$scope.order('-age',false);\r\n\t\t }\r\n\t\t</file>\r\n\t</example>\r\n\t */\r\n\torderByFilter.$inject = ['$parse'];\r\n\tfunction orderByFilter($parse) {\r\n\t\treturn function (array, sortPredicate, reverseOrder) {\r\n\t\t\tif (!isArray(array)) return array;\r\n\t\t\tif (!sortPredicate) return array;\r\n\t\t\tsortPredicate = isArray(sortPredicate) ? sortPredicate : [sortPredicate];\r\n\t\t\tsortPredicate = map(sortPredicate, function (predicate) {\r\n\t\t\t\tvar descending = false, get = predicate || identity;\r\n\t\t\t\tif (isString(predicate)) {\r\n\t\t\t\t\tif ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) {\r\n\t\t\t\t\t\tdescending = predicate.charAt(0) == '-';\r\n\t\t\t\t\t\tpredicate = predicate.substring(1);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tget = $parse(predicate);\r\n\t\t\t\t\tif (get.constant) {\r\n\t\t\t\t\t\tvar key = get();\r\n\t\t\t\t\t\treturn reverseComparator(function (a, b) {\r\n\t\t\t\t\t\t\treturn compare(a[key], b[key]);\r\n\t\t\t\t\t\t}, descending);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn reverseComparator(function (a, b) {\r\n\t\t\t\t\treturn compare(get(a), get(b));\r\n\t\t\t\t}, descending);\r\n\t\t\t});\r\n\t\t\tvar arrayCopy = [];\r\n\t\t\tfor (var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); }\r\n\t\t\treturn arrayCopy.sort(reverseComparator(comparator, reverseOrder));\r\n\r\n\t\t\tfunction comparator(o1, o2) {\r\n\t\t\t\tfor (var i = 0; i < sortPredicate.length; i++) {\r\n\t\t\t\t\tvar comp = sortPredicate[i](o1, o2);\r\n\t\t\t\t\tif (comp !== 0) return comp;\r\n\t\t\t\t}\r\n\t\t\t\treturn 0;\r\n\t\t\t}\r\n\t\t\tfunction reverseComparator(comp, descending) {\r\n\t\t\t\treturn toBoolean(descending)\r\n\t\t\t\t\t? function (a, b) { return comp(b, a); }\r\n\t\t\t\t\t: comp;\r\n\t\t\t}\r\n\t\t\tfunction compare(v1, v2) {\r\n\t\t\t\tvar t1 = typeof v1;\r\n\t\t\t\tvar t2 = typeof v2;\r\n\t\t\t\tif (t1 == t2) {\r\n\t\t\t\t\tif (t1 == \"string\") {\r\n\t\t\t\t\t\tv1 = v1.toLowerCase();\r\n\t\t\t\t\t\tv2 = v2.toLowerCase();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (v1 === v2) return 0;\r\n\t\t\t\t\treturn v1 < v2 ? -1 : 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn t1 < t2 ? -1 : 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t}\r\n\r\n\tfunction ngDirective(directive) {\r\n\t\tif (isFunction(directive)) {\r\n\t\t\tdirective = {\r\n\t\t\t\tlink: directive\r\n\t\t\t};\r\n\t\t}\r\n\t\tdirective.restrict = directive.restrict || 'AC';\r\n\t\treturn valueFn(directive);\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name a\r\n\t * @restrict E\r\n\t *\r\n\t * @description\r\n\t * Modifies the default behavior of the html A tag so that the default action is prevented when\r\n\t * the href attribute is empty.\r\n\t *\r\n\t * This change permits the easy creation of action links with the `ngClick` directive\r\n\t * without changing the location or causing page reloads, e.g.:\r\n\t * `<a href=\"\" ng-click=\"list.addItem()\">Add Item</a>`\r\n\t */\r\n\tvar htmlAnchorDirective = valueFn({\r\n\t\trestrict: 'E',\r\n\t\tcompile: function (element, attr) {\r\n\r\n\t\t\tif (msie <= 8) {\r\n\r\n\t\t\t\t// turn <a href ng-click=\"..\">link</a> into a stylable link in IE\r\n\t\t\t\t// but only if it doesn't have name attribute, in which case it's an anchor\r\n\t\t\t\tif (!attr.href && !attr.name) {\r\n\t\t\t\t\tattr.$set('href', '');\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// add a comment node to anchors to workaround IE bug that causes element content to be reset\r\n\t\t\t\t// to new attribute content if attribute is updated with value containing @ and element also\r\n\t\t\t\t// contains value with @\r\n\t\t\t\t// see issue #1949\r\n\t\t\t\telement.append(document.createComment('IE fix'));\r\n\t\t\t}\r\n\r\n\t\t\tif (!attr.href && !attr.xlinkHref && !attr.name) {\r\n\t\t\t\treturn function (scope, element) {\r\n\t\t\t\t\t// SVGAElement does not use the href attribute, but rather the 'xlinkHref' attribute.\r\n\t\t\t\t\tvar href = toString.call(element.prop('href')) === '[object SVGAnimatedString]' ?\r\n\t\t\t\t\t\t\t 'xlink:href' : 'href';\r\n\t\t\t\t\telement.on('click', function (event) {\r\n\t\t\t\t\t\t// if we have no href url, then don't navigate anywhere.\r\n\t\t\t\t\t\tif (!element.attr(href)) {\r\n\t\t\t\t\t\t\tevent.preventDefault();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngHref\r\n\t * @restrict A\r\n\t * @priority 99\r\n\t *\r\n\t * @description\r\n\t * Using Angular markup like `{{hash}}` in an href attribute will\r\n\t * make the link go to the wrong URL if the user clicks it before\r\n\t * Angular has a chance to replace the `{{hash}}` markup with its\r\n\t * value. Until Angular replaces the markup the link will be broken\r\n\t * and will most likely return a 404 error.\r\n\t *\r\n\t * The `ngHref` directive solves this problem.\r\n\t *\r\n\t * The wrong way to write it:\r\n\t * ```html\r\n\t * <a href=\"http://www.gravatar.com/avatar/{{hash}}\"/>\r\n\t * ```\r\n\t *\r\n\t * The correct way to write it:\r\n\t * ```html\r\n\t * <a ng-href=\"http://www.gravatar.com/avatar/{{hash}}\"/>\r\n\t * ```\r\n\t *\r\n\t * @element A\r\n\t * @param {template} ngHref any string which can contain `{{}}` markup.\r\n\t *\r\n\t * @example\r\n\t * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes\r\n\t * in links and their different behaviors:\r\n\t\t<example>\r\n\t\t <file name=\"index.html\">\r\n\t\t\t<input ng-model=\"value\" /><br />\r\n\t\t\t<a id=\"link-1\" href ng-click=\"value = 1\">link 1</a> (link, don't reload)<br />\r\n\t\t\t<a id=\"link-2\" href=\"\" ng-click=\"value = 2\">link 2</a> (link, don't reload)<br />\r\n\t\t\t<a id=\"link-3\" ng-href=\"/{{'123'}}\">link 3</a> (link, reload!)<br />\r\n\t\t\t<a id=\"link-4\" href=\"\" name=\"xx\" ng-click=\"value = 4\">anchor</a> (link, don't reload)<br />\r\n\t\t\t<a id=\"link-5\" name=\"xxx\" ng-click=\"value = 5\">anchor</a> (no link)<br />\r\n\t\t\t<a id=\"link-6\" ng-href=\"{{value}}\">link</a> (link, change location)\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\tit('should execute ng-click but not reload when href without value', function() {\r\n\t\t\t element(by.id('link-1')).click();\r\n\t\t\t expect(element(by.model('value')).getAttribute('value')).toEqual('1');\r\n\t\t\t expect(element(by.id('link-1')).getAttribute('href')).toBe('');\r\n\t\t\t});\r\n\t\r\n\t\t\tit('should execute ng-click but not reload when href empty string', function() {\r\n\t\t\t element(by.id('link-2')).click();\r\n\t\t\t expect(element(by.model('value')).getAttribute('value')).toEqual('2');\r\n\t\t\t expect(element(by.id('link-2')).getAttribute('href')).toBe('');\r\n\t\t\t});\r\n\t\r\n\t\t\tit('should execute ng-click and change url when ng-href specified', function() {\r\n\t\t\t expect(element(by.id('link-3')).getAttribute('href')).toMatch(/\\/123$/);\r\n\t\r\n\t\t\t element(by.id('link-3')).click();\r\n\t\r\n\t\t\t // At this point, we navigate away from an Angular page, so we need\r\n\t\t\t // to use browser.driver to get the base webdriver.\r\n\t\r\n\t\t\t browser.wait(function() {\r\n\t\t\t\treturn browser.driver.getCurrentUrl().then(function(url) {\r\n\t\t\t\t return url.match(/\\/123$/);\r\n\t\t\t\t});\r\n\t\t\t }, 1000, 'page should navigate to /123');\r\n\t\t\t});\r\n\t\r\n\t\t\txit('should execute ng-click but not reload when href empty string and name specified', function() {\r\n\t\t\t element(by.id('link-4')).click();\r\n\t\t\t expect(element(by.model('value')).getAttribute('value')).toEqual('4');\r\n\t\t\t expect(element(by.id('link-4')).getAttribute('href')).toBe('');\r\n\t\t\t});\r\n\t\r\n\t\t\tit('should execute ng-click but not reload when no href but name specified', function() {\r\n\t\t\t element(by.id('link-5')).click();\r\n\t\t\t expect(element(by.model('value')).getAttribute('value')).toEqual('5');\r\n\t\t\t expect(element(by.id('link-5')).getAttribute('href')).toBe(null);\r\n\t\t\t});\r\n\t\r\n\t\t\tit('should only change url when only ng-href', function() {\r\n\t\t\t element(by.model('value')).clear();\r\n\t\t\t element(by.model('value')).sendKeys('6');\r\n\t\t\t expect(element(by.id('link-6')).getAttribute('href')).toMatch(/\\/6$/);\r\n\t\r\n\t\t\t element(by.id('link-6')).click();\r\n\t\r\n\t\t\t // At this point, we navigate away from an Angular page, so we need\r\n\t\t\t // to use browser.driver to get the base webdriver.\r\n\t\t\t browser.wait(function() {\r\n\t\t\t\treturn browser.driver.getCurrentUrl().then(function(url) {\r\n\t\t\t\t return url.match(/\\/6$/);\r\n\t\t\t\t});\r\n\t\t\t }, 1000, 'page should navigate to /6');\r\n\t\t\t});\r\n\t\t </file>\r\n\t\t</example>\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngSrc\r\n\t * @restrict A\r\n\t * @priority 99\r\n\t *\r\n\t * @description\r\n\t * Using Angular markup like `{{hash}}` in a `src` attribute doesn't\r\n\t * work right: The browser will fetch from the URL with the literal\r\n\t * text `{{hash}}` until Angular replaces the expression inside\r\n\t * `{{hash}}`. The `ngSrc` directive solves this problem.\r\n\t *\r\n\t * The buggy way to write it:\r\n\t * ```html\r\n\t * <img src=\"http://www.gravatar.com/avatar/{{hash}}\"/>\r\n\t * ```\r\n\t *\r\n\t * The correct way to write it:\r\n\t * ```html\r\n\t * <img ng-src=\"http://www.gravatar.com/avatar/{{hash}}\"/>\r\n\t * ```\r\n\t *\r\n\t * @element IMG\r\n\t * @param {template} ngSrc any string which can contain `{{}}` markup.\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngSrcset\r\n\t * @restrict A\r\n\t * @priority 99\r\n\t *\r\n\t * @description\r\n\t * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't\r\n\t * work right: The browser will fetch from the URL with the literal\r\n\t * text `{{hash}}` until Angular replaces the expression inside\r\n\t * `{{hash}}`. The `ngSrcset` directive solves this problem.\r\n\t *\r\n\t * The buggy way to write it:\r\n\t * ```html\r\n\t * <img srcset=\"http://www.gravatar.com/avatar/{{hash}} 2x\"/>\r\n\t * ```\r\n\t *\r\n\t * The correct way to write it:\r\n\t * ```html\r\n\t * <img ng-srcset=\"http://www.gravatar.com/avatar/{{hash}} 2x\"/>\r\n\t * ```\r\n\t *\r\n\t * @element IMG\r\n\t * @param {template} ngSrcset any string which can contain `{{}}` markup.\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngDisabled\r\n\t * @restrict A\r\n\t * @priority 100\r\n\t *\r\n\t * @description\r\n\t *\r\n\t * The following markup will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:\r\n\t * ```html\r\n\t * <div ng-init=\"scope = { isDisabled: false }\">\r\n\t * <button disabled=\"{{scope.isDisabled}}\">Disabled</button>\r\n\t * </div>\r\n\t * ```\r\n\t *\r\n\t * The HTML specification does not require browsers to preserve the values of boolean attributes\r\n\t * such as disabled. (Their presence means true and their absence means false.)\r\n\t * If we put an Angular interpolation expression into such an attribute then the\r\n\t * binding information would be lost when the browser removes the attribute.\r\n\t * The `ngDisabled` directive solves this problem for the `disabled` attribute.\r\n\t * This complementary directive is not removed by the browser and so provides\r\n\t * a permanent reliable place to store the binding information.\r\n\t *\r\n\t * @example\r\n\t\t<example>\r\n\t\t <file name=\"index.html\">\r\n\t\t\tClick me to toggle: <input type=\"checkbox\" ng-model=\"checked\"><br/>\r\n\t\t\t<button ng-model=\"button\" ng-disabled=\"checked\">Button</button>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\tit('should toggle button', function() {\r\n\t\t\t expect(element(by.css('button')).getAttribute('disabled')).toBeFalsy();\r\n\t\t\t element(by.model('checked')).click();\r\n\t\t\t expect(element(by.css('button')).getAttribute('disabled')).toBeTruthy();\r\n\t\t\t});\r\n\t\t </file>\r\n\t\t</example>\r\n\t *\r\n\t * @element INPUT\r\n\t * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,\r\n\t * then special attribute \"disabled\" will be set on the element\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngChecked\r\n\t * @restrict A\r\n\t * @priority 100\r\n\t *\r\n\t * @description\r\n\t * The HTML specification does not require browsers to preserve the values of boolean attributes\r\n\t * such as checked. (Their presence means true and their absence means false.)\r\n\t * If we put an Angular interpolation expression into such an attribute then the\r\n\t * binding information would be lost when the browser removes the attribute.\r\n\t * The `ngChecked` directive solves this problem for the `checked` attribute.\r\n\t * This complementary directive is not removed by the browser and so provides\r\n\t * a permanent reliable place to store the binding information.\r\n\t * @example\r\n\t\t<example>\r\n\t\t <file name=\"index.html\">\r\n\t\t\tCheck me to check both: <input type=\"checkbox\" ng-model=\"master\"><br/>\r\n\t\t\t<input id=\"checkSlave\" type=\"checkbox\" ng-checked=\"master\">\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\tit('should check both checkBoxes', function() {\r\n\t\t\t expect(element(by.id('checkSlave')).getAttribute('checked')).toBeFalsy();\r\n\t\t\t element(by.model('master')).click();\r\n\t\t\t expect(element(by.id('checkSlave')).getAttribute('checked')).toBeTruthy();\r\n\t\t\t});\r\n\t\t </file>\r\n\t\t</example>\r\n\t *\r\n\t * @element INPUT\r\n\t * @param {expression} ngChecked If the {@link guide/expression expression} is truthy,\r\n\t * then special attribute \"checked\" will be set on the element\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngReadonly\r\n\t * @restrict A\r\n\t * @priority 100\r\n\t *\r\n\t * @description\r\n\t * The HTML specification does not require browsers to preserve the values of boolean attributes\r\n\t * such as readonly. (Their presence means true and their absence means false.)\r\n\t * If we put an Angular interpolation expression into such an attribute then the\r\n\t * binding information would be lost when the browser removes the attribute.\r\n\t * The `ngReadonly` directive solves this problem for the `readonly` attribute.\r\n\t * This complementary directive is not removed by the browser and so provides\r\n\t * a permanent reliable place to store the binding information.\r\n\t * @example\r\n\t\t<example>\r\n\t\t <file name=\"index.html\">\r\n\t\t\tCheck me to make text readonly: <input type=\"checkbox\" ng-model=\"checked\"><br/>\r\n\t\t\t<input type=\"text\" ng-readonly=\"checked\" value=\"I'm Angular\"/>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\tit('should toggle readonly attr', function() {\r\n\t\t\t expect(element(by.css('[type=\"text\"]')).getAttribute('readonly')).toBeFalsy();\r\n\t\t\t element(by.model('checked')).click();\r\n\t\t\t expect(element(by.css('[type=\"text\"]')).getAttribute('readonly')).toBeTruthy();\r\n\t\t\t});\r\n\t\t </file>\r\n\t\t</example>\r\n\t *\r\n\t * @element INPUT\r\n\t * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy,\r\n\t * then special attribute \"readonly\" will be set on the element\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngSelected\r\n\t * @restrict A\r\n\t * @priority 100\r\n\t *\r\n\t * @description\r\n\t * The HTML specification does not require browsers to preserve the values of boolean attributes\r\n\t * such as selected. (Their presence means true and their absence means false.)\r\n\t * If we put an Angular interpolation expression into such an attribute then the\r\n\t * binding information would be lost when the browser removes the attribute.\r\n\t * The `ngSelected` directive solves this problem for the `selected` attribute.\r\n\t * This complementary directive is not removed by the browser and so provides\r\n\t * a permanent reliable place to store the binding information.\r\n\t *\r\n\t * @example\r\n\t\t<example>\r\n\t\t <file name=\"index.html\">\r\n\t\t\tCheck me to select: <input type=\"checkbox\" ng-model=\"selected\"><br/>\r\n\t\t\t<select>\r\n\t\t\t <option>Hello!</option>\r\n\t\t\t <option id=\"greet\" ng-selected=\"selected\">Greetings!</option>\r\n\t\t\t</select>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\tit('should select Greetings!', function() {\r\n\t\t\t expect(element(by.id('greet')).getAttribute('selected')).toBeFalsy();\r\n\t\t\t element(by.model('selected')).click();\r\n\t\t\t expect(element(by.id('greet')).getAttribute('selected')).toBeTruthy();\r\n\t\t\t});\r\n\t\t </file>\r\n\t\t</example>\r\n\t *\r\n\t * @element OPTION\r\n\t * @param {expression} ngSelected If the {@link guide/expression expression} is truthy,\r\n\t * then special attribute \"selected\" will be set on the element\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngOpen\r\n\t * @restrict A\r\n\t * @priority 100\r\n\t *\r\n\t * @description\r\n\t * The HTML specification does not require browsers to preserve the values of boolean attributes\r\n\t * such as open. (Their presence means true and their absence means false.)\r\n\t * If we put an Angular interpolation expression into such an attribute then the\r\n\t * binding information would be lost when the browser removes the attribute.\r\n\t * The `ngOpen` directive solves this problem for the `open` attribute.\r\n\t * This complementary directive is not removed by the browser and so provides\r\n\t * a permanent reliable place to store the binding information.\r\n\t * @example\r\n\t\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t\t Check me check multiple: <input type=\"checkbox\" ng-model=\"open\"><br/>\r\n\t\t\t <details id=\"details\" ng-open=\"open\">\r\n\t\t\t\t<summary>Show/Hide me</summary>\r\n\t\t\t </details>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\t it('should toggle open', function() {\r\n\t\t\t expect(element(by.id('details')).getAttribute('open')).toBeFalsy();\r\n\t\t\t element(by.model('open')).click();\r\n\t\t\t expect(element(by.id('details')).getAttribute('open')).toBeTruthy();\r\n\t\t\t });\r\n\t\t </file>\r\n\t\t </example>\r\n\t *\r\n\t * @element DETAILS\r\n\t * @param {expression} ngOpen If the {@link guide/expression expression} is truthy,\r\n\t * then special attribute \"open\" will be set on the element\r\n\t */\r\n\r\n\tvar ngAttributeAliasDirectives = {};\r\n\r\n\r\n\t// boolean attrs are evaluated\r\n\tforEach(BOOLEAN_ATTR, function (propName, attrName) {\r\n\t\t// binding to multiple is not supported\r\n\t\tif (propName == \"multiple\") return;\r\n\r\n\t\tvar normalized = directiveNormalize('ng-' + attrName);\r\n\t\tngAttributeAliasDirectives[normalized] = function () {\r\n\t\t\treturn {\r\n\t\t\t\tpriority: 100,\r\n\t\t\t\tlink: function (scope, element, attr) {\r\n\t\t\t\t\tscope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {\r\n\t\t\t\t\t\tattr.$set(attrName, !!value);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\t});\r\n\r\n\r\n\t// ng-src, ng-srcset, ng-href are interpolated\r\n\tforEach(['src', 'srcset', 'href'], function (attrName) {\r\n\t\tvar normalized = directiveNormalize('ng-' + attrName);\r\n\t\tngAttributeAliasDirectives[normalized] = function () {\r\n\t\t\treturn {\r\n\t\t\t\tpriority: 99, // it needs to run after the attributes are interpolated\r\n\t\t\t\tlink: function (scope, element, attr) {\r\n\t\t\t\t\tvar propName = attrName,\r\n\t\t\t\t\t\tname = attrName;\r\n\r\n\t\t\t\t\tif (attrName === 'href' &&\r\n\t\t\t\t\t\ttoString.call(element.prop('href')) === '[object SVGAnimatedString]') {\r\n\t\t\t\t\t\tname = 'xlinkHref';\r\n\t\t\t\t\t\tattr.$attr[name] = 'xlink:href';\r\n\t\t\t\t\t\tpropName = null;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tattr.$observe(normalized, function (value) {\r\n\t\t\t\t\t\tif (!value)\r\n\t\t\t\t\t\t\treturn;\r\n\r\n\t\t\t\t\t\tattr.$set(name, value);\r\n\r\n\t\t\t\t\t\t// on IE, if \"ng:src\" directive declaration is used and \"src\" attribute doesn't exist\r\n\t\t\t\t\t\t// then calling element.setAttribute('src', 'foo') doesn't do anything, so we need\r\n\t\t\t\t\t\t// to set the property as well to achieve the desired effect.\r\n\t\t\t\t\t\t// we use attr[attrName] value since $set can sanitize the url.\r\n\t\t\t\t\t\tif (msie && propName) element.prop(propName, attr[name]);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t};\r\n\t});\r\n\r\n\t/* global -nullFormCtrl */\r\n\tvar nullFormCtrl = {\r\n\t\t$addControl: noop,\r\n\t\t$removeControl: noop,\r\n\t\t$setValidity: noop,\r\n\t\t$setDirty: noop,\r\n\t\t$setPristine: noop\r\n\t};\r\n\r\n\t/**\r\n\t * @ngdoc type\r\n\t * @name form.FormController\r\n\t *\r\n\t * @property {boolean} $pristine True if user has not interacted with the form yet.\r\n\t * @property {boolean} $dirty True if user has already interacted with the form.\r\n\t * @property {boolean} $valid True if all of the containing forms and controls are valid.\r\n\t * @property {boolean} $invalid True if at least one containing control or form is invalid.\r\n\t *\r\n\t * @property {Object} $error Is an object hash, containing references to all invalid controls or\r\n\t * forms, where:\r\n\t *\r\n\t * - keys are validation tokens (error names),\r\n\t * - values are arrays of controls or forms that are invalid for given error name.\r\n\t *\r\n\t *\r\n\t * Built-in validation tokens:\r\n\t *\r\n\t * - `email`\r\n\t * - `max`\r\n\t * - `maxlength`\r\n\t * - `min`\r\n\t * - `minlength`\r\n\t * - `number`\r\n\t * - `pattern`\r\n\t * - `required`\r\n\t * - `url`\r\n\t *\r\n\t * @description\r\n\t * `FormController` keeps track of all its controls and nested forms as well as the state of them,\r\n\t * such as being valid/invalid or dirty/pristine.\r\n\t *\r\n\t * Each {@link ng.directive:form form} directive creates an instance\r\n\t * of `FormController`.\r\n\t *\r\n\t */\r\n\t//asks for $scope to fool the BC controller module\r\n\tFormController.$inject = ['$element', '$attrs', '$scope', '$animate'];\r\n\tfunction FormController(element, attrs, $scope, $animate) {\r\n\t\tvar form = this,\r\n\t\t\tparentForm = element.parent().controller('form') || nullFormCtrl,\r\n\t\t\tinvalidCount = 0, // used to easily determine if we are valid\r\n\t\t\terrors = form.$error = {},\r\n\t\t\tcontrols = [];\r\n\r\n\t\t// init state\r\n\t\tform.$name = attrs.name || attrs.ngForm;\r\n\t\tform.$dirty = false;\r\n\t\tform.$pristine = true;\r\n\t\tform.$valid = true;\r\n\t\tform.$invalid = false;\r\n\r\n\t\tparentForm.$addControl(form);\r\n\r\n\t\t// Setup initial state of the control\r\n\t\telement.addClass(PRISTINE_CLASS);\r\n\t\ttoggleValidCss(true);\r\n\r\n\t\t// convenience method for easy toggling of classes\r\n\t\tfunction toggleValidCss(isValid, validationErrorKey) {\r\n\t\t\tvalidationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';\r\n\t\t\t$animate.removeClass(element, (isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey);\r\n\t\t\t$animate.addClass(element, (isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name form.FormController#$addControl\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Register a control with the form.\r\n\t\t *\r\n\t\t * Input elements using ngModelController do this automatically when they are linked.\r\n\t\t */\r\n\t\tform.$addControl = function (control) {\r\n\t\t\t// Breaking change - before, inputs whose name was \"hasOwnProperty\" were quietly ignored\r\n\t\t\t// and not added to the scope. Now we throw an error.\r\n\t\t\tassertNotHasOwnProperty(control.$name, 'input');\r\n\t\t\tcontrols.push(control);\r\n\r\n\t\t\tif (control.$name) {\r\n\t\t\t\tform[control.$name] = control;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name form.FormController#$removeControl\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Deregister a control from the form.\r\n\t\t *\r\n\t\t * Input elements using ngModelController do this automatically when they are destroyed.\r\n\t\t */\r\n\t\tform.$removeControl = function (control) {\r\n\t\t\tif (control.$name && form[control.$name] === control) {\r\n\t\t\t\tdelete form[control.$name];\r\n\t\t\t}\r\n\t\t\tforEach(errors, function (queue, validationToken) {\r\n\t\t\t\tform.$setValidity(validationToken, true, control);\r\n\t\t\t});\r\n\r\n\t\t\tarrayRemove(controls, control);\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name form.FormController#$setValidity\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Sets the validity of a form control.\r\n\t\t *\r\n\t\t * This method will also propagate to parent forms.\r\n\t\t */\r\n\t\tform.$setValidity = function (validationToken, isValid, control) {\r\n\t\t\tvar queue = errors[validationToken];\r\n\r\n\t\t\tif (isValid) {\r\n\t\t\t\tif (queue) {\r\n\t\t\t\t\tarrayRemove(queue, control);\r\n\t\t\t\t\tif (!queue.length) {\r\n\t\t\t\t\t\tinvalidCount--;\r\n\t\t\t\t\t\tif (!invalidCount) {\r\n\t\t\t\t\t\t\ttoggleValidCss(isValid);\r\n\t\t\t\t\t\t\tform.$valid = true;\r\n\t\t\t\t\t\t\tform.$invalid = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\terrors[validationToken] = false;\r\n\t\t\t\t\t\ttoggleValidCss(true, validationToken);\r\n\t\t\t\t\t\tparentForm.$setValidity(validationToken, true, form);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\t\t\t\tif (!invalidCount) {\r\n\t\t\t\t\ttoggleValidCss(isValid);\r\n\t\t\t\t}\r\n\t\t\t\tif (queue) {\r\n\t\t\t\t\tif (includes(queue, control)) return;\r\n\t\t\t\t} else {\r\n\t\t\t\t\terrors[validationToken] = queue = [];\r\n\t\t\t\t\tinvalidCount++;\r\n\t\t\t\t\ttoggleValidCss(false, validationToken);\r\n\t\t\t\t\tparentForm.$setValidity(validationToken, false, form);\r\n\t\t\t\t}\r\n\t\t\t\tqueue.push(control);\r\n\r\n\t\t\t\tform.$valid = false;\r\n\t\t\t\tform.$invalid = true;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name form.FormController#$setDirty\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Sets the form to a dirty state.\r\n\t\t *\r\n\t\t * This method can be called to add the 'ng-dirty' class and set the form to a dirty\r\n\t\t * state (ng-dirty class). This method will also propagate to parent forms.\r\n\t\t */\r\n\t\tform.$setDirty = function () {\r\n\t\t\t$animate.removeClass(element, PRISTINE_CLASS);\r\n\t\t\t$animate.addClass(element, DIRTY_CLASS);\r\n\t\t\tform.$dirty = true;\r\n\t\t\tform.$pristine = false;\r\n\t\t\tparentForm.$setDirty();\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * @ngdoc method\r\n\t\t * @name form.FormController#$setPristine\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Sets the form to its pristine state.\r\n\t\t *\r\n\t\t * This method can be called to remove the 'ng-dirty' class and set the form to its pristine\r\n\t\t * state (ng-pristine class). This method will also propagate to all the controls contained\r\n\t\t * in this form.\r\n\t\t *\r\n\t\t * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after\r\n\t\t * saving or resetting it.\r\n\t\t */\r\n\t\tform.$setPristine = function () {\r\n\t\t\t$animate.removeClass(element, DIRTY_CLASS);\r\n\t\t\t$animate.addClass(element, PRISTINE_CLASS);\r\n\t\t\tform.$dirty = false;\r\n\t\t\tform.$pristine = true;\r\n\t\t\tforEach(controls, function (control) {\r\n\t\t\t\tcontrol.$setPristine();\r\n\t\t\t});\r\n\t\t};\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngForm\r\n\t * @restrict EAC\r\n\t *\r\n\t * @description\r\n\t * Nestable alias of {@link ng.directive:form `form`} directive. HTML\r\n\t * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a\r\n\t * sub-group of controls needs to be determined.\r\n\t *\r\n\t * Note: the purpose of `ngForm` is to group controls,\r\n\t * but not to be a replacement for the `<form>` tag with all of its capabilities\r\n\t * (e.g. posting to the server, ...).\r\n\t *\r\n\t * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into\r\n\t * related scope, under this name.\r\n\t *\r\n\t */\r\n\r\n\t/**\r\n\t* @ngdoc directive\r\n\t* @name form\r\n\t* @restrict E\r\n\t*\r\n\t* @description\r\n\t* Directive that instantiates\r\n\t* {@link form.FormController FormController}.\r\n\t*\r\n\t* If the `name` attribute is specified, the form controller is published onto the current scope under\r\n\t* this name.\r\n\t*\r\n\t* # Alias: {@link ng.directive:ngForm `ngForm`}\r\n\t*\r\n\t* In Angular forms can be nested. This means that the outer form is valid when all of the child\r\n\t* forms are valid as well. However, browsers do not allow nesting of `<form>` elements, so\r\n\t* Angular provides the {@link ng.directive:ngForm `ngForm`} directive which behaves identically to\r\n\t* `<form>` but can be nested. This allows you to have nested forms, which is very useful when\r\n\t* using Angular validation directives in forms that are dynamically generated using the\r\n\t* {@link ng.directive:ngRepeat `ngRepeat`} directive. Since you cannot dynamically generate the `name`\r\n\t* attribute of input elements using interpolation, you have to wrap each set of repeated inputs in an\r\n\t* `ngForm` directive and nest these in an outer `form` element.\r\n\t*\r\n\t*\r\n\t* # CSS classes\r\n\t* - `ng-valid` is set if the form is valid.\r\n\t* - `ng-invalid` is set if the form is invalid.\r\n\t* - `ng-pristine` is set if the form is pristine.\r\n\t* - `ng-dirty` is set if the form is dirty.\r\n\t*\r\n\t* Keep in mind that ngAnimate can detect each of these classes when added and removed.\r\n\t*\r\n\t*\r\n\t* # Submitting a form and preventing the default action\r\n\t*\r\n\t* Since the role of forms in client-side Angular applications is different than in classical\r\n\t* roundtrip apps, it is desirable for the browser not to translate the form submission into a full\r\n\t* page reload that sends the data to the server. Instead some javascript logic should be triggered\r\n\t* to handle the form submission in an application-specific way.\r\n\t*\r\n\t* For this reason, Angular prevents the default action (form submission to the server) unless the\r\n\t* `<form>` element has an `action` attribute specified.\r\n\t*\r\n\t* You can use one of the following two ways to specify what javascript method should be called when\r\n\t* a form is submitted:\r\n\t*\r\n\t* - {@link ng.directive:ngSubmit ngSubmit} directive on the form element\r\n\t* - {@link ng.directive:ngClick ngClick} directive on the first\r\n\t * button or input field of type submit (input[type=submit])\r\n\t*\r\n\t* To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit}\r\n\t* or {@link ng.directive:ngClick ngClick} directives.\r\n\t* This is because of the following form submission rules in the HTML specification:\r\n\t*\r\n\t* - If a form has only one input field then hitting enter in this field triggers form submit\r\n\t* (`ngSubmit`)\r\n\t* - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter\r\n\t* doesn't trigger submit\r\n\t* - if a form has one or more input fields and one or more buttons or input[type=submit] then\r\n\t* hitting enter in any of the input fields will trigger the click handler on the *first* button or\r\n\t* input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`)\r\n\t*\r\n\t* @param {string=} name Name of the form. If specified, the form controller will be published into\r\n\t* related scope, under this name.\r\n\t*\r\n\t* ## Animation Hooks\r\n\t*\r\n\t* Animations in ngForm are triggered when any of the associated CSS classes are added and removed.\r\n\t* These classes are: `.ng-pristine`, `.ng-dirty`, `.ng-invalid` and `.ng-valid` as well as any\r\n\t* other validations that are performed within the form. Animations in ngForm are similar to how\r\n\t* they work in ngClass and animations can be hooked into using CSS transitions, keyframes as well\r\n\t* as JS animations.\r\n\t*\r\n\t* The following example shows a simple way to utilize CSS transitions to style a form element\r\n\t* that has been rendered as invalid after it has been validated:\r\n\t*\r\n\t* <pre>\r\n\t* //be sure to include ngAnimate as a module to hook into more\r\n\t* //advanced animations\r\n\t* .my-form {\r\n\t* transition:0.5s linear all;\r\n\t* background: white;\r\n\t* }\r\n\t* .my-form.ng-invalid {\r\n\t* background: red;\r\n\t* color:white;\r\n\t* }\r\n\t* </pre>\r\n\t*\r\n\t* @example\r\n\t <example deps=\"angular-animate.js\" animations=\"true\" fixBase=\"true\">\r\n\t\t <file name=\"index.html\">\r\n\t\t <script>\r\n\t\t\tfunction Ctrl($scope) {\r\n\t\t\t $scope.userType = 'guest';\r\n\t\t\t}\r\n\t\t </script>\r\n\t\t <style>\r\n\t\t .my-form {\r\n\t\t\t -webkit-transition:all linear 0.5s;\r\n\t\t\t transition:all linear 0.5s;\r\n\t\t\t background: transparent;\r\n\t\t }\r\n\t\t .my-form.ng-invalid {\r\n\t\t\t background: red;\r\n\t\t }\r\n\t\t </style>\r\n\t\t <form name=\"myForm\" ng-controller=\"Ctrl\" class=\"my-form\">\r\n\t\t\tuserType: <input name=\"input\" ng-model=\"userType\" required>\r\n\t\t\t<span class=\"error\" ng-show=\"myForm.input.$error.required\">Required!</span><br>\r\n\t\t\t<tt>userType = {{userType}}</tt><br>\r\n\t\t\t<tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br>\r\n\t\t\t<tt>myForm.input.$error = {{myForm.input.$error}}</tt><br>\r\n\t\t\t<tt>myForm.$valid = {{myForm.$valid}}</tt><br>\r\n\t\t\t<tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>\r\n\t\t </form>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should initialize to model', function() {\r\n\t\t\t var userType = element(by.binding('userType'));\r\n\t\t\t var valid = element(by.binding('myForm.input.$valid'));\r\n \r\n\t\t\t expect(userType.getText()).toContain('guest');\r\n\t\t\t expect(valid.getText()).toContain('true');\r\n\t\t });\r\n \r\n\t\t it('should be invalid if empty', function() {\r\n\t\t\t var userType = element(by.binding('userType'));\r\n\t\t\t var valid = element(by.binding('myForm.input.$valid'));\r\n\t\t\t var userInput = element(by.model('userType'));\r\n \r\n\t\t\t userInput.clear();\r\n\t\t\t userInput.sendKeys('');\r\n \r\n\t\t\t expect(userType.getText()).toEqual('userType =');\r\n\t\t\t expect(valid.getText()).toContain('false');\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t*\r\n\t*/\r\n\tvar formDirectiveFactory = function (isNgForm) {\r\n\t\treturn ['$timeout', function ($timeout) {\r\n\t\t\tvar formDirective = {\r\n\t\t\t\tname: 'form',\r\n\t\t\t\trestrict: isNgForm ? 'EAC' : 'E',\r\n\t\t\t\tcontroller: FormController,\r\n\t\t\t\tcompile: function () {\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tpre: function (scope, formElement, attr, controller) {\r\n\t\t\t\t\t\t\tif (!attr.action) {\r\n\t\t\t\t\t\t\t\t// we can't use jq events because if a form is destroyed during submission the default\r\n\t\t\t\t\t\t\t\t// action is not prevented. see #1238\r\n\t\t\t\t\t\t\t\t//\r\n\t\t\t\t\t\t\t\t// IE 9 is not affected because it doesn't fire a submit event and try to do a full\r\n\t\t\t\t\t\t\t\t// page reload if the form was destroyed by submission of the form via a click handler\r\n\t\t\t\t\t\t\t\t// on a button in the form. Looks like an IE9 specific bug.\r\n\t\t\t\t\t\t\t\tvar preventDefaultListener = function (event) {\r\n\t\t\t\t\t\t\t\t\tevent.preventDefault\r\n\t\t\t\t\t\t\t\t\t ? event.preventDefault()\r\n\t\t\t\t\t\t\t\t\t : event.returnValue = false; // IE\r\n\t\t\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\t\t\taddEventListenerFn(formElement[0], 'submit', preventDefaultListener);\r\n\r\n\t\t\t\t\t\t\t\t// unregister the preventDefault listener so that we don't not leak memory but in a\r\n\t\t\t\t\t\t\t\t// way that will achieve the prevention of the default action.\r\n\t\t\t\t\t\t\t\tformElement.on('$destroy', function () {\r\n\t\t\t\t\t\t\t\t\t$timeout(function () {\r\n\t\t\t\t\t\t\t\t\t\tremoveEventListenerFn(formElement[0], 'submit', preventDefaultListener);\r\n\t\t\t\t\t\t\t\t\t}, 0, false);\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tvar parentFormCtrl = formElement.parent().controller('form'),\r\n\t\t\t\t\t\t\t\talias = attr.name || attr.ngForm;\r\n\r\n\t\t\t\t\t\t\tif (alias) {\r\n\t\t\t\t\t\t\t\tsetter(scope, alias, controller, alias);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (parentFormCtrl) {\r\n\t\t\t\t\t\t\t\tformElement.on('$destroy', function () {\r\n\t\t\t\t\t\t\t\t\tparentFormCtrl.$removeControl(controller);\r\n\t\t\t\t\t\t\t\t\tif (alias) {\r\n\t\t\t\t\t\t\t\t\t\tsetter(scope, alias, undefined, alias);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\textend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\treturn formDirective;\r\n\t\t}];\r\n\t};\r\n\r\n\tvar formDirective = formDirectiveFactory();\r\n\tvar ngFormDirective = formDirectiveFactory(true);\r\n\r\n\t/* global\r\n\t\r\n\t\t-VALID_CLASS,\r\n\t\t-INVALID_CLASS,\r\n\t\t-PRISTINE_CLASS,\r\n\t\t-DIRTY_CLASS\r\n\t*/\r\n\r\n\tvar URL_REGEXP = /^(ftp|http|https):\\/\\/(\\w+:{0,1}\\w*@)?(\\S+)(:[0-9]+)?(\\/|\\/([\\w#!:.?+=&%@!\\-\\/]))?$/;\r\n\tvar EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\\/=?^_`{|}~.-]+@[a-z0-9-]+(\\.[a-z0-9-]+)*$/i;\r\n\tvar NUMBER_REGEXP = /^\\s*(\\-|\\+)?(\\d+|(\\d*(\\.\\d*)))\\s*$/;\r\n\r\n\tvar inputType = {\r\n\r\n\t\t/**\r\n\t\t * @ngdoc input\r\n\t\t * @name input[text]\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Standard HTML text input with angular data binding.\r\n\t\t *\r\n\t\t * @param {string} ngModel Assignable angular expression to data-bind to.\r\n\t\t * @param {string=} name Property name of the form under which the control is published.\r\n\t\t * @param {string=} required Adds `required` validation error key if the value is not entered.\r\n\t\t * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\r\n\t\t * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\r\n\t\t * `required` when you want to data-bind to the `required` attribute.\r\n\t\t * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n\t\t * minlength.\r\n\t\t * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n\t\t * maxlength.\r\n\t\t * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n\t\t * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n\t\t * patterns defined as scope expressions.\r\n\t\t * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n\t\t * interaction with the input element.\r\n\t\t * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.\r\n\t\t *\r\n\t\t * @example\r\n\t\t\t<example name=\"text-input-directive\">\r\n\t\t\t <file name=\"index.html\">\r\n\t\t\t <script>\r\n\t\t\t\t function Ctrl($scope) {\r\n\t\t\t\t $scope.text = 'guest';\r\n\t\t\t\t $scope.word = /^\\s*\\w*\\s*$/;\r\n\t\t\t\t }\r\n\t\t\t </script>\r\n\t\t\t <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n\t\t\t\t Single word: <input type=\"text\" name=\"input\" ng-model=\"text\"\r\n\t\t\t\t\t\t\t\t\t ng-pattern=\"word\" required ng-trim=\"false\">\r\n\t\t\t\t <span class=\"error\" ng-show=\"myForm.input.$error.required\">\r\n\t\t\t\t Required!</span>\r\n\t\t\t\t <span class=\"error\" ng-show=\"myForm.input.$error.pattern\">\r\n\t\t\t\t Single word only!</span>\r\n\t \r\n\t\t\t\t <tt>text = {{text}}</tt><br/>\r\n\t\t\t\t <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\r\n\t\t\t\t <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\r\n\t\t\t\t <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n\t\t\t\t <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n\t\t\t\t</form>\r\n\t\t\t </file>\r\n\t\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\t\tvar text = element(by.binding('text'));\r\n\t\t\t\tvar valid = element(by.binding('myForm.input.$valid'));\r\n\t\t\t\tvar input = element(by.model('text'));\r\n\t \r\n\t\t\t\tit('should initialize to model', function() {\r\n\t\t\t\t expect(text.getText()).toContain('guest');\r\n\t\t\t\t expect(valid.getText()).toContain('true');\r\n\t\t\t\t});\r\n\t \r\n\t\t\t\tit('should be invalid if empty', function() {\r\n\t\t\t\t input.clear();\r\n\t\t\t\t input.sendKeys('');\r\n\t \r\n\t\t\t\t expect(text.getText()).toEqual('text =');\r\n\t\t\t\t expect(valid.getText()).toContain('false');\r\n\t\t\t\t});\r\n\t \r\n\t\t\t\tit('should be invalid if multi word', function() {\r\n\t\t\t\t input.clear();\r\n\t\t\t\t input.sendKeys('hello world');\r\n\t \r\n\t\t\t\t expect(valid.getText()).toContain('false');\r\n\t\t\t\t});\r\n\t\t\t </file>\r\n\t\t\t</example>\r\n\t\t */\r\n\t\t'text': textInputType,\r\n\r\n\r\n\t\t/**\r\n\t\t * @ngdoc input\r\n\t\t * @name input[number]\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Text input with number validation and transformation. Sets the `number` validation\r\n\t\t * error if not a valid number.\r\n\t\t *\r\n\t\t * @param {string} ngModel Assignable angular expression to data-bind to.\r\n\t\t * @param {string=} name Property name of the form under which the control is published.\r\n\t\t * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.\r\n\t\t * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.\r\n\t\t * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n\t\t * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\r\n\t\t * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\r\n\t\t * `required` when you want to data-bind to the `required` attribute.\r\n\t\t * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n\t\t * minlength.\r\n\t\t * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n\t\t * maxlength.\r\n\t\t * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n\t\t * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n\t\t * patterns defined as scope expressions.\r\n\t\t * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n\t\t * interaction with the input element.\r\n\t\t *\r\n\t\t * @example\r\n\t\t\t<example name=\"number-input-directive\">\r\n\t\t\t <file name=\"index.html\">\r\n\t\t\t <script>\r\n\t\t\t\t function Ctrl($scope) {\r\n\t\t\t\t $scope.value = 12;\r\n\t\t\t\t }\r\n\t\t\t </script>\r\n\t\t\t <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n\t\t\t\t Number: <input type=\"number\" name=\"input\" ng-model=\"value\"\r\n\t\t\t\t\t\t\t\tmin=\"0\" max=\"99\" required>\r\n\t\t\t\t <span class=\"error\" ng-show=\"myForm.input.$error.required\">\r\n\t\t\t\t Required!</span>\r\n\t\t\t\t <span class=\"error\" ng-show=\"myForm.input.$error.number\">\r\n\t\t\t\t Not valid number!</span>\r\n\t\t\t\t <tt>value = {{value}}</tt><br/>\r\n\t\t\t\t <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\r\n\t\t\t\t <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\r\n\t\t\t\t <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n\t\t\t\t <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n\t\t\t\t</form>\r\n\t\t\t </file>\r\n\t\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\t\tvar value = element(by.binding('value'));\r\n\t\t\t\tvar valid = element(by.binding('myForm.input.$valid'));\r\n\t\t\t\tvar input = element(by.model('value'));\r\n\t \r\n\t\t\t\tit('should initialize to model', function() {\r\n\t\t\t\t expect(value.getText()).toContain('12');\r\n\t\t\t\t expect(valid.getText()).toContain('true');\r\n\t\t\t\t});\r\n\t \r\n\t\t\t\tit('should be invalid if empty', function() {\r\n\t\t\t\t input.clear();\r\n\t\t\t\t input.sendKeys('');\r\n\t\t\t\t expect(value.getText()).toEqual('value =');\r\n\t\t\t\t expect(valid.getText()).toContain('false');\r\n\t\t\t\t});\r\n\t \r\n\t\t\t\tit('should be invalid if over max', function() {\r\n\t\t\t\t input.clear();\r\n\t\t\t\t input.sendKeys('123');\r\n\t\t\t\t expect(value.getText()).toEqual('value =');\r\n\t\t\t\t expect(valid.getText()).toContain('false');\r\n\t\t\t\t});\r\n\t\t\t </file>\r\n\t\t\t</example>\r\n\t\t */\r\n\t\t'number': numberInputType,\r\n\r\n\r\n\t\t/**\r\n\t\t * @ngdoc input\r\n\t\t * @name input[url]\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Text input with URL validation. Sets the `url` validation error key if the content is not a\r\n\t\t * valid URL.\r\n\t\t *\r\n\t\t * @param {string} ngModel Assignable angular expression to data-bind to.\r\n\t\t * @param {string=} name Property name of the form under which the control is published.\r\n\t\t * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n\t\t * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\r\n\t\t * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\r\n\t\t * `required` when you want to data-bind to the `required` attribute.\r\n\t\t * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n\t\t * minlength.\r\n\t\t * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n\t\t * maxlength.\r\n\t\t * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n\t\t * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n\t\t * patterns defined as scope expressions.\r\n\t\t * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n\t\t * interaction with the input element.\r\n\t\t *\r\n\t\t * @example\r\n\t\t\t<example name=\"url-input-directive\">\r\n\t\t\t <file name=\"index.html\">\r\n\t\t\t <script>\r\n\t\t\t\t function Ctrl($scope) {\r\n\t\t\t\t $scope.text = 'http://google.com';\r\n\t\t\t\t }\r\n\t\t\t </script>\r\n\t\t\t <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n\t\t\t\t URL: <input type=\"url\" name=\"input\" ng-model=\"text\" required>\r\n\t\t\t\t <span class=\"error\" ng-show=\"myForm.input.$error.required\">\r\n\t\t\t\t Required!</span>\r\n\t\t\t\t <span class=\"error\" ng-show=\"myForm.input.$error.url\">\r\n\t\t\t\t Not valid url!</span>\r\n\t\t\t\t <tt>text = {{text}}</tt><br/>\r\n\t\t\t\t <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\r\n\t\t\t\t <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\r\n\t\t\t\t <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n\t\t\t\t <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n\t\t\t\t <tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/>\r\n\t\t\t\t</form>\r\n\t\t\t </file>\r\n\t\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\t\tvar text = element(by.binding('text'));\r\n\t\t\t\tvar valid = element(by.binding('myForm.input.$valid'));\r\n\t\t\t\tvar input = element(by.model('text'));\r\n\t \r\n\t\t\t\tit('should initialize to model', function() {\r\n\t\t\t\t expect(text.getText()).toContain('http://google.com');\r\n\t\t\t\t expect(valid.getText()).toContain('true');\r\n\t\t\t\t});\r\n\t \r\n\t\t\t\tit('should be invalid if empty', function() {\r\n\t\t\t\t input.clear();\r\n\t\t\t\t input.sendKeys('');\r\n\t \r\n\t\t\t\t expect(text.getText()).toEqual('text =');\r\n\t\t\t\t expect(valid.getText()).toContain('false');\r\n\t\t\t\t});\r\n\t \r\n\t\t\t\tit('should be invalid if not url', function() {\r\n\t\t\t\t input.clear();\r\n\t\t\t\t input.sendKeys('box');\r\n\t \r\n\t\t\t\t expect(valid.getText()).toContain('false');\r\n\t\t\t\t});\r\n\t\t\t </file>\r\n\t\t\t</example>\r\n\t\t */\r\n\t\t'url': urlInputType,\r\n\r\n\r\n\t\t/**\r\n\t\t * @ngdoc input\r\n\t\t * @name input[email]\r\n\t\t *\r\n\t\t * @description\r\n\t\t * Text input with email validation. Sets the `email` validation error key if not a valid email\r\n\t\t * address.\r\n\t\t *\r\n\t\t * @param {string} ngModel Assignable angular expression to data-bind to.\r\n\t\t * @param {string=} name Property name of the form under which the control is published.\r\n\t\t * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n\t\t * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\r\n\t\t * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\r\n\t\t * `required` when you want to data-bind to the `required` attribute.\r\n\t\t * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n\t\t * minlength.\r\n\t\t * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n\t\t * maxlength.\r\n\t\t * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n\t\t * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n\t\t * patterns defined as scope expressions.\r\n\t\t * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n\t\t * interaction with the input element.\r\n\t\t *\r\n\t\t * @example\r\n\t\t\t<example name=\"email-input-directive\">\r\n\t\t\t <file name=\"index.html\">\r\n\t\t\t <script>\r\n\t\t\t\t function Ctrl($scope) {\r\n\t\t\t\t $scope.text = 'me@example.com';\r\n\t\t\t\t }\r\n\t\t\t </script>\r\n\t\t\t\t <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n\t\t\t\t Email: <input type=\"email\" name=\"input\" ng-model=\"text\" required>\r\n\t\t\t\t <span class=\"error\" ng-show=\"myForm.input.$error.required\">\r\n\t\t\t\t\t Required!</span>\r\n\t\t\t\t <span class=\"error\" ng-show=\"myForm.input.$error.email\">\r\n\t\t\t\t\t Not valid email!</span>\r\n\t\t\t\t <tt>text = {{text}}</tt><br/>\r\n\t\t\t\t <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>\r\n\t\t\t\t <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>\r\n\t\t\t\t <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n\t\t\t\t <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n\t\t\t\t <tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/>\r\n\t\t\t\t </form>\r\n\t\t\t </file>\r\n\t\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\t\tvar text = element(by.binding('text'));\r\n\t\t\t\tvar valid = element(by.binding('myForm.input.$valid'));\r\n\t\t\t\tvar input = element(by.model('text'));\r\n\t \r\n\t\t\t\tit('should initialize to model', function() {\r\n\t\t\t\t expect(text.getText()).toContain('me@example.com');\r\n\t\t\t\t expect(valid.getText()).toContain('true');\r\n\t\t\t\t});\r\n\t \r\n\t\t\t\tit('should be invalid if empty', function() {\r\n\t\t\t\t input.clear();\r\n\t\t\t\t input.sendKeys('');\r\n\t\t\t\t expect(text.getText()).toEqual('text =');\r\n\t\t\t\t expect(valid.getText()).toContain('false');\r\n\t\t\t\t});\r\n\t \r\n\t\t\t\tit('should be invalid if not email', function() {\r\n\t\t\t\t input.clear();\r\n\t\t\t\t input.sendKeys('xxx');\r\n\t \r\n\t\t\t\t expect(valid.getText()).toContain('false');\r\n\t\t\t\t});\r\n\t\t\t </file>\r\n\t\t\t</example>\r\n\t\t */\r\n\t\t'email': emailInputType,\r\n\r\n\r\n\t\t/**\r\n\t\t * @ngdoc input\r\n\t\t * @name input[radio]\r\n\t\t *\r\n\t\t * @description\r\n\t\t * HTML radio button.\r\n\t\t *\r\n\t\t * @param {string} ngModel Assignable angular expression to data-bind to.\r\n\t\t * @param {string} value The value to which the expression should be set when selected.\r\n\t\t * @param {string=} name Property name of the form under which the control is published.\r\n\t\t * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n\t\t * interaction with the input element.\r\n\t\t * @param {string} ngValue Angular expression which sets the value to which the expression should\r\n\t\t * be set when selected.\r\n\t\t *\r\n\t\t * @example\r\n\t\t\t<example name=\"radio-input-directive\">\r\n\t\t\t <file name=\"index.html\">\r\n\t\t\t <script>\r\n\t\t\t\t function Ctrl($scope) {\r\n\t\t\t\t $scope.color = 'blue';\r\n\t\t\t\t $scope.specialValue = {\r\n\t\t\t\t\t \"id\": \"12345\",\r\n\t\t\t\t\t \"value\": \"green\"\r\n\t\t\t\t };\r\n\t\t\t\t }\r\n\t\t\t </script>\r\n\t\t\t <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n\t\t\t\t <input type=\"radio\" ng-model=\"color\" value=\"red\"> Red <br/>\r\n\t\t\t\t <input type=\"radio\" ng-model=\"color\" ng-value=\"specialValue\"> Green <br/>\r\n\t\t\t\t <input type=\"radio\" ng-model=\"color\" value=\"blue\"> Blue <br/>\r\n\t\t\t\t <tt>color = {{color | json}}</tt><br/>\r\n\t\t\t\t</form>\r\n\t\t\t\tNote that `ng-value=\"specialValue\"` sets radio item's value to be the value of `$scope.specialValue`.\r\n\t\t\t </file>\r\n\t\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\t\tit('should change state', function() {\r\n\t\t\t\t var color = element(by.binding('color'));\r\n\t \r\n\t\t\t\t expect(color.getText()).toContain('blue');\r\n\t \r\n\t\t\t\t element.all(by.model('color')).get(0).click();\r\n\t \r\n\t\t\t\t expect(color.getText()).toContain('red');\r\n\t\t\t\t});\r\n\t\t\t </file>\r\n\t\t\t</example>\r\n\t\t */\r\n\t\t'radio': radioInputType,\r\n\r\n\r\n\t\t/**\r\n\t\t * @ngdoc input\r\n\t\t * @name input[checkbox]\r\n\t\t *\r\n\t\t * @description\r\n\t\t * HTML checkbox.\r\n\t\t *\r\n\t\t * @param {string} ngModel Assignable angular expression to data-bind to.\r\n\t\t * @param {string=} name Property name of the form under which the control is published.\r\n\t\t * @param {string=} ngTrueValue The value to which the expression should be set when selected.\r\n\t\t * @param {string=} ngFalseValue The value to which the expression should be set when not selected.\r\n\t\t * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n\t\t * interaction with the input element.\r\n\t\t *\r\n\t\t * @example\r\n\t\t\t<example name=\"checkbox-input-directive\">\r\n\t\t\t <file name=\"index.html\">\r\n\t\t\t <script>\r\n\t\t\t\t function Ctrl($scope) {\r\n\t\t\t\t $scope.value1 = true;\r\n\t\t\t\t $scope.value2 = 'YES'\r\n\t\t\t\t }\r\n\t\t\t </script>\r\n\t\t\t <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n\t\t\t\t Value1: <input type=\"checkbox\" ng-model=\"value1\"> <br/>\r\n\t\t\t\t Value2: <input type=\"checkbox\" ng-model=\"value2\"\r\n\t\t\t\t\t\t\t\tng-true-value=\"YES\" ng-false-value=\"NO\"> <br/>\r\n\t\t\t\t <tt>value1 = {{value1}}</tt><br/>\r\n\t\t\t\t <tt>value2 = {{value2}}</tt><br/>\r\n\t\t\t\t</form>\r\n\t\t\t </file>\r\n\t\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\t\tit('should change state', function() {\r\n\t\t\t\t var value1 = element(by.binding('value1'));\r\n\t\t\t\t var value2 = element(by.binding('value2'));\r\n\t \r\n\t\t\t\t expect(value1.getText()).toContain('true');\r\n\t\t\t\t expect(value2.getText()).toContain('YES');\r\n\t \r\n\t\t\t\t element(by.model('value1')).click();\r\n\t\t\t\t element(by.model('value2')).click();\r\n\t \r\n\t\t\t\t expect(value1.getText()).toContain('false');\r\n\t\t\t\t expect(value2.getText()).toContain('NO');\r\n\t\t\t\t});\r\n\t\t\t </file>\r\n\t\t\t</example>\r\n\t\t */\r\n\t\t'checkbox': checkboxInputType,\r\n\r\n\t\t'hidden': noop,\r\n\t\t'button': noop,\r\n\t\t'submit': noop,\r\n\t\t'reset': noop,\r\n\t\t'file': noop\r\n\t};\r\n\r\n\t// A helper function to call $setValidity and return the value / undefined,\r\n\t// a pattern that is repeated a lot in the input validation logic.\r\n\tfunction validate(ctrl, validatorName, validity, value) {\r\n\t\tctrl.$setValidity(validatorName, validity);\r\n\t\treturn validity ? value : undefined;\r\n\t}\r\n\r\n\tfunction testFlags(validity, flags) {\r\n\t\tvar i, flag;\r\n\t\tif (flags) {\r\n\t\t\tfor (i = 0; i < flags.length; ++i) {\r\n\t\t\t\tflag = flags[i];\r\n\t\t\t\tif (validity[flag]) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\t// Pass validity so that behaviour can be mocked easier.\r\n\tfunction addNativeHtml5Validators(ctrl, validatorName, badFlags, ignoreFlags, validity) {\r\n\t\tif (isObject(validity)) {\r\n\t\t\tctrl.$$hasNativeValidators = true;\r\n\t\t\tvar validator = function (value) {\r\n\t\t\t\t// Don't overwrite previous validation, don't consider valueMissing to apply (ng-required can\r\n\t\t\t\t// perform the required validation)\r\n\t\t\t\tif (!ctrl.$error[validatorName] &&\r\n\t\t\t\t\t!testFlags(validity, ignoreFlags) &&\r\n\t\t\t\t\ttestFlags(validity, badFlags)) {\r\n\t\t\t\t\tctrl.$setValidity(validatorName, false);\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\treturn value;\r\n\t\t\t};\r\n\t\t\tctrl.$parsers.push(validator);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction textInputType(scope, element, attr, ctrl, $sniffer, $browser) {\r\n\t\tvar validity = element.prop(VALIDITY_STATE_PROPERTY);\r\n\t\tvar placeholder = element[0].placeholder, noevent = {};\r\n\t\tctrl.$$validityState = validity;\r\n\r\n\t\t// In composition mode, users are still inputing intermediate text buffer,\r\n\t\t// hold the listener until composition is done.\r\n\t\t// More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent\r\n\t\tif (!$sniffer.android) {\r\n\t\t\tvar composing = false;\r\n\r\n\t\t\telement.on('compositionstart', function (data) {\r\n\t\t\t\tcomposing = true;\r\n\t\t\t});\r\n\r\n\t\t\telement.on('compositionend', function () {\r\n\t\t\t\tcomposing = false;\r\n\t\t\t\tlistener();\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tvar listener = function (ev) {\r\n\t\t\tif (composing) return;\r\n\t\t\tvar value = element.val();\r\n\r\n\t\t\t// IE (11 and under) seem to emit an 'input' event if the placeholder value changes.\r\n\t\t\t// We don't want to dirty the value when this happens, so we abort here. Unfortunately,\r\n\t\t\t// IE also sends input events for other non-input-related things, (such as focusing on a\r\n\t\t\t// form control), so this change is not entirely enough to solve this.\r\n\t\t\tif (msie && (ev || noevent).type === 'input' && element[0].placeholder !== placeholder) {\r\n\t\t\t\tplaceholder = element[0].placeholder;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// By default we will trim the value\r\n\t\t\t// If the attribute ng-trim exists we will avoid trimming\r\n\t\t\t// e.g. <input ng-model=\"foo\" ng-trim=\"false\">\r\n\t\t\tif (toBoolean(attr.ngTrim || 'T')) {\r\n\t\t\t\tvalue = trim(value);\r\n\t\t\t}\r\n\r\n\t\t\t// If a control is suffering from bad input, browsers discard its value, so it may be\r\n\t\t\t// necessary to revalidate even if the control's value is the same empty value twice in\r\n\t\t\t// a row.\r\n\t\t\tvar revalidate = validity && ctrl.$$hasNativeValidators;\r\n\t\t\tif (ctrl.$viewValue !== value || (value === '' && revalidate)) {\r\n\t\t\t\tif (scope.$$phase) {\r\n\t\t\t\t\tctrl.$setViewValue(value);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tscope.$apply(function () {\r\n\t\t\t\t\t\tctrl.$setViewValue(value);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// if the browser does support \"input\" event, we are fine - except on IE9 which doesn't fire the\r\n\t\t// input event on backspace, delete or cut\r\n\t\tif ($sniffer.hasEvent('input')) {\r\n\t\t\telement.on('input', listener);\r\n\t\t} else {\r\n\t\t\tvar timeout;\r\n\r\n\t\t\tvar deferListener = function () {\r\n\t\t\t\tif (!timeout) {\r\n\t\t\t\t\ttimeout = $browser.defer(function () {\r\n\t\t\t\t\t\tlistener();\r\n\t\t\t\t\t\ttimeout = null;\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\telement.on('keydown', function (event) {\r\n\t\t\t\tvar key = event.keyCode;\r\n\r\n\t\t\t\t// ignore\r\n\t\t\t\t// command modifiers arrows\r\n\t\t\t\tif (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;\r\n\r\n\t\t\t\tdeferListener();\r\n\t\t\t});\r\n\r\n\t\t\t// if user modifies input value using context menu in IE, we need \"paste\" and \"cut\" events to catch it\r\n\t\t\tif ($sniffer.hasEvent('paste')) {\r\n\t\t\t\telement.on('paste cut', deferListener);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// if user paste into input using mouse on older browser\r\n\t\t// or form autocomplete on newer browser, we need \"change\" event to catch it\r\n\t\telement.on('change', listener);\r\n\r\n\t\tctrl.$render = function () {\r\n\t\t\telement.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue);\r\n\t\t};\r\n\r\n\t\t// pattern validator\r\n\t\tvar pattern = attr.ngPattern,\r\n\t\t\tpatternValidator,\r\n\t\t\tmatch;\r\n\r\n\t\tif (pattern) {\r\n\t\t\tvar validateRegex = function (regexp, value) {\r\n\t\t\t\treturn validate(ctrl, 'pattern', ctrl.$isEmpty(value) || regexp.test(value), value);\r\n\t\t\t};\r\n\t\t\tmatch = pattern.match(/^\\/(.*)\\/([gim]*)$/);\r\n\t\t\tif (match) {\r\n\t\t\t\tpattern = new RegExp(match[1], match[2]);\r\n\t\t\t\tpatternValidator = function (value) {\r\n\t\t\t\t\treturn validateRegex(pattern, value);\r\n\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\tpatternValidator = function (value) {\r\n\t\t\t\t\tvar patternObj = scope.$eval(pattern);\r\n\r\n\t\t\t\t\tif (!patternObj || !patternObj.test) {\r\n\t\t\t\t\t\tthrow minErr('ngPattern')('noregexp',\r\n\t\t\t\t\t\t 'Expected {0} to be a RegExp but was {1}. Element: {2}', pattern,\r\n\t\t\t\t\t\t patternObj, startingTag(element));\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn validateRegex(patternObj, value);\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tctrl.$formatters.push(patternValidator);\r\n\t\t\tctrl.$parsers.push(patternValidator);\r\n\t\t}\r\n\r\n\t\t// min length validator\r\n\t\tif (attr.ngMinlength) {\r\n\t\t\tvar minlength = int(attr.ngMinlength);\r\n\t\t\tvar minLengthValidator = function (value) {\r\n\t\t\t\treturn validate(ctrl, 'minlength', ctrl.$isEmpty(value) || value.length >= minlength, value);\r\n\t\t\t};\r\n\r\n\t\t\tctrl.$parsers.push(minLengthValidator);\r\n\t\t\tctrl.$formatters.push(minLengthValidator);\r\n\t\t}\r\n\r\n\t\t// max length validator\r\n\t\tif (attr.ngMaxlength) {\r\n\t\t\tvar maxlength = int(attr.ngMaxlength);\r\n\t\t\tvar maxLengthValidator = function (value) {\r\n\t\t\t\treturn validate(ctrl, 'maxlength', ctrl.$isEmpty(value) || value.length <= maxlength, value);\r\n\t\t\t};\r\n\r\n\t\t\tctrl.$parsers.push(maxLengthValidator);\r\n\t\t\tctrl.$formatters.push(maxLengthValidator);\r\n\t\t}\r\n\t}\r\n\r\n\tvar numberBadFlags = ['badInput'];\r\n\r\n\tfunction numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {\r\n\t\ttextInputType(scope, element, attr, ctrl, $sniffer, $browser);\r\n\r\n\t\tctrl.$parsers.push(function (value) {\r\n\t\t\tvar empty = ctrl.$isEmpty(value);\r\n\t\t\tif (empty || NUMBER_REGEXP.test(value)) {\r\n\t\t\t\tctrl.$setValidity('number', true);\r\n\t\t\t\treturn value === '' ? null : (empty ? value : parseFloat(value));\r\n\t\t\t} else {\r\n\t\t\t\tctrl.$setValidity('number', false);\r\n\t\t\t\treturn undefined;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\taddNativeHtml5Validators(ctrl, 'number', numberBadFlags, null, ctrl.$$validityState);\r\n\r\n\t\tctrl.$formatters.push(function (value) {\r\n\t\t\treturn ctrl.$isEmpty(value) ? '' : '' + value;\r\n\t\t});\r\n\r\n\t\tif (attr.min) {\r\n\t\t\tvar minValidator = function (value) {\r\n\t\t\t\tvar min = parseFloat(attr.min);\r\n\t\t\t\treturn validate(ctrl, 'min', ctrl.$isEmpty(value) || value >= min, value);\r\n\t\t\t};\r\n\r\n\t\t\tctrl.$parsers.push(minValidator);\r\n\t\t\tctrl.$formatters.push(minValidator);\r\n\t\t}\r\n\r\n\t\tif (attr.max) {\r\n\t\t\tvar maxValidator = function (value) {\r\n\t\t\t\tvar max = parseFloat(attr.max);\r\n\t\t\t\treturn validate(ctrl, 'max', ctrl.$isEmpty(value) || value <= max, value);\r\n\t\t\t};\r\n\r\n\t\t\tctrl.$parsers.push(maxValidator);\r\n\t\t\tctrl.$formatters.push(maxValidator);\r\n\t\t}\r\n\r\n\t\tctrl.$formatters.push(function (value) {\r\n\t\t\treturn validate(ctrl, 'number', ctrl.$isEmpty(value) || isNumber(value), value);\r\n\t\t});\r\n\t}\r\n\r\n\tfunction urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {\r\n\t\ttextInputType(scope, element, attr, ctrl, $sniffer, $browser);\r\n\r\n\t\tvar urlValidator = function (value) {\r\n\t\t\treturn validate(ctrl, 'url', ctrl.$isEmpty(value) || URL_REGEXP.test(value), value);\r\n\t\t};\r\n\r\n\t\tctrl.$formatters.push(urlValidator);\r\n\t\tctrl.$parsers.push(urlValidator);\r\n\t}\r\n\r\n\tfunction emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {\r\n\t\ttextInputType(scope, element, attr, ctrl, $sniffer, $browser);\r\n\r\n\t\tvar emailValidator = function (value) {\r\n\t\t\treturn validate(ctrl, 'email', ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value), value);\r\n\t\t};\r\n\r\n\t\tctrl.$formatters.push(emailValidator);\r\n\t\tctrl.$parsers.push(emailValidator);\r\n\t}\r\n\r\n\tfunction radioInputType(scope, element, attr, ctrl) {\r\n\t\t// make the name unique, if not defined\r\n\t\tif (isUndefined(attr.name)) {\r\n\t\t\telement.attr('name', nextUid());\r\n\t\t}\r\n\r\n\t\telement.on('click', function () {\r\n\t\t\tif (element[0].checked) {\r\n\t\t\t\tscope.$apply(function () {\r\n\t\t\t\t\tctrl.$setViewValue(attr.value);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tctrl.$render = function () {\r\n\t\t\tvar value = attr.value;\r\n\t\t\telement[0].checked = (value == ctrl.$viewValue);\r\n\t\t};\r\n\r\n\t\tattr.$observe('value', ctrl.$render);\r\n\t}\r\n\r\n\tfunction checkboxInputType(scope, element, attr, ctrl) {\r\n\t\tvar trueValue = attr.ngTrueValue,\r\n\t\t\tfalseValue = attr.ngFalseValue;\r\n\r\n\t\tif (!isString(trueValue)) trueValue = true;\r\n\t\tif (!isString(falseValue)) falseValue = false;\r\n\r\n\t\telement.on('click', function () {\r\n\t\t\tscope.$apply(function () {\r\n\t\t\t\tctrl.$setViewValue(element[0].checked);\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tctrl.$render = function () {\r\n\t\t\telement[0].checked = ctrl.$viewValue;\r\n\t\t};\r\n\r\n\t\t// Override the standard `$isEmpty` because a value of `false` means empty in a checkbox.\r\n\t\tctrl.$isEmpty = function (value) {\r\n\t\t\treturn value !== trueValue;\r\n\t\t};\r\n\r\n\t\tctrl.$formatters.push(function (value) {\r\n\t\t\treturn value === trueValue;\r\n\t\t});\r\n\r\n\t\tctrl.$parsers.push(function (value) {\r\n\t\t\treturn value ? trueValue : falseValue;\r\n\t\t});\r\n\t}\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name textarea\r\n\t * @restrict E\r\n\t *\r\n\t * @description\r\n\t * HTML textarea element control with angular data-binding. The data-binding and validation\r\n\t * properties of this element are exactly the same as those of the\r\n\t * {@link ng.directive:input input element}.\r\n\t *\r\n\t * @param {string} ngModel Assignable angular expression to data-bind to.\r\n\t * @param {string=} name Property name of the form under which the control is published.\r\n\t * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n\t * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\r\n\t * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\r\n\t * `required` when you want to data-bind to the `required` attribute.\r\n\t * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n\t * minlength.\r\n\t * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n\t * maxlength.\r\n\t * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n\t * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n\t * patterns defined as scope expressions.\r\n\t * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n\t * interaction with the input element.\r\n\t * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name input\r\n\t * @restrict E\r\n\t *\r\n\t * @description\r\n\t * HTML input element control with angular data-binding. Input control follows HTML5 input types\r\n\t * and polyfills the HTML5 validation behavior for older browsers.\r\n\t *\r\n\t * @param {string} ngModel Assignable angular expression to data-bind to.\r\n\t * @param {string=} name Property name of the form under which the control is published.\r\n\t * @param {string=} required Sets `required` validation error key if the value is not entered.\r\n\t * @param {boolean=} ngRequired Sets `required` attribute if set to true\r\n\t * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than\r\n\t * minlength.\r\n\t * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than\r\n\t * maxlength.\r\n\t * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the\r\n\t * RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for\r\n\t * patterns defined as scope expressions.\r\n\t * @param {string=} ngChange Angular expression to be executed when input changes due to user\r\n\t * interaction with the input element.\r\n\t *\r\n\t * @example\r\n\t\t<example name=\"input-directive\">\r\n\t\t <file name=\"index.html\">\r\n\t\t <script>\r\n\t\t\t function Ctrl($scope) {\r\n\t\t\t $scope.user = {name: 'guest', last: 'visitor'};\r\n\t\t\t }\r\n\t\t </script>\r\n\t\t <div ng-controller=\"Ctrl\">\r\n\t\t\t <form name=\"myForm\">\r\n\t\t\t User name: <input type=\"text\" name=\"userName\" ng-model=\"user.name\" required>\r\n\t\t\t <span class=\"error\" ng-show=\"myForm.userName.$error.required\">\r\n\t\t\t\t Required!</span><br>\r\n\t\t\t Last name: <input type=\"text\" name=\"lastName\" ng-model=\"user.last\"\r\n\t\t\t\t ng-minlength=\"3\" ng-maxlength=\"10\">\r\n\t\t\t <span class=\"error\" ng-show=\"myForm.lastName.$error.minlength\">\r\n\t\t\t\t Too short!</span>\r\n\t\t\t <span class=\"error\" ng-show=\"myForm.lastName.$error.maxlength\">\r\n\t\t\t\t Too long!</span><br>\r\n\t\t\t </form>\r\n\t\t\t <hr>\r\n\t\t\t <tt>user = {{user}}</tt><br/>\r\n\t\t\t <tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br>\r\n\t\t\t <tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br>\r\n\t\t\t <tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br>\r\n\t\t\t <tt>myForm.lastName.$error = {{myForm.lastName.$error}}</tt><br>\r\n\t\t\t <tt>myForm.$valid = {{myForm.$valid}}</tt><br>\r\n\t\t\t <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>\r\n\t\t\t <tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br>\r\n\t\t\t <tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br>\r\n\t\t </div>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\tvar user = element(by.binding('{{user}}'));\r\n\t\t\tvar userNameValid = element(by.binding('myForm.userName.$valid'));\r\n\t\t\tvar lastNameValid = element(by.binding('myForm.lastName.$valid'));\r\n\t\t\tvar lastNameError = element(by.binding('myForm.lastName.$error'));\r\n\t\t\tvar formValid = element(by.binding('myForm.$valid'));\r\n\t\t\tvar userNameInput = element(by.model('user.name'));\r\n\t\t\tvar userLastInput = element(by.model('user.last'));\r\n\t\r\n\t\t\tit('should initialize to model', function() {\r\n\t\t\t expect(user.getText()).toContain('{\"name\":\"guest\",\"last\":\"visitor\"}');\r\n\t\t\t expect(userNameValid.getText()).toContain('true');\r\n\t\t\t expect(formValid.getText()).toContain('true');\r\n\t\t\t});\r\n\t\r\n\t\t\tit('should be invalid if empty when required', function() {\r\n\t\t\t userNameInput.clear();\r\n\t\t\t userNameInput.sendKeys('');\r\n\t\r\n\t\t\t expect(user.getText()).toContain('{\"last\":\"visitor\"}');\r\n\t\t\t expect(userNameValid.getText()).toContain('false');\r\n\t\t\t expect(formValid.getText()).toContain('false');\r\n\t\t\t});\r\n\t\r\n\t\t\tit('should be valid if empty when min length is set', function() {\r\n\t\t\t userLastInput.clear();\r\n\t\t\t userLastInput.sendKeys('');\r\n\t\r\n\t\t\t expect(user.getText()).toContain('{\"name\":\"guest\",\"last\":\"\"}');\r\n\t\t\t expect(lastNameValid.getText()).toContain('true');\r\n\t\t\t expect(formValid.getText()).toContain('true');\r\n\t\t\t});\r\n\t\r\n\t\t\tit('should be invalid if less than required min length', function() {\r\n\t\t\t userLastInput.clear();\r\n\t\t\t userLastInput.sendKeys('xx');\r\n\t\r\n\t\t\t expect(user.getText()).toContain('{\"name\":\"guest\"}');\r\n\t\t\t expect(lastNameValid.getText()).toContain('false');\r\n\t\t\t expect(lastNameError.getText()).toContain('minlength');\r\n\t\t\t expect(formValid.getText()).toContain('false');\r\n\t\t\t});\r\n\t\r\n\t\t\tit('should be invalid if longer than max length', function() {\r\n\t\t\t userLastInput.clear();\r\n\t\t\t userLastInput.sendKeys('some ridiculously long name');\r\n\t\r\n\t\t\t expect(user.getText()).toContain('{\"name\":\"guest\"}');\r\n\t\t\t expect(lastNameValid.getText()).toContain('false');\r\n\t\t\t expect(lastNameError.getText()).toContain('maxlength');\r\n\t\t\t expect(formValid.getText()).toContain('false');\r\n\t\t\t});\r\n\t\t </file>\r\n\t\t</example>\r\n\t */\r\n\tvar inputDirective = ['$browser', '$sniffer', function ($browser, $sniffer) {\r\n\t\treturn {\r\n\t\t\trestrict: 'E',\r\n\t\t\trequire: '?ngModel',\r\n\t\t\tlink: function (scope, element, attr, ctrl) {\r\n\t\t\t\tif (ctrl) {\r\n\t\t\t\t\t(inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrl, $sniffer,\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t$browser);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t}];\r\n\r\n\tvar VALID_CLASS = 'ng-valid',\r\n\t\tINVALID_CLASS = 'ng-invalid',\r\n\t\tPRISTINE_CLASS = 'ng-pristine',\r\n\t\tDIRTY_CLASS = 'ng-dirty';\r\n\r\n\t/**\r\n\t * @ngdoc type\r\n\t * @name ngModel.NgModelController\r\n\t *\r\n\t * @property {string} $viewValue Actual string value in the view.\r\n\t * @property {*} $modelValue The value in the model, that the control is bound to.\r\n\t * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever\r\n\t\t the control reads value from the DOM. Each function is called, in turn, passing the value\r\n\t\t through to the next. The last return value is used to populate the model.\r\n\t\t Used to sanitize / convert the value as well as validation. For validation,\r\n\t\t the parsers should update the validity state using\r\n\t\t {@link ngModel.NgModelController#$setValidity $setValidity()},\r\n\t\t and return `undefined` for invalid values.\r\n\t\r\n\t *\r\n\t * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever\r\n\t\t the model value changes. Each function is called, in turn, passing the value through to the\r\n\t\t next. Used to format / convert values for display in the control and validation.\r\n\t * ```js\r\n\t * function formatter(value) {\r\n\t * if (value) {\r\n\t * return value.toUpperCase();\r\n\t * }\r\n\t * }\r\n\t * ngModel.$formatters.push(formatter);\r\n\t * ```\r\n\t *\r\n\t * @property {Array.<Function>} $viewChangeListeners Array of functions to execute whenever the\r\n\t * view value has changed. It is called with no arguments, and its return value is ignored.\r\n\t * This can be used in place of additional $watches against the model value.\r\n\t *\r\n\t * @property {Object} $error An object hash with all errors as keys.\r\n\t *\r\n\t * @property {boolean} $pristine True if user has not interacted with the control yet.\r\n\t * @property {boolean} $dirty True if user has already interacted with the control.\r\n\t * @property {boolean} $valid True if there is no error.\r\n\t * @property {boolean} $invalid True if at least one error on the control.\r\n\t *\r\n\t * @description\r\n\t *\r\n\t * `NgModelController` provides API for the `ng-model` directive. The controller contains\r\n\t * services for data-binding, validation, CSS updates, and value formatting and parsing. It\r\n\t * purposefully does not contain any logic which deals with DOM rendering or listening to\r\n\t * DOM events. Such DOM related logic should be provided by other directives which make use of\r\n\t * `NgModelController` for data-binding.\r\n\t *\r\n\t * ## Custom Control Example\r\n\t * This example shows how to use `NgModelController` with a custom control to achieve\r\n\t * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)\r\n\t * collaborate together to achieve the desired result.\r\n\t *\r\n\t * Note that `contenteditable` is an HTML5 attribute, which tells the browser to let the element\r\n\t * contents be edited in place by the user. This will not work on older browsers.\r\n\t *\r\n\t * We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize}\r\n\t * module to automatically remove \"bad\" content like inline event listener (e.g. `<span onclick=\"...\">`).\r\n\t * However, as we are using `$sce` the model can still decide to to provide unsafe content if it marks\r\n\t * that content using the `$sce` service.\r\n\t *\r\n\t * <example name=\"NgModelController\" module=\"customControl\" deps=\"angular-sanitize.js\">\r\n\t\t<file name=\"style.css\">\r\n\t\t [contenteditable] {\r\n\t\t\tborder: 1px solid black;\r\n\t\t\tbackground-color: white;\r\n\t\t\tmin-height: 20px;\r\n\t\t }\r\n\t\r\n\t\t .ng-invalid {\r\n\t\t\tborder: 1px solid red;\r\n\t\t }\r\n\t\r\n\t\t</file>\r\n\t\t<file name=\"script.js\">\r\n\t\t angular.module('customControl', ['ngSanitize']).\r\n\t\t\tdirective('contenteditable', ['$sce', function($sce) {\r\n\t\t\t return {\r\n\t\t\t\trestrict: 'A', // only activate on element attribute\r\n\t\t\t\trequire: '?ngModel', // get a hold of NgModelController\r\n\t\t\t\tlink: function(scope, element, attrs, ngModel) {\r\n\t\t\t\t if(!ngModel) return; // do nothing if no ng-model\r\n\t\r\n\t\t\t\t // Specify how UI should be updated\r\n\t\t\t\t ngModel.$render = function() {\r\n\t\t\t\t\telement.html($sce.getTrustedHtml(ngModel.$viewValue || ''));\r\n\t\t\t\t };\r\n\t\r\n\t\t\t\t // Listen for change events to enable binding\r\n\t\t\t\t element.on('blur keyup change', function() {\r\n\t\t\t\t\tscope.$apply(read);\r\n\t\t\t\t });\r\n\t\t\t\t read(); // initialize\r\n\t\r\n\t\t\t\t // Write data to the model\r\n\t\t\t\t function read() {\r\n\t\t\t\t\tvar html = element.html();\r\n\t\t\t\t\t// When we clear the content editable the browser leaves a <br> behind\r\n\t\t\t\t\t// If strip-br attribute is provided then we strip this out\r\n\t\t\t\t\tif( attrs.stripBr && html == '<br>' ) {\r\n\t\t\t\t\t html = '';\r\n\t\t\t\t\t}\r\n\t\t\t\t\tngModel.$setViewValue(html);\r\n\t\t\t\t }\r\n\t\t\t\t}\r\n\t\t\t };\r\n\t\t\t}]);\r\n\t\t</file>\r\n\t\t<file name=\"index.html\">\r\n\t\t <form name=\"myForm\">\r\n\t\t <div contenteditable\r\n\t\t\t\tname=\"myWidget\" ng-model=\"userContent\"\r\n\t\t\t\tstrip-br=\"true\"\r\n\t\t\t\trequired>Change me!</div>\r\n\t\t\t<span ng-show=\"myForm.myWidget.$error.required\">Required!</span>\r\n\t\t <hr>\r\n\t\t <textarea ng-model=\"userContent\"></textarea>\r\n\t\t </form>\r\n\t\t</file>\r\n\t\t<file name=\"protractor.js\" type=\"protractor\">\r\n\t\tit('should data-bind and become invalid', function() {\r\n\t\t if (browser.params.browser == 'safari' || browser.params.browser == 'firefox') {\r\n\t\t\t// SafariDriver can't handle contenteditable\r\n\t\t\t// and Firefox driver can't clear contenteditables very well\r\n\t\t\treturn;\r\n\t\t }\r\n\t\t var contentEditable = element(by.css('[contenteditable]'));\r\n\t\t var content = 'Change me!';\r\n\t\r\n\t\t expect(contentEditable.getText()).toEqual(content);\r\n\t\r\n\t\t contentEditable.clear();\r\n\t\t contentEditable.sendKeys(protractor.Key.BACK_SPACE);\r\n\t\t expect(contentEditable.getText()).toEqual('');\r\n\t\t expect(contentEditable.getAttribute('class')).toMatch(/ng-invalid-required/);\r\n\t\t});\r\n\t\t</file>\r\n\t * </example>\r\n\t *\r\n\t *\r\n\t */\r\n\tvar NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse', '$animate',\r\n\t\tfunction ($scope, $exceptionHandler, $attr, $element, $parse, $animate) {\r\n\t\t\tthis.$viewValue = Number.NaN;\r\n\t\t\tthis.$modelValue = Number.NaN;\r\n\t\t\tthis.$parsers = [];\r\n\t\t\tthis.$formatters = [];\r\n\t\t\tthis.$viewChangeListeners = [];\r\n\t\t\tthis.$pristine = true;\r\n\t\t\tthis.$dirty = false;\r\n\t\t\tthis.$valid = true;\r\n\t\t\tthis.$invalid = false;\r\n\t\t\tthis.$name = $attr.name;\r\n\r\n\t\t\tvar ngModelGet = $parse($attr.ngModel),\r\n\t\t\t\tngModelSet = ngModelGet.assign;\r\n\r\n\t\t\tif (!ngModelSet) {\r\n\t\t\t\tthrow minErr('ngModel')('nonassign', \"Expression '{0}' is non-assignable. Element: {1}\",\r\n\t\t\t\t\t$attr.ngModel, startingTag($element));\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name ngModel.NgModelController#$render\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Called when the view needs to be updated. It is expected that the user of the ng-model\r\n\t\t\t * directive will implement this method.\r\n\t\t\t */\r\n\t\t\tthis.$render = noop;\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name ngModel.NgModelController#$isEmpty\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * This is called when we need to determine if the value of the input is empty.\r\n\t\t\t *\r\n\t\t\t * For instance, the required directive does this to work out if the input has data or not.\r\n\t\t\t * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`.\r\n\t\t\t *\r\n\t\t\t * You can override this for input directives whose concept of being empty is different to the\r\n\t\t\t * default. The `checkboxInputType` directive does this because in its case a value of `false`\r\n\t\t\t * implies empty.\r\n\t\t\t *\r\n\t\t\t * @param {*} value Reference to check.\r\n\t\t\t * @returns {boolean} True if `value` is empty.\r\n\t\t\t */\r\n\t\t\tthis.$isEmpty = function (value) {\r\n\t\t\t\treturn isUndefined(value) || value === '' || value === null || value !== value;\r\n\t\t\t};\r\n\r\n\t\t\tvar parentForm = $element.inheritedData('$formController') || nullFormCtrl,\r\n\t\t\t\tinvalidCount = 0, // used to easily determine if we are valid\r\n\t\t\t\t$error = this.$error = {}; // keep invalid keys here\r\n\r\n\r\n\t\t\t// Setup initial state of the control\r\n\t\t\t$element.addClass(PRISTINE_CLASS);\r\n\t\t\ttoggleValidCss(true);\r\n\r\n\t\t\t// convenience method for easy toggling of classes\r\n\t\t\tfunction toggleValidCss(isValid, validationErrorKey) {\r\n\t\t\t\tvalidationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';\r\n\t\t\t\t$animate.removeClass($element, (isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey);\r\n\t\t\t\t$animate.addClass($element, (isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);\r\n\t\t\t}\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name ngModel.NgModelController#$setValidity\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Change the validity state, and notifies the form when the control changes validity. (i.e. it\r\n\t\t\t * does not notify form if given validator is already marked as invalid).\r\n\t\t\t *\r\n\t\t\t * This method should be called by validators - i.e. the parser or formatter functions.\r\n\t\t\t *\r\n\t\t\t * @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign\r\n\t\t\t * to `$error[validationErrorKey]=!isValid` so that it is available for data-binding.\r\n\t\t\t * The `validationErrorKey` should be in camelCase and will get converted into dash-case\r\n\t\t\t * for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`\r\n\t\t\t * class and can be bound to as `{{someForm.someControl.$error.myError}}` .\r\n\t\t\t * @param {boolean} isValid Whether the current state is valid (true) or invalid (false).\r\n\t\t\t */\r\n\t\t\tthis.$setValidity = function (validationErrorKey, isValid) {\r\n\t\t\t\t// Purposeful use of ! here to cast isValid to boolean in case it is undefined\r\n\t\t\t\t// jshint -W018\r\n\t\t\t\tif ($error[validationErrorKey] === !isValid) return;\r\n\t\t\t\t// jshint +W018\r\n\r\n\t\t\t\tif (isValid) {\r\n\t\t\t\t\tif ($error[validationErrorKey]) invalidCount--;\r\n\t\t\t\t\tif (!invalidCount) {\r\n\t\t\t\t\t\ttoggleValidCss(true);\r\n\t\t\t\t\t\tthis.$valid = true;\r\n\t\t\t\t\t\tthis.$invalid = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttoggleValidCss(false);\r\n\t\t\t\t\tthis.$invalid = true;\r\n\t\t\t\t\tthis.$valid = false;\r\n\t\t\t\t\tinvalidCount++;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t$error[validationErrorKey] = !isValid;\r\n\t\t\t\ttoggleValidCss(isValid, validationErrorKey);\r\n\r\n\t\t\t\tparentForm.$setValidity(validationErrorKey, isValid, this);\r\n\t\t\t};\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name ngModel.NgModelController#$setPristine\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Sets the control to its pristine state.\r\n\t\t\t *\r\n\t\t\t * This method can be called to remove the 'ng-dirty' class and set the control to its pristine\r\n\t\t\t * state (ng-pristine class).\r\n\t\t\t */\r\n\t\t\tthis.$setPristine = function () {\r\n\t\t\t\tthis.$dirty = false;\r\n\t\t\t\tthis.$pristine = true;\r\n\t\t\t\t$animate.removeClass($element, DIRTY_CLASS);\r\n\t\t\t\t$animate.addClass($element, PRISTINE_CLASS);\r\n\t\t\t};\r\n\r\n\t\t\t/**\r\n\t\t\t * @ngdoc method\r\n\t\t\t * @name ngModel.NgModelController#$setViewValue\r\n\t\t\t *\r\n\t\t\t * @description\r\n\t\t\t * Update the view value.\r\n\t\t\t *\r\n\t\t\t * This method should be called when the view value changes, typically from within a DOM event handler.\r\n\t\t\t * For example {@link ng.directive:input input} and\r\n\t\t\t * {@link ng.directive:select select} directives call it.\r\n\t\t\t *\r\n\t\t\t * It will update the $viewValue, then pass this value through each of the functions in `$parsers`,\r\n\t\t\t * which includes any validators. The value that comes out of this `$parsers` pipeline, be applied to\r\n\t\t\t * `$modelValue` and the **expression** specified in the `ng-model` attribute.\r\n\t\t\t *\r\n\t\t\t * Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called.\r\n\t\t\t *\r\n\t\t\t * Note that calling this function does not trigger a `$digest`.\r\n\t\t\t *\r\n\t\t\t * @param {string} value Value from the view.\r\n\t\t\t */\r\n\t\t\tthis.$setViewValue = function (value) {\r\n\t\t\t\tthis.$viewValue = value;\r\n\r\n\t\t\t\t// change to dirty\r\n\t\t\t\tif (this.$pristine) {\r\n\t\t\t\t\tthis.$dirty = true;\r\n\t\t\t\t\tthis.$pristine = false;\r\n\t\t\t\t\t$animate.removeClass($element, PRISTINE_CLASS);\r\n\t\t\t\t\t$animate.addClass($element, DIRTY_CLASS);\r\n\t\t\t\t\tparentForm.$setDirty();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tforEach(this.$parsers, function (fn) {\r\n\t\t\t\t\tvalue = fn(value);\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif (this.$modelValue !== value) {\r\n\t\t\t\t\tthis.$modelValue = value;\r\n\t\t\t\t\tngModelSet($scope, value);\r\n\t\t\t\t\tforEach(this.$viewChangeListeners, function (listener) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tlistener();\r\n\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t$exceptionHandler(e);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\t// model -> value\r\n\t\t\tvar ctrl = this;\r\n\r\n\t\t\t$scope.$watch(function ngModelWatch() {\r\n\t\t\t\tvar value = ngModelGet($scope);\r\n\r\n\t\t\t\t// if scope model value and ngModel value are out of sync\r\n\t\t\t\tif (ctrl.$modelValue !== value) {\r\n\r\n\t\t\t\t\tvar formatters = ctrl.$formatters,\r\n\t\t\t\t\t\tidx = formatters.length;\r\n\r\n\t\t\t\t\tctrl.$modelValue = value;\r\n\t\t\t\t\twhile (idx--) {\r\n\t\t\t\t\t\tvalue = formatters[idx](value);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (ctrl.$viewValue !== value) {\r\n\t\t\t\t\t\tctrl.$viewValue = value;\r\n\t\t\t\t\t\tctrl.$render();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn value;\r\n\t\t\t});\r\n\t\t}];\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngModel\r\n\t *\r\n\t * @element input\r\n\t *\r\n\t * @description\r\n\t * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a\r\n\t * property on the scope using {@link ngModel.NgModelController NgModelController},\r\n\t * which is created and exposed by this directive.\r\n\t *\r\n\t * `ngModel` is responsible for:\r\n\t *\r\n\t * - Binding the view into the model, which other directives such as `input`, `textarea` or `select`\r\n\t * require.\r\n\t * - Providing validation behavior (i.e. required, number, email, url).\r\n\t * - Keeping the state of the control (valid/invalid, dirty/pristine, validation errors).\r\n\t * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`) including animations.\r\n\t * - Registering the control with its parent {@link ng.directive:form form}.\r\n\t *\r\n\t * Note: `ngModel` will try to bind to the property given by evaluating the expression on the\r\n\t * current scope. If the property doesn't already exist on this scope, it will be created\r\n\t * implicitly and added to the scope.\r\n\t *\r\n\t * For best practices on using `ngModel`, see:\r\n\t *\r\n\t * - [https://github.com/angular/angular.js/wiki/Understanding-Scopes]\r\n\t *\r\n\t * For basic examples, how to use `ngModel`, see:\r\n\t *\r\n\t * - {@link ng.directive:input input}\r\n\t * - {@link input[text] text}\r\n\t * - {@link input[checkbox] checkbox}\r\n\t * - {@link input[radio] radio}\r\n\t * - {@link input[number] number}\r\n\t * - {@link input[email] email}\r\n\t * - {@link input[url] url}\r\n\t * - {@link ng.directive:select select}\r\n\t * - {@link ng.directive:textarea textarea}\r\n\t *\r\n\t * # CSS classes\r\n\t * The following CSS classes are added and removed on the associated input/select/textarea element\r\n\t * depending on the validity of the model.\r\n\t *\r\n\t * - `ng-valid` is set if the model is valid.\r\n\t * - `ng-invalid` is set if the model is invalid.\r\n\t * - `ng-pristine` is set if the model is pristine.\r\n\t * - `ng-dirty` is set if the model is dirty.\r\n\t *\r\n\t * Keep in mind that ngAnimate can detect each of these classes when added and removed.\r\n\t *\r\n\t * ## Animation Hooks\r\n\t *\r\n\t * Animations within models are triggered when any of the associated CSS classes are added and removed\r\n\t * on the input element which is attached to the model. These classes are: `.ng-pristine`, `.ng-dirty`,\r\n\t * `.ng-invalid` and `.ng-valid` as well as any other validations that are performed on the model itself.\r\n\t * The animations that are triggered within ngModel are similar to how they work in ngClass and\r\n\t * animations can be hooked into using CSS transitions, keyframes as well as JS animations.\r\n\t *\r\n\t * The following example shows a simple way to utilize CSS transitions to style an input element\r\n\t * that has been rendered as invalid after it has been validated:\r\n\t *\r\n\t * <pre>\r\n\t * //be sure to include ngAnimate as a module to hook into more\r\n\t * //advanced animations\r\n\t * .my-input {\r\n\t * transition:0.5s linear all;\r\n\t * background: white;\r\n\t * }\r\n\t * .my-input.ng-invalid {\r\n\t * background: red;\r\n\t * color:white;\r\n\t * }\r\n\t * </pre>\r\n\t *\r\n\t * @example\r\n\t * <example deps=\"angular-animate.js\" animations=\"true\" fixBase=\"true\">\r\n\t\t <file name=\"index.html\">\r\n\t\t <script>\r\n\t\t\tfunction Ctrl($scope) {\r\n\t\t\t $scope.val = '1';\r\n\t\t\t}\r\n\t\t </script>\r\n\t\t <style>\r\n\t\t\t .my-input {\r\n\t\t\t -webkit-transition:all linear 0.5s;\r\n\t\t\t transition:all linear 0.5s;\r\n\t\t\t background: transparent;\r\n\t\t\t }\r\n\t\t\t .my-input.ng-invalid {\r\n\t\t\t color:white;\r\n\t\t\t background: red;\r\n\t\t\t }\r\n\t\t </style>\r\n\t\t Update input to see transitions when valid/invalid.\r\n\t\t Integer is a valid value.\r\n\t\t <form name=\"testForm\" ng-controller=\"Ctrl\">\r\n\t\t\t <input ng-model=\"val\" ng-pattern=\"/^\\d+$/\" name=\"anim\" class=\"my-input\" />\r\n\t\t </form>\r\n\t\t </file>\r\n\t * </example>\r\n\t */\r\n\tvar ngModelDirective = function () {\r\n\t\treturn {\r\n\t\t\trequire: ['ngModel', '^?form'],\r\n\t\t\tcontroller: NgModelController,\r\n\t\t\tlink: function (scope, element, attr, ctrls) {\r\n\t\t\t\t// notify others, especially parent forms\r\n\r\n\t\t\t\tvar modelCtrl = ctrls[0],\r\n\t\t\t\t\tformCtrl = ctrls[1] || nullFormCtrl;\r\n\r\n\t\t\t\tformCtrl.$addControl(modelCtrl);\r\n\r\n\t\t\t\tscope.$on('$destroy', function () {\r\n\t\t\t\t\tformCtrl.$removeControl(modelCtrl);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngChange\r\n\t *\r\n\t * @description\r\n\t * Evaluate the given expression when the user changes the input.\r\n\t * The expression is evaluated immediately, unlike the JavaScript onchange event\r\n\t * which only triggers at the end of a change (usually, when the user leaves the\r\n\t * form element or presses the return key).\r\n\t * The expression is not evaluated when the value change is coming from the model.\r\n\t *\r\n\t * Note, this directive requires `ngModel` to be present.\r\n\t *\r\n\t * @element input\r\n\t * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change\r\n\t * in input value.\r\n\t *\r\n\t * @example\r\n\t * <example name=\"ngChange-directive\">\r\n\t * <file name=\"index.html\">\r\n\t * <script>\r\n\t * function Controller($scope) {\r\n\t * $scope.counter = 0;\r\n\t * $scope.change = function() {\r\n\t * $scope.counter++;\r\n\t * };\r\n\t * }\r\n\t * </script>\r\n\t * <div ng-controller=\"Controller\">\r\n\t * <input type=\"checkbox\" ng-model=\"confirmed\" ng-change=\"change()\" id=\"ng-change-example1\" />\r\n\t * <input type=\"checkbox\" ng-model=\"confirmed\" id=\"ng-change-example2\" />\r\n\t * <label for=\"ng-change-example2\">Confirmed</label><br />\r\n\t * <tt>debug = {{confirmed}}</tt><br/>\r\n\t * <tt>counter = {{counter}}</tt><br/>\r\n\t * </div>\r\n\t * </file>\r\n\t * <file name=\"protractor.js\" type=\"protractor\">\r\n\t * var counter = element(by.binding('counter'));\r\n\t * var debug = element(by.binding('confirmed'));\r\n\t *\r\n\t * it('should evaluate the expression if changing from view', function() {\r\n\t * expect(counter.getText()).toContain('0');\r\n\t *\r\n\t * element(by.id('ng-change-example1')).click();\r\n\t *\r\n\t * expect(counter.getText()).toContain('1');\r\n\t * expect(debug.getText()).toContain('true');\r\n\t * });\r\n\t *\r\n\t * it('should not evaluate the expression if changing from model', function() {\r\n\t * element(by.id('ng-change-example2')).click();\r\n\t\r\n\t * expect(counter.getText()).toContain('0');\r\n\t * expect(debug.getText()).toContain('true');\r\n\t * });\r\n\t * </file>\r\n\t * </example>\r\n\t */\r\n\tvar ngChangeDirective = valueFn({\r\n\t\trequire: 'ngModel',\r\n\t\tlink: function (scope, element, attr, ctrl) {\r\n\t\t\tctrl.$viewChangeListeners.push(function () {\r\n\t\t\t\tscope.$eval(attr.ngChange);\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n\r\n\r\n\tvar requiredDirective = function () {\r\n\t\treturn {\r\n\t\t\trequire: '?ngModel',\r\n\t\t\tlink: function (scope, elm, attr, ctrl) {\r\n\t\t\t\tif (!ctrl) return;\r\n\t\t\t\tattr.required = true; // force truthy in case we are on non input element\r\n\r\n\t\t\t\tvar validator = function (value) {\r\n\t\t\t\t\tif (attr.required && ctrl.$isEmpty(value)) {\r\n\t\t\t\t\t\tctrl.$setValidity('required', false);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tctrl.$setValidity('required', true);\r\n\t\t\t\t\t\treturn value;\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\t\t\t\tctrl.$formatters.push(validator);\r\n\t\t\t\tctrl.$parsers.unshift(validator);\r\n\r\n\t\t\t\tattr.$observe('required', function () {\r\n\t\t\t\t\tvalidator(ctrl.$viewValue);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngList\r\n\t *\r\n\t * @description\r\n\t * Text input that converts between a delimited string and an array of strings. The delimiter\r\n\t * can be a fixed string (by default a comma) or a regular expression.\r\n\t *\r\n\t * @element input\r\n\t * @param {string=} ngList optional delimiter that should be used to split the value. If\r\n\t * specified in form `/something/` then the value will be converted into a regular expression.\r\n\t *\r\n\t * @example\r\n\t\t<example name=\"ngList-directive\">\r\n\t\t <file name=\"index.html\">\r\n\t\t <script>\r\n\t\t\t function Ctrl($scope) {\r\n\t\t\t $scope.names = ['igor', 'misko', 'vojta'];\r\n\t\t\t }\r\n\t\t </script>\r\n\t\t <form name=\"myForm\" ng-controller=\"Ctrl\">\r\n\t\t\t List: <input name=\"namesInput\" ng-model=\"names\" ng-list required>\r\n\t\t\t <span class=\"error\" ng-show=\"myForm.namesInput.$error.required\">\r\n\t\t\t Required!</span>\r\n\t\t\t <br>\r\n\t\t\t <tt>names = {{names}}</tt><br/>\r\n\t\t\t <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>\r\n\t\t\t <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>\r\n\t\t\t <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>\r\n\t\t\t <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>\r\n\t\t\t</form>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\tvar listInput = element(by.model('names'));\r\n\t\t\tvar names = element(by.binding('{{names}}'));\r\n\t\t\tvar valid = element(by.binding('myForm.namesInput.$valid'));\r\n\t\t\tvar error = element(by.css('span.error'));\r\n\t\r\n\t\t\tit('should initialize to model', function() {\r\n\t\t\t expect(names.getText()).toContain('[\"igor\",\"misko\",\"vojta\"]');\r\n\t\t\t expect(valid.getText()).toContain('true');\r\n\t\t\t expect(error.getCssValue('display')).toBe('none');\r\n\t\t\t});\r\n\t\r\n\t\t\tit('should be invalid if empty', function() {\r\n\t\t\t listInput.clear();\r\n\t\t\t listInput.sendKeys('');\r\n\t\r\n\t\t\t expect(names.getText()).toContain('');\r\n\t\t\t expect(valid.getText()).toContain('false');\r\n\t\t\t expect(error.getCssValue('display')).not.toBe('none'); });\r\n\t\t </file>\r\n\t\t</example>\r\n\t */\r\n\tvar ngListDirective = function () {\r\n\t\treturn {\r\n\t\t\trequire: 'ngModel',\r\n\t\t\tlink: function (scope, element, attr, ctrl) {\r\n\t\t\t\tvar match = /\\/(.*)\\//.exec(attr.ngList),\r\n\t\t\t\t\tseparator = match && new RegExp(match[1]) || attr.ngList || ',';\r\n\r\n\t\t\t\tvar parse = function (viewValue) {\r\n\t\t\t\t\t// If the viewValue is invalid (say required but empty) it will be `undefined`\r\n\t\t\t\t\tif (isUndefined(viewValue)) return;\r\n\r\n\t\t\t\t\tvar list = [];\r\n\r\n\t\t\t\t\tif (viewValue) {\r\n\t\t\t\t\t\tforEach(viewValue.split(separator), function (value) {\r\n\t\t\t\t\t\t\tif (value) list.push(trim(value));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn list;\r\n\t\t\t\t};\r\n\r\n\t\t\t\tctrl.$parsers.push(parse);\r\n\t\t\t\tctrl.$formatters.push(function (value) {\r\n\t\t\t\t\tif (isArray(value)) {\r\n\t\t\t\t\t\treturn value.join(', ');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\treturn undefined;\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// Override the standard $isEmpty because an empty array means the input is empty.\r\n\t\t\t\tctrl.$isEmpty = function (value) {\r\n\t\t\t\t\treturn !value || !value.length;\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n\r\n\r\n\tvar CONSTANT_VALUE_REGEXP = /^(true|false|\\d+)$/;\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngValue\r\n\t *\r\n\t * @description\r\n\t * Binds the given expression to the value of `input[select]` or `input[radio]`, so\r\n\t * that when the element is selected, the `ngModel` of that element is set to the\r\n\t * bound value.\r\n\t *\r\n\t * `ngValue` is useful when dynamically generating lists of radio buttons using `ng-repeat`, as\r\n\t * shown below.\r\n\t *\r\n\t * @element input\r\n\t * @param {string=} ngValue angular expression, whose value will be bound to the `value` attribute\r\n\t * of the `input` element\r\n\t *\r\n\t * @example\r\n\t\t<example name=\"ngValue-directive\">\r\n\t\t <file name=\"index.html\">\r\n\t\t <script>\r\n\t\t\t function Ctrl($scope) {\r\n\t\t\t\t$scope.names = ['pizza', 'unicorns', 'robots'];\r\n\t\t\t\t$scope.my = { favorite: 'unicorns' };\r\n\t\t\t }\r\n\t\t </script>\r\n\t\t\t<form ng-controller=\"Ctrl\">\r\n\t\t\t <h2>Which is your favorite?</h2>\r\n\t\t\t\t<label ng-repeat=\"name in names\" for=\"{{name}}\">\r\n\t\t\t\t {{name}}\r\n\t\t\t\t <input type=\"radio\"\r\n\t\t\t\t\t\t ng-model=\"my.favorite\"\r\n\t\t\t\t\t\t ng-value=\"name\"\r\n\t\t\t\t\t\t id=\"{{name}}\"\r\n\t\t\t\t\t\t name=\"favorite\">\r\n\t\t\t\t</label>\r\n\t\t\t <div>You chose {{my.favorite}}</div>\r\n\t\t\t</form>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\tvar favorite = element(by.binding('my.favorite'));\r\n\t\r\n\t\t\tit('should initialize to model', function() {\r\n\t\t\t expect(favorite.getText()).toContain('unicorns');\r\n\t\t\t});\r\n\t\t\tit('should bind the values to the inputs', function() {\r\n\t\t\t element.all(by.model('my.favorite')).get(0).click();\r\n\t\t\t expect(favorite.getText()).toContain('pizza');\r\n\t\t\t});\r\n\t\t </file>\r\n\t\t</example>\r\n\t */\r\n\tvar ngValueDirective = function () {\r\n\t\treturn {\r\n\t\t\tpriority: 100,\r\n\t\t\tcompile: function (tpl, tplAttr) {\r\n\t\t\t\tif (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {\r\n\t\t\t\t\treturn function ngValueConstantLink(scope, elm, attr) {\r\n\t\t\t\t\t\tattr.$set('value', scope.$eval(attr.ngValue));\r\n\t\t\t\t\t};\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn function ngValueLink(scope, elm, attr) {\r\n\t\t\t\t\t\tscope.$watch(attr.ngValue, function valueWatchAction(value) {\r\n\t\t\t\t\t\t\tattr.$set('value', value);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngBind\r\n\t * @restrict AC\r\n\t *\r\n\t * @description\r\n\t * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element\r\n\t * with the value of a given expression, and to update the text content when the value of that\r\n\t * expression changes.\r\n\t *\r\n\t * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like\r\n\t * `{{ expression }}` which is similar but less verbose.\r\n\t *\r\n\t * It is preferable to use `ngBind` instead of `{{ expression }}` when a template is momentarily\r\n\t * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an\r\n\t * element attribute, it makes the bindings invisible to the user while the page is loading.\r\n\t *\r\n\t * An alternative solution to this problem would be using the\r\n\t * {@link ng.directive:ngCloak ngCloak} directive.\r\n\t *\r\n\t *\r\n\t * @element ANY\r\n\t * @param {expression} ngBind {@link guide/expression Expression} to evaluate.\r\n\t *\r\n\t * @example\r\n\t * Enter a name in the Live Preview text box; the greeting below the text box changes instantly.\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <script>\r\n\t\t\t function Ctrl($scope) {\r\n\t\t\t $scope.name = 'Whirled';\r\n\t\t\t }\r\n\t\t </script>\r\n\t\t <div ng-controller=\"Ctrl\">\r\n\t\t\t Enter name: <input type=\"text\" ng-model=\"name\"><br>\r\n\t\t\t Hello <span ng-bind=\"name\"></span>!\r\n\t\t </div>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should check ng-bind', function() {\r\n\t\t\t var nameInput = element(by.model('name'));\r\n\t\r\n\t\t\t expect(element(by.binding('name')).getText()).toBe('Whirled');\r\n\t\t\t nameInput.clear();\r\n\t\t\t nameInput.sendKeys('world');\r\n\t\t\t expect(element(by.binding('name')).getText()).toBe('world');\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tvar ngBindDirective = ngDirective({\r\n\t\tcompile: function (templateElement) {\r\n\t\t\ttemplateElement.addClass('ng-binding');\r\n\t\t\treturn function (scope, element, attr) {\r\n\t\t\t\telement.data('$binding', attr.ngBind);\r\n\t\t\t\tscope.$watch(attr.ngBind, function ngBindWatchAction(value) {\r\n\t\t\t\t\t// We are purposefully using == here rather than === because we want to\r\n\t\t\t\t\t// catch when value is \"null or undefined\"\r\n\t\t\t\t\t// jshint -W041\r\n\t\t\t\t\telement.text(value == undefined ? '' : value);\r\n\t\t\t\t});\r\n\t\t\t};\r\n\t\t}\r\n\t});\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngBindTemplate\r\n\t *\r\n\t * @description\r\n\t * The `ngBindTemplate` directive specifies that the element\r\n\t * text content should be replaced with the interpolation of the template\r\n\t * in the `ngBindTemplate` attribute.\r\n\t * Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}`\r\n\t * expressions. This directive is needed since some HTML elements\r\n\t * (such as TITLE and OPTION) cannot contain SPAN elements.\r\n\t *\r\n\t * @element ANY\r\n\t * @param {string} ngBindTemplate template of form\r\n\t * <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval.\r\n\t *\r\n\t * @example\r\n\t * Try it here: enter text in text box and watch the greeting change.\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <script>\r\n\t\t\t function Ctrl($scope) {\r\n\t\t\t $scope.salutation = 'Hello';\r\n\t\t\t $scope.name = 'World';\r\n\t\t\t }\r\n\t\t </script>\r\n\t\t <div ng-controller=\"Ctrl\">\r\n\t\t\tSalutation: <input type=\"text\" ng-model=\"salutation\"><br>\r\n\t\t\tName: <input type=\"text\" ng-model=\"name\"><br>\r\n\t\t\t<pre ng-bind-template=\"{{salutation}} {{name}}!\"></pre>\r\n\t\t </div>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should check ng-bind', function() {\r\n\t\t\t var salutationElem = element(by.binding('salutation'));\r\n\t\t\t var salutationInput = element(by.model('salutation'));\r\n\t\t\t var nameInput = element(by.model('name'));\r\n\t\r\n\t\t\t expect(salutationElem.getText()).toBe('Hello World!');\r\n\t\r\n\t\t\t salutationInput.clear();\r\n\t\t\t salutationInput.sendKeys('Greetings');\r\n\t\t\t nameInput.clear();\r\n\t\t\t nameInput.sendKeys('user');\r\n\t\r\n\t\t\t expect(salutationElem.getText()).toBe('Greetings user!');\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tvar ngBindTemplateDirective = ['$interpolate', function ($interpolate) {\r\n\t\treturn function (scope, element, attr) {\r\n\t\t\t// TODO: move this to scenario runner\r\n\t\t\tvar interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));\r\n\t\t\telement.addClass('ng-binding').data('$binding', interpolateFn);\r\n\t\t\tattr.$observe('ngBindTemplate', function (value) {\r\n\t\t\t\telement.text(value);\r\n\t\t\t});\r\n\t\t};\r\n\t}];\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngBindHtml\r\n\t *\r\n\t * @description\r\n\t * Creates a binding that will innerHTML the result of evaluating the `expression` into the current\r\n\t * element in a secure way. By default, the innerHTML-ed content will be sanitized using the {@link\r\n\t * ngSanitize.$sanitize $sanitize} service. To utilize this functionality, ensure that `$sanitize`\r\n\t * is available, for example, by including {@link ngSanitize} in your module's dependencies (not in\r\n\t * core Angular.) You may also bypass sanitization for values you know are safe. To do so, bind to\r\n\t * an explicitly trusted value via {@link ng.$sce#trustAsHtml $sce.trustAsHtml}. See the example\r\n\t * under {@link ng.$sce#Example Strict Contextual Escaping (SCE)}.\r\n\t *\r\n\t * Note: If a `$sanitize` service is unavailable and the bound value isn't explicitly trusted, you\r\n\t * will have an exception (instead of an exploit.)\r\n\t *\r\n\t * @element ANY\r\n\t * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.\r\n\t *\r\n\t * @example\r\n\t Try it here: enter text in text box and watch the greeting change.\r\n\t\r\n\t <example module=\"ngBindHtmlExample\" deps=\"angular-sanitize.js\">\r\n\t\t <file name=\"index.html\">\r\n\t\t <div ng-controller=\"ngBindHtmlCtrl\">\r\n\t\t\t<p ng-bind-html=\"myHTML\"></p>\r\n\t\t </div>\r\n\t\t </file>\r\n\t\r\n\t\t <file name=\"script.js\">\r\n\t\t angular.module('ngBindHtmlExample', ['ngSanitize'])\r\n\t\r\n\t\t .controller('ngBindHtmlCtrl', ['$scope', function ngBindHtmlCtrl($scope) {\r\n\t\t\t $scope.myHTML =\r\n\t\t\t\t'I am an <code>HTML</code>string with <a href=\"#\">links!</a> and other <em>stuff</em>';\r\n\t\t }]);\r\n\t\t </file>\r\n\t\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should check ng-bind-html', function() {\r\n\t\t\t expect(element(by.binding('myHTML')).getText()).toBe(\r\n\t\t\t\t 'I am an HTMLstring with links! and other stuff');\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tvar ngBindHtmlDirective = ['$sce', '$parse', function ($sce, $parse) {\r\n\t\treturn function (scope, element, attr) {\r\n\t\t\telement.addClass('ng-binding').data('$binding', attr.ngBindHtml);\r\n\r\n\t\t\tvar parsed = $parse(attr.ngBindHtml);\r\n\t\t\tfunction getStringValue() { return (parsed(scope) || '').toString(); }\r\n\r\n\t\t\tscope.$watch(getStringValue, function ngBindHtmlWatchAction(value) {\r\n\t\t\t\telement.html($sce.getTrustedHtml(parsed(scope)) || '');\r\n\t\t\t});\r\n\t\t};\r\n\t}];\r\n\r\n\tfunction classDirective(name, selector) {\r\n\t\tname = 'ngClass' + name;\r\n\t\treturn ['$animate', function ($animate) {\r\n\t\t\treturn {\r\n\t\t\t\trestrict: 'AC',\r\n\t\t\t\tlink: function (scope, element, attr) {\r\n\t\t\t\t\tvar oldVal;\r\n\r\n\t\t\t\t\tscope.$watch(attr[name], ngClassWatchAction, true);\r\n\r\n\t\t\t\t\tattr.$observe('class', function (value) {\r\n\t\t\t\t\t\tngClassWatchAction(scope.$eval(attr[name]));\r\n\t\t\t\t\t});\r\n\r\n\r\n\t\t\t\t\tif (name !== 'ngClass') {\r\n\t\t\t\t\t\tscope.$watch('$index', function ($index, old$index) {\r\n\t\t\t\t\t\t\t// jshint bitwise: false\r\n\t\t\t\t\t\t\tvar mod = $index & 1;\r\n\t\t\t\t\t\t\tif (mod !== (old$index & 1)) {\r\n\t\t\t\t\t\t\t\tvar classes = arrayClasses(scope.$eval(attr[name]));\r\n\t\t\t\t\t\t\t\tmod === selector ?\r\n\t\t\t\t\t\t\t\t addClasses(classes) :\r\n\t\t\t\t\t\t\t\t removeClasses(classes);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfunction addClasses(classes) {\r\n\t\t\t\t\t\tvar newClasses = digestClassCounts(classes, 1);\r\n\t\t\t\t\t\tattr.$addClass(newClasses);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfunction removeClasses(classes) {\r\n\t\t\t\t\t\tvar newClasses = digestClassCounts(classes, -1);\r\n\t\t\t\t\t\tattr.$removeClass(newClasses);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfunction digestClassCounts(classes, count) {\r\n\t\t\t\t\t\tvar classCounts = element.data('$classCounts') || {};\r\n\t\t\t\t\t\tvar classesToUpdate = [];\r\n\t\t\t\t\t\tforEach(classes, function (className) {\r\n\t\t\t\t\t\t\tif (count > 0 || classCounts[className]) {\r\n\t\t\t\t\t\t\t\tclassCounts[className] = (classCounts[className] || 0) + count;\r\n\t\t\t\t\t\t\t\tif (classCounts[className] === +(count > 0)) {\r\n\t\t\t\t\t\t\t\t\tclassesToUpdate.push(className);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\telement.data('$classCounts', classCounts);\r\n\t\t\t\t\t\treturn classesToUpdate.join(' ');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfunction updateClasses(oldClasses, newClasses) {\r\n\t\t\t\t\t\tvar toAdd = arrayDifference(newClasses, oldClasses);\r\n\t\t\t\t\t\tvar toRemove = arrayDifference(oldClasses, newClasses);\r\n\t\t\t\t\t\ttoRemove = digestClassCounts(toRemove, -1);\r\n\t\t\t\t\t\ttoAdd = digestClassCounts(toAdd, 1);\r\n\r\n\t\t\t\t\t\tif (toAdd.length === 0) {\r\n\t\t\t\t\t\t\t$animate.removeClass(element, toRemove);\r\n\t\t\t\t\t\t} else if (toRemove.length === 0) {\r\n\t\t\t\t\t\t\t$animate.addClass(element, toAdd);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t$animate.setClass(element, toAdd, toRemove);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfunction ngClassWatchAction(newVal) {\r\n\t\t\t\t\t\tif (selector === true || scope.$index % 2 === selector) {\r\n\t\t\t\t\t\t\tvar newClasses = arrayClasses(newVal || []);\r\n\t\t\t\t\t\t\tif (!oldVal) {\r\n\t\t\t\t\t\t\t\taddClasses(newClasses);\r\n\t\t\t\t\t\t\t} else if (!equals(newVal, oldVal)) {\r\n\t\t\t\t\t\t\t\tvar oldClasses = arrayClasses(oldVal);\r\n\t\t\t\t\t\t\t\tupdateClasses(oldClasses, newClasses);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\toldVal = shallowCopy(newVal);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tfunction arrayDifference(tokens1, tokens2) {\r\n\t\t\t\tvar values = [];\r\n\r\n\t\t\t\touter:\r\n\t\t\t\t\tfor (var i = 0; i < tokens1.length; i++) {\r\n\t\t\t\t\t\tvar token = tokens1[i];\r\n\t\t\t\t\t\tfor (var j = 0; j < tokens2.length; j++) {\r\n\t\t\t\t\t\t\tif (token == tokens2[j]) continue outer;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tvalues.push(token);\r\n\t\t\t\t\t}\r\n\t\t\t\treturn values;\r\n\t\t\t}\r\n\r\n\t\t\tfunction arrayClasses(classVal) {\r\n\t\t\t\tif (isArray(classVal)) {\r\n\t\t\t\t\treturn classVal;\r\n\t\t\t\t} else if (isString(classVal)) {\r\n\t\t\t\t\treturn classVal.split(' ');\r\n\t\t\t\t} else if (isObject(classVal)) {\r\n\t\t\t\t\tvar classes = [], i = 0;\r\n\t\t\t\t\tforEach(classVal, function (v, k) {\r\n\t\t\t\t\t\tif (v) {\r\n\t\t\t\t\t\t\tclasses = classes.concat(k.split(' '));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn classes;\r\n\t\t\t\t}\r\n\t\t\t\treturn classVal;\r\n\t\t\t}\r\n\t\t}];\r\n\t}\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngClass\r\n\t * @restrict AC\r\n\t *\r\n\t * @description\r\n\t * The `ngClass` directive allows you to dynamically set CSS classes on an HTML element by databinding\r\n\t * an expression that represents all classes to be added.\r\n\t *\r\n\t * The directive operates in three different ways, depending on which of three types the expression\r\n\t * evaluates to:\r\n\t *\r\n\t * 1. If the expression evaluates to a string, the string should be one or more space-delimited class\r\n\t * names.\r\n\t *\r\n\t * 2. If the expression evaluates to an array, each element of the array should be a string that is\r\n\t * one or more space-delimited class names.\r\n\t *\r\n\t * 3. If the expression evaluates to an object, then for each key-value pair of the\r\n\t * object with a truthy value the corresponding key is used as a class name.\r\n\t *\r\n\t * The directive won't add duplicate classes if a particular class was already set.\r\n\t *\r\n\t * When the expression changes, the previously added classes are removed and only then the\r\n\t * new classes are added.\r\n\t *\r\n\t * @animations\r\n\t * add - happens just before the class is applied to the element\r\n\t * remove - happens just before the class is removed from the element\r\n\t *\r\n\t * @element ANY\r\n\t * @param {expression} ngClass {@link guide/expression Expression} to eval. The result\r\n\t * of the evaluation can be a string representing space delimited class\r\n\t * names, an array, or a map of class names to boolean values. In the case of a map, the\r\n\t * names of the properties whose values are truthy will be added as css classes to the\r\n\t * element.\r\n\t *\r\n\t * @example Example that demonstrates basic bindings via ngClass directive.\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <p ng-class=\"{strike: deleted, bold: important, red: error}\">Map Syntax Example</p>\r\n\t\t <input type=\"checkbox\" ng-model=\"deleted\"> deleted (apply \"strike\" class)<br>\r\n\t\t <input type=\"checkbox\" ng-model=\"important\"> important (apply \"bold\" class)<br>\r\n\t\t <input type=\"checkbox\" ng-model=\"error\"> error (apply \"red\" class)\r\n\t\t <hr>\r\n\t\t <p ng-class=\"style\">Using String Syntax</p>\r\n\t\t <input type=\"text\" ng-model=\"style\" placeholder=\"Type: bold strike red\">\r\n\t\t <hr>\r\n\t\t <p ng-class=\"[style1, style2, style3]\">Using Array Syntax</p>\r\n\t\t <input ng-model=\"style1\" placeholder=\"Type: bold, strike or red\"><br>\r\n\t\t <input ng-model=\"style2\" placeholder=\"Type: bold, strike or red\"><br>\r\n\t\t <input ng-model=\"style3\" placeholder=\"Type: bold, strike or red\"><br>\r\n\t\t </file>\r\n\t\t <file name=\"style.css\">\r\n\t\t .strike {\r\n\t\t\t text-decoration: line-through;\r\n\t\t }\r\n\t\t .bold {\r\n\t\t\t font-weight: bold;\r\n\t\t }\r\n\t\t .red {\r\n\t\t\t color: red;\r\n\t\t }\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t var ps = element.all(by.css('p'));\r\n\t\r\n\t\t it('should let you toggle the class', function() {\r\n\t\r\n\t\t\t expect(ps.first().getAttribute('class')).not.toMatch(/bold/);\r\n\t\t\t expect(ps.first().getAttribute('class')).not.toMatch(/red/);\r\n\t\r\n\t\t\t element(by.model('important')).click();\r\n\t\t\t expect(ps.first().getAttribute('class')).toMatch(/bold/);\r\n\t\r\n\t\t\t element(by.model('error')).click();\r\n\t\t\t expect(ps.first().getAttribute('class')).toMatch(/red/);\r\n\t\t });\r\n\t\r\n\t\t it('should let you toggle string example', function() {\r\n\t\t\t expect(ps.get(1).getAttribute('class')).toBe('');\r\n\t\t\t element(by.model('style')).clear();\r\n\t\t\t element(by.model('style')).sendKeys('red');\r\n\t\t\t expect(ps.get(1).getAttribute('class')).toBe('red');\r\n\t\t });\r\n\t\r\n\t\t it('array example should have 3 classes', function() {\r\n\t\t\t expect(ps.last().getAttribute('class')).toBe('');\r\n\t\t\t element(by.model('style1')).sendKeys('bold');\r\n\t\t\t element(by.model('style2')).sendKeys('strike');\r\n\t\t\t element(by.model('style3')).sendKeys('red');\r\n\t\t\t expect(ps.last().getAttribute('class')).toBe('bold strike red');\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t\r\n\t ## Animations\r\n\t\r\n\t The example below demonstrates how to perform animations using ngClass.\r\n\t\r\n\t <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\r\n\t\t <file name=\"index.html\">\r\n\t\t <input id=\"setbtn\" type=\"button\" value=\"set\" ng-click=\"myVar='my-class'\">\r\n\t\t <input id=\"clearbtn\" type=\"button\" value=\"clear\" ng-click=\"myVar=''\">\r\n\t\t <br>\r\n\t\t <span class=\"base-class\" ng-class=\"myVar\">Sample Text</span>\r\n\t\t </file>\r\n\t\t <file name=\"style.css\">\r\n\t\t .base-class {\r\n\t\t\t -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\r\n\t\t\t transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\r\n\t\t }\r\n\t\r\n\t\t .base-class.my-class {\r\n\t\t\t color: red;\r\n\t\t\t font-size:3em;\r\n\t\t }\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should check ng-class', function() {\r\n\t\t\t expect(element(by.css('.base-class')).getAttribute('class')).not.\r\n\t\t\t toMatch(/my-class/);\r\n\t\r\n\t\t\t element(by.id('setbtn')).click();\r\n\t\r\n\t\t\t expect(element(by.css('.base-class')).getAttribute('class')).\r\n\t\t\t toMatch(/my-class/);\r\n\t\r\n\t\t\t element(by.id('clearbtn')).click();\r\n\t\r\n\t\t\t expect(element(by.css('.base-class')).getAttribute('class')).not.\r\n\t\t\t toMatch(/my-class/);\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t\r\n\t\r\n\t ## ngClass and pre-existing CSS3 Transitions/Animations\r\n\t The ngClass directive still supports CSS3 Transitions/Animations even if they do not follow the ngAnimate CSS naming structure.\r\n\t Upon animation ngAnimate will apply supplementary CSS classes to track the start and end of an animation, but this will not hinder\r\n\t any pre-existing CSS transitions already on the element. To get an idea of what happens during a class-based animation, be sure\r\n\t to view the step by step details of {@link ngAnimate.$animate#addclass $animate.addClass} and\r\n\t {@link ngAnimate.$animate#removeclass $animate.removeClass}.\r\n\t */\r\n\tvar ngClassDirective = classDirective('', true);\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngClassOdd\r\n\t * @restrict AC\r\n\t *\r\n\t * @description\r\n\t * The `ngClassOdd` and `ngClassEven` directives work exactly as\r\n\t * {@link ng.directive:ngClass ngClass}, except they work in\r\n\t * conjunction with `ngRepeat` and take effect only on odd (even) rows.\r\n\t *\r\n\t * This directive can be applied only within the scope of an\r\n\t * {@link ng.directive:ngRepeat ngRepeat}.\r\n\t *\r\n\t * @element ANY\r\n\t * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result\r\n\t * of the evaluation can be a string representing space delimited class names or an array.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t\t<ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\r\n\t\t\t <li ng-repeat=\"name in names\">\r\n\t\t\t <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\r\n\t\t\t\t {{name}}\r\n\t\t\t </span>\r\n\t\t\t </li>\r\n\t\t\t</ol>\r\n\t\t </file>\r\n\t\t <file name=\"style.css\">\r\n\t\t .odd {\r\n\t\t\t color: red;\r\n\t\t }\r\n\t\t .even {\r\n\t\t\t color: blue;\r\n\t\t }\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should check ng-class-odd and ng-class-even', function() {\r\n\t\t\t expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).\r\n\t\t\t toMatch(/odd/);\r\n\t\t\t expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).\r\n\t\t\t toMatch(/even/);\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tvar ngClassOddDirective = classDirective('Odd', 0);\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngClassEven\r\n\t * @restrict AC\r\n\t *\r\n\t * @description\r\n\t * The `ngClassOdd` and `ngClassEven` directives work exactly as\r\n\t * {@link ng.directive:ngClass ngClass}, except they work in\r\n\t * conjunction with `ngRepeat` and take effect only on odd (even) rows.\r\n\t *\r\n\t * This directive can be applied only within the scope of an\r\n\t * {@link ng.directive:ngRepeat ngRepeat}.\r\n\t *\r\n\t * @element ANY\r\n\t * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The\r\n\t * result of the evaluation can be a string representing space delimited class names or an array.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t\t<ol ng-init=\"names=['John', 'Mary', 'Cate', 'Suz']\">\r\n\t\t\t <li ng-repeat=\"name in names\">\r\n\t\t\t <span ng-class-odd=\"'odd'\" ng-class-even=\"'even'\">\r\n\t\t\t\t {{name}} \r\n\t\t\t </span>\r\n\t\t\t </li>\r\n\t\t\t</ol>\r\n\t\t </file>\r\n\t\t <file name=\"style.css\">\r\n\t\t .odd {\r\n\t\t\t color: red;\r\n\t\t }\r\n\t\t .even {\r\n\t\t\t color: blue;\r\n\t\t }\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should check ng-class-odd and ng-class-even', function() {\r\n\t\t\t expect(element(by.repeater('name in names').row(0).column('name')).getAttribute('class')).\r\n\t\t\t toMatch(/odd/);\r\n\t\t\t expect(element(by.repeater('name in names').row(1).column('name')).getAttribute('class')).\r\n\t\t\t toMatch(/even/);\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tvar ngClassEvenDirective = classDirective('Even', 1);\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngCloak\r\n\t * @restrict AC\r\n\t *\r\n\t * @description\r\n\t * The `ngCloak` directive is used to prevent the Angular html template from being briefly\r\n\t * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this\r\n\t * directive to avoid the undesirable flicker effect caused by the html template display.\r\n\t *\r\n\t * The directive can be applied to the `<body>` element, but the preferred usage is to apply\r\n\t * multiple `ngCloak` directives to small portions of the page to permit progressive rendering\r\n\t * of the browser view.\r\n\t *\r\n\t * `ngCloak` works in cooperation with the following css rule embedded within `angular.js` and\r\n\t * `angular.min.js`.\r\n\t * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\r\n\t *\r\n\t * ```css\r\n\t * [ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {\r\n\t * display: none !important;\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * When this css rule is loaded by the browser, all html elements (including their children) that\r\n\t * are tagged with the `ngCloak` directive are hidden. When Angular encounters this directive\r\n\t * during the compilation of the template it deletes the `ngCloak` element attribute, making\r\n\t * the compiled element visible.\r\n\t *\r\n\t * For the best result, the `angular.js` script must be loaded in the head section of the html\r\n\t * document; alternatively, the css rule above must be included in the external stylesheet of the\r\n\t * application.\r\n\t *\r\n\t * Legacy browsers, like IE7, do not provide attribute selector support (added in CSS 2.1) so they\r\n\t * cannot match the `[ng\\:cloak]` selector. To work around this limitation, you must add the css\r\n\t * class `ng-cloak` in addition to the `ngCloak` directive as shown in the example below.\r\n\t *\r\n\t * @element ANY\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t\t<div id=\"template1\" ng-cloak>{{ 'hello' }}</div>\r\n\t\t\t<div id=\"template2\" ng-cloak class=\"ng-cloak\">{{ 'hello IE7' }}</div>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should remove the template directive and css class', function() {\r\n\t\t\t expect($('#template1').getAttribute('ng-cloak')).\r\n\t\t\t toBeNull();\r\n\t\t\t expect($('#template2').getAttribute('ng-cloak')).\r\n\t\t\t toBeNull();\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t *\r\n\t */\r\n\tvar ngCloakDirective = ngDirective({\r\n\t\tcompile: function (element, attr) {\r\n\t\t\tattr.$set('ngCloak', undefined);\r\n\t\t\telement.removeClass('ng-cloak');\r\n\t\t}\r\n\t});\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngController\r\n\t *\r\n\t * @description\r\n\t * The `ngController` directive attaches a controller class to the view. This is a key aspect of how angular\r\n\t * supports the principles behind the Model-View-Controller design pattern.\r\n\t *\r\n\t * MVC components in angular:\r\n\t *\r\n\t * * Model — Models are the properties of a scope; scopes are attached to the DOM where scope properties\r\n\t * are accessed through bindings.\r\n\t * * View — The template (HTML with data bindings) that is rendered into the View.\r\n\t * * Controller — The `ngController` directive specifies a Controller class; the class contains business\r\n\t * logic behind the application to decorate the scope with functions and values\r\n\t *\r\n\t * Note that you can also attach controllers to the DOM by declaring it in a route definition\r\n\t * via the {@link ngRoute.$route $route} service. A common mistake is to declare the controller\r\n\t * again using `ng-controller` in the template itself. This will cause the controller to be attached\r\n\t * and executed twice.\r\n\t *\r\n\t * @element ANY\r\n\t * @scope\r\n\t * @param {expression} ngController Name of a globally accessible constructor function or an\r\n\t * {@link guide/expression expression} that on the current scope evaluates to a\r\n\t * constructor function. The controller instance can be published into a scope property\r\n\t * by specifying `as propertyName`.\r\n\t *\r\n\t * @example\r\n\t * Here is a simple form for editing user contact information. Adding, removing, clearing, and\r\n\t * greeting are methods declared on the controller (see source tab). These methods can\r\n\t * easily be called from the angular markup. Any changes to the data are automatically reflected\r\n\t * in the View without the need for a manual update.\r\n\t *\r\n\t * Two different declaration styles are included below:\r\n\t *\r\n\t * * one binds methods and properties directly onto the controller using `this`:\r\n\t * `ng-controller=\"SettingsController1 as settings\"`\r\n\t * * one injects `$scope` into the controller:\r\n\t * `ng-controller=\"SettingsController2\"`\r\n\t *\r\n\t * The second option is more common in the Angular community, and is generally used in boilerplates\r\n\t * and in this guide. However, there are advantages to binding properties directly to the controller\r\n\t * and avoiding scope.\r\n\t *\r\n\t * * Using `controller as` makes it obvious which controller you are accessing in the template when\r\n\t * multiple controllers apply to an element.\r\n\t * * If you are writing your controllers as classes you have easier access to the properties and\r\n\t * methods, which will appear on the scope, from inside the controller code.\r\n\t * * Since there is always a `.` in the bindings, you don't have to worry about prototypal\r\n\t * inheritance masking primitives.\r\n\t *\r\n\t * This example demonstrates the `controller as` syntax.\r\n\t *\r\n\t * <example name=\"ngControllerAs\">\r\n\t * <file name=\"index.html\">\r\n\t * <div id=\"ctrl-as-exmpl\" ng-controller=\"SettingsController1 as settings\">\r\n\t * Name: <input type=\"text\" ng-model=\"settings.name\"/>\r\n\t * [ <a href=\"\" ng-click=\"settings.greet()\">greet</a> ]<br/>\r\n\t * Contact:\r\n\t * <ul>\r\n\t * <li ng-repeat=\"contact in settings.contacts\">\r\n\t * <select ng-model=\"contact.type\">\r\n\t * <option>phone</option>\r\n\t * <option>email</option>\r\n\t * </select>\r\n\t * <input type=\"text\" ng-model=\"contact.value\"/>\r\n\t * [ <a href=\"\" ng-click=\"settings.clearContact(contact)\">clear</a>\r\n\t * | <a href=\"\" ng-click=\"settings.removeContact(contact)\">X</a> ]\r\n\t * </li>\r\n\t * <li>[ <a href=\"\" ng-click=\"settings.addContact()\">add</a> ]</li>\r\n\t * </ul>\r\n\t * </div>\r\n\t * </file>\r\n\t * <file name=\"app.js\">\r\n\t * function SettingsController1() {\r\n\t * this.name = \"John Smith\";\r\n\t * this.contacts = [\r\n\t * {type: 'phone', value: '408 555 1212'},\r\n\t * {type: 'email', value: 'john.smith@example.org'} ];\r\n\t * }\r\n\t *\r\n\t * SettingsController1.prototype.greet = function() {\r\n\t * alert(this.name);\r\n\t * };\r\n\t *\r\n\t * SettingsController1.prototype.addContact = function() {\r\n\t * this.contacts.push({type: 'email', value: 'yourname@example.org'});\r\n\t * };\r\n\t *\r\n\t * SettingsController1.prototype.removeContact = function(contactToRemove) {\r\n\t * var index = this.contacts.indexOf(contactToRemove);\r\n\t * this.contacts.splice(index, 1);\r\n\t * };\r\n\t *\r\n\t * SettingsController1.prototype.clearContact = function(contact) {\r\n\t * contact.type = 'phone';\r\n\t * contact.value = '';\r\n\t * };\r\n\t * </file>\r\n\t * <file name=\"protractor.js\" type=\"protractor\">\r\n\t * it('should check controller as', function() {\r\n\t * var container = element(by.id('ctrl-as-exmpl'));\r\n\t * expect(container.findElement(by.model('settings.name'))\r\n\t * .getAttribute('value')).toBe('John Smith');\r\n\t *\r\n\t * var firstRepeat =\r\n\t * container.findElement(by.repeater('contact in settings.contacts').row(0));\r\n\t * var secondRepeat =\r\n\t * container.findElement(by.repeater('contact in settings.contacts').row(1));\r\n\t *\r\n\t * expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))\r\n\t * .toBe('408 555 1212');\r\n\t *\r\n\t * expect(secondRepeat.findElement(by.model('contact.value')).getAttribute('value'))\r\n\t * .toBe('john.smith@example.org');\r\n\t *\r\n\t * firstRepeat.findElement(by.linkText('clear')).click();\r\n\t *\r\n\t * expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))\r\n\t * .toBe('');\r\n\t *\r\n\t * container.findElement(by.linkText('add')).click();\r\n\t *\r\n\t * expect(container.findElement(by.repeater('contact in settings.contacts').row(2))\r\n\t * .findElement(by.model('contact.value'))\r\n\t * .getAttribute('value'))\r\n\t * .toBe('yourname@example.org');\r\n\t * });\r\n\t * </file>\r\n\t * </example>\r\n\t *\r\n\t * This example demonstrates the \"attach to `$scope`\" style of controller.\r\n\t *\r\n\t * <example name=\"ngController\">\r\n\t * <file name=\"index.html\">\r\n\t * <div id=\"ctrl-exmpl\" ng-controller=\"SettingsController2\">\r\n\t * Name: <input type=\"text\" ng-model=\"name\"/>\r\n\t * [ <a href=\"\" ng-click=\"greet()\">greet</a> ]<br/>\r\n\t * Contact:\r\n\t * <ul>\r\n\t * <li ng-repeat=\"contact in contacts\">\r\n\t * <select ng-model=\"contact.type\">\r\n\t * <option>phone</option>\r\n\t * <option>email</option>\r\n\t * </select>\r\n\t * <input type=\"text\" ng-model=\"contact.value\"/>\r\n\t * [ <a href=\"\" ng-click=\"clearContact(contact)\">clear</a>\r\n\t * | <a href=\"\" ng-click=\"removeContact(contact)\">X</a> ]\r\n\t * </li>\r\n\t * <li>[ <a href=\"\" ng-click=\"addContact()\">add</a> ]</li>\r\n\t * </ul>\r\n\t * </div>\r\n\t * </file>\r\n\t * <file name=\"app.js\">\r\n\t * function SettingsController2($scope) {\r\n\t * $scope.name = \"John Smith\";\r\n\t * $scope.contacts = [\r\n\t * {type:'phone', value:'408 555 1212'},\r\n\t * {type:'email', value:'john.smith@example.org'} ];\r\n\t *\r\n\t * $scope.greet = function() {\r\n\t * alert($scope.name);\r\n\t * };\r\n\t *\r\n\t * $scope.addContact = function() {\r\n\t * $scope.contacts.push({type:'email', value:'yourname@example.org'});\r\n\t * };\r\n\t *\r\n\t * $scope.removeContact = function(contactToRemove) {\r\n\t * var index = $scope.contacts.indexOf(contactToRemove);\r\n\t * $scope.contacts.splice(index, 1);\r\n\t * };\r\n\t *\r\n\t * $scope.clearContact = function(contact) {\r\n\t * contact.type = 'phone';\r\n\t * contact.value = '';\r\n\t * };\r\n\t * }\r\n\t * </file>\r\n\t * <file name=\"protractor.js\" type=\"protractor\">\r\n\t * it('should check controller', function() {\r\n\t * var container = element(by.id('ctrl-exmpl'));\r\n\t *\r\n\t * expect(container.findElement(by.model('name'))\r\n\t * .getAttribute('value')).toBe('John Smith');\r\n\t *\r\n\t * var firstRepeat =\r\n\t * container.findElement(by.repeater('contact in contacts').row(0));\r\n\t * var secondRepeat =\r\n\t * container.findElement(by.repeater('contact in contacts').row(1));\r\n\t *\r\n\t * expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))\r\n\t * .toBe('408 555 1212');\r\n\t * expect(secondRepeat.findElement(by.model('contact.value')).getAttribute('value'))\r\n\t * .toBe('john.smith@example.org');\r\n\t *\r\n\t * firstRepeat.findElement(by.linkText('clear')).click();\r\n\t *\r\n\t * expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))\r\n\t * .toBe('');\r\n\t *\r\n\t * container.findElement(by.linkText('add')).click();\r\n\t *\r\n\t * expect(container.findElement(by.repeater('contact in contacts').row(2))\r\n\t * .findElement(by.model('contact.value'))\r\n\t * .getAttribute('value'))\r\n\t * .toBe('yourname@example.org');\r\n\t * });\r\n\t * </file>\r\n\t *</example>\r\n\t\r\n\t */\r\n\tvar ngControllerDirective = [function () {\r\n\t\treturn {\r\n\t\t\tscope: true,\r\n\t\t\tcontroller: '@',\r\n\t\t\tpriority: 500\r\n\t\t};\r\n\t}];\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngCsp\r\n\t *\r\n\t * @element html\r\n\t * @description\r\n\t * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support.\r\n\t *\r\n\t * This is necessary when developing things like Google Chrome Extensions.\r\n\t *\r\n\t * CSP forbids apps to use `eval` or `Function(string)` generated functions (among other things).\r\n\t * For us to be compatible, we just need to implement the \"getterFn\" in $parse without violating\r\n\t * any of these restrictions.\r\n\t *\r\n\t * AngularJS uses `Function(string)` generated functions as a speed optimization. Applying the `ngCsp`\r\n\t * directive will cause Angular to use CSP compatibility mode. When this mode is on AngularJS will\r\n\t * evaluate all expressions up to 30% slower than in non-CSP mode, but no security violations will\r\n\t * be raised.\r\n\t *\r\n\t * CSP forbids JavaScript to inline stylesheet rules. In non CSP mode Angular automatically\r\n\t * includes some CSS rules (e.g. {@link ng.directive:ngCloak ngCloak}).\r\n\t * To make those directives work in CSP mode, include the `angular-csp.css` manually.\r\n\t *\r\n\t * In order to use this feature put the `ngCsp` directive on the root element of the application.\r\n\t *\r\n\t * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.*\r\n\t *\r\n\t * @example\r\n\t * This example shows how to apply the `ngCsp` directive to the `html` tag.\r\n\t ```html\r\n\t\t <!doctype html>\r\n\t\t <html ng-app ng-csp>\r\n\t\t ...\r\n\t\t ...\r\n\t\t </html>\r\n\t ```\r\n\t */\r\n\r\n\t// ngCsp is not implemented as a proper directive any more, because we need it be processed while we bootstrap\r\n\t// the system (before $parse is instantiated), for this reason we just have a csp() fn that looks for ng-csp attribute\r\n\t// anywhere in the current doc\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngClick\r\n\t *\r\n\t * @description\r\n\t * The ngClick directive allows you to specify custom behavior when\r\n\t * an element is clicked.\r\n\t *\r\n\t * @element ANY\r\n\t * @priority 0\r\n\t * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon\r\n\t * click. ({@link guide/expression#-event- Event object is available as `$event`})\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <button ng-click=\"count = count + 1\" ng-init=\"count=0\">\r\n\t\t\tIncrement\r\n\t\t </button>\r\n\t\t count: {{count}}\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should check ng-click', function() {\r\n\t\t\t expect(element(by.binding('count')).getText()).toMatch('0');\r\n\t\t\t element(by.css('button')).click();\r\n\t\t\t expect(element(by.binding('count')).getText()).toMatch('1');\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\t/*\r\n\t * A directive that allows creation of custom onclick handlers that are defined as angular\r\n\t * expressions and are compiled and executed within the current scope.\r\n\t *\r\n\t * Events that are handled via these handler are always configured not to propagate further.\r\n\t */\r\n\tvar ngEventDirectives = {};\r\n\tforEach(\r\n\t 'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),\r\n\t function (name) {\r\n\t \tvar directiveName = directiveNormalize('ng-' + name);\r\n\t \tngEventDirectives[directiveName] = ['$parse', function ($parse) {\r\n\t \t\treturn {\r\n\t \t\t\tcompile: function ($element, attr) {\r\n\t \t\t\t\tvar fn = $parse(attr[directiveName]);\r\n\t \t\t\t\treturn function ngEventHandler(scope, element) {\r\n\t \t\t\t\t\telement.on(lowercase(name), function (event) {\r\n\t \t\t\t\t\t\tscope.$apply(function () {\r\n\t \t\t\t\t\t\t\tfn(scope, { $event: event });\r\n\t \t\t\t\t\t\t});\r\n\t \t\t\t\t\t});\r\n\t \t\t\t\t};\r\n\t \t\t\t}\r\n\t \t\t};\r\n\t \t}];\r\n\t }\r\n\t);\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngDblclick\r\n\t *\r\n\t * @description\r\n\t * The `ngDblclick` directive allows you to specify custom behavior on a dblclick event.\r\n\t *\r\n\t * @element ANY\r\n\t * @priority 0\r\n\t * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon\r\n\t * a dblclick. (The Event object is available as `$event`)\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <button ng-dblclick=\"count = count + 1\" ng-init=\"count=0\">\r\n\t\t\tIncrement (on double click)\r\n\t\t </button>\r\n\t\t count: {{count}}\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngMousedown\r\n\t *\r\n\t * @description\r\n\t * The ngMousedown directive allows you to specify custom behavior on mousedown event.\r\n\t *\r\n\t * @element ANY\r\n\t * @priority 0\r\n\t * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon\r\n\t * mousedown. ({@link guide/expression#-event- Event object is available as `$event`})\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <button ng-mousedown=\"count = count + 1\" ng-init=\"count=0\">\r\n\t\t\tIncrement (on mouse down)\r\n\t\t </button>\r\n\t\t count: {{count}}\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngMouseup\r\n\t *\r\n\t * @description\r\n\t * Specify custom behavior on mouseup event.\r\n\t *\r\n\t * @element ANY\r\n\t * @priority 0\r\n\t * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon\r\n\t * mouseup. ({@link guide/expression#-event- Event object is available as `$event`})\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <button ng-mouseup=\"count = count + 1\" ng-init=\"count=0\">\r\n\t\t\tIncrement (on mouse up)\r\n\t\t </button>\r\n\t\t count: {{count}}\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngMouseover\r\n\t *\r\n\t * @description\r\n\t * Specify custom behavior on mouseover event.\r\n\t *\r\n\t * @element ANY\r\n\t * @priority 0\r\n\t * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon\r\n\t * mouseover. ({@link guide/expression#-event- Event object is available as `$event`})\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <button ng-mouseover=\"count = count + 1\" ng-init=\"count=0\">\r\n\t\t\tIncrement (when mouse is over)\r\n\t\t </button>\r\n\t\t count: {{count}}\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngMouseenter\r\n\t *\r\n\t * @description\r\n\t * Specify custom behavior on mouseenter event.\r\n\t *\r\n\t * @element ANY\r\n\t * @priority 0\r\n\t * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon\r\n\t * mouseenter. ({@link guide/expression#-event- Event object is available as `$event`})\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <button ng-mouseenter=\"count = count + 1\" ng-init=\"count=0\">\r\n\t\t\tIncrement (when mouse enters)\r\n\t\t </button>\r\n\t\t count: {{count}}\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngMouseleave\r\n\t *\r\n\t * @description\r\n\t * Specify custom behavior on mouseleave event.\r\n\t *\r\n\t * @element ANY\r\n\t * @priority 0\r\n\t * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon\r\n\t * mouseleave. ({@link guide/expression#-event- Event object is available as `$event`})\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <button ng-mouseleave=\"count = count + 1\" ng-init=\"count=0\">\r\n\t\t\tIncrement (when mouse leaves)\r\n\t\t </button>\r\n\t\t count: {{count}}\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngMousemove\r\n\t *\r\n\t * @description\r\n\t * Specify custom behavior on mousemove event.\r\n\t *\r\n\t * @element ANY\r\n\t * @priority 0\r\n\t * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon\r\n\t * mousemove. ({@link guide/expression#-event- Event object is available as `$event`})\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <button ng-mousemove=\"count = count + 1\" ng-init=\"count=0\">\r\n\t\t\tIncrement (when mouse moves)\r\n\t\t </button>\r\n\t\t count: {{count}}\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngKeydown\r\n\t *\r\n\t * @description\r\n\t * Specify custom behavior on keydown event.\r\n\t *\r\n\t * @element ANY\r\n\t * @priority 0\r\n\t * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon\r\n\t * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <input ng-keydown=\"count = count + 1\" ng-init=\"count=0\">\r\n\t\t key down count: {{count}}\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngKeyup\r\n\t *\r\n\t * @description\r\n\t * Specify custom behavior on keyup event.\r\n\t *\r\n\t * @element ANY\r\n\t * @priority 0\r\n\t * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon\r\n\t * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <p>Typing in the input box below updates the key count</p>\r\n\t\t <input ng-keyup=\"count = count + 1\" ng-init=\"count=0\"> key up count: {{count}}\r\n\t\r\n\t\t <p>Typing in the input box below updates the keycode</p>\r\n\t\t <input ng-keyup=\"event=$event\">\r\n\t\t <p>event keyCode: {{ event.keyCode }}</p>\r\n\t\t <p>event altKey: {{ event.altKey }}</p>\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngKeypress\r\n\t *\r\n\t * @description\r\n\t * Specify custom behavior on keypress event.\r\n\t *\r\n\t * @element ANY\r\n\t * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon\r\n\t * keypress. ({@link guide/expression#-event- Event object is available as `$event`}\r\n\t * and can be interrogated for keyCode, altKey, etc.)\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <input ng-keypress=\"count = count + 1\" ng-init=\"count=0\">\r\n\t\t key press count: {{count}}\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngSubmit\r\n\t *\r\n\t * @description\r\n\t * Enables binding angular expressions to onsubmit events.\r\n\t *\r\n\t * Additionally it prevents the default action (which for form means sending the request to the\r\n\t * server and reloading the current page), but only if the form does not contain `action`,\r\n\t * `data-action`, or `x-action` attributes.\r\n\t *\r\n\t * @element form\r\n\t * @priority 0\r\n\t * @param {expression} ngSubmit {@link guide/expression Expression} to eval.\r\n\t * ({@link guide/expression#-event- Event object is available as `$event`})\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <script>\r\n\t\t\tfunction Ctrl($scope) {\r\n\t\t\t $scope.list = [];\r\n\t\t\t $scope.text = 'hello';\r\n\t\t\t $scope.submit = function() {\r\n\t\t\t\tif ($scope.text) {\r\n\t\t\t\t $scope.list.push(this.text);\r\n\t\t\t\t $scope.text = '';\r\n\t\t\t\t}\r\n\t\t\t };\r\n\t\t\t}\r\n\t\t </script>\r\n\t\t <form ng-submit=\"submit()\" ng-controller=\"Ctrl\">\r\n\t\t\tEnter text and hit enter:\r\n\t\t\t<input type=\"text\" ng-model=\"text\" name=\"text\" />\r\n\t\t\t<input type=\"submit\" id=\"submit\" value=\"Submit\" />\r\n\t\t\t<pre>list={{list}}</pre>\r\n\t\t </form>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should check ng-submit', function() {\r\n\t\t\t expect(element(by.binding('list')).getText()).toBe('list=[]');\r\n\t\t\t element(by.css('#submit')).click();\r\n\t\t\t expect(element(by.binding('list')).getText()).toContain('hello');\r\n\t\t\t expect(element(by.input('text')).getAttribute('value')).toBe('');\r\n\t\t });\r\n\t\t it('should ignore empty strings', function() {\r\n\t\t\t expect(element(by.binding('list')).getText()).toBe('list=[]');\r\n\t\t\t element(by.css('#submit')).click();\r\n\t\t\t element(by.css('#submit')).click();\r\n\t\t\t expect(element(by.binding('list')).getText()).toContain('hello');\r\n\t\t\t});\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngFocus\r\n\t *\r\n\t * @description\r\n\t * Specify custom behavior on focus event.\r\n\t *\r\n\t * @element window, input, select, textarea, a\r\n\t * @priority 0\r\n\t * @param {expression} ngFocus {@link guide/expression Expression} to evaluate upon\r\n\t * focus. ({@link guide/expression#-event- Event object is available as `$event`})\r\n\t *\r\n\t * @example\r\n\t * See {@link ng.directive:ngClick ngClick}\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngBlur\r\n\t *\r\n\t * @description\r\n\t * Specify custom behavior on blur event.\r\n\t *\r\n\t * @element window, input, select, textarea, a\r\n\t * @priority 0\r\n\t * @param {expression} ngBlur {@link guide/expression Expression} to evaluate upon\r\n\t * blur. ({@link guide/expression#-event- Event object is available as `$event`})\r\n\t *\r\n\t * @example\r\n\t * See {@link ng.directive:ngClick ngClick}\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngCopy\r\n\t *\r\n\t * @description\r\n\t * Specify custom behavior on copy event.\r\n\t *\r\n\t * @element window, input, select, textarea, a\r\n\t * @priority 0\r\n\t * @param {expression} ngCopy {@link guide/expression Expression} to evaluate upon\r\n\t * copy. ({@link guide/expression#-event- Event object is available as `$event`})\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <input ng-copy=\"copied=true\" ng-init=\"copied=false; value='copy me'\" ng-model=\"value\">\r\n\t\t copied: {{copied}}\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngCut\r\n\t *\r\n\t * @description\r\n\t * Specify custom behavior on cut event.\r\n\t *\r\n\t * @element window, input, select, textarea, a\r\n\t * @priority 0\r\n\t * @param {expression} ngCut {@link guide/expression Expression} to evaluate upon\r\n\t * cut. ({@link guide/expression#-event- Event object is available as `$event`})\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <input ng-cut=\"cut=true\" ng-init=\"cut=false; value='cut me'\" ng-model=\"value\">\r\n\t\t cut: {{cut}}\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngPaste\r\n\t *\r\n\t * @description\r\n\t * Specify custom behavior on paste event.\r\n\t *\r\n\t * @element window, input, select, textarea, a\r\n\t * @priority 0\r\n\t * @param {expression} ngPaste {@link guide/expression Expression} to evaluate upon\r\n\t * paste. ({@link guide/expression#-event- Event object is available as `$event`})\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t <input ng-paste=\"paste=true\" ng-init=\"paste=false\" placeholder='paste here'>\r\n\t\t pasted: {{paste}}\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngIf\r\n\t * @restrict A\r\n\t *\r\n\t * @description\r\n\t * The `ngIf` directive removes or recreates a portion of the DOM tree based on an\r\n\t * {expression}. If the expression assigned to `ngIf` evaluates to a false\r\n\t * value then the element is removed from the DOM, otherwise a clone of the\r\n\t * element is reinserted into the DOM.\r\n\t *\r\n\t * `ngIf` differs from `ngShow` and `ngHide` in that `ngIf` completely removes and recreates the\r\n\t * element in the DOM rather than changing its visibility via the `display` css property. A common\r\n\t * case when this difference is significant is when using css selectors that rely on an element's\r\n\t * position within the DOM, such as the `:first-child` or `:last-child` pseudo-classes.\r\n\t *\r\n\t * Note that when an element is removed using `ngIf` its scope is destroyed and a new scope\r\n\t * is created when the element is restored. The scope created within `ngIf` inherits from\r\n\t * its parent scope using\r\n\t * [prototypal inheritance](https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance).\r\n\t * An important implication of this is if `ngModel` is used within `ngIf` to bind to\r\n\t * a javascript primitive defined in the parent scope. In this case any modifications made to the\r\n\t * variable within the child scope will override (hide) the value in the parent scope.\r\n\t *\r\n\t * Also, `ngIf` recreates elements using their compiled state. An example of this behavior\r\n\t * is if an element's class attribute is directly modified after it's compiled, using something like\r\n\t * jQuery's `.addClass()` method, and the element is later removed. When `ngIf` recreates the element\r\n\t * the added class will be lost because the original compiled state is used to regenerate the element.\r\n\t *\r\n\t * Additionally, you can provide animations via the `ngAnimate` module to animate the `enter`\r\n\t * and `leave` effects.\r\n\t *\r\n\t * @animations\r\n\t * enter - happens just after the ngIf contents change and a new DOM element is created and injected into the ngIf container\r\n\t * leave - happens just before the ngIf contents are removed from the DOM\r\n\t *\r\n\t * @element ANY\r\n\t * @scope\r\n\t * @priority 600\r\n\t * @param {expression} ngIf If the {@link guide/expression expression} is falsy then\r\n\t * the element is removed from the DOM tree. If it is truthy a copy of the compiled\r\n\t * element is added to the DOM tree.\r\n\t *\r\n\t * @example\r\n\t <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\r\n\t\t<file name=\"index.html\">\r\n\t\t Click me: <input type=\"checkbox\" ng-model=\"checked\" ng-init=\"checked=true\" /><br/>\r\n\t\t Show when checked:\r\n\t\t <span ng-if=\"checked\" class=\"animate-if\">\r\n\t\t\tI'm removed when the checkbox is unchecked.\r\n\t\t </span>\r\n\t\t</file>\r\n\t\t<file name=\"animations.css\">\r\n\t\t .animate-if {\r\n\t\t\tbackground:white;\r\n\t\t\tborder:1px solid black;\r\n\t\t\tpadding:10px;\r\n\t\t }\r\n\t\r\n\t\t .animate-if.ng-enter, .animate-if.ng-leave {\r\n\t\t\t-webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\r\n\t\t\ttransition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\r\n\t\t }\r\n\t\r\n\t\t .animate-if.ng-enter,\r\n\t\t .animate-if.ng-leave.ng-leave-active {\r\n\t\t\topacity:0;\r\n\t\t }\r\n\t\r\n\t\t .animate-if.ng-leave,\r\n\t\t .animate-if.ng-enter.ng-enter-active {\r\n\t\t\topacity:1;\r\n\t\t }\r\n\t\t</file>\r\n\t </example>\r\n\t */\r\n\tvar ngIfDirective = ['$animate', function ($animate) {\r\n\t\treturn {\r\n\t\t\ttransclude: 'element',\r\n\t\t\tpriority: 600,\r\n\t\t\tterminal: true,\r\n\t\t\trestrict: 'A',\r\n\t\t\t$$tlb: true,\r\n\t\t\tlink: function ($scope, $element, $attr, ctrl, $transclude) {\r\n\t\t\t\tvar block, childScope, previousElements;\r\n\t\t\t\t$scope.$watch($attr.ngIf, function ngIfWatchAction(value) {\r\n\r\n\t\t\t\t\tif (toBoolean(value)) {\r\n\t\t\t\t\t\tif (!childScope) {\r\n\t\t\t\t\t\t\tchildScope = $scope.$new();\r\n\t\t\t\t\t\t\t$transclude(childScope, function (clone) {\r\n\t\t\t\t\t\t\t\tclone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' ');\r\n\t\t\t\t\t\t\t\t// Note: We only need the first/last node of the cloned nodes.\r\n\t\t\t\t\t\t\t\t// However, we need to keep the reference to the jqlite wrapper as it might be changed later\r\n\t\t\t\t\t\t\t\t// by a directive with templateUrl when its template arrives.\r\n\t\t\t\t\t\t\t\tblock = {\r\n\t\t\t\t\t\t\t\t\tclone: clone\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\t$animate.enter(clone, $element.parent(), $element);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tif (previousElements) {\r\n\t\t\t\t\t\t\tpreviousElements.remove();\r\n\t\t\t\t\t\t\tpreviousElements = null;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (childScope) {\r\n\t\t\t\t\t\t\tchildScope.$destroy();\r\n\t\t\t\t\t\t\tchildScope = null;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (block) {\r\n\t\t\t\t\t\t\tpreviousElements = getBlockElements(block.clone);\r\n\t\t\t\t\t\t\t$animate.leave(previousElements, function () {\r\n\t\t\t\t\t\t\t\tpreviousElements = null;\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tblock = null;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\t}];\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngInclude\r\n\t * @restrict ECA\r\n\t *\r\n\t * @description\r\n\t * Fetches, compiles and includes an external HTML fragment.\r\n\t *\r\n\t * By default, the template URL is restricted to the same domain and protocol as the\r\n\t * application document. This is done by calling {@link ng.$sce#getTrustedResourceUrl\r\n\t * $sce.getTrustedResourceUrl} on it. To load templates from other domains or protocols\r\n\t * you may either {@link ng.$sceDelegateProvider#resourceUrlWhitelist whitelist them} or\r\n\t * [wrap them](ng.$sce#trustAsResourceUrl) as trusted values. Refer to Angular's {@link\r\n\t * ng.$sce Strict Contextual Escaping}.\r\n\t *\r\n\t * In addition, the browser's\r\n\t * [Same Origin Policy](https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest)\r\n\t * and [Cross-Origin Resource Sharing (CORS)](http://www.w3.org/TR/cors/)\r\n\t * policy may further restrict whether the template is successfully loaded.\r\n\t * For example, `ngInclude` won't work for cross-domain requests on all browsers and for `file://`\r\n\t * access on some browsers.\r\n\t *\r\n\t * @animations\r\n\t * enter - animation is used to bring new content into the browser.\r\n\t * leave - animation is used to animate existing content away.\r\n\t *\r\n\t * The enter and leave animation occur concurrently.\r\n\t *\r\n\t * @scope\r\n\t * @priority 400\r\n\t *\r\n\t * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,\r\n\t * make sure you wrap it in **single** quotes, e.g. `src=\"'myPartialTemplate.html'\"`.\r\n\t * @param {string=} onload Expression to evaluate when a new partial is loaded.\r\n\t *\r\n\t * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll\r\n\t * $anchorScroll} to scroll the viewport after the content is loaded.\r\n\t *\r\n\t * - If the attribute is not set, disable scrolling.\r\n\t * - If the attribute is set without value, enable scrolling.\r\n\t * - Otherwise enable scrolling only if the expression evaluates to truthy value.\r\n\t *\r\n\t * @example\r\n\t <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\r\n\t\t<file name=\"index.html\">\r\n\t\t <div ng-controller=\"Ctrl\">\r\n\t\t <select ng-model=\"template\" ng-options=\"t.name for t in templates\">\r\n\t\t\t<option value=\"\">(blank)</option>\r\n\t\t </select>\r\n\t\t url of the template: <tt>{{template.url}}</tt>\r\n\t\t <hr/>\r\n\t\t <div class=\"slide-animate-container\">\r\n\t\t\t <div class=\"slide-animate\" ng-include=\"template.url\"></div>\r\n\t\t </div>\r\n\t\t </div>\r\n\t\t</file>\r\n\t\t<file name=\"script.js\">\r\n\t\t function Ctrl($scope) {\r\n\t\t\t$scope.templates =\r\n\t\t\t [ { name: 'template1.html', url: 'template1.html'},\r\n\t\t\t\t{ name: 'template2.html', url: 'template2.html'} ];\r\n\t\t\t$scope.template = $scope.templates[0];\r\n\t\t }\r\n\t\t </file>\r\n\t\t<file name=\"template1.html\">\r\n\t\t Content of template1.html\r\n\t\t</file>\r\n\t\t<file name=\"template2.html\">\r\n\t\t Content of template2.html\r\n\t\t</file>\r\n\t\t<file name=\"animations.css\">\r\n\t\t .slide-animate-container {\r\n\t\t\tposition:relative;\r\n\t\t\tbackground:white;\r\n\t\t\tborder:1px solid black;\r\n\t\t\theight:40px;\r\n\t\t\toverflow:hidden;\r\n\t\t }\r\n\t\r\n\t\t .slide-animate {\r\n\t\t\tpadding:10px;\r\n\t\t }\r\n\t\r\n\t\t .slide-animate.ng-enter, .slide-animate.ng-leave {\r\n\t\t\t-webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\r\n\t\t\ttransition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\r\n\t\r\n\t\t\tposition:absolute;\r\n\t\t\ttop:0;\r\n\t\t\tleft:0;\r\n\t\t\tright:0;\r\n\t\t\tbottom:0;\r\n\t\t\tdisplay:block;\r\n\t\t\tpadding:10px;\r\n\t\t }\r\n\t\r\n\t\t .slide-animate.ng-enter {\r\n\t\t\ttop:-50px;\r\n\t\t }\r\n\t\t .slide-animate.ng-enter.ng-enter-active {\r\n\t\t\ttop:0;\r\n\t\t }\r\n\t\r\n\t\t .slide-animate.ng-leave {\r\n\t\t\ttop:0;\r\n\t\t }\r\n\t\t .slide-animate.ng-leave.ng-leave-active {\r\n\t\t\ttop:50px;\r\n\t\t }\r\n\t\t</file>\r\n\t\t<file name=\"protractor.js\" type=\"protractor\">\r\n\t\t var templateSelect = element(by.model('template'));\r\n\t\t var includeElem = element(by.css('[ng-include]'));\r\n\t\r\n\t\t it('should load template1.html', function() {\r\n\t\t\texpect(includeElem.getText()).toMatch(/Content of template1.html/);\r\n\t\t });\r\n\t\r\n\t\t it('should load template2.html', function() {\r\n\t\t\tif (browser.params.browser == 'firefox') {\r\n\t\t\t // Firefox can't handle using selects\r\n\t\t\t // See https://github.com/angular/protractor/issues/480\r\n\t\t\t return;\r\n\t\t\t}\r\n\t\t\ttemplateSelect.click();\r\n\t\t\ttemplateSelect.element.all(by.css('option')).get(2).click();\r\n\t\t\texpect(includeElem.getText()).toMatch(/Content of template2.html/);\r\n\t\t });\r\n\t\r\n\t\t it('should change to blank', function() {\r\n\t\t\tif (browser.params.browser == 'firefox') {\r\n\t\t\t // Firefox can't handle using selects\r\n\t\t\t return;\r\n\t\t\t}\r\n\t\t\ttemplateSelect.click();\r\n\t\t\ttemplateSelect.element.all(by.css('option')).get(0).click();\r\n\t\t\texpect(includeElem.isPresent()).toBe(false);\r\n\t\t });\r\n\t\t</file>\r\n\t </example>\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc event\r\n\t * @name ngInclude#$includeContentRequested\r\n\t * @eventType emit on the scope ngInclude was declared in\r\n\t * @description\r\n\t * Emitted every time the ngInclude content is requested.\r\n\t */\r\n\r\n\r\n\t/**\r\n\t * @ngdoc event\r\n\t * @name ngInclude#$includeContentLoaded\r\n\t * @eventType emit on the current ngInclude scope\r\n\t * @description\r\n\t * Emitted every time the ngInclude content is reloaded.\r\n\t */\r\n\tvar ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$animate', '$sce',\r\n\t\t\t\t\t function ($http, $templateCache, $anchorScroll, $animate, $sce) {\r\n\t\t\t\t\t \treturn {\r\n\t\t\t\t\t \t\trestrict: 'ECA',\r\n\t\t\t\t\t \t\tpriority: 400,\r\n\t\t\t\t\t \t\tterminal: true,\r\n\t\t\t\t\t \t\ttransclude: 'element',\r\n\t\t\t\t\t \t\tcontroller: angular.noop,\r\n\t\t\t\t\t \t\tcompile: function (element, attr) {\r\n\t\t\t\t\t \t\t\tvar srcExp = attr.ngInclude || attr.src,\r\n\t\t\t\t\t\t\t\t\tonloadExp = attr.onload || '',\r\n\t\t\t\t\t\t\t\t\tautoScrollExp = attr.autoscroll;\r\n\r\n\t\t\t\t\t \t\t\treturn function (scope, $element, $attr, ctrl, $transclude) {\r\n\t\t\t\t\t \t\t\t\tvar changeCounter = 0,\r\n\t\t\t\t\t\t\t\t\t\tcurrentScope,\r\n\t\t\t\t\t\t\t\t\t\tpreviousElement,\r\n\t\t\t\t\t\t\t\t\t\tcurrentElement;\r\n\r\n\t\t\t\t\t \t\t\t\tvar cleanupLastIncludeContent = function () {\r\n\t\t\t\t\t \t\t\t\t\tif (previousElement) {\r\n\t\t\t\t\t \t\t\t\t\t\tpreviousElement.remove();\r\n\t\t\t\t\t \t\t\t\t\t\tpreviousElement = null;\r\n\t\t\t\t\t \t\t\t\t\t}\r\n\t\t\t\t\t \t\t\t\t\tif (currentScope) {\r\n\t\t\t\t\t \t\t\t\t\t\tcurrentScope.$destroy();\r\n\t\t\t\t\t \t\t\t\t\t\tcurrentScope = null;\r\n\t\t\t\t\t \t\t\t\t\t}\r\n\t\t\t\t\t \t\t\t\t\tif (currentElement) {\r\n\t\t\t\t\t \t\t\t\t\t\t$animate.leave(currentElement, function () {\r\n\t\t\t\t\t \t\t\t\t\t\t\tpreviousElement = null;\r\n\t\t\t\t\t \t\t\t\t\t\t});\r\n\t\t\t\t\t \t\t\t\t\t\tpreviousElement = currentElement;\r\n\t\t\t\t\t \t\t\t\t\t\tcurrentElement = null;\r\n\t\t\t\t\t \t\t\t\t\t}\r\n\t\t\t\t\t \t\t\t\t};\r\n\r\n\t\t\t\t\t \t\t\t\tscope.$watch($sce.parseAsResourceUrl(srcExp), function ngIncludeWatchAction(src) {\r\n\t\t\t\t\t \t\t\t\t\tvar afterAnimation = function () {\r\n\t\t\t\t\t \t\t\t\t\t\tif (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) {\r\n\t\t\t\t\t \t\t\t\t\t\t\t$anchorScroll();\r\n\t\t\t\t\t \t\t\t\t\t\t}\r\n\t\t\t\t\t \t\t\t\t\t};\r\n\t\t\t\t\t \t\t\t\t\tvar thisChangeId = ++changeCounter;\r\n\r\n\t\t\t\t\t \t\t\t\t\tif (src) {\r\n\t\t\t\t\t \t\t\t\t\t\t$http.get(src, { cache: $templateCache }).success(function (response) {\r\n\t\t\t\t\t \t\t\t\t\t\t\tif (thisChangeId !== changeCounter) return;\r\n\t\t\t\t\t \t\t\t\t\t\t\tvar newScope = scope.$new();\r\n\t\t\t\t\t \t\t\t\t\t\t\tctrl.template = response;\r\n\r\n\t\t\t\t\t \t\t\t\t\t\t\t// Note: This will also link all children of ng-include that were contained in the original\r\n\t\t\t\t\t \t\t\t\t\t\t\t// html. If that content contains controllers, ... they could pollute/change the scope.\r\n\t\t\t\t\t \t\t\t\t\t\t\t// However, using ng-include on an element with additional content does not make sense...\r\n\t\t\t\t\t \t\t\t\t\t\t\t// Note: We can't remove them in the cloneAttchFn of $transclude as that\r\n\t\t\t\t\t \t\t\t\t\t\t\t// function is called before linking the content, which would apply child\r\n\t\t\t\t\t \t\t\t\t\t\t\t// directives to non existing elements.\r\n\t\t\t\t\t \t\t\t\t\t\t\tvar clone = $transclude(newScope, function (clone) {\r\n\t\t\t\t\t \t\t\t\t\t\t\t\tcleanupLastIncludeContent();\r\n\t\t\t\t\t \t\t\t\t\t\t\t\t$animate.enter(clone, null, $element, afterAnimation);\r\n\t\t\t\t\t \t\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t \t\t\t\t\t\t\tcurrentScope = newScope;\r\n\t\t\t\t\t \t\t\t\t\t\t\tcurrentElement = clone;\r\n\r\n\t\t\t\t\t \t\t\t\t\t\t\tcurrentScope.$emit('$includeContentLoaded');\r\n\t\t\t\t\t \t\t\t\t\t\t\tscope.$eval(onloadExp);\r\n\t\t\t\t\t \t\t\t\t\t\t}).error(function () {\r\n\t\t\t\t\t \t\t\t\t\t\t\tif (thisChangeId === changeCounter) cleanupLastIncludeContent();\r\n\t\t\t\t\t \t\t\t\t\t\t});\r\n\t\t\t\t\t \t\t\t\t\t\tscope.$emit('$includeContentRequested');\r\n\t\t\t\t\t \t\t\t\t\t} else {\r\n\t\t\t\t\t \t\t\t\t\t\tcleanupLastIncludeContent();\r\n\t\t\t\t\t \t\t\t\t\t\tctrl.template = null;\r\n\t\t\t\t\t \t\t\t\t\t}\r\n\t\t\t\t\t \t\t\t\t});\r\n\t\t\t\t\t \t\t\t};\r\n\t\t\t\t\t \t\t}\r\n\t\t\t\t\t \t};\r\n\t\t\t\t\t }];\r\n\r\n\t// This directive is called during the $transclude call of the first `ngInclude` directive.\r\n\t// It will replace and compile the content of the element with the loaded template.\r\n\t// We need this directive so that the element content is already filled when\r\n\t// the link function of another directive on the same element as ngInclude\r\n\t// is called.\r\n\tvar ngIncludeFillContentDirective = ['$compile',\r\n\t function ($compile) {\r\n\t \treturn {\r\n\t \t\trestrict: 'ECA',\r\n\t \t\tpriority: -400,\r\n\t \t\trequire: 'ngInclude',\r\n\t \t\tlink: function (scope, $element, $attr, ctrl) {\r\n\t \t\t\t$element.html(ctrl.template);\r\n\t \t\t\t$compile($element.contents())(scope);\r\n\t \t\t}\r\n\t \t};\r\n\t }];\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngInit\r\n\t * @restrict AC\r\n\t *\r\n\t * @description\r\n\t * The `ngInit` directive allows you to evaluate an expression in the\r\n\t * current scope.\r\n\t *\r\n\t * <div class=\"alert alert-error\">\r\n\t * The only appropriate use of `ngInit` is for aliasing special properties of\r\n\t * {@link ng.directive:ngRepeat `ngRepeat`}, as seen in the demo below. Besides this case, you\r\n\t * should use {@link guide/controller controllers} rather than `ngInit`\r\n\t * to initialize values on a scope.\r\n\t * </div>\r\n\t * <div class=\"alert alert-warning\">\r\n\t * **Note**: If you have assignment in `ngInit` along with {@link ng.$filter `$filter`}, make\r\n\t * sure you have parenthesis for correct precedence:\r\n\t * <pre class=\"prettyprint\">\r\n\t * <div ng-init=\"test1 = (data | orderBy:'name')\"></div>\r\n\t * </pre>\r\n\t * </div>\r\n\t *\r\n\t * @priority 450\r\n\t *\r\n\t * @element ANY\r\n\t * @param {expression} ngInit {@link guide/expression Expression} to eval.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t <script>\r\n\t\t function Ctrl($scope) {\r\n\t\t $scope.list = [['a', 'b'], ['c', 'd']];\r\n\t\t }\r\n\t </script>\r\n\t <div ng-controller=\"Ctrl\">\r\n\t\t <div ng-repeat=\"innerList in list\" ng-init=\"outerIndex = $index\">\r\n\t\t <div ng-repeat=\"value in innerList\" ng-init=\"innerIndex = $index\">\r\n\t\t\t <span class=\"example-init\">list[ {{outerIndex}} ][ {{innerIndex}} ] = {{value}};</span>\r\n\t\t </div>\r\n\t\t </div>\r\n\t </div>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should alias index positions', function() {\r\n\t\t\t var elements = element.all(by.css('.example-init'));\r\n\t\t\t expect(elements.get(0).getText()).toBe('list[ 0 ][ 0 ] = a;');\r\n\t\t\t expect(elements.get(1).getText()).toBe('list[ 0 ][ 1 ] = b;');\r\n\t\t\t expect(elements.get(2).getText()).toBe('list[ 1 ][ 0 ] = c;');\r\n\t\t\t expect(elements.get(3).getText()).toBe('list[ 1 ][ 1 ] = d;');\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tvar ngInitDirective = ngDirective({\r\n\t\tpriority: 450,\r\n\t\tcompile: function () {\r\n\t\t\treturn {\r\n\t\t\t\tpre: function (scope, element, attrs) {\r\n\t\t\t\t\tscope.$eval(attrs.ngInit);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\t});\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngNonBindable\r\n\t * @restrict AC\r\n\t * @priority 1000\r\n\t *\r\n\t * @description\r\n\t * The `ngNonBindable` directive tells Angular not to compile or bind the contents of the current\r\n\t * DOM element. This is useful if the element contains what appears to be Angular directives and\r\n\t * bindings but which should be ignored by Angular. This could be the case if you have a site that\r\n\t * displays snippets of code, for instance.\r\n\t *\r\n\t * @element ANY\r\n\t *\r\n\t * @example\r\n\t * In this example there are two locations where a simple interpolation binding (`{{}}`) is present,\r\n\t * but the one wrapped in `ngNonBindable` is left alone.\r\n\t *\r\n\t * @example\r\n\t\t<example>\r\n\t\t <file name=\"index.html\">\r\n\t\t\t<div>Normal: {{1 + 2}}</div>\r\n\t\t\t<div ng-non-bindable>Ignored: {{1 + 2}}</div>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should check ng-non-bindable', function() {\r\n\t\t\t expect(element(by.binding('1 + 2')).getText()).toContain('3');\r\n\t\t\t expect(element.all(by.css('div')).last().getText()).toMatch(/1 \\+ 2/);\r\n\t\t });\r\n\t\t </file>\r\n\t\t</example>\r\n\t */\r\n\tvar ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngPluralize\r\n\t * @restrict EA\r\n\t *\r\n\t * @description\r\n\t * `ngPluralize` is a directive that displays messages according to en-US localization rules.\r\n\t * These rules are bundled with angular.js, but can be overridden\r\n\t * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive\r\n\t * by specifying the mappings between\r\n\t * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\r\n\t * and the strings to be displayed.\r\n\t *\r\n\t * # Plural categories and explicit number rules\r\n\t * There are two\r\n\t * [plural categories](http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html)\r\n\t * in Angular's default en-US locale: \"one\" and \"other\".\r\n\t *\r\n\t * While a plural category may match many numbers (for example, in en-US locale, \"other\" can match\r\n\t * any number that is not 1), an explicit number rule can only match one number. For example, the\r\n\t * explicit number rule for \"3\" matches the number 3. There are examples of plural categories\r\n\t * and explicit number rules throughout the rest of this documentation.\r\n\t *\r\n\t * # Configuring ngPluralize\r\n\t * You configure ngPluralize by providing 2 attributes: `count` and `when`.\r\n\t * You can also provide an optional attribute, `offset`.\r\n\t *\r\n\t * The value of the `count` attribute can be either a string or an {@link guide/expression\r\n\t * Angular expression}; these are evaluated on the current scope for its bound value.\r\n\t *\r\n\t * The `when` attribute specifies the mappings between plural categories and the actual\r\n\t * string to be displayed. The value of the attribute should be a JSON object.\r\n\t *\r\n\t * The following example shows how to configure ngPluralize:\r\n\t *\r\n\t * ```html\r\n\t * <ng-pluralize count=\"personCount\"\r\n\t\t\t\t\t when=\"{'0': 'Nobody is viewing.',\r\n\t * 'one': '1 person is viewing.',\r\n\t * 'other': '{} people are viewing.'}\">\r\n\t * </ng-pluralize>\r\n\t *```\r\n\t *\r\n\t * In the example, `\"0: Nobody is viewing.\"` is an explicit number rule. If you did not\r\n\t * specify this rule, 0 would be matched to the \"other\" category and \"0 people are viewing\"\r\n\t * would be shown instead of \"Nobody is viewing\". You can specify an explicit number rule for\r\n\t * other numbers, for example 12, so that instead of showing \"12 people are viewing\", you can\r\n\t * show \"a dozen people are viewing\".\r\n\t *\r\n\t * You can use a set of closed braces (`{}`) as a placeholder for the number that you want substituted\r\n\t * into pluralized strings. In the previous example, Angular will replace `{}` with\r\n\t * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder\r\n\t * for <span ng-non-bindable>{{numberExpression}}</span>.\r\n\t *\r\n\t * # Configuring ngPluralize with offset\r\n\t * The `offset` attribute allows further customization of pluralized text, which can result in\r\n\t * a better user experience. For example, instead of the message \"4 people are viewing this document\",\r\n\t * you might display \"John, Kate and 2 others are viewing this document\".\r\n\t * The offset attribute allows you to offset a number by any desired value.\r\n\t * Let's take a look at an example:\r\n\t *\r\n\t * ```html\r\n\t * <ng-pluralize count=\"personCount\" offset=2\r\n\t * when=\"{'0': 'Nobody is viewing.',\r\n\t * '1': '{{person1}} is viewing.',\r\n\t * '2': '{{person1}} and {{person2}} are viewing.',\r\n\t * 'one': '{{person1}}, {{person2}} and one other person are viewing.',\r\n\t * 'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\r\n\t * </ng-pluralize>\r\n\t * ```\r\n\t *\r\n\t * Notice that we are still using two plural categories(one, other), but we added\r\n\t * three explicit number rules 0, 1 and 2.\r\n\t * When one person, perhaps John, views the document, \"John is viewing\" will be shown.\r\n\t * When three people view the document, no explicit number rule is found, so\r\n\t * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.\r\n\t * In this case, plural category 'one' is matched and \"John, Mary and one other person are viewing\"\r\n\t * is shown.\r\n\t *\r\n\t * Note that when you specify offsets, you must provide explicit number rules for\r\n\t * numbers from 0 up to and including the offset. If you use an offset of 3, for example,\r\n\t * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for\r\n\t * plural categories \"one\" and \"other\".\r\n\t *\r\n\t * @param {string|expression} count The variable to be bound to.\r\n\t * @param {string} when The mapping between plural category to its corresponding strings.\r\n\t * @param {number=} offset Offset to deduct from the total number.\r\n\t *\r\n\t * @example\r\n\t\t<example>\r\n\t\t <file name=\"index.html\">\r\n\t\t\t<script>\r\n\t\t\t function Ctrl($scope) {\r\n\t\t\t\t$scope.person1 = 'Igor';\r\n\t\t\t\t$scope.person2 = 'Misko';\r\n\t\t\t\t$scope.personCount = 1;\r\n\t\t\t }\r\n\t\t\t</script>\r\n\t\t\t<div ng-controller=\"Ctrl\">\r\n\t\t\t Person 1:<input type=\"text\" ng-model=\"person1\" value=\"Igor\" /><br/>\r\n\t\t\t Person 2:<input type=\"text\" ng-model=\"person2\" value=\"Misko\" /><br/>\r\n\t\t\t Number of People:<input type=\"text\" ng-model=\"personCount\" value=\"1\" /><br/>\r\n\t\r\n\t\t\t <!--- Example with simple pluralization rules for en locale --->\r\n\t\t\t Without Offset:\r\n\t\t\t <ng-pluralize count=\"personCount\"\r\n\t\t\t\t\t\t\twhen=\"{'0': 'Nobody is viewing.',\r\n\t\t\t\t\t\t\t\t 'one': '1 person is viewing.',\r\n\t\t\t\t\t\t\t\t 'other': '{} people are viewing.'}\">\r\n\t\t\t </ng-pluralize><br>\r\n\t\r\n\t\t\t <!--- Example with offset --->\r\n\t\t\t With Offset(2):\r\n\t\t\t <ng-pluralize count=\"personCount\" offset=2\r\n\t\t\t\t\t\t\twhen=\"{'0': 'Nobody is viewing.',\r\n\t\t\t\t\t\t\t\t '1': '{{person1}} is viewing.',\r\n\t\t\t\t\t\t\t\t '2': '{{person1}} and {{person2}} are viewing.',\r\n\t\t\t\t\t\t\t\t 'one': '{{person1}}, {{person2}} and one other person are viewing.',\r\n\t\t\t\t\t\t\t\t 'other': '{{person1}}, {{person2}} and {} other people are viewing.'}\">\r\n\t\t\t </ng-pluralize>\r\n\t\t\t</div>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\tit('should show correct pluralized string', function() {\r\n\t\t\t var withoutOffset = element.all(by.css('ng-pluralize')).get(0);\r\n\t\t\t var withOffset = element.all(by.css('ng-pluralize')).get(1);\r\n\t\t\t var countInput = element(by.model('personCount'));\r\n\t\r\n\t\t\t expect(withoutOffset.getText()).toEqual('1 person is viewing.');\r\n\t\t\t expect(withOffset.getText()).toEqual('Igor is viewing.');\r\n\t\r\n\t\t\t countInput.clear();\r\n\t\t\t countInput.sendKeys('0');\r\n\t\r\n\t\t\t expect(withoutOffset.getText()).toEqual('Nobody is viewing.');\r\n\t\t\t expect(withOffset.getText()).toEqual('Nobody is viewing.');\r\n\t\r\n\t\t\t countInput.clear();\r\n\t\t\t countInput.sendKeys('2');\r\n\t\r\n\t\t\t expect(withoutOffset.getText()).toEqual('2 people are viewing.');\r\n\t\t\t expect(withOffset.getText()).toEqual('Igor and Misko are viewing.');\r\n\t\r\n\t\t\t countInput.clear();\r\n\t\t\t countInput.sendKeys('3');\r\n\t\r\n\t\t\t expect(withoutOffset.getText()).toEqual('3 people are viewing.');\r\n\t\t\t expect(withOffset.getText()).toEqual('Igor, Misko and one other person are viewing.');\r\n\t\r\n\t\t\t countInput.clear();\r\n\t\t\t countInput.sendKeys('4');\r\n\t\r\n\t\t\t expect(withoutOffset.getText()).toEqual('4 people are viewing.');\r\n\t\t\t expect(withOffset.getText()).toEqual('Igor, Misko and 2 other people are viewing.');\r\n\t\t\t});\r\n\t\t\tit('should show data-bound names', function() {\r\n\t\t\t var withOffset = element.all(by.css('ng-pluralize')).get(1);\r\n\t\t\t var personCount = element(by.model('personCount'));\r\n\t\t\t var person1 = element(by.model('person1'));\r\n\t\t\t var person2 = element(by.model('person2'));\r\n\t\t\t personCount.clear();\r\n\t\t\t personCount.sendKeys('4');\r\n\t\t\t person1.clear();\r\n\t\t\t person1.sendKeys('Di');\r\n\t\t\t person2.clear();\r\n\t\t\t person2.sendKeys('Vojta');\r\n\t\t\t expect(withOffset.getText()).toEqual('Di, Vojta and 2 other people are viewing.');\r\n\t\t\t});\r\n\t\t </file>\r\n\t\t</example>\r\n\t */\r\n\tvar ngPluralizeDirective = ['$locale', '$interpolate', function ($locale, $interpolate) {\r\n\t\tvar BRACE = /{}/g;\r\n\t\treturn {\r\n\t\t\trestrict: 'EA',\r\n\t\t\tlink: function (scope, element, attr) {\r\n\t\t\t\tvar numberExp = attr.count,\r\n\t\t\t\t\twhenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs\r\n\t\t\t\t\toffset = attr.offset || 0,\r\n\t\t\t\t\twhens = scope.$eval(whenExp) || {},\r\n\t\t\t\t\twhensExpFns = {},\r\n\t\t\t\t\tstartSymbol = $interpolate.startSymbol(),\r\n\t\t\t\t\tendSymbol = $interpolate.endSymbol(),\r\n\t\t\t\t\tisWhen = /^when(Minus)?(.+)$/;\r\n\r\n\t\t\t\tforEach(attr, function (expression, attributeName) {\r\n\t\t\t\t\tif (isWhen.test(attributeName)) {\r\n\t\t\t\t\t\twhens[lowercase(attributeName.replace('when', '').replace('Minus', '-'))] =\r\n\t\t\t\t\t\t element.attr(attr.$attr[attributeName]);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tforEach(whens, function (expression, key) {\r\n\t\t\t\t\twhensExpFns[key] =\r\n\t\t\t\t\t $interpolate(expression.replace(BRACE, startSymbol + numberExp + '-' +\r\n\t\t\t\t\t\toffset + endSymbol));\r\n\t\t\t\t});\r\n\r\n\t\t\t\tscope.$watch(function ngPluralizeWatch() {\r\n\t\t\t\t\tvar value = parseFloat(scope.$eval(numberExp));\r\n\r\n\t\t\t\t\tif (!isNaN(value)) {\r\n\t\t\t\t\t\t//if explicit number rule such as 1, 2, 3... is defined, just use it. Otherwise,\r\n\t\t\t\t\t\t//check it against pluralization rules in $locale service\r\n\t\t\t\t\t\tif (!(value in whens)) value = $locale.pluralCat(value - offset);\r\n\t\t\t\t\t\treturn whensExpFns[value](scope, element, true);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn '';\r\n\t\t\t\t\t}\r\n\t\t\t\t}, function ngPluralizeWatchAction(newVal) {\r\n\t\t\t\t\telement.text(newVal);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\t}];\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngRepeat\r\n\t *\r\n\t * @description\r\n\t * The `ngRepeat` directive instantiates a template once per item from a collection. Each template\r\n\t * instance gets its own scope, where the given loop variable is set to the current collection item,\r\n\t * and `$index` is set to the item index or key.\r\n\t *\r\n\t * Special properties are exposed on the local scope of each template instance, including:\r\n\t *\r\n\t * | Variable | Type | Details |\r\n\t * |-----------|-----------------|-----------------------------------------------------------------------------|\r\n\t * | `$index` | {@type number} | iterator offset of the repeated element (0..length-1) |\r\n\t * | `$first` | {@type boolean} | true if the repeated element is first in the iterator. |\r\n\t * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. |\r\n\t * | `$last` | {@type boolean} | true if the repeated element is last in the iterator. |\r\n\t * | `$even` | {@type boolean} | true if the iterator position `$index` is even (otherwise false). |\r\n\t * | `$odd` | {@type boolean} | true if the iterator position `$index` is odd (otherwise false). |\r\n\t *\r\n\t * Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}.\r\n\t * This may be useful when, for instance, nesting ngRepeats.\r\n\t *\r\n\t * # Special repeat start and end points\r\n\t * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending\r\n\t * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.\r\n\t * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on)\r\n\t * up to and including the ending HTML tag where **ng-repeat-end** is placed.\r\n\t *\r\n\t * The example below makes use of this feature:\r\n\t * ```html\r\n\t * <header ng-repeat-start=\"item in items\">\r\n\t * Header {{ item }}\r\n\t * </header>\r\n\t * <div class=\"body\">\r\n\t * Body {{ item }}\r\n\t * </div>\r\n\t * <footer ng-repeat-end>\r\n\t * Footer {{ item }}\r\n\t * </footer>\r\n\t * ```\r\n\t *\r\n\t * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to:\r\n\t * ```html\r\n\t * <header>\r\n\t * Header A\r\n\t * </header>\r\n\t * <div class=\"body\">\r\n\t * Body A\r\n\t * </div>\r\n\t * <footer>\r\n\t * Footer A\r\n\t * </footer>\r\n\t * <header>\r\n\t * Header B\r\n\t * </header>\r\n\t * <div class=\"body\">\r\n\t * Body B\r\n\t * </div>\r\n\t * <footer>\r\n\t * Footer B\r\n\t * </footer>\r\n\t * ```\r\n\t *\r\n\t * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such\r\n\t * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**).\r\n\t *\r\n\t * @animations\r\n\t * **.enter** - when a new item is added to the list or when an item is revealed after a filter\r\n\t *\r\n\t * **.leave** - when an item is removed from the list or when an item is filtered out\r\n\t *\r\n\t * **.move** - when an adjacent item is filtered out causing a reorder or when the item contents are reordered\r\n\t *\r\n\t * @element ANY\r\n\t * @scope\r\n\t * @priority 1000\r\n\t * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These\r\n\t * formats are currently supported:\r\n\t *\r\n\t * * `variable in expression` – where variable is the user defined loop variable and `expression`\r\n\t * is a scope expression giving the collection to enumerate.\r\n\t *\r\n\t * For example: `album in artist.albums`.\r\n\t *\r\n\t * * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers,\r\n\t * and `expression` is the scope expression giving the collection to enumerate.\r\n\t *\r\n\t * For example: `(name, age) in {'adam':10, 'amalie':12}`.\r\n\t *\r\n\t * * `variable in expression track by tracking_expression` – You can also provide an optional tracking function\r\n\t * which can be used to associate the objects in the collection with the DOM elements. If no tracking function\r\n\t * is specified the ng-repeat associates elements by identity in the collection. It is an error to have\r\n\t * more than one tracking function to resolve to the same key. (This would mean that two distinct objects are\r\n\t * mapped to the same DOM element, which is not possible.) Filters should be applied to the expression,\r\n\t * before specifying a tracking expression.\r\n\t *\r\n\t * For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements\r\n\t * will be associated by item identity in the array.\r\n\t *\r\n\t * For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique\r\n\t * `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements\r\n\t * with the corresponding item in the array by identity. Moving the same object in array would move the DOM\r\n\t * element in the same way in the DOM.\r\n\t *\r\n\t * For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this\r\n\t * case the object identity does not matter. Two objects are considered equivalent as long as their `id`\r\n\t * property is same.\r\n\t *\r\n\t * For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter\r\n\t * to items in conjunction with a tracking expression.\r\n\t *\r\n\t * @example\r\n\t * This example initializes the scope to a list of names and\r\n\t * then uses `ngRepeat` to display every person:\r\n\t <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\r\n\t\t<file name=\"index.html\">\r\n\t\t <div ng-init=\"friends = [\r\n\t\t\t{name:'John', age:25, gender:'boy'},\r\n\t\t\t{name:'Jessie', age:30, gender:'girl'},\r\n\t\t\t{name:'Johanna', age:28, gender:'girl'},\r\n\t\t\t{name:'Joy', age:15, gender:'girl'},\r\n\t\t\t{name:'Mary', age:28, gender:'girl'},\r\n\t\t\t{name:'Peter', age:95, gender:'boy'},\r\n\t\t\t{name:'Sebastian', age:50, gender:'boy'},\r\n\t\t\t{name:'Erika', age:27, gender:'girl'},\r\n\t\t\t{name:'Patrick', age:40, gender:'boy'},\r\n\t\t\t{name:'Samantha', age:60, gender:'girl'}\r\n\t\t ]\">\r\n\t\t\tI have {{friends.length}} friends. They are:\r\n\t\t\t<input type=\"search\" ng-model=\"q\" placeholder=\"filter friends...\" />\r\n\t\t\t<ul class=\"example-animate-container\">\r\n\t\t\t <li class=\"animate-repeat\" ng-repeat=\"friend in friends | filter:q\">\r\n\t\t\t\t[{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.\r\n\t\t\t </li>\r\n\t\t\t</ul>\r\n\t\t </div>\r\n\t\t</file>\r\n\t\t<file name=\"animations.css\">\r\n\t\t .example-animate-container {\r\n\t\t\tbackground:white;\r\n\t\t\tborder:1px solid black;\r\n\t\t\tlist-style:none;\r\n\t\t\tmargin:0;\r\n\t\t\tpadding:0 10px;\r\n\t\t }\r\n\t\r\n\t\t .animate-repeat {\r\n\t\t\tline-height:40px;\r\n\t\t\tlist-style:none;\r\n\t\t\tbox-sizing:border-box;\r\n\t\t }\r\n\t\r\n\t\t .animate-repeat.ng-move,\r\n\t\t .animate-repeat.ng-enter,\r\n\t\t .animate-repeat.ng-leave {\r\n\t\t\t-webkit-transition:all linear 0.5s;\r\n\t\t\ttransition:all linear 0.5s;\r\n\t\t }\r\n\t\r\n\t\t .animate-repeat.ng-leave.ng-leave-active,\r\n\t\t .animate-repeat.ng-move,\r\n\t\t .animate-repeat.ng-enter {\r\n\t\t\topacity:0;\r\n\t\t\tmax-height:0;\r\n\t\t }\r\n\t\r\n\t\t .animate-repeat.ng-leave,\r\n\t\t .animate-repeat.ng-move.ng-move-active,\r\n\t\t .animate-repeat.ng-enter.ng-enter-active {\r\n\t\t\topacity:1;\r\n\t\t\tmax-height:40px;\r\n\t\t }\r\n\t\t</file>\r\n\t\t<file name=\"protractor.js\" type=\"protractor\">\r\n\t\t var friends = element.all(by.repeater('friend in friends'));\r\n\t\r\n\t\t it('should render initial data set', function() {\r\n\t\t\texpect(friends.count()).toBe(10);\r\n\t\t\texpect(friends.get(0).getText()).toEqual('[1] John who is 25 years old.');\r\n\t\t\texpect(friends.get(1).getText()).toEqual('[2] Jessie who is 30 years old.');\r\n\t\t\texpect(friends.last().getText()).toEqual('[10] Samantha who is 60 years old.');\r\n\t\t\texpect(element(by.binding('friends.length')).getText())\r\n\t\t\t\t.toMatch(\"I have 10 friends. They are:\");\r\n\t\t });\r\n\t\r\n\t\t it('should update repeater when filter predicate changes', function() {\r\n\t\t\t expect(friends.count()).toBe(10);\r\n\t\r\n\t\t\t element(by.model('q')).sendKeys('ma');\r\n\t\r\n\t\t\t expect(friends.count()).toBe(2);\r\n\t\t\t expect(friends.get(0).getText()).toEqual('[1] Mary who is 28 years old.');\r\n\t\t\t expect(friends.last().getText()).toEqual('[2] Samantha who is 60 years old.');\r\n\t\t });\r\n\t\t </file>\r\n\t\t</example>\r\n\t */\r\n\tvar ngRepeatDirective = ['$parse', '$animate', function ($parse, $animate) {\r\n\t\tvar NG_REMOVED = '$$NG_REMOVED';\r\n\t\tvar ngRepeatMinErr = minErr('ngRepeat');\r\n\t\treturn {\r\n\t\t\ttransclude: 'element',\r\n\t\t\tpriority: 1000,\r\n\t\t\tterminal: true,\r\n\t\t\t$$tlb: true,\r\n\t\t\tlink: function ($scope, $element, $attr, ctrl, $transclude) {\r\n\t\t\t\tvar expression = $attr.ngRepeat;\r\n\t\t\t\tvar match = expression.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/),\r\n\t\t\t\t trackByExp, trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn,\r\n\t\t\t\t lhs, rhs, valueIdentifier, keyIdentifier,\r\n\t\t\t\t hashFnLocals = { $id: hashKey };\r\n\r\n\t\t\t\tif (!match) {\r\n\t\t\t\t\tthrow ngRepeatMinErr('iexp', \"Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.\",\r\n\t\t\t\t\t expression);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlhs = match[1];\r\n\t\t\t\trhs = match[2];\r\n\t\t\t\ttrackByExp = match[3];\r\n\r\n\t\t\t\tif (trackByExp) {\r\n\t\t\t\t\ttrackByExpGetter = $parse(trackByExp);\r\n\t\t\t\t\ttrackByIdExpFn = function (key, value, index) {\r\n\t\t\t\t\t\t// assign key, value, and $index to the locals so that they can be used in hash functions\r\n\t\t\t\t\t\tif (keyIdentifier) hashFnLocals[keyIdentifier] = key;\r\n\t\t\t\t\t\thashFnLocals[valueIdentifier] = value;\r\n\t\t\t\t\t\thashFnLocals.$index = index;\r\n\t\t\t\t\t\treturn trackByExpGetter($scope, hashFnLocals);\r\n\t\t\t\t\t};\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttrackByIdArrayFn = function (key, value) {\r\n\t\t\t\t\t\treturn hashKey(value);\r\n\t\t\t\t\t};\r\n\t\t\t\t\ttrackByIdObjFn = function (key) {\r\n\t\t\t\t\t\treturn key;\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmatch = lhs.match(/^(?:([\\$\\w]+)|\\(([\\$\\w]+)\\s*,\\s*([\\$\\w]+)\\))$/);\r\n\t\t\t\tif (!match) {\r\n\t\t\t\t\tthrow ngRepeatMinErr('iidexp', \"'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t lhs);\r\n\t\t\t\t}\r\n\t\t\t\tvalueIdentifier = match[3] || match[1];\r\n\t\t\t\tkeyIdentifier = match[2];\r\n\r\n\t\t\t\t// Store a list of elements from previous run. This is a hash where key is the item from the\r\n\t\t\t\t// iterator, and the value is objects with following properties.\r\n\t\t\t\t// - scope: bound scope\r\n\t\t\t\t// - element: previous element.\r\n\t\t\t\t// - index: position\r\n\t\t\t\tvar lastBlockMap = {};\r\n\r\n\t\t\t\t//watch props\r\n\t\t\t\t$scope.$watchCollection(rhs, function ngRepeatAction(collection) {\r\n\t\t\t\t\tvar index, length,\r\n\t\t\t\t\t\tpreviousNode = $element[0], // current position of the node\r\n\t\t\t\t\t\tnextNode,\r\n\t\t\t\t\t\t// Same as lastBlockMap but it has the current state. It will become the\r\n\t\t\t\t\t\t// lastBlockMap on the next iteration.\r\n\t\t\t\t\t\tnextBlockMap = {},\r\n\t\t\t\t\t\tarrayLength,\r\n\t\t\t\t\t\tchildScope,\r\n\t\t\t\t\t\tkey, value, // key/value of iteration\r\n\t\t\t\t\t\ttrackById,\r\n\t\t\t\t\t\ttrackByIdFn,\r\n\t\t\t\t\t\tcollectionKeys,\r\n\t\t\t\t\t\tblock, // last object information {scope, element, id}\r\n\t\t\t\t\t\tnextBlockOrder = [],\r\n\t\t\t\t\t\telementsToRemove;\r\n\r\n\r\n\t\t\t\t\tif (isArrayLike(collection)) {\r\n\t\t\t\t\t\tcollectionKeys = collection;\r\n\t\t\t\t\t\ttrackByIdFn = trackByIdExpFn || trackByIdArrayFn;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\ttrackByIdFn = trackByIdExpFn || trackByIdObjFn;\r\n\t\t\t\t\t\t// if object, extract keys, sort them and use to determine order of iteration over obj props\r\n\t\t\t\t\t\tcollectionKeys = [];\r\n\t\t\t\t\t\tfor (key in collection) {\r\n\t\t\t\t\t\t\tif (collection.hasOwnProperty(key) && key.charAt(0) != '$') {\r\n\t\t\t\t\t\t\t\tcollectionKeys.push(key);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcollectionKeys.sort();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tarrayLength = collectionKeys.length;\r\n\r\n\t\t\t\t\t// locate existing items\r\n\t\t\t\t\tlength = nextBlockOrder.length = collectionKeys.length;\r\n\t\t\t\t\tfor (index = 0; index < length; index++) {\r\n\t\t\t\t\t\tkey = (collection === collectionKeys) ? index : collectionKeys[index];\r\n\t\t\t\t\t\tvalue = collection[key];\r\n\t\t\t\t\t\ttrackById = trackByIdFn(key, value, index);\r\n\t\t\t\t\t\tassertNotHasOwnProperty(trackById, '`track by` id');\r\n\t\t\t\t\t\tif (lastBlockMap.hasOwnProperty(trackById)) {\r\n\t\t\t\t\t\t\tblock = lastBlockMap[trackById];\r\n\t\t\t\t\t\t\tdelete lastBlockMap[trackById];\r\n\t\t\t\t\t\t\tnextBlockMap[trackById] = block;\r\n\t\t\t\t\t\t\tnextBlockOrder[index] = block;\r\n\t\t\t\t\t\t} else if (nextBlockMap.hasOwnProperty(trackById)) {\r\n\t\t\t\t\t\t\t// restore lastBlockMap\r\n\t\t\t\t\t\t\tforEach(nextBlockOrder, function (block) {\r\n\t\t\t\t\t\t\t\tif (block && block.scope) lastBlockMap[block.id] = block;\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t// This is a duplicate and we need to throw an error\r\n\t\t\t\t\t\t\tthrow ngRepeatMinErr('dupes', \"Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t expression, trackById);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// new never before seen block\r\n\t\t\t\t\t\t\tnextBlockOrder[index] = { id: trackById };\r\n\t\t\t\t\t\t\tnextBlockMap[trackById] = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// remove existing items\r\n\t\t\t\t\tfor (key in lastBlockMap) {\r\n\t\t\t\t\t\t// lastBlockMap is our own object so we don't need to use special hasOwnPropertyFn\r\n\t\t\t\t\t\tif (lastBlockMap.hasOwnProperty(key)) {\r\n\t\t\t\t\t\t\tblock = lastBlockMap[key];\r\n\t\t\t\t\t\t\telementsToRemove = getBlockElements(block.clone);\r\n\t\t\t\t\t\t\t$animate.leave(elementsToRemove);\r\n\t\t\t\t\t\t\tforEach(elementsToRemove, function (element) { element[NG_REMOVED] = true; });\r\n\t\t\t\t\t\t\tblock.scope.$destroy();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// we are not using forEach for perf reasons (trying to avoid #call)\r\n\t\t\t\t\tfor (index = 0, length = collectionKeys.length; index < length; index++) {\r\n\t\t\t\t\t\tkey = (collection === collectionKeys) ? index : collectionKeys[index];\r\n\t\t\t\t\t\tvalue = collection[key];\r\n\t\t\t\t\t\tblock = nextBlockOrder[index];\r\n\t\t\t\t\t\tif (nextBlockOrder[index - 1]) previousNode = getBlockEnd(nextBlockOrder[index - 1]);\r\n\r\n\t\t\t\t\t\tif (block.scope) {\r\n\t\t\t\t\t\t\t// if we have already seen this object, then we need to reuse the\r\n\t\t\t\t\t\t\t// associated scope/element\r\n\t\t\t\t\t\t\tchildScope = block.scope;\r\n\r\n\t\t\t\t\t\t\tnextNode = previousNode;\r\n\t\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\t\tnextNode = nextNode.nextSibling;\r\n\t\t\t\t\t\t\t} while (nextNode && nextNode[NG_REMOVED]);\r\n\r\n\t\t\t\t\t\t\tif (getBlockStart(block) != nextNode) {\r\n\t\t\t\t\t\t\t\t// existing item which got moved\r\n\t\t\t\t\t\t\t\t$animate.move(getBlockElements(block.clone), null, jqLite(previousNode));\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tpreviousNode = getBlockEnd(block);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// new item which we don't know about\r\n\t\t\t\t\t\t\tchildScope = $scope.$new();\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tchildScope[valueIdentifier] = value;\r\n\t\t\t\t\t\tif (keyIdentifier) childScope[keyIdentifier] = key;\r\n\t\t\t\t\t\tchildScope.$index = index;\r\n\t\t\t\t\t\tchildScope.$first = (index === 0);\r\n\t\t\t\t\t\tchildScope.$last = (index === (arrayLength - 1));\r\n\t\t\t\t\t\tchildScope.$middle = !(childScope.$first || childScope.$last);\r\n\t\t\t\t\t\t// jshint bitwise: false\r\n\t\t\t\t\t\tchildScope.$odd = !(childScope.$even = (index & 1) === 0);\r\n\t\t\t\t\t\t// jshint bitwise: true\r\n\r\n\t\t\t\t\t\tif (!block.scope) {\r\n\t\t\t\t\t\t\t$transclude(childScope, function (clone) {\r\n\t\t\t\t\t\t\t\tclone[clone.length++] = document.createComment(' end ngRepeat: ' + expression + ' ');\r\n\t\t\t\t\t\t\t\t$animate.enter(clone, null, jqLite(previousNode));\r\n\t\t\t\t\t\t\t\tpreviousNode = clone;\r\n\t\t\t\t\t\t\t\tblock.scope = childScope;\r\n\t\t\t\t\t\t\t\t// Note: We only need the first/last node of the cloned nodes.\r\n\t\t\t\t\t\t\t\t// However, we need to keep the reference to the jqlite wrapper as it might be changed later\r\n\t\t\t\t\t\t\t\t// by a directive with templateUrl when its template arrives.\r\n\t\t\t\t\t\t\t\tblock.clone = clone;\r\n\t\t\t\t\t\t\t\tnextBlockMap[block.id] = block;\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlastBlockMap = nextBlockMap;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tfunction getBlockStart(block) {\r\n\t\t\treturn block.clone[0];\r\n\t\t}\r\n\r\n\t\tfunction getBlockEnd(block) {\r\n\t\t\treturn block.clone[block.clone.length - 1];\r\n\t\t}\r\n\t}];\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngShow\r\n\t *\r\n\t * @description\r\n\t * The `ngShow` directive shows or hides the given HTML element based on the expression\r\n\t * provided to the ngShow attribute. The element is shown or hidden by removing or adding\r\n\t * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined\r\n\t * in AngularJS and sets the display style to none (using an !important flag).\r\n\t * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\r\n\t *\r\n\t * ```html\r\n\t * <!-- when $scope.myValue is truthy (element is visible) -->\r\n\t * <div ng-show=\"myValue\"></div>\r\n\t *\r\n\t * <!-- when $scope.myValue is falsy (element is hidden) -->\r\n\t * <div ng-show=\"myValue\" class=\"ng-hide\"></div>\r\n\t * ```\r\n\t *\r\n\t * When the ngShow expression evaluates to false then the ng-hide CSS class is added to the class attribute\r\n\t * on the element causing it to become hidden. When true, the ng-hide CSS class is removed\r\n\t * from the element causing the element not to appear hidden.\r\n\t *\r\n\t * <div class=\"alert alert-warning\">\r\n\t * **Note:** Here is a list of values that ngShow will consider as a falsy value (case insensitive):<br />\r\n\t * \"f\" / \"0\" / \"false\" / \"no\" / \"n\" / \"[]\"\r\n\t * </div>\r\n\t *\r\n\t * ## Why is !important used?\r\n\t *\r\n\t * You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector\r\n\t * can be easily overridden by heavier selectors. For example, something as simple\r\n\t * as changing the display style on a HTML list item would make hidden elements appear visible.\r\n\t * This also becomes a bigger issue when dealing with CSS frameworks.\r\n\t *\r\n\t * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector\r\n\t * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the\r\n\t * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.\r\n\t *\r\n\t * ### Overriding .ng-hide\r\n\t *\r\n\t * By default, the `.ng-hide` class will style the element with `display:none!important`. If you wish to change\r\n\t * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`\r\n\t * class in CSS:\r\n\t *\r\n\t * ```css\r\n\t * .ng-hide {\r\n\t * //this is just another form of hiding an element\r\n\t * display:block!important;\r\n\t * position:absolute;\r\n\t * top:-9999px;\r\n\t * left:-9999px;\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * By default you don't need to override in CSS anything and the animations will work around the display style.\r\n\t *\r\n\t * ## A note about animations with ngShow\r\n\t *\r\n\t * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression\r\n\t * is true and false. This system works like the animation system present with ngClass except that\r\n\t * you must also include the !important flag to override the display property\r\n\t * so that you can perform an animation when the element is hidden during the time of the animation.\r\n\t *\r\n\t * ```css\r\n\t * //\r\n\t * //a working example can be found at the bottom of this page\r\n\t * //\r\n\t * .my-element.ng-hide-add, .my-element.ng-hide-remove {\r\n\t * transition:0.5s linear all;\r\n\t * }\r\n\t *\r\n\t * .my-element.ng-hide-add { ... }\r\n\t * .my-element.ng-hide-add.ng-hide-add-active { ... }\r\n\t * .my-element.ng-hide-remove { ... }\r\n\t * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\r\n\t * ```\r\n\t *\r\n\t * Keep in mind that, as of AngularJS version 1.2.17 (and 1.3.0-beta.11), there is no need to change the display\r\n\t * property to block during animation states--ngAnimate will handle the style toggling automatically for you.\r\n\t *\r\n\t * @animations\r\n\t * addClass: .ng-hide - happens after the ngShow expression evaluates to a truthy value and the just before contents are set to visible\r\n\t * removeClass: .ng-hide - happens after the ngShow expression evaluates to a non truthy value and just before the contents are set to hidden\r\n\t *\r\n\t * @element ANY\r\n\t * @param {expression} ngShow If the {@link guide/expression expression} is truthy\r\n\t * then the element is shown or hidden respectively.\r\n\t *\r\n\t * @example\r\n\t <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\r\n\t\t<file name=\"index.html\">\r\n\t\t Click me: <input type=\"checkbox\" ng-model=\"checked\"><br/>\r\n\t\t <div>\r\n\t\t\tShow:\r\n\t\t\t<div class=\"check-element animate-show\" ng-show=\"checked\">\r\n\t\t\t <span class=\"glyphicon glyphicon-thumbs-up\"></span> I show up when your checkbox is checked.\r\n\t\t\t</div>\r\n\t\t </div>\r\n\t\t <div>\r\n\t\t\tHide:\r\n\t\t\t<div class=\"check-element animate-show\" ng-hide=\"checked\">\r\n\t\t\t <span class=\"glyphicon glyphicon-thumbs-down\"></span> I hide when your checkbox is checked.\r\n\t\t\t</div>\r\n\t\t </div>\r\n\t\t</file>\r\n\t\t<file name=\"glyphicons.css\">\r\n\t\t @import url(//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css);\r\n\t\t</file>\r\n\t\t<file name=\"animations.css\">\r\n\t\t .animate-show {\r\n\t\t\t-webkit-transition:all linear 0.5s;\r\n\t\t\ttransition:all linear 0.5s;\r\n\t\t\tline-height:20px;\r\n\t\t\topacity:1;\r\n\t\t\tpadding:10px;\r\n\t\t\tborder:1px solid black;\r\n\t\t\tbackground:white;\r\n\t\t }\r\n\t\r\n\t\t .animate-show.ng-hide {\r\n\t\t\tline-height:0;\r\n\t\t\topacity:0;\r\n\t\t\tpadding:0 10px;\r\n\t\t }\r\n\t\r\n\t\t .check-element {\r\n\t\t\tpadding:10px;\r\n\t\t\tborder:1px solid black;\r\n\t\t\tbackground:white;\r\n\t\t }\r\n\t\t</file>\r\n\t\t<file name=\"protractor.js\" type=\"protractor\">\r\n\t\t var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));\r\n\t\t var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));\r\n\t\r\n\t\t it('should check ng-show / ng-hide', function() {\r\n\t\t\texpect(thumbsUp.isDisplayed()).toBeFalsy();\r\n\t\t\texpect(thumbsDown.isDisplayed()).toBeTruthy();\r\n\t\r\n\t\t\telement(by.model('checked')).click();\r\n\t\r\n\t\t\texpect(thumbsUp.isDisplayed()).toBeTruthy();\r\n\t\t\texpect(thumbsDown.isDisplayed()).toBeFalsy();\r\n\t\t });\r\n\t\t</file>\r\n\t </example>\r\n\t */\r\n\tvar ngShowDirective = ['$animate', function ($animate) {\r\n\t\treturn function (scope, element, attr) {\r\n\t\t\tscope.$watch(attr.ngShow, function ngShowWatchAction(value) {\r\n\t\t\t\t$animate[toBoolean(value) ? 'removeClass' : 'addClass'](element, 'ng-hide');\r\n\t\t\t});\r\n\t\t};\r\n\t}];\r\n\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngHide\r\n\t *\r\n\t * @description\r\n\t * The `ngHide` directive shows or hides the given HTML element based on the expression\r\n\t * provided to the ngHide attribute. The element is shown or hidden by removing or adding\r\n\t * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined\r\n\t * in AngularJS and sets the display style to none (using an !important flag).\r\n\t * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).\r\n\t *\r\n\t * ```html\r\n\t * <!-- when $scope.myValue is truthy (element is hidden) -->\r\n\t * <div ng-hide=\"myValue\" class=\"ng-hide\"></div>\r\n\t *\r\n\t * <!-- when $scope.myValue is falsy (element is visible) -->\r\n\t * <div ng-hide=\"myValue\"></div>\r\n\t * ```\r\n\t *\r\n\t * When the ngHide expression evaluates to true then the .ng-hide CSS class is added to the class attribute\r\n\t * on the element causing it to become hidden. When false, the ng-hide CSS class is removed\r\n\t * from the element causing the element not to appear hidden.\r\n\t *\r\n\t * <div class=\"alert alert-warning\">\r\n\t * **Note:** Here is a list of values that ngHide will consider as a falsy value (case insensitive):<br />\r\n\t * \"f\" / \"0\" / \"false\" / \"no\" / \"n\" / \"[]\"\r\n\t * </div>\r\n\t *\r\n\t * ## Why is !important used?\r\n\t *\r\n\t * You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector\r\n\t * can be easily overridden by heavier selectors. For example, something as simple\r\n\t * as changing the display style on a HTML list item would make hidden elements appear visible.\r\n\t * This also becomes a bigger issue when dealing with CSS frameworks.\r\n\t *\r\n\t * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector\r\n\t * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the\r\n\t * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.\r\n\t *\r\n\t * ### Overriding .ng-hide\r\n\t *\r\n\t * By default, the `.ng-hide` class will style the element with `display:none!important`. If you wish to change\r\n\t * the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`\r\n\t * class in CSS:\r\n\t *\r\n\t * ```css\r\n\t * .ng-hide {\r\n\t * //this is just another form of hiding an element\r\n\t * display:block!important;\r\n\t * position:absolute;\r\n\t * top:-9999px;\r\n\t * left:-9999px;\r\n\t * }\r\n\t * ```\r\n\t *\r\n\t * By default you don't need to override in CSS anything and the animations will work around the display style.\r\n\t *\r\n\t * ## A note about animations with ngHide\r\n\t *\r\n\t * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression\r\n\t * is true and false. This system works like the animation system present with ngClass, except that the `.ng-hide`\r\n\t * CSS class is added and removed for you instead of your own CSS class.\r\n\t *\r\n\t * ```css\r\n\t * //\r\n\t * //a working example can be found at the bottom of this page\r\n\t * //\r\n\t * .my-element.ng-hide-add, .my-element.ng-hide-remove {\r\n\t * transition:0.5s linear all;\r\n\t * }\r\n\t *\r\n\t * .my-element.ng-hide-add { ... }\r\n\t * .my-element.ng-hide-add.ng-hide-add-active { ... }\r\n\t * .my-element.ng-hide-remove { ... }\r\n\t * .my-element.ng-hide-remove.ng-hide-remove-active { ... }\r\n\t * ```\r\n\t *\r\n\t * Keep in mind that, as of AngularJS version 1.2.17 (and 1.3.0-beta.11), there is no need to change the display\r\n\t * property to block during animation states--ngAnimate will handle the style toggling automatically for you.\r\n\t *\r\n\t * @animations\r\n\t * removeClass: .ng-hide - happens after the ngHide expression evaluates to a truthy value and just before the contents are set to hidden\r\n\t * addClass: .ng-hide - happens after the ngHide expression evaluates to a non truthy value and just before the contents are set to visible\r\n\t *\r\n\t * @element ANY\r\n\t * @param {expression} ngHide If the {@link guide/expression expression} is truthy then\r\n\t * the element is shown or hidden respectively.\r\n\t *\r\n\t * @example\r\n\t <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\r\n\t\t<file name=\"index.html\">\r\n\t\t Click me: <input type=\"checkbox\" ng-model=\"checked\"><br/>\r\n\t\t <div>\r\n\t\t\tShow:\r\n\t\t\t<div class=\"check-element animate-hide\" ng-show=\"checked\">\r\n\t\t\t <span class=\"glyphicon glyphicon-thumbs-up\"></span> I show up when your checkbox is checked.\r\n\t\t\t</div>\r\n\t\t </div>\r\n\t\t <div>\r\n\t\t\tHide:\r\n\t\t\t<div class=\"check-element animate-hide\" ng-hide=\"checked\">\r\n\t\t\t <span class=\"glyphicon glyphicon-thumbs-down\"></span> I hide when your checkbox is checked.\r\n\t\t\t</div>\r\n\t\t </div>\r\n\t\t</file>\r\n\t\t<file name=\"glyphicons.css\">\r\n\t\t @import url(//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap-glyphicons.css);\r\n\t\t</file>\r\n\t\t<file name=\"animations.css\">\r\n\t\t .animate-hide {\r\n\t\t\t-webkit-transition:all linear 0.5s;\r\n\t\t\ttransition:all linear 0.5s;\r\n\t\t\tline-height:20px;\r\n\t\t\topacity:1;\r\n\t\t\tpadding:10px;\r\n\t\t\tborder:1px solid black;\r\n\t\t\tbackground:white;\r\n\t\t }\r\n\t\r\n\t\t .animate-hide.ng-hide {\r\n\t\t\tline-height:0;\r\n\t\t\topacity:0;\r\n\t\t\tpadding:0 10px;\r\n\t\t }\r\n\t\r\n\t\t .check-element {\r\n\t\t\tpadding:10px;\r\n\t\t\tborder:1px solid black;\r\n\t\t\tbackground:white;\r\n\t\t }\r\n\t\t</file>\r\n\t\t<file name=\"protractor.js\" type=\"protractor\">\r\n\t\t var thumbsUp = element(by.css('span.glyphicon-thumbs-up'));\r\n\t\t var thumbsDown = element(by.css('span.glyphicon-thumbs-down'));\r\n\t\r\n\t\t it('should check ng-show / ng-hide', function() {\r\n\t\t\texpect(thumbsUp.isDisplayed()).toBeFalsy();\r\n\t\t\texpect(thumbsDown.isDisplayed()).toBeTruthy();\r\n\t\r\n\t\t\telement(by.model('checked')).click();\r\n\t\r\n\t\t\texpect(thumbsUp.isDisplayed()).toBeTruthy();\r\n\t\t\texpect(thumbsDown.isDisplayed()).toBeFalsy();\r\n\t\t });\r\n\t\t</file>\r\n\t </example>\r\n\t */\r\n\tvar ngHideDirective = ['$animate', function ($animate) {\r\n\t\treturn function (scope, element, attr) {\r\n\t\t\tscope.$watch(attr.ngHide, function ngHideWatchAction(value) {\r\n\t\t\t\t$animate[toBoolean(value) ? 'addClass' : 'removeClass'](element, 'ng-hide');\r\n\t\t\t});\r\n\t\t};\r\n\t}];\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngStyle\r\n\t * @restrict AC\r\n\t *\r\n\t * @description\r\n\t * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.\r\n\t *\r\n\t * @element ANY\r\n\t * @param {expression} ngStyle\r\n\t *\r\n\t * {@link guide/expression Expression} which evals to an\r\n\t * object whose keys are CSS style names and values are corresponding values for those CSS\r\n\t * keys.\r\n\t *\r\n\t * Since some CSS style names are not valid keys for an object, they must be quoted.\r\n\t * See the 'background-color' style in the example below.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t <file name=\"index.html\">\r\n\t\t\t<input type=\"button\" value=\"set color\" ng-click=\"myStyle={color:'red'}\">\r\n\t\t\t<input type=\"button\" value=\"set background\" ng-click=\"myStyle={'background-color':'blue'}\">\r\n\t\t\t<input type=\"button\" value=\"clear\" ng-click=\"myStyle={}\">\r\n\t\t\t<br/>\r\n\t\t\t<span ng-style=\"myStyle\">Sample Text</span>\r\n\t\t\t<pre>myStyle={{myStyle}}</pre>\r\n\t\t </file>\r\n\t\t <file name=\"style.css\">\r\n\t\t span {\r\n\t\t\t color: black;\r\n\t\t }\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t var colorSpan = element(by.css('span'));\r\n\t\r\n\t\t it('should check ng-style', function() {\r\n\t\t\t expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\r\n\t\t\t element(by.css('input[value=\\'set color\\']')).click();\r\n\t\t\t expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');\r\n\t\t\t element(by.css('input[value=clear]')).click();\r\n\t\t\t expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');\r\n\t\t });\r\n\t\t </file>\r\n\t </example>\r\n\t */\r\n\tvar ngStyleDirective = ngDirective(function (scope, element, attr) {\r\n\t\tscope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) {\r\n\t\t\tif (oldStyles && (newStyles !== oldStyles)) {\r\n\t\t\t\tforEach(oldStyles, function (val, style) { element.css(style, ''); });\r\n\t\t\t}\r\n\t\t\tif (newStyles) element.css(newStyles);\r\n\t\t}, true);\r\n\t});\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngSwitch\r\n\t * @restrict EA\r\n\t *\r\n\t * @description\r\n\t * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression.\r\n\t * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location\r\n\t * as specified in the template.\r\n\t *\r\n\t * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it\r\n\t * from the template cache), `ngSwitch` simply chooses one of the nested elements and makes it visible based on which element\r\n\t * matches the value obtained from the evaluated expression. In other words, you define a container element\r\n\t * (where you place the directive), place an expression on the **`on=\"...\"` attribute**\r\n\t * (or the **`ng-switch=\"...\"` attribute**), define any inner elements inside of the directive and place\r\n\t * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on\r\n\t * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default\r\n\t * attribute is displayed.\r\n\t *\r\n\t * <div class=\"alert alert-info\">\r\n\t * Be aware that the attribute values to match against cannot be expressions. They are interpreted\r\n\t * as literal string values to match against.\r\n\t * For example, **`ng-switch-when=\"someVal\"`** will match against the string `\"someVal\"` not against the\r\n\t * value of the expression `$scope.someVal`.\r\n\t * </div>\r\n\t\r\n\t * @animations\r\n\t * enter - happens after the ngSwitch contents change and the matched child element is placed inside the container\r\n\t * leave - happens just after the ngSwitch contents change and just before the former contents are removed from the DOM\r\n\t *\r\n\t * @usage\r\n\t *\r\n\t * ```\r\n\t * <ANY ng-switch=\"expression\">\r\n\t * <ANY ng-switch-when=\"matchValue1\">...</ANY>\r\n\t * <ANY ng-switch-when=\"matchValue2\">...</ANY>\r\n\t * <ANY ng-switch-default>...</ANY>\r\n\t * </ANY>\r\n\t * ```\r\n\t *\r\n\t *\r\n\t * @scope\r\n\t * @priority 800\r\n\t * @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>.\r\n\t * On child elements add:\r\n\t *\r\n\t * * `ngSwitchWhen`: the case statement to match against. If match then this\r\n\t * case will be displayed. If the same match appears multiple times, all the\r\n\t * elements will be displayed.\r\n\t * * `ngSwitchDefault`: the default case when no other case match. If there\r\n\t * are multiple default cases, all of them will be displayed when no other\r\n\t * case match.\r\n\t *\r\n\t *\r\n\t * @example\r\n\t <example module=\"ngAnimate\" deps=\"angular-animate.js\" animations=\"true\">\r\n\t\t<file name=\"index.html\">\r\n\t\t <div ng-controller=\"Ctrl\">\r\n\t\t\t<select ng-model=\"selection\" ng-options=\"item for item in items\">\r\n\t\t\t</select>\r\n\t\t\t<tt>selection={{selection}}</tt>\r\n\t\t\t<hr/>\r\n\t\t\t<div class=\"animate-switch-container\"\r\n\t\t\t ng-switch on=\"selection\">\r\n\t\t\t\t<div class=\"animate-switch\" ng-switch-when=\"settings\">Settings Div</div>\r\n\t\t\t\t<div class=\"animate-switch\" ng-switch-when=\"home\">Home Span</div>\r\n\t\t\t\t<div class=\"animate-switch\" ng-switch-default>default</div>\r\n\t\t\t</div>\r\n\t\t </div>\r\n\t\t</file>\r\n\t\t<file name=\"script.js\">\r\n\t\t function Ctrl($scope) {\r\n\t\t\t$scope.items = ['settings', 'home', 'other'];\r\n\t\t\t$scope.selection = $scope.items[0];\r\n\t\t }\r\n\t\t</file>\r\n\t\t<file name=\"animations.css\">\r\n\t\t .animate-switch-container {\r\n\t\t\tposition:relative;\r\n\t\t\tbackground:white;\r\n\t\t\tborder:1px solid black;\r\n\t\t\theight:40px;\r\n\t\t\toverflow:hidden;\r\n\t\t }\r\n\t\r\n\t\t .animate-switch {\r\n\t\t\tpadding:10px;\r\n\t\t }\r\n\t\r\n\t\t .animate-switch.ng-animate {\r\n\t\t\t-webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\r\n\t\t\ttransition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;\r\n\t\r\n\t\t\tposition:absolute;\r\n\t\t\ttop:0;\r\n\t\t\tleft:0;\r\n\t\t\tright:0;\r\n\t\t\tbottom:0;\r\n\t\t }\r\n\t\r\n\t\t .animate-switch.ng-leave.ng-leave-active,\r\n\t\t .animate-switch.ng-enter {\r\n\t\t\ttop:-50px;\r\n\t\t }\r\n\t\t .animate-switch.ng-leave,\r\n\t\t .animate-switch.ng-enter.ng-enter-active {\r\n\t\t\ttop:0;\r\n\t\t }\r\n\t\t</file>\r\n\t\t<file name=\"protractor.js\" type=\"protractor\">\r\n\t\t var switchElem = element(by.css('[ng-switch]'));\r\n\t\t var select = element(by.model('selection'));\r\n\t\r\n\t\t it('should start in settings', function() {\r\n\t\t\texpect(switchElem.getText()).toMatch(/Settings Div/);\r\n\t\t });\r\n\t\t it('should change to home', function() {\r\n\t\t\tselect.element.all(by.css('option')).get(1).click();\r\n\t\t\texpect(switchElem.getText()).toMatch(/Home Span/);\r\n\t\t });\r\n\t\t it('should select default', function() {\r\n\t\t\tselect.element.all(by.css('option')).get(2).click();\r\n\t\t\texpect(switchElem.getText()).toMatch(/default/);\r\n\t\t });\r\n\t\t</file>\r\n\t </example>\r\n\t */\r\n\tvar ngSwitchDirective = ['$animate', function ($animate) {\r\n\t\treturn {\r\n\t\t\trestrict: 'EA',\r\n\t\t\trequire: 'ngSwitch',\r\n\r\n\t\t\t// asks for $scope to fool the BC controller module\r\n\t\t\tcontroller: ['$scope', function ngSwitchController() {\r\n\t\t\t\tthis.cases = {};\r\n\t\t\t}],\r\n\t\t\tlink: function (scope, element, attr, ngSwitchController) {\r\n\t\t\t\tvar watchExpr = attr.ngSwitch || attr.on,\r\n\t\t\t\t\tselectedTranscludes = [],\r\n\t\t\t\t\tselectedElements = [],\r\n\t\t\t\t\tpreviousElements = [],\r\n\t\t\t\t\tselectedScopes = [];\r\n\r\n\t\t\t\tscope.$watch(watchExpr, function ngSwitchWatchAction(value) {\r\n\t\t\t\t\tvar i, ii;\r\n\t\t\t\t\tfor (i = 0, ii = previousElements.length; i < ii; ++i) {\r\n\t\t\t\t\t\tpreviousElements[i].remove();\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpreviousElements.length = 0;\r\n\r\n\t\t\t\t\tfor (i = 0, ii = selectedScopes.length; i < ii; ++i) {\r\n\t\t\t\t\t\tvar selected = selectedElements[i];\r\n\t\t\t\t\t\tselectedScopes[i].$destroy();\r\n\t\t\t\t\t\tpreviousElements[i] = selected;\r\n\t\t\t\t\t\t$animate.leave(selected, function () {\r\n\t\t\t\t\t\t\tpreviousElements.splice(i, 1);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tselectedElements.length = 0;\r\n\t\t\t\t\tselectedScopes.length = 0;\r\n\r\n\t\t\t\t\tif ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) {\r\n\t\t\t\t\t\tscope.$eval(attr.change);\r\n\t\t\t\t\t\tforEach(selectedTranscludes, function (selectedTransclude) {\r\n\t\t\t\t\t\t\tvar selectedScope = scope.$new();\r\n\t\t\t\t\t\t\tselectedScopes.push(selectedScope);\r\n\t\t\t\t\t\t\tselectedTransclude.transclude(selectedScope, function (caseElement) {\r\n\t\t\t\t\t\t\t\tvar anchor = selectedTransclude.element;\r\n\r\n\t\t\t\t\t\t\t\tselectedElements.push(caseElement);\r\n\t\t\t\t\t\t\t\t$animate.enter(caseElement, anchor.parent(), anchor);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\t}];\r\n\r\n\tvar ngSwitchWhenDirective = ngDirective({\r\n\t\ttransclude: 'element',\r\n\t\tpriority: 800,\r\n\t\trequire: '^ngSwitch',\r\n\t\tlink: function (scope, element, attrs, ctrl, $transclude) {\r\n\t\t\tctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []);\r\n\t\t\tctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element });\r\n\t\t}\r\n\t});\r\n\r\n\tvar ngSwitchDefaultDirective = ngDirective({\r\n\t\ttransclude: 'element',\r\n\t\tpriority: 800,\r\n\t\trequire: '^ngSwitch',\r\n\t\tlink: function (scope, element, attr, ctrl, $transclude) {\r\n\t\t\tctrl.cases['?'] = (ctrl.cases['?'] || []);\r\n\t\t\tctrl.cases['?'].push({ transclude: $transclude, element: element });\r\n\t\t}\r\n\t});\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name ngTransclude\r\n\t * @restrict AC\r\n\t *\r\n\t * @description\r\n\t * Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion.\r\n\t *\r\n\t * Any existing content of the element that this directive is placed on will be removed before the transcluded content is inserted.\r\n\t *\r\n\t * @element ANY\r\n\t *\r\n\t * @example\r\n\t <example module=\"transclude\">\r\n\t\t <file name=\"index.html\">\r\n\t\t <script>\r\n\t\t\t function Ctrl($scope) {\r\n\t\t\t $scope.title = 'Lorem Ipsum';\r\n\t\t\t $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';\r\n\t\t\t }\r\n\t\r\n\t\t\t angular.module('transclude', [])\r\n\t\t\t .directive('pane', function(){\r\n\t\t\t\t return {\r\n\t\t\t\t restrict: 'E',\r\n\t\t\t\t transclude: true,\r\n\t\t\t\t scope: { title:'@' },\r\n\t\t\t\t template: '<div style=\"border: 1px solid black;\">' +\r\n\t\t\t\t\t\t\t '<div style=\"background-color: gray\">{{title}}</div>' +\r\n\t\t\t\t\t\t\t '<div ng-transclude></div>' +\r\n\t\t\t\t\t\t\t '</div>'\r\n\t\t\t\t };\r\n\t\t\t });\r\n\t\t </script>\r\n\t\t <div ng-controller=\"Ctrl\">\r\n\t\t\t <input ng-model=\"title\"><br>\r\n\t\t\t <textarea ng-model=\"text\"></textarea> <br/>\r\n\t\t\t <pane title=\"{{title}}\">{{text}}</pane>\r\n\t\t </div>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\tit('should have transcluded', function() {\r\n\t\t\t var titleElement = element(by.model('title'));\r\n\t\t\t titleElement.clear();\r\n\t\t\t titleElement.sendKeys('TITLE');\r\n\t\t\t var textElement = element(by.model('text'));\r\n\t\t\t textElement.clear();\r\n\t\t\t textElement.sendKeys('TEXT');\r\n\t\t\t expect(element(by.binding('title')).getText()).toEqual('TITLE');\r\n\t\t\t expect(element(by.binding('text')).getText()).toEqual('TEXT');\r\n\t\t\t});\r\n\t\t </file>\r\n\t </example>\r\n\t *\r\n\t */\r\n\tvar ngTranscludeDirective = ngDirective({\r\n\t\tlink: function ($scope, $element, $attrs, controller, $transclude) {\r\n\t\t\tif (!$transclude) {\r\n\t\t\t\tthrow minErr('ngTransclude')('orphan',\r\n\t\t\t\t 'Illegal use of ngTransclude directive in the template! ' +\r\n\t\t\t\t 'No parent directive that requires a transclusion found. ' +\r\n\t\t\t\t 'Element: {0}',\r\n\t\t\t\t startingTag($element));\r\n\t\t\t}\r\n\r\n\t\t\t$transclude(function (clone) {\r\n\t\t\t\t$element.empty();\r\n\t\t\t\t$element.append(clone);\r\n\t\t\t});\r\n\t\t}\r\n\t});\r\n\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name script\r\n\t * @restrict E\r\n\t *\r\n\t * @description\r\n\t * Load the content of a `<script>` element into {@link ng.$templateCache `$templateCache`}, so that the\r\n\t * template can be used by {@link ng.directive:ngInclude `ngInclude`},\r\n\t * {@link ngRoute.directive:ngView `ngView`}, or {@link guide/directive directives}. The type of the\r\n\t * `<script>` element must be specified as `text/ng-template`, and a cache name for the template must be\r\n\t * assigned through the element's `id`, which can then be used as a directive's `templateUrl`.\r\n\t *\r\n\t * @param {string} type Must be set to `'text/ng-template'`.\r\n\t * @param {string} id Cache name of the template.\r\n\t *\r\n\t * @example\r\n\t <example>\r\n\t\t<file name=\"index.html\">\r\n\t\t <script type=\"text/ng-template\" id=\"/tpl.html\">\r\n\t\t\tContent of the template.\r\n\t\t </script>\r\n\t\r\n\t\t <a ng-click=\"currentTpl='/tpl.html'\" id=\"tpl-link\">Load inlined template</a>\r\n\t\t <div id=\"tpl-content\" ng-include src=\"currentTpl\"></div>\r\n\t\t</file>\r\n\t\t<file name=\"protractor.js\" type=\"protractor\">\r\n\t\t it('should load template defined inside script tag', function() {\r\n\t\t\telement(by.css('#tpl-link')).click();\r\n\t\t\texpect(element(by.css('#tpl-content')).getText()).toMatch(/Content of the template/);\r\n\t\t });\r\n\t\t</file>\r\n\t </example>\r\n\t */\r\n\tvar scriptDirective = ['$templateCache', function ($templateCache) {\r\n\t\treturn {\r\n\t\t\trestrict: 'E',\r\n\t\t\tterminal: true,\r\n\t\t\tcompile: function (element, attr) {\r\n\t\t\t\tif (attr.type == 'text/ng-template') {\r\n\t\t\t\t\tvar templateUrl = attr.id,\r\n\t\t\t\t\t\t// IE is not consistent, in scripts we have to read .text but in other nodes we have to read .textContent\r\n\t\t\t\t\t\ttext = element[0].text;\r\n\r\n\t\t\t\t\t$templateCache.put(templateUrl, text);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t}];\r\n\r\n\tvar ngOptionsMinErr = minErr('ngOptions');\r\n\t/**\r\n\t * @ngdoc directive\r\n\t * @name select\r\n\t * @restrict E\r\n\t *\r\n\t * @description\r\n\t * HTML `SELECT` element with angular data-binding.\r\n\t *\r\n\t * # `ngOptions`\r\n\t *\r\n\t * The `ngOptions` attribute can be used to dynamically generate a list of `<option>`\r\n\t * elements for the `<select>` element using the array or object obtained by evaluating the\r\n\t * `ngOptions` comprehension_expression.\r\n\t *\r\n\t * When an item in the `<select>` menu is selected, the array element or object property\r\n\t * represented by the selected option will be bound to the model identified by the `ngModel`\r\n\t * directive.\r\n\t *\r\n\t * <div class=\"alert alert-warning\">\r\n\t * **Note:** `ngModel` compares by reference, not value. This is important when binding to an\r\n\t * array of objects. See an example [in this jsfiddle](http://jsfiddle.net/qWzTb/).\r\n\t * </div>\r\n\t *\r\n\t * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can\r\n\t * be nested into the `<select>` element. This element will then represent the `null` or \"not selected\"\r\n\t * option. See example below for demonstration.\r\n\t *\r\n\t * <div class=\"alert alert-warning\">\r\n\t * **Note:** `ngOptions` provides an iterator facility for the `<option>` element which should be used instead\r\n\t * of {@link ng.directive:ngRepeat ngRepeat} when you want the\r\n\t * `select` model to be bound to a non-string value. This is because an option element can only\r\n\t * be bound to string values at present.\r\n\t * </div>\r\n\t *\r\n\t * @param {string} ngModel Assignable angular expression to data-bind to.\r\n\t * @param {string=} name Property name of the form under which the control is published.\r\n\t * @param {string=} required The control is considered valid only if value is entered.\r\n\t * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to\r\n\t * the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of\r\n\t * `required` when you want to data-bind to the `required` attribute.\r\n\t * @param {comprehension_expression=} ngOptions in one of the following forms:\r\n\t *\r\n\t * * for array data sources:\r\n\t * * `label` **`for`** `value` **`in`** `array`\r\n\t * * `select` **`as`** `label` **`for`** `value` **`in`** `array`\r\n\t * * `label` **`group by`** `group` **`for`** `value` **`in`** `array`\r\n\t * * `select` **`as`** `label` **`group by`** `group` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`\r\n\t * * for object data sources:\r\n\t * * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\r\n\t * * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`\r\n\t * * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object`\r\n\t * * `select` **`as`** `label` **`group by`** `group`\r\n\t * **`for` `(`**`key`**`,`** `value`**`) in`** `object`\r\n\t *\r\n\t * Where:\r\n\t *\r\n\t * * `array` / `object`: an expression which evaluates to an array / object to iterate over.\r\n\t * * `value`: local variable which will refer to each item in the `array` or each property value\r\n\t * of `object` during iteration.\r\n\t * * `key`: local variable which will refer to a property name in `object` during iteration.\r\n\t * * `label`: The result of this expression will be the label for `<option>` element. The\r\n\t * `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`).\r\n\t * * `select`: The result of this expression will be bound to the model of the parent `<select>`\r\n\t * element. If not specified, `select` expression will default to `value`.\r\n\t * * `group`: The result of this expression will be used to group options using the `<optgroup>`\r\n\t * DOM element.\r\n\t * * `trackexpr`: Used when working with an array of objects. The result of this expression will be\r\n\t * used to identify the objects in the array. The `trackexpr` will most likely refer to the\r\n\t * `value` variable (e.g. `value.propertyName`).\r\n\t *\r\n\t * @example\r\n\t\t<example>\r\n\t\t <file name=\"index.html\">\r\n\t\t\t<script>\r\n\t\t\tfunction MyCntrl($scope) {\r\n\t\t\t $scope.colors = [\r\n\t\t\t\t{name:'black', shade:'dark'},\r\n\t\t\t\t{name:'white', shade:'light'},\r\n\t\t\t\t{name:'red', shade:'dark'},\r\n\t\t\t\t{name:'blue', shade:'dark'},\r\n\t\t\t\t{name:'yellow', shade:'light'}\r\n\t\t\t ];\r\n\t\t\t $scope.myColor = $scope.colors[2]; // red\r\n\t\t\t}\r\n\t\t\t</script>\r\n\t\t\t<div ng-controller=\"MyCntrl\">\r\n\t\t\t <ul>\r\n\t\t\t\t<li ng-repeat=\"color in colors\">\r\n\t\t\t\t Name: <input ng-model=\"color.name\">\r\n\t\t\t\t [<a href ng-click=\"colors.splice($index, 1)\">X</a>]\r\n\t\t\t\t</li>\r\n\t\t\t\t<li>\r\n\t\t\t\t [<a href ng-click=\"colors.push({})\">add</a>]\r\n\t\t\t\t</li>\r\n\t\t\t </ul>\r\n\t\t\t <hr/>\r\n\t\t\t Color (null not allowed):\r\n\t\t\t <select ng-model=\"myColor\" ng-options=\"color.name for color in colors\"></select><br>\r\n\t\r\n\t\t\t Color (null allowed):\r\n\t\t\t <span class=\"nullable\">\r\n\t\t\t\t<select ng-model=\"myColor\" ng-options=\"color.name for color in colors\">\r\n\t\t\t\t <option value=\"\">-- choose color --</option>\r\n\t\t\t\t</select>\r\n\t\t\t </span><br/>\r\n\t\r\n\t\t\t Color grouped by shade:\r\n\t\t\t <select ng-model=\"myColor\" ng-options=\"color.name group by color.shade for color in colors\">\r\n\t\t\t </select><br/>\r\n\t\r\n\t\r\n\t\t\t Select <a href ng-click=\"myColor = { name:'not in list', shade: 'other' }\">bogus</a>.<br>\r\n\t\t\t <hr/>\r\n\t\t\t Currently selected: {{ {selected_color:myColor} }}\r\n\t\t\t <div style=\"border:solid 1px black; height:20px\"\r\n\t\t\t\t ng-style=\"{'background-color':myColor.name}\">\r\n\t\t\t </div>\r\n\t\t\t</div>\r\n\t\t </file>\r\n\t\t <file name=\"protractor.js\" type=\"protractor\">\r\n\t\t\t it('should check ng-options', function() {\r\n\t\t\t expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red');\r\n\t\t\t element.all(by.select('myColor')).first().click();\r\n\t\t\t element.all(by.css('select[ng-model=\"myColor\"] option')).first().click();\r\n\t\t\t expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black');\r\n\t\t\t element(by.css('.nullable select[ng-model=\"myColor\"]')).click();\r\n\t\t\t element.all(by.css('.nullable select[ng-model=\"myColor\"] option')).first().click();\r\n\t\t\t expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null');\r\n\t\t\t });\r\n\t\t </file>\r\n\t\t</example>\r\n\t */\r\n\r\n\tvar ngOptionsDirective = valueFn({ terminal: true });\r\n\t// jshint maxlen: false\r\n\tvar selectDirective = ['$compile', '$parse', function ($compile, $parse) {\r\n\t\t//000011111111110000000000022222222220000000000000000000003333333333000000000000004444444444444440000000005555555555555550000000666666666666666000000000000000777777777700000000000000000008888888888\r\n\t\tvar NG_OPTIONS_REGEXP = /^\\s*([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+group\\s+by\\s+([\\s\\S]+?))?\\s+for\\s+(?:([\\$\\w][\\$\\w]*)|(?:\\(\\s*([\\$\\w][\\$\\w]*)\\s*,\\s*([\\$\\w][\\$\\w]*)\\s*\\)))\\s+in\\s+([\\s\\S]+?)(?:\\s+track\\s+by\\s+([\\s\\S]+?))?$/,\r\n\t\t\tnullModelCtrl = { $setViewValue: noop };\r\n\t\t// jshint maxlen: 100\r\n\r\n\t\treturn {\r\n\t\t\trestrict: 'E',\r\n\t\t\trequire: ['select', '?ngModel'],\r\n\t\t\tcontroller: ['$element', '$scope', '$attrs', function ($element, $scope, $attrs) {\r\n\t\t\t\tvar self = this,\r\n\t\t\t\t\toptionsMap = {},\r\n\t\t\t\t\tngModelCtrl = nullModelCtrl,\r\n\t\t\t\t\tnullOption,\r\n\t\t\t\t\tunknownOption;\r\n\r\n\r\n\t\t\t\tself.databound = $attrs.ngModel;\r\n\r\n\r\n\t\t\t\tself.init = function (ngModelCtrl_, nullOption_, unknownOption_) {\r\n\t\t\t\t\tngModelCtrl = ngModelCtrl_;\r\n\t\t\t\t\tnullOption = nullOption_;\r\n\t\t\t\t\tunknownOption = unknownOption_;\r\n\t\t\t\t};\r\n\r\n\r\n\t\t\t\tself.addOption = function (value) {\r\n\t\t\t\t\tassertNotHasOwnProperty(value, '\"option value\"');\r\n\t\t\t\t\toptionsMap[value] = true;\r\n\r\n\t\t\t\t\tif (ngModelCtrl.$viewValue == value) {\r\n\t\t\t\t\t\t$element.val(value);\r\n\t\t\t\t\t\tif (unknownOption.parent()) unknownOption.remove();\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\r\n\t\t\t\tself.removeOption = function (value) {\r\n\t\t\t\t\tif (this.hasOption(value)) {\r\n\t\t\t\t\t\tdelete optionsMap[value];\r\n\t\t\t\t\t\tif (ngModelCtrl.$viewValue == value) {\r\n\t\t\t\t\t\t\tthis.renderUnknownOption(value);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\r\n\r\n\t\t\t\tself.renderUnknownOption = function (val) {\r\n\t\t\t\t\tvar unknownVal = '? ' + hashKey(val) + ' ?';\r\n\t\t\t\t\tunknownOption.val(unknownVal);\r\n\t\t\t\t\t$element.prepend(unknownOption);\r\n\t\t\t\t\t$element.val(unknownVal);\r\n\t\t\t\t\tunknownOption.prop('selected', true); // needed for IE\r\n\t\t\t\t};\r\n\r\n\r\n\t\t\t\tself.hasOption = function (value) {\r\n\t\t\t\t\treturn optionsMap.hasOwnProperty(value);\r\n\t\t\t\t};\r\n\r\n\t\t\t\t$scope.$on('$destroy', function () {\r\n\t\t\t\t\t// disable unknown option so that we don't do work when the whole select is being destroyed\r\n\t\t\t\t\tself.renderUnknownOption = noop;\r\n\t\t\t\t});\r\n\t\t\t}],\r\n\r\n\t\t\tlink: function (scope, element, attr, ctrls) {\r\n\t\t\t\t// if ngModel is not defined, we don't need to do anything\r\n\t\t\t\tif (!ctrls[1]) return;\r\n\r\n\t\t\t\tvar selectCtrl = ctrls[0],\r\n\t\t\t\t\tngModelCtrl = ctrls[1],\r\n\t\t\t\t\tmultiple = attr.multiple,\r\n\t\t\t\t\toptionsExp = attr.ngOptions,\r\n\t\t\t\t\tnullOption = false, // if false, user will not be able to select it (used by ngOptions)\r\n\t\t\t\t\temptyOption,\r\n\t\t\t\t\t// we can't just jqLite('<option>') since jqLite is not smart enough\r\n\t\t\t\t\t// to create it in <select> and IE barfs otherwise.\r\n\t\t\t\t\toptionTemplate = jqLite(document.createElement('option')),\r\n\t\t\t\t\toptGroupTemplate = jqLite(document.createElement('optgroup')),\r\n\t\t\t\t\tunknownOption = optionTemplate.clone();\r\n\r\n\t\t\t\t// find \"null\" option\r\n\t\t\t\tfor (var i = 0, children = element.children(), ii = children.length; i < ii; i++) {\r\n\t\t\t\t\tif (children[i].value === '') {\r\n\t\t\t\t\t\temptyOption = nullOption = children.eq(i);\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tselectCtrl.init(ngModelCtrl, nullOption, unknownOption);\r\n\r\n\t\t\t\t// required validator\r\n\t\t\t\tif (multiple) {\r\n\t\t\t\t\tngModelCtrl.$isEmpty = function (value) {\r\n\t\t\t\t\t\treturn !value || value.length === 0;\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (optionsExp) setupAsOptions(scope, element, ngModelCtrl);\r\n\t\t\t\telse if (multiple) setupAsMultiple(scope, element, ngModelCtrl);\r\n\t\t\t\telse setupAsSingle(scope, element, ngModelCtrl, selectCtrl);\r\n\r\n\r\n\t\t\t\t////////////////////////////\r\n\r\n\r\n\r\n\t\t\t\tfunction setupAsSingle(scope, selectElement, ngModelCtrl, selectCtrl) {\r\n\t\t\t\t\tngModelCtrl.$render = function () {\r\n\t\t\t\t\t\tvar viewValue = ngModelCtrl.$viewValue;\r\n\r\n\t\t\t\t\t\tif (selectCtrl.hasOption(viewValue)) {\r\n\t\t\t\t\t\t\tif (unknownOption.parent()) unknownOption.remove();\r\n\t\t\t\t\t\t\tselectElement.val(viewValue);\r\n\t\t\t\t\t\t\tif (viewValue === '') emptyOption.prop('selected', true); // to make IE9 happy\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tif (isUndefined(viewValue) && emptyOption) {\r\n\t\t\t\t\t\t\t\tselectElement.val('');\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tselectCtrl.renderUnknownOption(viewValue);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tselectElement.on('change', function () {\r\n\t\t\t\t\t\tscope.$apply(function () {\r\n\t\t\t\t\t\t\tif (unknownOption.parent()) unknownOption.remove();\r\n\t\t\t\t\t\t\tngModelCtrl.$setViewValue(selectElement.val());\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction setupAsMultiple(scope, selectElement, ctrl) {\r\n\t\t\t\t\tvar lastView;\r\n\t\t\t\t\tctrl.$render = function () {\r\n\t\t\t\t\t\tvar items = new HashMap(ctrl.$viewValue);\r\n\t\t\t\t\t\tforEach(selectElement.find('option'), function (option) {\r\n\t\t\t\t\t\t\toption.selected = isDefined(items.get(option.value));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// we have to do it on each watch since ngModel watches reference, but\r\n\t\t\t\t\t// we need to work of an array, so we need to see if anything was inserted/removed\r\n\t\t\t\t\tscope.$watch(function selectMultipleWatch() {\r\n\t\t\t\t\t\tif (!equals(lastView, ctrl.$viewValue)) {\r\n\t\t\t\t\t\t\tlastView = shallowCopy(ctrl.$viewValue);\r\n\t\t\t\t\t\t\tctrl.$render();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tselectElement.on('change', function () {\r\n\t\t\t\t\t\tscope.$apply(function () {\r\n\t\t\t\t\t\t\tvar array = [];\r\n\t\t\t\t\t\t\tforEach(selectElement.find('option'), function (option) {\r\n\t\t\t\t\t\t\t\tif (option.selected) {\r\n\t\t\t\t\t\t\t\t\tarray.push(option.value);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tctrl.$setViewValue(array);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfunction setupAsOptions(scope, selectElement, ctrl) {\r\n\t\t\t\t\tvar match;\r\n\r\n\t\t\t\t\tif (!(match = optionsExp.match(NG_OPTIONS_REGEXP))) {\r\n\t\t\t\t\t\tthrow ngOptionsMinErr('iexp',\r\n\t\t\t\t\t\t \"Expected expression in form of \" +\r\n\t\t\t\t\t\t \"'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'\" +\r\n\t\t\t\t\t\t \" but got '{0}'. Element: {1}\",\r\n\t\t\t\t\t\t optionsExp, startingTag(selectElement));\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tvar displayFn = $parse(match[2] || match[1]),\r\n\t\t\t\t\t\tvalueName = match[4] || match[6],\r\n\t\t\t\t\t\tkeyName = match[5],\r\n\t\t\t\t\t\tgroupByFn = $parse(match[3] || ''),\r\n\t\t\t\t\t\tvalueFn = $parse(match[2] ? match[1] : valueName),\r\n\t\t\t\t\t\tvaluesFn = $parse(match[7]),\r\n\t\t\t\t\t\ttrack = match[8],\r\n\t\t\t\t\t\ttrackFn = track ? $parse(match[8]) : null,\r\n\t\t\t\t\t\t// This is an array of array of existing option groups in DOM.\r\n\t\t\t\t\t\t// We try to reuse these if possible\r\n\t\t\t\t\t\t// - optionGroupsCache[0] is the options with no option group\r\n\t\t\t\t\t\t// - optionGroupsCache[?][0] is the parent: either the SELECT or OPTGROUP element\r\n\t\t\t\t\t\toptionGroupsCache = [[{ element: selectElement, label: '' }]];\r\n\r\n\t\t\t\t\tif (nullOption) {\r\n\t\t\t\t\t\t// compile the element since there might be bindings in it\r\n\t\t\t\t\t\t$compile(nullOption)(scope);\r\n\r\n\t\t\t\t\t\t// remove the class, which is added automatically because we recompile the element and it\r\n\t\t\t\t\t\t// becomes the compilation root\r\n\t\t\t\t\t\tnullOption.removeClass('ng-scope');\r\n\r\n\t\t\t\t\t\t// we need to remove it before calling selectElement.empty() because otherwise IE will\r\n\t\t\t\t\t\t// remove the label from the element. wtf?\r\n\t\t\t\t\t\tnullOption.remove();\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// clear contents, we'll add what's needed based on the model\r\n\t\t\t\t\tselectElement.empty();\r\n\r\n\t\t\t\t\tselectElement.on('change', function () {\r\n\t\t\t\t\t\tscope.$apply(function () {\r\n\t\t\t\t\t\t\tvar optionGroup,\r\n\t\t\t\t\t\t\t\tcollection = valuesFn(scope) || [],\r\n\t\t\t\t\t\t\t\tlocals = {},\r\n\t\t\t\t\t\t\t\tkey, value, optionElement, index, groupIndex, length, groupLength, trackIndex;\r\n\r\n\t\t\t\t\t\t\tif (multiple) {\r\n\t\t\t\t\t\t\t\tvalue = [];\r\n\t\t\t\t\t\t\t\tfor (groupIndex = 0, groupLength = optionGroupsCache.length;\r\n\t\t\t\t\t\t\t\t\t groupIndex < groupLength;\r\n\t\t\t\t\t\t\t\t\t groupIndex++) {\r\n\t\t\t\t\t\t\t\t\t// list of options for that group. (first item has the parent)\r\n\t\t\t\t\t\t\t\t\toptionGroup = optionGroupsCache[groupIndex];\r\n\r\n\t\t\t\t\t\t\t\t\tfor (index = 1, length = optionGroup.length; index < length; index++) {\r\n\t\t\t\t\t\t\t\t\t\tif ((optionElement = optionGroup[index].element)[0].selected) {\r\n\t\t\t\t\t\t\t\t\t\t\tkey = optionElement.val();\r\n\t\t\t\t\t\t\t\t\t\t\tif (keyName) locals[keyName] = key;\r\n\t\t\t\t\t\t\t\t\t\t\tif (trackFn) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tfor (trackIndex = 0; trackIndex < collection.length; trackIndex++) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tlocals[valueName] = collection[trackIndex];\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tif (trackFn(scope, locals) == key) break;\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t\t\tlocals[valueName] = collection[key];\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\tvalue.push(valueFn(scope, locals));\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tkey = selectElement.val();\r\n\t\t\t\t\t\t\t\tif (key == '?') {\r\n\t\t\t\t\t\t\t\t\tvalue = undefined;\r\n\t\t\t\t\t\t\t\t} else if (key === '') {\r\n\t\t\t\t\t\t\t\t\tvalue = null;\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tif (trackFn) {\r\n\t\t\t\t\t\t\t\t\t\tfor (trackIndex = 0; trackIndex < collection.length; trackIndex++) {\r\n\t\t\t\t\t\t\t\t\t\t\tlocals[valueName] = collection[trackIndex];\r\n\t\t\t\t\t\t\t\t\t\t\tif (trackFn(scope, locals) == key) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tvalue = valueFn(scope, locals);\r\n\t\t\t\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\tlocals[valueName] = collection[key];\r\n\t\t\t\t\t\t\t\t\t\tif (keyName) locals[keyName] = key;\r\n\t\t\t\t\t\t\t\t\t\tvalue = valueFn(scope, locals);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t// Update the null option's selected property here so $render cleans it up correctly\r\n\t\t\t\t\t\t\t\tif (optionGroupsCache[0].length > 1) {\r\n\t\t\t\t\t\t\t\t\tif (optionGroupsCache[0][1].id !== key) {\r\n\t\t\t\t\t\t\t\t\t\toptionGroupsCache[0][1].selected = false;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tctrl.$setViewValue(value);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tctrl.$render = render;\r\n\r\n\t\t\t\t\t// TODO(vojta): can't we optimize this ?\r\n\t\t\t\t\tscope.$watch(render);\r\n\r\n\t\t\t\t\tfunction render() {\r\n\t\t\t\t\t\t// Temporary location for the option groups before we render them\r\n\t\t\t\t\t\tvar optionGroups = { '': [] },\r\n\t\t\t\t\t\t\toptionGroupNames = [''],\r\n\t\t\t\t\t\t\toptionGroupName,\r\n\t\t\t\t\t\t\toptionGroup,\r\n\t\t\t\t\t\t\toption,\r\n\t\t\t\t\t\t\texistingParent, existingOptions, existingOption,\r\n\t\t\t\t\t\t\tmodelValue = ctrl.$modelValue,\r\n\t\t\t\t\t\t\tvalues = valuesFn(scope) || [],\r\n\t\t\t\t\t\t\tkeys = keyName ? sortedKeys(values) : values,\r\n\t\t\t\t\t\t\tkey,\r\n\t\t\t\t\t\t\tgroupLength, length,\r\n\t\t\t\t\t\t\tgroupIndex, index,\r\n\t\t\t\t\t\t\tlocals = {},\r\n\t\t\t\t\t\t\tselected,\r\n\t\t\t\t\t\t\tselectedSet = false, // nothing is selected yet\r\n\t\t\t\t\t\t\tlastElement,\r\n\t\t\t\t\t\t\telement,\r\n\t\t\t\t\t\t\tlabel;\r\n\r\n\t\t\t\t\t\tif (multiple) {\r\n\t\t\t\t\t\t\tif (trackFn && isArray(modelValue)) {\r\n\t\t\t\t\t\t\t\tselectedSet = new HashMap([]);\r\n\t\t\t\t\t\t\t\tfor (var trackIndex = 0; trackIndex < modelValue.length; trackIndex++) {\r\n\t\t\t\t\t\t\t\t\tlocals[valueName] = modelValue[trackIndex];\r\n\t\t\t\t\t\t\t\t\tselectedSet.put(trackFn(scope, locals), modelValue[trackIndex]);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tselectedSet = new HashMap(modelValue);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// We now build up the list of options we need (we merge later)\r\n\t\t\t\t\t\tfor (index = 0; length = keys.length, index < length; index++) {\r\n\r\n\t\t\t\t\t\t\tkey = index;\r\n\t\t\t\t\t\t\tif (keyName) {\r\n\t\t\t\t\t\t\t\tkey = keys[index];\r\n\t\t\t\t\t\t\t\tif (key.charAt(0) === '$') continue;\r\n\t\t\t\t\t\t\t\tlocals[keyName] = key;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tlocals[valueName] = values[key];\r\n\r\n\t\t\t\t\t\t\toptionGroupName = groupByFn(scope, locals) || '';\r\n\t\t\t\t\t\t\tif (!(optionGroup = optionGroups[optionGroupName])) {\r\n\t\t\t\t\t\t\t\toptionGroup = optionGroups[optionGroupName] = [];\r\n\t\t\t\t\t\t\t\toptionGroupNames.push(optionGroupName);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (multiple) {\r\n\t\t\t\t\t\t\t\tselected = isDefined(\r\n\t\t\t\t\t\t\t\t selectedSet.remove(trackFn ? trackFn(scope, locals) : valueFn(scope, locals))\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tif (trackFn) {\r\n\t\t\t\t\t\t\t\t\tvar modelCast = {};\r\n\t\t\t\t\t\t\t\t\tmodelCast[valueName] = modelValue;\r\n\t\t\t\t\t\t\t\t\tselected = trackFn(scope, modelCast) === trackFn(scope, locals);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tselected = modelValue === valueFn(scope, locals);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tselectedSet = selectedSet || selected; // see if at least one item is selected\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tlabel = displayFn(scope, locals); // what will be seen by the user\r\n\r\n\t\t\t\t\t\t\t// doing displayFn(scope, locals) || '' overwrites zero values\r\n\t\t\t\t\t\t\tlabel = isDefined(label) ? label : '';\r\n\t\t\t\t\t\t\toptionGroup.push({\r\n\t\t\t\t\t\t\t\t// either the index into array or key from object\r\n\t\t\t\t\t\t\t\tid: trackFn ? trackFn(scope, locals) : (keyName ? keys[index] : index),\r\n\t\t\t\t\t\t\t\tlabel: label,\r\n\t\t\t\t\t\t\t\tselected: selected // determine if we should be selected\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (!multiple) {\r\n\t\t\t\t\t\t\tif (nullOption || modelValue === null) {\r\n\t\t\t\t\t\t\t\t// insert null option if we have a placeholder, or the model is null\r\n\t\t\t\t\t\t\t\toptionGroups[''].unshift({ id: '', label: '', selected: !selectedSet });\r\n\t\t\t\t\t\t\t} else if (!selectedSet) {\r\n\t\t\t\t\t\t\t\t// option could not be found, we have to insert the undefined item\r\n\t\t\t\t\t\t\t\toptionGroups[''].unshift({ id: '?', label: '', selected: true });\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Now we need to update the list of DOM nodes to match the optionGroups we computed above\r\n\t\t\t\t\t\tfor (groupIndex = 0, groupLength = optionGroupNames.length;\r\n\t\t\t\t\t\t\t groupIndex < groupLength;\r\n\t\t\t\t\t\t\t groupIndex++) {\r\n\t\t\t\t\t\t\t// current option group name or '' if no group\r\n\t\t\t\t\t\t\toptionGroupName = optionGroupNames[groupIndex];\r\n\r\n\t\t\t\t\t\t\t// list of options for that group. (first item has the parent)\r\n\t\t\t\t\t\t\toptionGroup = optionGroups[optionGroupName];\r\n\r\n\t\t\t\t\t\t\tif (optionGroupsCache.length <= groupIndex) {\r\n\t\t\t\t\t\t\t\t// we need to grow the optionGroups\r\n\t\t\t\t\t\t\t\texistingParent = {\r\n\t\t\t\t\t\t\t\t\telement: optGroupTemplate.clone().attr('label', optionGroupName),\r\n\t\t\t\t\t\t\t\t\tlabel: optionGroup.label\r\n\t\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\t\texistingOptions = [existingParent];\r\n\t\t\t\t\t\t\t\toptionGroupsCache.push(existingOptions);\r\n\t\t\t\t\t\t\t\tselectElement.append(existingParent.element);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\texistingOptions = optionGroupsCache[groupIndex];\r\n\t\t\t\t\t\t\t\texistingParent = existingOptions[0]; // either SELECT (no group) or OPTGROUP element\r\n\r\n\t\t\t\t\t\t\t\t// update the OPTGROUP label if not the same.\r\n\t\t\t\t\t\t\t\tif (existingParent.label != optionGroupName) {\r\n\t\t\t\t\t\t\t\t\texistingParent.element.attr('label', existingParent.label = optionGroupName);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tlastElement = null; // start at the beginning\r\n\t\t\t\t\t\t\tfor (index = 0, length = optionGroup.length; index < length; index++) {\r\n\t\t\t\t\t\t\t\toption = optionGroup[index];\r\n\t\t\t\t\t\t\t\tif ((existingOption = existingOptions[index + 1])) {\r\n\t\t\t\t\t\t\t\t\t// reuse elements\r\n\t\t\t\t\t\t\t\t\tlastElement = existingOption.element;\r\n\t\t\t\t\t\t\t\t\tif (existingOption.label !== option.label) {\r\n\t\t\t\t\t\t\t\t\t\tlastElement.text(existingOption.label = option.label);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tif (existingOption.id !== option.id) {\r\n\t\t\t\t\t\t\t\t\t\tlastElement.val(existingOption.id = option.id);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t// lastElement.prop('selected') provided by jQuery has side-effects\r\n\t\t\t\t\t\t\t\t\tif (existingOption.selected !== option.selected) {\r\n\t\t\t\t\t\t\t\t\t\tlastElement.prop('selected', (existingOption.selected = option.selected));\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t// grow elements\r\n\r\n\t\t\t\t\t\t\t\t\t// if it's a null option\r\n\t\t\t\t\t\t\t\t\tif (option.id === '' && nullOption) {\r\n\t\t\t\t\t\t\t\t\t\t// put back the pre-compiled element\r\n\t\t\t\t\t\t\t\t\t\telement = nullOption;\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t// jQuery(v1.4.2) Bug: We should be able to chain the method calls, but\r\n\t\t\t\t\t\t\t\t\t\t// in this version of jQuery on some browser the .text() returns a string\r\n\t\t\t\t\t\t\t\t\t\t// rather then the element.\r\n\t\t\t\t\t\t\t\t\t\t(element = optionTemplate.clone())\r\n\t\t\t\t\t\t\t\t\t\t\t.val(option.id)\r\n\t\t\t\t\t\t\t\t\t\t\t.prop('selected', option.selected)\r\n\t\t\t\t\t\t\t\t\t\t\t.text(option.label);\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\texistingOptions.push(existingOption = {\r\n\t\t\t\t\t\t\t\t\t\telement: element,\r\n\t\t\t\t\t\t\t\t\t\tlabel: option.label,\r\n\t\t\t\t\t\t\t\t\t\tid: option.id,\r\n\t\t\t\t\t\t\t\t\t\tselected: option.selected\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\tif (lastElement) {\r\n\t\t\t\t\t\t\t\t\t\tlastElement.after(element);\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\texistingParent.element.append(element);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\tlastElement = element;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t// remove any excessive OPTIONs in a group\r\n\t\t\t\t\t\t\tindex++; // increment since the existingOptions[0] is parent element not OPTION\r\n\t\t\t\t\t\t\twhile (existingOptions.length > index) {\r\n\t\t\t\t\t\t\t\texistingOptions.pop().element.remove();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// remove any excessive OPTGROUPs from select\r\n\t\t\t\t\t\twhile (optionGroupsCache.length > groupIndex) {\r\n\t\t\t\t\t\t\toptionGroupsCache.pop()[0].element.remove();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t}];\r\n\r\n\tvar optionDirective = ['$interpolate', function ($interpolate) {\r\n\t\tvar nullSelectCtrl = {\r\n\t\t\taddOption: noop,\r\n\t\t\tremoveOption: noop\r\n\t\t};\r\n\r\n\t\treturn {\r\n\t\t\trestrict: 'E',\r\n\t\t\tpriority: 100,\r\n\t\t\tcompile: function (element, attr) {\r\n\t\t\t\tif (isUndefined(attr.value)) {\r\n\t\t\t\t\tvar interpolateFn = $interpolate(element.text(), true);\r\n\t\t\t\t\tif (!interpolateFn) {\r\n\t\t\t\t\t\tattr.$set('value', element.text());\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn function (scope, element, attr) {\r\n\t\t\t\t\tvar selectCtrlName = '$selectController',\r\n\t\t\t\t\t\tparent = element.parent(),\r\n\t\t\t\t\t\tselectCtrl = parent.data(selectCtrlName) ||\r\n\t\t\t\t\t\t parent.parent().data(selectCtrlName); // in case we are in optgroup\r\n\r\n\t\t\t\t\tif (selectCtrl && selectCtrl.databound) {\r\n\t\t\t\t\t\t// For some reason Opera defaults to true and if not overridden this messes up the repeater.\r\n\t\t\t\t\t\t// We don't want the view to drive the initialization of the model anyway.\r\n\t\t\t\t\t\telement.prop('selected', false);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tselectCtrl = nullSelectCtrl;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (interpolateFn) {\r\n\t\t\t\t\t\tscope.$watch(interpolateFn, function interpolateWatchAction(newVal, oldVal) {\r\n\t\t\t\t\t\t\tattr.$set('value', newVal);\r\n\t\t\t\t\t\t\tif (newVal !== oldVal) selectCtrl.removeOption(oldVal);\r\n\t\t\t\t\t\t\tselectCtrl.addOption(newVal);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tselectCtrl.addOption(attr.value);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\telement.on('$destroy', function () {\r\n\t\t\t\t\t\tselectCtrl.removeOption(attr.value);\r\n\t\t\t\t\t});\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t};\r\n\t}];\r\n\r\n\tvar styleDirective = valueFn({\r\n\t\trestrict: 'E',\r\n\t\tterminal: true\r\n\t});\r\n\r\n\tif (window.angular.bootstrap) {\r\n\t\t//AngularJS is already loaded, so we can return here...\r\n\t\tconsole.log('WARNING: Tried to load angular more than once.');\r\n\t\treturn;\r\n\t}\r\n\r\n\t//try to bind to jquery now so that one can write angular.element().read()\r\n\t//but we will rebind on bootstrap again.\r\n\tbindJQuery();\r\n\r\n\tpublishExternalAPI(angular);\r\n\r\n\tjqLite(document).ready(function () {\r\n\t\tangularInit(document, bootstrap);\r\n\t});\r\n\r\n})(window, document);\r\n\r\n!window.angular.$$csp() && window.angular.element(document).find('head').prepend('<style type=\"text/css\">@charset \"UTF-8\";[ng\\\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\\\:form{display:block;}.ng-animate-block-transitions{transition:0s all!important;-webkit-transition:0s all!important;}.ng-hide-add-active,.ng-hide-remove{display:block!important;}</style>');","/**!\r\n * AngularJS file upload/drop directive with http post and progress\r\n * @author Danial <danial.farid@gmail.com>\r\n * @version 1.2.8\r\n */\r\n(function() {\r\n\t\r\nvar angularFileUpload = angular.module('angularFileUpload', []);\r\n\r\nangularFileUpload.service('$upload', ['$http', '$rootScope', '$timeout', function($http, $rootScope, $timeout) {\r\n\tfunction sendHttp(config) {\r\n\t\tconfig.method = config.method || 'POST';\r\n\t\tconfig.headers = config.headers || {};\r\n\t\tconfig.transformRequest = config.transformRequest || function(data) {\r\n\t\t\tif (window.ArrayBuffer && data instanceof ArrayBuffer) {\r\n\t\t\t\treturn data;\r\n\t\t\t}\r\n\t\t\treturn $http.defaults.transformRequest[0](data);\r\n\t\t};\r\n\t\t\r\n\t\tif (window.XMLHttpRequest.__isShim) {\r\n\t\t\tconfig.headers['__setXHR_'] = function() {\r\n\t\t\t\treturn function(xhr) {\r\n\t\t\t\t\tconfig.__XHR = xhr;\r\n\t\t\t\t\txhr.upload.addEventListener('progress', function(e) {\r\n\t\t\t\t\t\tif (config.progress) {\r\n\t\t\t\t\t\t\t$timeout(function() {\r\n\t\t\t\t\t\t\t\tif (config.progress) config.progress(e);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, false);\r\n\t\t\t\t\t//fix for firefox not firing upload progress end, also IE8-9\r\n\t\t\t\t\txhr.upload.addEventListener('load', function(e) {\r\n\t\t\t\t\t\tif (e.lengthComputable) {\r\n\t\t\t\t\t\t\t$timeout(function() {\r\n\t\t\t\t\t\t\t\tif (config.progress) config.progress(e);\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, false);\r\n\t\t\t\t};\r\n\t\t\t};\r\n\t\t}\r\n\t\t\t\r\n\t\tvar promise = $http(config);\r\n\t\t\r\n\t\tpromise.progress = function(fn) {\r\n\t\t\tconfig.progress = fn;\r\n\t\t\treturn promise;\r\n\t\t};\t\t\r\n\t\tpromise.abort = function() {\r\n\t\t\tif (config.__XHR) {\r\n\t\t\t\t$timeout(function() {\r\n\t\t\t\t\tconfig.__XHR.abort();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\treturn promise;\r\n\t\t};\t\t\r\n\t\tpromise.then = (function(promise, origThen) {\r\n\t\t\treturn function(s, e, p) {\r\n\t\t\t\tconfig.progress = p || config.progress;\r\n\t\t\t\tvar result = origThen.apply(promise, [s, e, p]);\r\n\t\t\t\tresult.abort = promise.abort;\r\n\t\t\t\tresult.progress = promise.progress;\r\n\t\t\t\treturn result;\r\n\t\t\t};\r\n\t\t})(promise, promise.then);\r\n\t\t\r\n\t\treturn promise;\r\n\t};\r\n\tthis.upload = function(config) {\r\n\t\tconfig.headers = config.headers || {};\r\n\t\tconfig.headers['Content-Type'] = undefined;\r\n\t\tconfig.transformRequest = config.transformRequest || $http.defaults.transformRequest;\r\n\t\tvar formData = new FormData();\r\n\t\tif (config.data) {\r\n\t\t\tfor (var key in config.data) {\r\n\t\t\t\tvar val = config.data[key];\r\n\t\t\t\tif (!config.formDataAppender) {\r\n\t\t\t\t\tif (typeof config.transformRequest == 'function') {\r\n\t\t\t\t\t\tval = config.transformRequest(val);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tfor (var i = 0; i < config.transformRequest.length; i++) {\r\n\t\t\t\t\t\t\tvar fn = config.transformRequest[i];\r\n\t\t\t\t\t\t\tif (typeof fn == 'function') {\r\n\t\t\t\t\t\t\t\tval = fn(val);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tformData.append(key, val);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconfig.formDataAppender(formData, key, val);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tconfig.transformRequest = angular.identity;\r\n\t\t\r\n\t\tvar fileFormName = config.fileFormDataName || 'file';\r\n\t\t\r\n\t\tif (Object.prototype.toString.call(config.file) === '[object Array]') {\r\n\t\t\tvar isFileFormNameString = Object.prototype.toString.call(fileFormName) === '[object String]'; \r\n\t\t\tfor (var i = 0; i < config.file.length; i++) {\t\t\t\t\t\t \r\n\t\t\t\tformData.append(isFileFormNameString ? fileFormName + i : fileFormName[i], config.file[i], config.file[i].name);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tformData.append(fileFormName, config.file, config.file.name);\r\n\t\t}\r\n\t\t\r\n\t\tconfig.data = formData;\r\n\t\t\r\n\t\treturn sendHttp(config);\r\n\t};\r\n\tthis.http = function(config) {\r\n\t\treturn sendHttp(config);\r\n\t}\r\n}]);\r\n\r\nangularFileUpload.directive('ngFileSelect', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) {\r\n\treturn function(scope, elem, attr) {\r\n\t\tvar fn = $parse(attr['ngFileSelect']);\r\n\t\telem.bind('change', function(evt) {\r\n\t\t\tvar files = [], fileList, i;\r\n\t\t\tfileList = evt.target.files;\r\n\t\t\tif (fileList != null) {\r\n\t\t\t\tfor (i = 0; i < fileList.length; i++) {\r\n\t\t\t\t\tfiles.push(fileList.item(i));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t$timeout(function() {\r\n\t\t\t\tfn(scope, {\r\n\t\t\t\t\t$files : files,\r\n\t\t\t\t\t$event : evt\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t});\r\n\t\telem.bind('click', function(){\r\n\t\t\tthis.value = null;\r\n\t\t});\r\n\t};\r\n} ]);\r\n\r\nangularFileUpload.directive('ngFileDropAvailable', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) {\r\n\treturn function(scope, elem, attr) {\r\n\t\tif ('draggable' in document.createElement('span')) {\r\n\t\t\tvar fn = $parse(attr['ngFileDropAvailable']);\r\n\t\t\t$timeout(function() {\r\n\t\t\t\tfn(scope);\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n} ]);\r\n\r\nangularFileUpload.directive('ngFileDrop', [ '$parse', '$http', '$timeout', function($parse, $http, $timeout) {\r\n\treturn function(scope, elem, attr) {\r\n\t\tif ('draggable' in document.createElement('span')) {\r\n\t\t\tvar cancel = null;\r\n\t\t\tvar fn = $parse(attr['ngFileDrop']);\r\n\t\t\telem[0].addEventListener(\"dragover\", function(evt) {\r\n\t\t\t\t$timeout.cancel(cancel);\r\n\t\t\t\tevt.stopPropagation();\r\n\t\t\t\tevt.preventDefault();\r\n\t\t\t\telem.addClass(attr['ngFileDragOverClass'] || \"dragover\");\r\n\t\t\t}, false);\r\n\t\t\telem[0].addEventListener(\"dragleave\", function(evt) {\r\n\t\t\t\tcancel = $timeout(function() {\r\n\t\t\t\t\telem.removeClass(attr['ngFileDragOverClass'] || \"dragover\");\r\n\t\t\t\t});\r\n\t\t\t}, false);\r\n\t\t\telem[0].addEventListener(\"drop\", function(evt) {\r\n\t\t\t\tevt.stopPropagation();\r\n\t\t\t\tevt.preventDefault();\r\n\t\t\t\telem.removeClass(attr['ngFileDragOverClass'] || \"dragover\");\r\n\t\t\t\tvar files = [], fileList = evt.dataTransfer.files, i;\r\n\t\t\t\tif (fileList != null) {\r\n\t\t\t\t\tfor (i = 0; i < fileList.length; i++) {\r\n\t\t\t\t\t\tfiles.push(fileList.item(i));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t$timeout(function() {\r\n\t\t\t\t\tfn(scope, {\r\n\t\t\t\t\t\t$files : files,\r\n\t\t\t\t\t\t$event : evt\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t}, false);\r\n\t\t}\r\n\t};\r\n} ]);\r\n\r\n})();\r\n","/**\r\n * @license AngularJS v1.2.16\r\n * (c) 2010-2014 Google, Inc. http://angularjs.org\r\n * License: MIT\r\n */\r\n(function(window, angular, undefined) {'use strict';\r\n\r\n/**\r\n * @ngdoc module\r\n * @name ngRoute\r\n * @description\r\n *\r\n * # ngRoute\r\n *\r\n * The `ngRoute` module provides routing and deeplinking services and directives for angular apps.\r\n *\r\n * ## Example\r\n * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.\r\n *\r\n *\r\n * <div doc-module-components=\"ngRoute\"></div>\r\n */\r\n /* global -ngRouteModule */\r\nvar ngRouteModule = angular.module('ngRoute', ['ng']).\r\n provider('$route', $RouteProvider);\r\n\r\n/**\r\n * @ngdoc provider\r\n * @name $routeProvider\r\n * @function\r\n *\r\n * @description\r\n *\r\n * Used for configuring routes.\r\n *\r\n * ## Example\r\n * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.\r\n *\r\n * ## Dependencies\r\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\r\n */\r\nfunction $RouteProvider(){\r\n function inherit(parent, extra) {\r\n return angular.extend(new (angular.extend(function() {}, {prototype:parent}))(), extra);\r\n }\r\n\r\n var routes = {};\r\n\r\n /**\r\n * @ngdoc method\r\n * @name $routeProvider#when\r\n *\r\n * @param {string} path Route path (matched against `$location.path`). If `$location.path`\r\n * contains redundant trailing slash or is missing one, the route will still match and the\r\n * `$location.path` will be updated to add or drop the trailing slash to exactly match the\r\n * route definition.\r\n *\r\n * * `path` can contain named groups starting with a colon: e.g. `:name`. All characters up\r\n * to the next slash are matched and stored in `$routeParams` under the given `name`\r\n * when the route matches.\r\n * * `path` can contain named groups starting with a colon and ending with a star:\r\n * e.g.`:name*`. All characters are eagerly stored in `$routeParams` under the given `name`\r\n * when the route matches.\r\n * * `path` can contain optional named groups with a question mark: e.g.`:name?`.\r\n *\r\n * For example, routes like `/color/:color/largecode/:largecode*\\/edit` will match\r\n * `/color/brown/largecode/code/with/slashes/edit` and extract:\r\n *\r\n * * `color: brown`\r\n * * `largecode: code/with/slashes`.\r\n *\r\n *\r\n * @param {Object} route Mapping information to be assigned to `$route.current` on route\r\n * match.\r\n *\r\n * Object properties:\r\n *\r\n * - `controller` – `{(string|function()=}` – Controller fn that should be associated with\r\n * newly created scope or the name of a {@link angular.Module#controller registered\r\n * controller} if passed as a string.\r\n * - `controllerAs` – `{string=}` – A controller alias name. If present the controller will be\r\n * published to scope under the `controllerAs` name.\r\n * - `template` – `{string=|function()=}` – html template as a string or a function that\r\n * returns an html template as a string which should be used by {@link\r\n * ngRoute.directive:ngView ngView} or {@link ng.directive:ngInclude ngInclude} directives.\r\n * This property takes precedence over `templateUrl`.\r\n *\r\n * If `template` is a function, it will be called with the following parameters:\r\n *\r\n * - `{Array.<Object>}` - route parameters extracted from the current\r\n * `$location.path()` by applying the current route\r\n *\r\n * - `templateUrl` – `{string=|function()=}` – path or function that returns a path to an html\r\n * template that should be used by {@link ngRoute.directive:ngView ngView}.\r\n *\r\n * If `templateUrl` is a function, it will be called with the following parameters:\r\n *\r\n * - `{Array.<Object>}` - route parameters extracted from the current\r\n * `$location.path()` by applying the current route\r\n *\r\n * - `resolve` - `{Object.<string, function>=}` - An optional map of dependencies which should\r\n * be injected into the controller. If any of these dependencies are promises, the router\r\n * will wait for them all to be resolved or one to be rejected before the controller is\r\n * instantiated.\r\n * If all the promises are resolved successfully, the values of the resolved promises are\r\n * injected and {@link ngRoute.$route#$routeChangeSuccess $routeChangeSuccess} event is\r\n * fired. If any of the promises are rejected the\r\n * {@link ngRoute.$route#$routeChangeError $routeChangeError} event is fired. The map object\r\n * is:\r\n *\r\n * - `key` – `{string}`: a name of a dependency to be injected into the controller.\r\n * - `factory` - `{string|function}`: If `string` then it is an alias for a service.\r\n * Otherwise if function, then it is {@link auto.$injector#invoke injected}\r\n * and the return value is treated as the dependency. If the result is a promise, it is\r\n * resolved before its value is injected into the controller. Be aware that\r\n * `ngRoute.$routeParams` will still refer to the previous route within these resolve\r\n * functions. Use `$route.current.params` to access the new route parameters, instead.\r\n *\r\n * - `redirectTo` – {(string|function())=} – value to update\r\n * {@link ng.$location $location} path with and trigger route redirection.\r\n *\r\n * If `redirectTo` is a function, it will be called with the following parameters:\r\n *\r\n * - `{Object.<string>}` - route parameters extracted from the current\r\n * `$location.path()` by applying the current route templateUrl.\r\n * - `{string}` - current `$location.path()`\r\n * - `{Object}` - current `$location.search()`\r\n *\r\n * The custom `redirectTo` function is expected to return a string which will be used\r\n * to update `$location.path()` and `$location.search()`.\r\n *\r\n * - `[reloadOnSearch=true]` - {boolean=} - reload route when only `$location.search()`\r\n * or `$location.hash()` changes.\r\n *\r\n * If the option is set to `false` and url in the browser changes, then\r\n * `$routeUpdate` event is broadcasted on the root scope.\r\n *\r\n * - `[caseInsensitiveMatch=false]` - {boolean=} - match routes without being case sensitive\r\n *\r\n * If the option is set to `true`, then the particular route can be matched without being\r\n * case sensitive\r\n *\r\n * @returns {Object} self\r\n *\r\n * @description\r\n * Adds a new route definition to the `$route` service.\r\n */\r\n this.when = function(path, route) {\r\n routes[path] = angular.extend(\r\n {reloadOnSearch: true},\r\n route,\r\n path && pathRegExp(path, route)\r\n );\r\n\r\n // create redirection for trailing slashes\r\n if (path) {\r\n var redirectPath = (path[path.length-1] == '/')\r\n ? path.substr(0, path.length-1)\r\n : path +'/';\r\n\r\n routes[redirectPath] = angular.extend(\r\n {redirectTo: path},\r\n pathRegExp(redirectPath, route)\r\n );\r\n }\r\n\r\n return this;\r\n };\r\n\r\n /**\r\n * @param path {string} path\r\n * @param opts {Object} options\r\n * @return {?Object}\r\n *\r\n * @description\r\n * Normalizes the given path, returning a regular expression\r\n * and the original path.\r\n *\r\n * Inspired by pathRexp in visionmedia/express/lib/utils.js.\r\n */\r\n function pathRegExp(path, opts) {\r\n var insensitive = opts.caseInsensitiveMatch,\r\n ret = {\r\n originalPath: path,\r\n regexp: path\r\n },\r\n keys = ret.keys = [];\r\n\r\n path = path\r\n .replace(/([().])/g, '\\\\$1')\r\n .replace(/(\\/)?:(\\w+)([\\?\\*])?/g, function(_, slash, key, option){\r\n var optional = option === '?' ? option : null;\r\n var star = option === '*' ? option : null;\r\n keys.push({ name: key, optional: !!optional });\r\n slash = slash || '';\r\n return ''\r\n + (optional ? '' : slash)\r\n + '(?:'\r\n + (optional ? slash : '')\r\n + (star && '(.+?)' || '([^/]+)')\r\n + (optional || '')\r\n + ')'\r\n + (optional || '');\r\n })\r\n .replace(/([\\/$\\*])/g, '\\\\$1');\r\n\r\n ret.regexp = new RegExp('^' + path + '$', insensitive ? 'i' : '');\r\n return ret;\r\n }\r\n\r\n /**\r\n * @ngdoc method\r\n * @name $routeProvider#otherwise\r\n *\r\n * @description\r\n * Sets route definition that will be used on route change when no other route definition\r\n * is matched.\r\n *\r\n * @param {Object} params Mapping information to be assigned to `$route.current`.\r\n * @returns {Object} self\r\n */\r\n this.otherwise = function(params) {\r\n this.when(null, params);\r\n return this;\r\n };\r\n\r\n\r\n this.$get = ['$rootScope',\r\n '$location',\r\n '$routeParams',\r\n '$q',\r\n '$injector',\r\n '$http',\r\n '$templateCache',\r\n '$sce',\r\n function($rootScope, $location, $routeParams, $q, $injector, $http, $templateCache, $sce) {\r\n\r\n /**\r\n * @ngdoc service\r\n * @name $route\r\n * @requires $location\r\n * @requires $routeParams\r\n *\r\n * @property {Object} current Reference to the current route definition.\r\n * The route definition contains:\r\n *\r\n * - `controller`: The controller constructor as define in route definition.\r\n * - `locals`: A map of locals which is used by {@link ng.$controller $controller} service for\r\n * controller instantiation. The `locals` contain\r\n * the resolved values of the `resolve` map. Additionally the `locals` also contain:\r\n *\r\n * - `$scope` - The current route scope.\r\n * - `$template` - The current route template HTML.\r\n *\r\n * @property {Object} routes Object with all route configuration Objects as its properties.\r\n *\r\n * @description\r\n * `$route` is used for deep-linking URLs to controllers and views (HTML partials).\r\n * It watches `$location.url()` and tries to map the path to an existing route definition.\r\n *\r\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\r\n *\r\n * You can define routes through {@link ngRoute.$routeProvider $routeProvider}'s API.\r\n *\r\n * The `$route` service is typically used in conjunction with the\r\n * {@link ngRoute.directive:ngView `ngView`} directive and the\r\n * {@link ngRoute.$routeParams `$routeParams`} service.\r\n *\r\n * @example\r\n * This example shows how changing the URL hash causes the `$route` to match a route against the\r\n * URL, and the `ngView` pulls in the partial.\r\n *\r\n * Note that this example is using {@link ng.directive:script inlined templates}\r\n * to get it working on jsfiddle as well.\r\n *\r\n * <example name=\"$route-service\" module=\"ngRouteExample\"\r\n * deps=\"angular-route.js\" fixBase=\"true\">\r\n * <file name=\"index.html\">\r\n * <div ng-controller=\"MainController\">\r\n * Choose:\r\n * <a href=\"Book/Moby\">Moby</a> |\r\n * <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\r\n * <a href=\"Book/Gatsby\">Gatsby</a> |\r\n * <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\r\n * <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\r\n *\r\n * <div ng-view></div>\r\n *\r\n * <hr />\r\n *\r\n * <pre>$location.path() = {{$location.path()}}</pre>\r\n * <pre>$route.current.templateUrl = {{$route.current.templateUrl}}</pre>\r\n * <pre>$route.current.params = {{$route.current.params}}</pre>\r\n * <pre>$route.current.scope.name = {{$route.current.scope.name}}</pre>\r\n * <pre>$routeParams = {{$routeParams}}</pre>\r\n * </div>\r\n * </file>\r\n *\r\n * <file name=\"book.html\">\r\n * controller: {{name}}<br />\r\n * Book Id: {{params.bookId}}<br />\r\n * </file>\r\n *\r\n * <file name=\"chapter.html\">\r\n * controller: {{name}}<br />\r\n * Book Id: {{params.bookId}}<br />\r\n * Chapter Id: {{params.chapterId}}\r\n * </file>\r\n *\r\n * <file name=\"script.js\">\r\n * angular.module('ngRouteExample', ['ngRoute'])\r\n *\r\n * .controller('MainController', function($scope, $route, $routeParams, $location) {\r\n * $scope.$route = $route;\r\n * $scope.$location = $location;\r\n * $scope.$routeParams = $routeParams;\r\n * })\r\n *\r\n * .controller('BookController', function($scope, $routeParams) {\r\n * $scope.name = \"BookController\";\r\n * $scope.params = $routeParams;\r\n * })\r\n *\r\n * .controller('ChapterController', function($scope, $routeParams) {\r\n * $scope.name = \"ChapterController\";\r\n * $scope.params = $routeParams;\r\n * })\r\n *\r\n * .config(function($routeProvider, $locationProvider) {\r\n * $routeProvider\r\n * .when('/Book/:bookId', {\r\n * templateUrl: 'book.html',\r\n * controller: 'BookController',\r\n * resolve: {\r\n * // I will cause a 1 second delay\r\n * delay: function($q, $timeout) {\r\n * var delay = $q.defer();\r\n * $timeout(delay.resolve, 1000);\r\n * return delay.promise;\r\n * }\r\n * }\r\n * })\r\n * .when('/Book/:bookId/ch/:chapterId', {\r\n * templateUrl: 'chapter.html',\r\n * controller: 'ChapterController'\r\n * });\r\n *\r\n * // configure html5 to get links working on jsfiddle\r\n * $locationProvider.html5Mode(true);\r\n * });\r\n *\r\n * </file>\r\n *\r\n * <file name=\"protractor.js\" type=\"protractor\">\r\n * it('should load and compile correct template', function() {\r\n * element(by.linkText('Moby: Ch1')).click();\r\n * var content = element(by.css('[ng-view]')).getText();\r\n * expect(content).toMatch(/controller\\: ChapterController/);\r\n * expect(content).toMatch(/Book Id\\: Moby/);\r\n * expect(content).toMatch(/Chapter Id\\: 1/);\r\n *\r\n * element(by.partialLinkText('Scarlet')).click();\r\n *\r\n * content = element(by.css('[ng-view]')).getText();\r\n * expect(content).toMatch(/controller\\: BookController/);\r\n * expect(content).toMatch(/Book Id\\: Scarlet/);\r\n * });\r\n * </file>\r\n * </example>\r\n */\r\n\r\n /**\r\n * @ngdoc event\r\n * @name $route#$routeChangeStart\r\n * @eventType broadcast on root scope\r\n * @description\r\n * Broadcasted before a route change. At this point the route services starts\r\n * resolving all of the dependencies needed for the route change to occur.\r\n * Typically this involves fetching the view template as well as any dependencies\r\n * defined in `resolve` route property. Once all of the dependencies are resolved\r\n * `$routeChangeSuccess` is fired.\r\n *\r\n * @param {Object} angularEvent Synthetic event object.\r\n * @param {Route} next Future route information.\r\n * @param {Route} current Current route information.\r\n */\r\n\r\n /**\r\n * @ngdoc event\r\n * @name $route#$routeChangeSuccess\r\n * @eventType broadcast on root scope\r\n * @description\r\n * Broadcasted after a route dependencies are resolved.\r\n * {@link ngRoute.directive:ngView ngView} listens for the directive\r\n * to instantiate the controller and render the view.\r\n *\r\n * @param {Object} angularEvent Synthetic event object.\r\n * @param {Route} current Current route information.\r\n * @param {Route|Undefined} previous Previous route information, or undefined if current is\r\n * first route entered.\r\n */\r\n\r\n /**\r\n * @ngdoc event\r\n * @name $route#$routeChangeError\r\n * @eventType broadcast on root scope\r\n * @description\r\n * Broadcasted if any of the resolve promises are rejected.\r\n *\r\n * @param {Object} angularEvent Synthetic event object\r\n * @param {Route} current Current route information.\r\n * @param {Route} previous Previous route information.\r\n * @param {Route} rejection Rejection of the promise. Usually the error of the failed promise.\r\n */\r\n\r\n /**\r\n * @ngdoc event\r\n * @name $route#$routeUpdate\r\n * @eventType broadcast on root scope\r\n * @description\r\n *\r\n * The `reloadOnSearch` property has been set to false, and we are reusing the same\r\n * instance of the Controller.\r\n */\r\n\r\n var forceReload = false,\r\n $route = {\r\n routes: routes,\r\n\r\n /**\r\n * @ngdoc method\r\n * @name $route#reload\r\n *\r\n * @description\r\n * Causes `$route` service to reload the current route even if\r\n * {@link ng.$location $location} hasn't changed.\r\n *\r\n * As a result of that, {@link ngRoute.directive:ngView ngView}\r\n * creates new scope, reinstantiates the controller.\r\n */\r\n reload: function() {\r\n forceReload = true;\r\n $rootScope.$evalAsync(updateRoute);\r\n }\r\n };\r\n\r\n $rootScope.$on('$locationChangeSuccess', updateRoute);\r\n\r\n return $route;\r\n\r\n /////////////////////////////////////////////////////\r\n\r\n /**\r\n * @param on {string} current url\r\n * @param route {Object} route regexp to match the url against\r\n * @return {?Object}\r\n *\r\n * @description\r\n * Check if the route matches the current url.\r\n *\r\n * Inspired by match in\r\n * visionmedia/express/lib/router/router.js.\r\n */\r\n function switchRouteMatcher(on, route) {\r\n var keys = route.keys,\r\n params = {};\r\n\r\n if (!route.regexp) return null;\r\n\r\n var m = route.regexp.exec(on);\r\n if (!m) return null;\r\n\r\n for (var i = 1, len = m.length; i < len; ++i) {\r\n var key = keys[i - 1];\r\n\r\n var val = 'string' == typeof m[i]\r\n ? decodeURIComponent(m[i])\r\n : m[i];\r\n\r\n if (key && val) {\r\n params[key.name] = val;\r\n }\r\n }\r\n return params;\r\n }\r\n\r\n function updateRoute() {\r\n var next = parseRoute(),\r\n last = $route.current;\r\n\r\n if (next && last && next.$$route === last.$$route\r\n && angular.equals(next.pathParams, last.pathParams)\r\n && !next.reloadOnSearch && !forceReload) {\r\n last.params = next.params;\r\n angular.copy(last.params, $routeParams);\r\n $rootScope.$broadcast('$routeUpdate', last);\r\n } else if (next || last) {\r\n forceReload = false;\r\n $rootScope.$broadcast('$routeChangeStart', next, last);\r\n $route.current = next;\r\n if (next) {\r\n if (next.redirectTo) {\r\n if (angular.isString(next.redirectTo)) {\r\n $location.path(interpolate(next.redirectTo, next.params)).search(next.params)\r\n .replace();\r\n } else {\r\n $location.url(next.redirectTo(next.pathParams, $location.path(), $location.search()))\r\n .replace();\r\n }\r\n }\r\n }\r\n\r\n $q.when(next).\r\n then(function() {\r\n if (next) {\r\n var locals = angular.extend({}, next.resolve),\r\n template, templateUrl;\r\n\r\n angular.forEach(locals, function(value, key) {\r\n locals[key] = angular.isString(value) ?\r\n $injector.get(value) : $injector.invoke(value);\r\n });\r\n\r\n if (angular.isDefined(template = next.template)) {\r\n if (angular.isFunction(template)) {\r\n template = template(next.params);\r\n }\r\n } else if (angular.isDefined(templateUrl = next.templateUrl)) {\r\n if (angular.isFunction(templateUrl)) {\r\n templateUrl = templateUrl(next.params);\r\n }\r\n templateUrl = $sce.getTrustedResourceUrl(templateUrl);\r\n if (angular.isDefined(templateUrl)) {\r\n next.loadedTemplateUrl = templateUrl;\r\n template = $http.get(templateUrl, {cache: $templateCache}).\r\n then(function(response) { return response.data; });\r\n }\r\n }\r\n if (angular.isDefined(template)) {\r\n locals['$template'] = template;\r\n }\r\n return $q.all(locals);\r\n }\r\n }).\r\n // after route change\r\n then(function(locals) {\r\n if (next == $route.current) {\r\n if (next) {\r\n next.locals = locals;\r\n angular.copy(next.params, $routeParams);\r\n }\r\n $rootScope.$broadcast('$routeChangeSuccess', next, last);\r\n }\r\n }, function(error) {\r\n if (next == $route.current) {\r\n $rootScope.$broadcast('$routeChangeError', next, last, error);\r\n }\r\n });\r\n }\r\n }\r\n\r\n\r\n /**\r\n * @returns {Object} the current active route, by matching it against the URL\r\n */\r\n function parseRoute() {\r\n // Match a route\r\n var params, match;\r\n angular.forEach(routes, function(route, path) {\r\n if (!match && (params = switchRouteMatcher($location.path(), route))) {\r\n match = inherit(route, {\r\n params: angular.extend({}, $location.search(), params),\r\n pathParams: params});\r\n match.$$route = route;\r\n }\r\n });\r\n // No route matched; fallback to \"otherwise\" route\r\n return match || routes[null] && inherit(routes[null], {params: {}, pathParams:{}});\r\n }\r\n\r\n /**\r\n * @returns {string} interpolation of the redirect path with the parameters\r\n */\r\n function interpolate(string, params) {\r\n var result = [];\r\n angular.forEach((string||'').split(':'), function(segment, i) {\r\n if (i === 0) {\r\n result.push(segment);\r\n } else {\r\n var segmentMatch = segment.match(/(\\w+)(.*)/);\r\n var key = segmentMatch[1];\r\n result.push(params[key]);\r\n result.push(segmentMatch[2] || '');\r\n delete params[key];\r\n }\r\n });\r\n return result.join('');\r\n }\r\n }];\r\n}\r\n\r\nngRouteModule.provider('$routeParams', $RouteParamsProvider);\r\n\r\n\r\n/**\r\n * @ngdoc service\r\n * @name $routeParams\r\n * @requires $route\r\n *\r\n * @description\r\n * The `$routeParams` service allows you to retrieve the current set of route parameters.\r\n *\r\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\r\n *\r\n * The route parameters are a combination of {@link ng.$location `$location`}'s\r\n * {@link ng.$location#search `search()`} and {@link ng.$location#path `path()`}.\r\n * The `path` parameters are extracted when the {@link ngRoute.$route `$route`} path is matched.\r\n *\r\n * In case of parameter name collision, `path` params take precedence over `search` params.\r\n *\r\n * The service guarantees that the identity of the `$routeParams` object will remain unchanged\r\n * (but its properties will likely change) even when a route change occurs.\r\n *\r\n * Note that the `$routeParams` are only updated *after* a route change completes successfully.\r\n * This means that you cannot rely on `$routeParams` being correct in route resolve functions.\r\n * Instead you can use `$route.current.params` to access the new route's parameters.\r\n *\r\n * @example\r\n * ```js\r\n * // Given:\r\n * // URL: http://server.com/index.html#/Chapter/1/Section/2?search=moby\r\n * // Route: /Chapter/:chapterId/Section/:sectionId\r\n * //\r\n * // Then\r\n * $routeParams ==> {chapterId:1, sectionId:2, search:'moby'}\r\n * ```\r\n */\r\nfunction $RouteParamsProvider() {\r\n this.$get = function() { return {}; };\r\n}\r\n\r\nngRouteModule.directive('ngView', ngViewFactory);\r\nngRouteModule.directive('ngView', ngViewFillContentFactory);\r\n\r\n\r\n/**\r\n * @ngdoc directive\r\n * @name ngView\r\n * @restrict ECA\r\n *\r\n * @description\r\n * # Overview\r\n * `ngView` is a directive that complements the {@link ngRoute.$route $route} service by\r\n * including the rendered template of the current route into the main layout (`index.html`) file.\r\n * Every time the current route changes, the included view changes with it according to the\r\n * configuration of the `$route` service.\r\n *\r\n * Requires the {@link ngRoute `ngRoute`} module to be installed.\r\n *\r\n * @animations\r\n * enter - animation is used to bring new content into the browser.\r\n * leave - animation is used to animate existing content away.\r\n *\r\n * The enter and leave animation occur concurrently.\r\n *\r\n * @scope\r\n * @priority 400\r\n * @param {string=} onload Expression to evaluate whenever the view updates.\r\n *\r\n * @param {string=} autoscroll Whether `ngView` should call {@link ng.$anchorScroll\r\n * $anchorScroll} to scroll the viewport after the view is updated.\r\n *\r\n * - If the attribute is not set, disable scrolling.\r\n * - If the attribute is set without value, enable scrolling.\r\n * - Otherwise enable scrolling only if the `autoscroll` attribute value evaluated\r\n * as an expression yields a truthy value.\r\n * @example\r\n <example name=\"ngView-directive\" module=\"ngViewExample\"\r\n deps=\"angular-route.js;angular-animate.js\"\r\n animations=\"true\" fixBase=\"true\">\r\n <file name=\"index.html\">\r\n <div ng-controller=\"MainCtrl as main\">\r\n Choose:\r\n <a href=\"Book/Moby\">Moby</a> |\r\n <a href=\"Book/Moby/ch/1\">Moby: Ch1</a> |\r\n <a href=\"Book/Gatsby\">Gatsby</a> |\r\n <a href=\"Book/Gatsby/ch/4?key=value\">Gatsby: Ch4</a> |\r\n <a href=\"Book/Scarlet\">Scarlet Letter</a><br/>\r\n\r\n <div class=\"view-animate-container\">\r\n <div ng-view class=\"view-animate\"></div>\r\n </div>\r\n <hr />\r\n\r\n <pre>$location.path() = {{main.$location.path()}}</pre>\r\n <pre>$route.current.templateUrl = {{main.$route.current.templateUrl}}</pre>\r\n <pre>$route.current.params = {{main.$route.current.params}}</pre>\r\n <pre>$route.current.scope.name = {{main.$route.current.scope.name}}</pre>\r\n <pre>$routeParams = {{main.$routeParams}}</pre>\r\n </div>\r\n </file>\r\n\r\n <file name=\"book.html\">\r\n <div>\r\n controller: {{book.name}}<br />\r\n Book Id: {{book.params.bookId}}<br />\r\n </div>\r\n </file>\r\n\r\n <file name=\"chapter.html\">\r\n <div>\r\n controller: {{chapter.name}}<br />\r\n Book Id: {{chapter.params.bookId}}<br />\r\n Chapter Id: {{chapter.params.chapterId}}\r\n </div>\r\n </file>\r\n\r\n <file name=\"animations.css\">\r\n .view-animate-container {\r\n position:relative;\r\n height:100px!important;\r\n position:relative;\r\n background:white;\r\n border:1px solid black;\r\n height:40px;\r\n overflow:hidden;\r\n }\r\n\r\n .view-animate {\r\n padding:10px;\r\n }\r\n\r\n .view-animate.ng-enter, .view-animate.ng-leave {\r\n -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;\r\n transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 1.5s;\r\n\r\n display:block;\r\n width:100%;\r\n border-left:1px solid black;\r\n\r\n position:absolute;\r\n top:0;\r\n left:0;\r\n right:0;\r\n bottom:0;\r\n padding:10px;\r\n }\r\n\r\n .view-animate.ng-enter {\r\n left:100%;\r\n }\r\n .view-animate.ng-enter.ng-enter-active {\r\n left:0;\r\n }\r\n .view-animate.ng-leave.ng-leave-active {\r\n left:-100%;\r\n }\r\n </file>\r\n\r\n <file name=\"script.js\">\r\n angular.module('ngViewExample', ['ngRoute', 'ngAnimate'])\r\n .config(['$routeProvider', '$locationProvider',\r\n function($routeProvider, $locationProvider) {\r\n $routeProvider\r\n .when('/Book/:bookId', {\r\n templateUrl: 'book.html',\r\n controller: 'BookCtrl',\r\n controllerAs: 'book'\r\n })\r\n .when('/Book/:bookId/ch/:chapterId', {\r\n templateUrl: 'chapter.html',\r\n controller: 'ChapterCtrl',\r\n controllerAs: 'chapter'\r\n });\r\n\r\n // configure html5 to get links working on jsfiddle\r\n $locationProvider.html5Mode(true);\r\n }])\r\n .controller('MainCtrl', ['$route', '$routeParams', '$location',\r\n function($route, $routeParams, $location) {\r\n this.$route = $route;\r\n this.$location = $location;\r\n this.$routeParams = $routeParams;\r\n }])\r\n .controller('BookCtrl', ['$routeParams', function($routeParams) {\r\n this.name = \"BookCtrl\";\r\n this.params = $routeParams;\r\n }])\r\n .controller('ChapterCtrl', ['$routeParams', function($routeParams) {\r\n this.name = \"ChapterCtrl\";\r\n this.params = $routeParams;\r\n }]);\r\n\r\n </file>\r\n\r\n <file name=\"protractor.js\" type=\"protractor\">\r\n it('should load and compile correct template', function() {\r\n element(by.linkText('Moby: Ch1')).click();\r\n var content = element(by.css('[ng-view]')).getText();\r\n expect(content).toMatch(/controller\\: ChapterCtrl/);\r\n expect(content).toMatch(/Book Id\\: Moby/);\r\n expect(content).toMatch(/Chapter Id\\: 1/);\r\n\r\n element(by.partialLinkText('Scarlet')).click();\r\n\r\n content = element(by.css('[ng-view]')).getText();\r\n expect(content).toMatch(/controller\\: BookCtrl/);\r\n expect(content).toMatch(/Book Id\\: Scarlet/);\r\n });\r\n </file>\r\n </example>\r\n */\r\n\r\n\r\n/**\r\n * @ngdoc event\r\n * @name ngView#$viewContentLoaded\r\n * @eventType emit on the current ngView scope\r\n * @description\r\n * Emitted every time the ngView content is reloaded.\r\n */\r\nngViewFactory.$inject = ['$route', '$anchorScroll', '$animate'];\r\nfunction ngViewFactory( $route, $anchorScroll, $animate) {\r\n return {\r\n restrict: 'ECA',\r\n terminal: true,\r\n priority: 400,\r\n transclude: 'element',\r\n link: function(scope, $element, attr, ctrl, $transclude) {\r\n var currentScope,\r\n currentElement,\r\n previousElement,\r\n autoScrollExp = attr.autoscroll,\r\n onloadExp = attr.onload || '';\r\n\r\n scope.$on('$routeChangeSuccess', update);\r\n update();\r\n\r\n function cleanupLastView() {\r\n if(previousElement) {\r\n previousElement.remove();\r\n previousElement = null;\r\n }\r\n if(currentScope) {\r\n currentScope.$destroy();\r\n currentScope = null;\r\n }\r\n if(currentElement) {\r\n $animate.leave(currentElement, function() {\r\n previousElement = null;\r\n });\r\n previousElement = currentElement;\r\n currentElement = null;\r\n }\r\n }\r\n\r\n function update() {\r\n var locals = $route.current && $route.current.locals,\r\n template = locals && locals.$template;\r\n\r\n if (angular.isDefined(template)) {\r\n var newScope = scope.$new();\r\n var current = $route.current;\r\n\r\n // Note: This will also link all children of ng-view that were contained in the original\r\n // html. If that content contains controllers, ... they could pollute/change the scope.\r\n // However, using ng-view on an element with additional content does not make sense...\r\n // Note: We can't remove them in the cloneAttchFn of $transclude as that\r\n // function is called before linking the content, which would apply child\r\n // directives to non existing elements.\r\n var clone = $transclude(newScope, function(clone) {\r\n $animate.enter(clone, null, currentElement || $element, function onNgViewEnter () {\r\n if (angular.isDefined(autoScrollExp)\r\n && (!autoScrollExp || scope.$eval(autoScrollExp))) {\r\n $anchorScroll();\r\n }\r\n });\r\n cleanupLastView();\r\n });\r\n\r\n currentElement = clone;\r\n currentScope = current.scope = newScope;\r\n currentScope.$emit('$viewContentLoaded');\r\n currentScope.$eval(onloadExp);\r\n } else {\r\n cleanupLastView();\r\n }\r\n }\r\n }\r\n };\r\n}\r\n\r\n// This directive is called during the $transclude call of the first `ngView` directive.\r\n// It will replace and compile the content of the element with the loaded template.\r\n// We need this directive so that the element content is already filled when\r\n// the link function of another directive on the same element as ngView\r\n// is called.\r\nngViewFillContentFactory.$inject = ['$compile', '$controller', '$route'];\r\nfunction ngViewFillContentFactory($compile, $controller, $route) {\r\n return {\r\n restrict: 'ECA',\r\n priority: -400,\r\n link: function(scope, $element) {\r\n var current = $route.current,\r\n locals = current.locals;\r\n\r\n $element.html(locals.$template);\r\n\r\n var link = $compile($element.contents());\r\n\r\n if (current.controller) {\r\n locals.$scope = scope;\r\n var controller = $controller(current.controller, locals);\r\n if (current.controllerAs) {\r\n scope[current.controllerAs] = controller;\r\n }\r\n $element.data('$ngControllerController', controller);\r\n $element.children().data('$ngControllerController', controller);\r\n }\r\n\r\n link(scope);\r\n }\r\n };\r\n}\r\n\r\n\r\n})(window, window.angular);\r\n",null,null,"/**\r\n * @license AngularJS v1.2.16\r\n * (c) 2010-2014 Google, Inc. http://angularjs.org\r\n * License: MIT\r\n */\r\n(function(window, angular, undefined) {'use strict';\r\n\r\n/**\r\n * @ngdoc module\r\n * @name ngCookies\r\n * @description\r\n *\r\n * # ngCookies\r\n *\r\n * The `ngCookies` module provides a convenient wrapper for reading and writing browser cookies.\r\n *\r\n *\r\n * <div doc-module-components=\"ngCookies\"></div>\r\n *\r\n * See {@link ngCookies.$cookies `$cookies`} and\r\n * {@link ngCookies.$cookieStore `$cookieStore`} for usage.\r\n */\r\n\r\n\r\nangular.module('ngCookies', ['ng']).\r\n /**\r\n * @ngdoc service\r\n * @name $cookies\r\n *\r\n * @description\r\n * Provides read/write access to browser's cookies.\r\n *\r\n * Only a simple Object is exposed and by adding or removing properties to/from this object, new\r\n * cookies are created/deleted at the end of current $eval.\r\n * The object's properties can only be strings.\r\n *\r\n * Requires the {@link ngCookies `ngCookies`} module to be installed.\r\n *\r\n * @example\r\n <example>\r\n <file name=\"index.html\">\r\n <script>\r\n function ExampleController($cookies) {\r\n // Retrieving a cookie\r\n var favoriteCookie = $cookies.myFavorite;\r\n // Setting a cookie\r\n $cookies.myFavorite = 'oatmeal';\r\n }\r\n </script>\r\n </file>\r\n </example>\r\n */\r\n factory('$cookies', ['$rootScope', '$browser', function ($rootScope, $browser) {\r\n var cookies = {},\r\n lastCookies = {},\r\n lastBrowserCookies,\r\n runEval = false,\r\n copy = angular.copy,\r\n isUndefined = angular.isUndefined;\r\n\r\n //creates a poller fn that copies all cookies from the $browser to service & inits the service\r\n $browser.addPollFn(function() {\r\n var currentCookies = $browser.cookies();\r\n if (lastBrowserCookies != currentCookies) { //relies on browser.cookies() impl\r\n lastBrowserCookies = currentCookies;\r\n copy(currentCookies, lastCookies);\r\n copy(currentCookies, cookies);\r\n if (runEval) $rootScope.$apply();\r\n }\r\n })();\r\n\r\n runEval = true;\r\n\r\n //at the end of each eval, push cookies\r\n //TODO: this should happen before the \"delayed\" watches fire, because if some cookies are not\r\n // strings or browser refuses to store some cookies, we update the model in the push fn.\r\n $rootScope.$watch(push);\r\n\r\n return cookies;\r\n\r\n\r\n /**\r\n * Pushes all the cookies from the service to the browser and verifies if all cookies were\r\n * stored.\r\n */\r\n function push() {\r\n var name,\r\n value,\r\n browserCookies,\r\n updated;\r\n\r\n //delete any cookies deleted in $cookies\r\n for (name in lastCookies) {\r\n if (isUndefined(cookies[name])) {\r\n $browser.cookies(name, undefined);\r\n }\r\n }\r\n\r\n //update all cookies updated in $cookies\r\n for(name in cookies) {\r\n value = cookies[name];\r\n if (!angular.isString(value)) {\r\n value = '' + value;\r\n cookies[name] = value;\r\n }\r\n if (value !== lastCookies[name]) {\r\n $browser.cookies(name, value);\r\n updated = true;\r\n }\r\n }\r\n\r\n //verify what was actually stored\r\n if (updated){\r\n updated = false;\r\n browserCookies = $browser.cookies();\r\n\r\n for (name in cookies) {\r\n if (cookies[name] !== browserCookies[name]) {\r\n //delete or reset all cookies that the browser dropped from $cookies\r\n if (isUndefined(browserCookies[name])) {\r\n delete cookies[name];\r\n } else {\r\n cookies[name] = browserCookies[name];\r\n }\r\n updated = true;\r\n }\r\n }\r\n }\r\n }\r\n }]).\r\n\r\n\r\n /**\r\n * @ngdoc service\r\n * @name $cookieStore\r\n * @requires $cookies\r\n *\r\n * @description\r\n * Provides a key-value (string-object) storage, that is backed by session cookies.\r\n * Objects put or retrieved from this storage are automatically serialized or\r\n * deserialized by angular's toJson/fromJson.\r\n *\r\n * Requires the {@link ngCookies `ngCookies`} module to be installed.\r\n *\r\n * @example\r\n */\r\n factory('$cookieStore', ['$cookies', function($cookies) {\r\n\r\n return {\r\n /**\r\n * @ngdoc method\r\n * @name $cookieStore#get\r\n *\r\n * @description\r\n * Returns the value of given cookie key\r\n *\r\n * @param {string} key Id to use for lookup.\r\n * @returns {Object} Deserialized cookie value.\r\n */\r\n get: function(key) {\r\n var value = $cookies[key];\r\n return value ? angular.fromJson(value) : value;\r\n },\r\n\r\n /**\r\n * @ngdoc method\r\n * @name $cookieStore#put\r\n *\r\n * @description\r\n * Sets a value for given cookie key\r\n *\r\n * @param {string} key Id for the `value`.\r\n * @param {Object} value Value to be stored.\r\n */\r\n put: function(key, value) {\r\n $cookies[key] = angular.toJson(value);\r\n },\r\n\r\n /**\r\n * @ngdoc method\r\n * @name $cookieStore#remove\r\n *\r\n * @description\r\n * Remove given cookie\r\n *\r\n * @param {string} key Id of the key-value pair to delete.\r\n */\r\n remove: function(key) {\r\n delete $cookies[key];\r\n }\r\n };\r\n\r\n }]);\r\n\r\n\r\n})(window, window.angular);\r\n","/**\r\n * @license AngularJS v1.2.16\r\n * (c) 2010-2014 Google, Inc. http://angularjs.org\r\n * License: MIT\r\n */\r\n(function(window, angular, undefined) {'use strict';\r\n\r\n/* jshint maxlen: false */\r\n\r\n/**\r\n * @ngdoc module\r\n * @name ngAnimate\r\n * @description\r\n *\r\n * # ngAnimate\r\n *\r\n * The `ngAnimate` module provides support for JavaScript, CSS3 transition and CSS3 keyframe animation hooks within existing core and custom directives.\r\n *\r\n *\r\n * <div doc-module-components=\"ngAnimate\"></div>\r\n *\r\n * # Usage\r\n *\r\n * To see animations in action, all that is required is to define the appropriate CSS classes\r\n * or to register a JavaScript animation via the myModule.animation() function. The directives that support animation automatically are:\r\n * `ngRepeat`, `ngInclude`, `ngIf`, `ngSwitch`, `ngShow`, `ngHide`, `ngView` and `ngClass`. Custom directives can take advantage of animation\r\n * by using the `$animate` service.\r\n *\r\n * Below is a more detailed breakdown of the supported animation events provided by pre-existing ng directives:\r\n *\r\n * | Directive | Supported Animations |\r\n * |---------------------------------------------------------- |----------------------------------------------------|\r\n * | {@link ng.directive:ngRepeat#usage_animations ngRepeat} | enter, leave and move |\r\n * | {@link ngRoute.directive:ngView#usage_animations ngView} | enter and leave |\r\n * | {@link ng.directive:ngInclude#usage_animations ngInclude} | enter and leave |\r\n * | {@link ng.directive:ngSwitch#usage_animations ngSwitch} | enter and leave |\r\n * | {@link ng.directive:ngIf#usage_animations ngIf} | enter and leave |\r\n * | {@link ng.directive:ngClass#usage_animations ngClass} | add and remove |\r\n * | {@link ng.directive:ngShow#usage_animations ngShow & ngHide} | add and remove (the ng-hide class value) |\r\n * | {@link ng.directive:form#usage_animations form} | add and remove (dirty, pristine, valid, invalid & all other validations) |\r\n * | {@link ng.directive:ngModel#usage_animations ngModel} | add and remove (dirty, pristine, valid, invalid & all other validations) |\r\n *\r\n * You can find out more information about animations upon visiting each directive page.\r\n *\r\n * Below is an example of how to apply animations to a directive that supports animation hooks:\r\n *\r\n * ```html\r\n * <style type=\"text/css\">\r\n * .slide.ng-enter, .slide.ng-leave {\r\n * -webkit-transition:0.5s linear all;\r\n * transition:0.5s linear all;\r\n * }\r\n *\r\n * .slide.ng-enter { } /* starting animations for enter */\r\n * .slide.ng-enter-active { } /* terminal animations for enter */\r\n * .slide.ng-leave { } /* starting animations for leave */\r\n * .slide.ng-leave-active { } /* terminal animations for leave */\r\n * </style>\r\n *\r\n * <!--\r\n * the animate service will automatically add .ng-enter and .ng-leave to the element\r\n * to trigger the CSS transition/animations\r\n * -->\r\n * <ANY class=\"slide\" ng-include=\"...\"></ANY>\r\n * ```\r\n *\r\n * Keep in mind that if an animation is running, any child elements cannot be animated until the parent element's\r\n * animation has completed.\r\n *\r\n * <h2>CSS-defined Animations</h2>\r\n * The animate service will automatically apply two CSS classes to the animated element and these two CSS classes\r\n * are designed to contain the start and end CSS styling. Both CSS transitions and keyframe animations are supported\r\n * and can be used to play along with this naming structure.\r\n *\r\n * The following code below demonstrates how to perform animations using **CSS transitions** with Angular:\r\n *\r\n * ```html\r\n * <style type=\"text/css\">\r\n * /*\r\n * The animate class is apart of the element and the ng-enter class\r\n * is attached to the element once the enter animation event is triggered\r\n * */\r\n * .reveal-animation.ng-enter {\r\n * -webkit-transition: 1s linear all; /* Safari/Chrome */\r\n * transition: 1s linear all; /* All other modern browsers and IE10+ */\r\n *\r\n * /* The animation preparation code */\r\n * opacity: 0;\r\n * }\r\n *\r\n * /*\r\n * Keep in mind that you want to combine both CSS\r\n * classes together to avoid any CSS-specificity\r\n * conflicts\r\n * */\r\n * .reveal-animation.ng-enter.ng-enter-active {\r\n * /* The animation code itself */\r\n * opacity: 1;\r\n * }\r\n * </style>\r\n *\r\n * <div class=\"view-container\">\r\n * <div ng-view class=\"reveal-animation\"></div>\r\n * </div>\r\n * ```\r\n *\r\n * The following code below demonstrates how to perform animations using **CSS animations** with Angular:\r\n *\r\n * ```html\r\n * <style type=\"text/css\">\r\n * .reveal-animation.ng-enter {\r\n * -webkit-animation: enter_sequence 1s linear; /* Safari/Chrome */\r\n * animation: enter_sequence 1s linear; /* IE10+ and Future Browsers */\r\n * }\r\n * @-webkit-keyframes enter_sequence {\r\n * from { opacity:0; }\r\n * to { opacity:1; }\r\n * }\r\n * @keyframes enter_sequence {\r\n * from { opacity:0; }\r\n * to { opacity:1; }\r\n * }\r\n * </style>\r\n *\r\n * <div class=\"view-container\">\r\n * <div ng-view class=\"reveal-animation\"></div>\r\n * </div>\r\n * ```\r\n *\r\n * Both CSS3 animations and transitions can be used together and the animate service will figure out the correct duration and delay timing.\r\n *\r\n * Upon DOM mutation, the event class is added first (something like `ng-enter`), then the browser prepares itself to add\r\n * the active class (in this case `ng-enter-active`) which then triggers the animation. The animation module will automatically\r\n * detect the CSS code to determine when the animation ends. Once the animation is over then both CSS classes will be\r\n * removed from the DOM. If a browser does not support CSS transitions or CSS animations then the animation will start and end\r\n * immediately resulting in a DOM element that is at its final state. This final state is when the DOM element\r\n * has no CSS transition/animation classes applied to it.\r\n *\r\n * <h3>CSS Staggering Animations</h3>\r\n * A Staggering animation is a collection of animations that are issued with a slight delay in between each successive operation resulting in a\r\n * curtain-like effect. The ngAnimate module, as of 1.2.0, supports staggering animations and the stagger effect can be\r\n * performed by creating a **ng-EVENT-stagger** CSS class and attaching that class to the base CSS class used for\r\n * the animation. The style property expected within the stagger class can either be a **transition-delay** or an\r\n * **animation-delay** property (or both if your animation contains both transitions and keyframe animations).\r\n *\r\n * ```css\r\n * .my-animation.ng-enter {\r\n * /* standard transition code */\r\n * -webkit-transition: 1s linear all;\r\n * transition: 1s linear all;\r\n * opacity:0;\r\n * }\r\n * .my-animation.ng-enter-stagger {\r\n * /* this will have a 100ms delay between each successive leave animation */\r\n * -webkit-transition-delay: 0.1s;\r\n * transition-delay: 0.1s;\r\n *\r\n * /* in case the stagger doesn't work then these two values\r\n * must be set to 0 to avoid an accidental CSS inheritance */\r\n * -webkit-transition-duration: 0s;\r\n * transition-duration: 0s;\r\n * }\r\n * .my-animation.ng-enter.ng-enter-active {\r\n * /* standard transition styles */\r\n * opacity:1;\r\n * }\r\n * ```\r\n *\r\n * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations\r\n * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this\r\n * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation\r\n * will also be reset if more than 10ms has passed after the last animation has been fired.\r\n *\r\n * The following code will issue the **ng-leave-stagger** event on the element provided:\r\n *\r\n * ```js\r\n * var kids = parent.children();\r\n *\r\n * $animate.leave(kids[0]); //stagger index=0\r\n * $animate.leave(kids[1]); //stagger index=1\r\n * $animate.leave(kids[2]); //stagger index=2\r\n * $animate.leave(kids[3]); //stagger index=3\r\n * $animate.leave(kids[4]); //stagger index=4\r\n *\r\n * $timeout(function() {\r\n * //stagger has reset itself\r\n * $animate.leave(kids[5]); //stagger index=0\r\n * $animate.leave(kids[6]); //stagger index=1\r\n * }, 100, false);\r\n * ```\r\n *\r\n * Stagger animations are currently only supported within CSS-defined animations.\r\n *\r\n * <h2>JavaScript-defined Animations</h2>\r\n * In the event that you do not want to use CSS3 transitions or CSS3 animations or if you wish to offer animations on browsers that do not\r\n * yet support CSS transitions/animations, then you can make use of JavaScript animations defined inside of your AngularJS module.\r\n *\r\n * ```js\r\n * //!annotate=\"YourApp\" Your AngularJS Module|Replace this or ngModule with the module that you used to define your application.\r\n * var ngModule = angular.module('YourApp', ['ngAnimate']);\r\n * ngModule.animation('.my-crazy-animation', function() {\r\n * return {\r\n * enter: function(element, done) {\r\n * //run the animation here and call done when the animation is complete\r\n * return function(cancelled) {\r\n * //this (optional) function will be called when the animation\r\n * //completes or when the animation is cancelled (the cancelled\r\n * //flag will be set to true if cancelled).\r\n * };\r\n * },\r\n * leave: function(element, done) { },\r\n * move: function(element, done) { },\r\n *\r\n * //animation that can be triggered before the class is added\r\n * beforeAddClass: function(element, className, done) { },\r\n *\r\n * //animation that can be triggered after the class is added\r\n * addClass: function(element, className, done) { },\r\n *\r\n * //animation that can be triggered before the class is removed\r\n * beforeRemoveClass: function(element, className, done) { },\r\n *\r\n * //animation that can be triggered after the class is removed\r\n * removeClass: function(element, className, done) { }\r\n * };\r\n * });\r\n * ```\r\n *\r\n * JavaScript-defined animations are created with a CSS-like class selector and a collection of events which are set to run\r\n * a javascript callback function. When an animation is triggered, $animate will look for a matching animation which fits\r\n * the element's CSS class attribute value and then run the matching animation event function (if found).\r\n * In other words, if the CSS classes present on the animated element match any of the JavaScript animations then the callback function will\r\n * be executed. It should be also noted that only simple, single class selectors are allowed (compound class selectors are not supported).\r\n *\r\n * Within a JavaScript animation, an object containing various event callback animation functions is expected to be returned.\r\n * As explained above, these callbacks are triggered based on the animation event. Therefore if an enter animation is run,\r\n * and the JavaScript animation is found, then the enter callback will handle that animation (in addition to the CSS keyframe animation\r\n * or transition code that is defined via a stylesheet).\r\n *\r\n */\r\n\r\nangular.module('ngAnimate', ['ng'])\r\n\r\n /**\r\n * @ngdoc provider\r\n * @name $animateProvider\r\n * @description\r\n *\r\n * The `$animateProvider` allows developers to register JavaScript animation event handlers directly inside of a module.\r\n * When an animation is triggered, the $animate service will query the $animate service to find any animations that match\r\n * the provided name value.\r\n *\r\n * Requires the {@link ngAnimate `ngAnimate`} module to be installed.\r\n *\r\n * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application.\r\n *\r\n */\r\n\r\n //this private service is only used within CSS-enabled animations\r\n //IE8 + IE9 do not support rAF natively, but that is fine since they\r\n //also don't support transitions and keyframes which means that the code\r\n //below will never be used by the two browsers.\r\n .factory('$$animateReflow', ['$$rAF', '$document', function($$rAF, $document) {\r\n var bod = $document[0].body;\r\n return function(fn) {\r\n //the returned function acts as the cancellation function\r\n return $$rAF(function() {\r\n //the line below will force the browser to perform a repaint\r\n //so that all the animated elements within the animation frame\r\n //will be properly updated and drawn on screen. This is\r\n //required to perform multi-class CSS based animations with\r\n //Firefox. DO NOT REMOVE THIS LINE.\r\n var a = bod.offsetWidth + 1;\r\n fn();\r\n });\r\n };\r\n }])\r\n\r\n .config(['$provide', '$animateProvider', function($provide, $animateProvider) {\r\n var noop = angular.noop;\r\n var forEach = angular.forEach;\r\n var selectors = $animateProvider.$$selectors;\r\n\r\n var ELEMENT_NODE = 1;\r\n var NG_ANIMATE_STATE = '$$ngAnimateState';\r\n var NG_ANIMATE_CLASS_NAME = 'ng-animate';\r\n var rootAnimateState = {running: true};\r\n\r\n function extractElementNode(element) {\r\n for(var i = 0; i < element.length; i++) {\r\n var elm = element[i];\r\n if(elm.nodeType == ELEMENT_NODE) {\r\n return elm;\r\n }\r\n }\r\n }\r\n\r\n function stripCommentsFromElement(element) {\r\n return angular.element(extractElementNode(element));\r\n }\r\n\r\n function isMatchingElement(elm1, elm2) {\r\n return extractElementNode(elm1) == extractElementNode(elm2);\r\n }\r\n\r\n $provide.decorator('$animate', ['$delegate', '$injector', '$sniffer', '$rootElement', '$$asyncCallback', '$rootScope', '$document',\r\n function($delegate, $injector, $sniffer, $rootElement, $$asyncCallback, $rootScope, $document) {\r\n\r\n var globalAnimationCounter = 0;\r\n $rootElement.data(NG_ANIMATE_STATE, rootAnimateState);\r\n\r\n // disable animations during bootstrap, but once we bootstrapped, wait again\r\n // for another digest until enabling animations. The reason why we digest twice\r\n // is because all structural animations (enter, leave and move) all perform a\r\n // post digest operation before animating. If we only wait for a single digest\r\n // to pass then the structural animation would render its animation on page load.\r\n // (which is what we're trying to avoid when the application first boots up.)\r\n $rootScope.$$postDigest(function() {\r\n $rootScope.$$postDigest(function() {\r\n rootAnimateState.running = false;\r\n });\r\n });\r\n\r\n var classNameFilter = $animateProvider.classNameFilter();\r\n var isAnimatableClassName = !classNameFilter\r\n ? function() { return true; }\r\n : function(className) {\r\n return classNameFilter.test(className);\r\n };\r\n\r\n function lookup(name) {\r\n if (name) {\r\n var matches = [],\r\n flagMap = {},\r\n classes = name.substr(1).split('.');\r\n\r\n //the empty string value is the default animation\r\n //operation which performs CSS transition and keyframe\r\n //animations sniffing. This is always included for each\r\n //element animation procedure if the browser supports\r\n //transitions and/or keyframe animations. The default\r\n //animation is added to the top of the list to prevent\r\n //any previous animations from affecting the element styling\r\n //prior to the element being animated.\r\n if ($sniffer.transitions || $sniffer.animations) {\r\n matches.push($injector.get(selectors['']));\r\n }\r\n\r\n for(var i=0; i < classes.length; i++) {\r\n var klass = classes[i],\r\n selectorFactoryName = selectors[klass];\r\n if(selectorFactoryName && !flagMap[klass]) {\r\n matches.push($injector.get(selectorFactoryName));\r\n flagMap[klass] = true;\r\n }\r\n }\r\n return matches;\r\n }\r\n }\r\n\r\n function animationRunner(element, animationEvent, className) {\r\n //transcluded directives may sometimes fire an animation using only comment nodes\r\n //best to catch this early on to prevent any animation operations from occurring\r\n var node = element[0];\r\n if(!node) {\r\n return;\r\n }\r\n\r\n var isSetClassOperation = animationEvent == 'setClass';\r\n var isClassBased = isSetClassOperation ||\r\n animationEvent == 'addClass' ||\r\n animationEvent == 'removeClass';\r\n\r\n var classNameAdd, classNameRemove;\r\n if(angular.isArray(className)) {\r\n classNameAdd = className[0];\r\n classNameRemove = className[1];\r\n className = classNameAdd + ' ' + classNameRemove;\r\n }\r\n\r\n var currentClassName = element.attr('class');\r\n var classes = currentClassName + ' ' + className;\r\n if(!isAnimatableClassName(classes)) {\r\n return;\r\n }\r\n\r\n var beforeComplete = noop,\r\n beforeCancel = [],\r\n before = [],\r\n afterComplete = noop,\r\n afterCancel = [],\r\n after = [];\r\n\r\n var animationLookup = (' ' + classes).replace(/\\s+/g,'.');\r\n forEach(lookup(animationLookup), function(animationFactory) {\r\n var created = registerAnimation(animationFactory, animationEvent);\r\n if(!created && isSetClassOperation) {\r\n registerAnimation(animationFactory, 'addClass');\r\n registerAnimation(animationFactory, 'removeClass');\r\n }\r\n });\r\n\r\n function registerAnimation(animationFactory, event) {\r\n var afterFn = animationFactory[event];\r\n var beforeFn = animationFactory['before' + event.charAt(0).toUpperCase() + event.substr(1)];\r\n if(afterFn || beforeFn) {\r\n if(event == 'leave') {\r\n beforeFn = afterFn;\r\n //when set as null then animation knows to skip this phase\r\n afterFn = null;\r\n }\r\n after.push({\r\n event : event, fn : afterFn\r\n });\r\n before.push({\r\n event : event, fn : beforeFn\r\n });\r\n return true;\r\n }\r\n }\r\n\r\n function run(fns, cancellations, allCompleteFn) {\r\n var animations = [];\r\n forEach(fns, function(animation) {\r\n animation.fn && animations.push(animation);\r\n });\r\n\r\n var count = 0;\r\n function afterAnimationComplete(index) {\r\n if(cancellations) {\r\n (cancellations[index] || noop)();\r\n if(++count < animations.length) return;\r\n cancellations = null;\r\n }\r\n allCompleteFn();\r\n }\r\n\r\n //The code below adds directly to the array in order to work with\r\n //both sync and async animations. Sync animations are when the done()\r\n //operation is called right away. DO NOT REFACTOR!\r\n forEach(animations, function(animation, index) {\r\n var progress = function() {\r\n afterAnimationComplete(index);\r\n };\r\n switch(animation.event) {\r\n case 'setClass':\r\n cancellations.push(animation.fn(element, classNameAdd, classNameRemove, progress));\r\n break;\r\n case 'addClass':\r\n cancellations.push(animation.fn(element, classNameAdd || className, progress));\r\n break;\r\n case 'removeClass':\r\n cancellations.push(animation.fn(element, classNameRemove || className, progress));\r\n break;\r\n default:\r\n cancellations.push(animation.fn(element, progress));\r\n break;\r\n }\r\n });\r\n\r\n if(cancellations && cancellations.length === 0) {\r\n allCompleteFn();\r\n }\r\n }\r\n\r\n return {\r\n node : node,\r\n event : animationEvent,\r\n className : className,\r\n isClassBased : isClassBased,\r\n isSetClassOperation : isSetClassOperation,\r\n before : function(allCompleteFn) {\r\n beforeComplete = allCompleteFn;\r\n run(before, beforeCancel, function() {\r\n beforeComplete = noop;\r\n allCompleteFn();\r\n });\r\n },\r\n after : function(allCompleteFn) {\r\n afterComplete = allCompleteFn;\r\n run(after, afterCancel, function() {\r\n afterComplete = noop;\r\n allCompleteFn();\r\n });\r\n },\r\n cancel : function() {\r\n if(beforeCancel) {\r\n forEach(beforeCancel, function(cancelFn) {\r\n (cancelFn || noop)(true);\r\n });\r\n beforeComplete(true);\r\n }\r\n if(afterCancel) {\r\n forEach(afterCancel, function(cancelFn) {\r\n (cancelFn || noop)(true);\r\n });\r\n afterComplete(true);\r\n }\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * @ngdoc service\r\n * @name $animate\r\n * @function\r\n *\r\n * @description\r\n * The `$animate` service provides animation detection support while performing DOM operations (enter, leave and move) as well as during addClass and removeClass operations.\r\n * When any of these operations are run, the $animate service\r\n * will examine any JavaScript-defined animations (which are defined by using the $animateProvider provider object)\r\n * as well as any CSS-defined animations against the CSS classes present on the element once the DOM operation is run.\r\n *\r\n * The `$animate` service is used behind the scenes with pre-existing directives and animation with these directives\r\n * will work out of the box without any extra configuration.\r\n *\r\n * Requires the {@link ngAnimate `ngAnimate`} module to be installed.\r\n *\r\n * Please visit the {@link ngAnimate `ngAnimate`} module overview page learn more about how to use animations in your application.\r\n *\r\n */\r\n return {\r\n /**\r\n * @ngdoc method\r\n * @name $animate#enter\r\n * @function\r\n *\r\n * @description\r\n * Appends the element to the parentElement element that resides in the document and then runs the enter animation. Once\r\n * the animation is started, the following CSS classes will be present on the element for the duration of the animation:\r\n *\r\n * Below is a breakdown of each step that occurs during enter animation:\r\n *\r\n * | Animation Step | What the element class attribute looks like |\r\n * |----------------------------------------------------------------------------------------------|---------------------------------------------|\r\n * | 1. $animate.enter(...) is called | class=\"my-animation\" |\r\n * | 2. element is inserted into the parentElement element or beside the afterElement element | class=\"my-animation\" |\r\n * | 3. $animate runs any JavaScript-defined animations on the element | class=\"my-animation ng-animate\" |\r\n * | 4. the .ng-enter class is added to the element | class=\"my-animation ng-animate ng-enter\" |\r\n * | 5. $animate scans the element styles to get the CSS transition/animation duration and delay | class=\"my-animation ng-animate ng-enter\" |\r\n * | 6. $animate waits for 10ms (this performs a reflow) | class=\"my-animation ng-animate ng-enter\" |\r\n * | 7. the .ng-enter-active and .ng-animate-active classes are added (this triggers the CSS transition/animation) | class=\"my-animation ng-animate ng-animate-active ng-enter ng-enter-active\" |\r\n * | 8. $animate waits for X milliseconds for the animation to complete | class=\"my-animation ng-animate ng-animate-active ng-enter ng-enter-active\" |\r\n * | 9. The animation ends and all generated CSS classes are removed from the element | class=\"my-animation\" |\r\n * | 10. The doneCallback() callback is fired (if provided) | class=\"my-animation\" |\r\n *\r\n * @param {DOMElement} element the element that will be the focus of the enter animation\r\n * @param {DOMElement} parentElement the parent element of the element that will be the focus of the enter animation\r\n * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the enter animation\r\n * @param {function()=} doneCallback the callback function that will be called once the animation is complete\r\n */\r\n enter : function(element, parentElement, afterElement, doneCallback) {\r\n this.enabled(false, element);\r\n $delegate.enter(element, parentElement, afterElement);\r\n $rootScope.$$postDigest(function() {\r\n element = stripCommentsFromElement(element);\r\n performAnimation('enter', 'ng-enter', element, parentElement, afterElement, noop, doneCallback);\r\n });\r\n },\r\n\r\n /**\r\n * @ngdoc method\r\n * @name $animate#leave\r\n * @function\r\n *\r\n * @description\r\n * Runs the leave animation operation and, upon completion, removes the element from the DOM. Once\r\n * the animation is started, the following CSS classes will be added for the duration of the animation:\r\n *\r\n * Below is a breakdown of each step that occurs during leave animation:\r\n *\r\n * | Animation Step | What the element class attribute looks like |\r\n * |----------------------------------------------------------------------------------------------|---------------------------------------------|\r\n * | 1. $animate.leave(...) is called | class=\"my-animation\" |\r\n * | 2. $animate runs any JavaScript-defined animations on the element | class=\"my-animation ng-animate\" |\r\n * | 3. the .ng-leave class is added to the element | class=\"my-animation ng-animate ng-leave\" |\r\n * | 4. $animate scans the element styles to get the CSS transition/animation duration and delay | class=\"my-animation ng-animate ng-leave\" |\r\n * | 5. $animate waits for 10ms (this performs a reflow) | class=\"my-animation ng-animate ng-leave\" |\r\n * | 6. the .ng-leave-active and .ng-animate-active classes is added (this triggers the CSS transition/animation) | class=\"my-animation ng-animate ng-animate-active ng-leave ng-leave-active\" |\r\n * | 7. $animate waits for X milliseconds for the animation to complete | class=\"my-animation ng-animate ng-animate-active ng-leave ng-leave-active\" |\r\n * | 8. The animation ends and all generated CSS classes are removed from the element | class=\"my-animation\" |\r\n * | 9. The element is removed from the DOM | ... |\r\n * | 10. The doneCallback() callback is fired (if provided) | ... |\r\n *\r\n * @param {DOMElement} element the element that will be the focus of the leave animation\r\n * @param {function()=} doneCallback the callback function that will be called once the animation is complete\r\n */\r\n leave : function(element, doneCallback) {\r\n cancelChildAnimations(element);\r\n this.enabled(false, element);\r\n $rootScope.$$postDigest(function() {\r\n performAnimation('leave', 'ng-leave', stripCommentsFromElement(element), null, null, function() {\r\n $delegate.leave(element);\r\n }, doneCallback);\r\n });\r\n },\r\n\r\n /**\r\n * @ngdoc method\r\n * @name $animate#move\r\n * @function\r\n *\r\n * @description\r\n * Fires the move DOM operation. Just before the animation starts, the animate service will either append it into the parentElement container or\r\n * add the element directly after the afterElement element if present. Then the move animation will be run. Once\r\n * the animation is started, the following CSS classes will be added for the duration of the animation:\r\n *\r\n * Below is a breakdown of each step that occurs during move animation:\r\n *\r\n * | Animation Step | What the element class attribute looks like |\r\n * |----------------------------------------------------------------------------------------------|---------------------------------------------|\r\n * | 1. $animate.move(...) is called | class=\"my-animation\" |\r\n * | 2. element is moved into the parentElement element or beside the afterElement element | class=\"my-animation\" |\r\n * | 3. $animate runs any JavaScript-defined animations on the element | class=\"my-animation ng-animate\" |\r\n * | 4. the .ng-move class is added to the element | class=\"my-animation ng-animate ng-move\" |\r\n * | 5. $animate scans the element styles to get the CSS transition/animation duration and delay | class=\"my-animation ng-animate ng-move\" |\r\n * | 6. $animate waits for 10ms (this performs a reflow) | class=\"my-animation ng-animate ng-move\" |\r\n * | 7. the .ng-move-active and .ng-animate-active classes is added (this triggers the CSS transition/animation) | class=\"my-animation ng-animate ng-animate-active ng-move ng-move-active\" |\r\n * | 8. $animate waits for X milliseconds for the animation to complete | class=\"my-animation ng-animate ng-animate-active ng-move ng-move-active\" |\r\n * | 9. The animation ends and all generated CSS classes are removed from the element | class=\"my-animation\" |\r\n * | 10. The doneCallback() callback is fired (if provided) | class=\"my-animation\" |\r\n *\r\n * @param {DOMElement} element the element that will be the focus of the move animation\r\n * @param {DOMElement} parentElement the parentElement element of the element that will be the focus of the move animation\r\n * @param {DOMElement} afterElement the sibling element (which is the previous element) of the element that will be the focus of the move animation\r\n * @param {function()=} doneCallback the callback function that will be called once the animation is complete\r\n */\r\n move : function(element, parentElement, afterElement, doneCallback) {\r\n cancelChildAnimations(element);\r\n this.enabled(false, element);\r\n $delegate.move(element, parentElement, afterElement);\r\n $rootScope.$$postDigest(function() {\r\n element = stripCommentsFromElement(element);\r\n performAnimation('move', 'ng-move', element, parentElement, afterElement, noop, doneCallback);\r\n });\r\n },\r\n\r\n /**\r\n * @ngdoc method\r\n * @name $animate#addClass\r\n *\r\n * @description\r\n * Triggers a custom animation event based off the className variable and then attaches the className value to the element as a CSS class.\r\n * Unlike the other animation methods, the animate service will suffix the className value with {@type -add} in order to provide\r\n * the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if no CSS transitions\r\n * or keyframes are defined on the -add or base CSS class).\r\n *\r\n * Below is a breakdown of each step that occurs during addClass animation:\r\n *\r\n * | Animation Step | What the element class attribute looks like |\r\n * |------------------------------------------------------------------------------------------------|---------------------------------------------|\r\n * | 1. $animate.addClass(element, 'super') is called | class=\"my-animation\" |\r\n * | 2. $animate runs any JavaScript-defined animations on the element | class=\"my-animation ng-animate\" |\r\n * | 3. the .super-add class are added to the element | class=\"my-animation ng-animate super-add\" |\r\n * | 4. $animate scans the element styles to get the CSS transition/animation duration and delay | class=\"my-animation ng-animate super-add\" |\r\n * | 5. $animate waits for 10ms (this performs a reflow) | class=\"my-animation ng-animate super-add\" |\r\n * | 6. the .super, .super-add-active and .ng-animate-active classes are added (this triggers the CSS transition/animation) | class=\"my-animation ng-animate ng-animate-active super super-add super-add-active\" |\r\n * | 7. $animate waits for X milliseconds for the animation to complete | class=\"my-animation super super-add super-add-active\" |\r\n * | 8. The animation ends and all generated CSS classes are removed from the element | class=\"my-animation super\" |\r\n * | 9. The super class is kept on the element | class=\"my-animation super\" |\r\n * | 10. The doneCallback() callback is fired (if provided) | class=\"my-animation super\" |\r\n *\r\n * @param {DOMElement} element the element that will be animated\r\n * @param {string} className the CSS class that will be added to the element and then animated\r\n * @param {function()=} doneCallback the callback function that will be called once the animation is complete\r\n */\r\n addClass : function(element, className, doneCallback) {\r\n element = stripCommentsFromElement(element);\r\n performAnimation('addClass', className, element, null, null, function() {\r\n $delegate.addClass(element, className);\r\n }, doneCallback);\r\n },\r\n\r\n /**\r\n * @ngdoc method\r\n * @name $animate#removeClass\r\n *\r\n * @description\r\n * Triggers a custom animation event based off the className variable and then removes the CSS class provided by the className value\r\n * from the element. Unlike the other animation methods, the animate service will suffix the className value with {@type -remove} in\r\n * order to provide the animate service the setup and active CSS classes in order to trigger the animation (this will be skipped if\r\n * no CSS transitions or keyframes are defined on the -remove or base CSS classes).\r\n *\r\n * Below is a breakdown of each step that occurs during removeClass animation:\r\n *\r\n * | Animation Step | What the element class attribute looks like |\r\n * |-----------------------------------------------------------------------------------------------|---------------------------------------------|\r\n * | 1. $animate.removeClass(element, 'super') is called | class=\"my-animation super\" |\r\n * | 2. $animate runs any JavaScript-defined animations on the element | class=\"my-animation super ng-animate\" |\r\n * | 3. the .super-remove class are added to the element | class=\"my-animation super ng-animate super-remove\"|\r\n * | 4. $animate scans the element styles to get the CSS transition/animation duration and delay | class=\"my-animation super ng-animate super-remove\" |\r\n * | 5. $animate waits for 10ms (this performs a reflow) | class=\"my-animation super ng-animate super-remove\" |\r\n * | 6. the .super-remove-active and .ng-animate-active classes are added and .super is removed (this triggers the CSS transition/animation) | class=\"my-animation ng-animate ng-animate-active super-remove super-remove-active\" |\r\n * | 7. $animate waits for X milliseconds for the animation to complete | class=\"my-animation ng-animate ng-animate-active super-remove super-remove-active\" |\r\n * | 8. The animation ends and all generated CSS classes are removed from the element | class=\"my-animation\" |\r\n * | 9. The doneCallback() callback is fired (if provided) | class=\"my-animation\" |\r\n *\r\n *\r\n * @param {DOMElement} element the element that will be animated\r\n * @param {string} className the CSS class that will be animated and then removed from the element\r\n * @param {function()=} doneCallback the callback function that will be called once the animation is complete\r\n */\r\n removeClass : function(element, className, doneCallback) {\r\n element = stripCommentsFromElement(element);\r\n performAnimation('removeClass', className, element, null, null, function() {\r\n $delegate.removeClass(element, className);\r\n }, doneCallback);\r\n },\r\n\r\n /**\r\n *\r\n * @ngdoc function\r\n * @name $animate#setClass\r\n * @function\r\n * @description Adds and/or removes the given CSS classes to and from the element.\r\n * Once complete, the done() callback will be fired (if provided).\r\n * @param {DOMElement} element the element which will it's CSS classes changed\r\n * removed from it\r\n * @param {string} add the CSS classes which will be added to the element\r\n * @param {string} remove the CSS class which will be removed from the element\r\n * @param {Function=} done the callback function (if provided) that will be fired after the\r\n * CSS classes have been set on the element\r\n */\r\n setClass : function(element, add, remove, doneCallback) {\r\n element = stripCommentsFromElement(element);\r\n performAnimation('setClass', [add, remove], element, null, null, function() {\r\n $delegate.setClass(element, add, remove);\r\n }, doneCallback);\r\n },\r\n\r\n /**\r\n * @ngdoc method\r\n * @name $animate#enabled\r\n * @function\r\n *\r\n * @param {boolean=} value If provided then set the animation on or off.\r\n * @param {DOMElement=} element If provided then the element will be used to represent the enable/disable operation\r\n * @return {boolean} Current animation state.\r\n *\r\n * @description\r\n * Globally enables/disables animations.\r\n *\r\n */\r\n enabled : function(value, element) {\r\n switch(arguments.length) {\r\n case 2:\r\n if(value) {\r\n cleanup(element);\r\n } else {\r\n var data = element.data(NG_ANIMATE_STATE) || {};\r\n data.disabled = true;\r\n element.data(NG_ANIMATE_STATE, data);\r\n }\r\n break;\r\n\r\n case 1:\r\n rootAnimateState.disabled = !value;\r\n break;\r\n\r\n default:\r\n value = !rootAnimateState.disabled;\r\n break;\r\n }\r\n return !!value;\r\n }\r\n };\r\n\r\n /*\r\n all animations call this shared animation triggering function internally.\r\n The animationEvent variable refers to the JavaScript animation event that will be triggered\r\n and the className value is the name of the animation that will be applied within the\r\n CSS code. Element, parentElement and afterElement are provided DOM elements for the animation\r\n and the onComplete callback will be fired once the animation is fully complete.\r\n */\r\n function performAnimation(animationEvent, className, element, parentElement, afterElement, domOperation, doneCallback) {\r\n\r\n var runner = animationRunner(element, animationEvent, className);\r\n if(!runner) {\r\n fireDOMOperation();\r\n fireBeforeCallbackAsync();\r\n fireAfterCallbackAsync();\r\n closeAnimation();\r\n return;\r\n }\r\n\r\n className = runner.className;\r\n var elementEvents = angular.element._data(runner.node);\r\n elementEvents = elementEvents && elementEvents.events;\r\n\r\n if (!parentElement) {\r\n parentElement = afterElement ? afterElement.parent() : element.parent();\r\n }\r\n\r\n var ngAnimateState = element.data(NG_ANIMATE_STATE) || {};\r\n var runningAnimations = ngAnimateState.active || {};\r\n var totalActiveAnimations = ngAnimateState.totalActive || 0;\r\n var lastAnimation = ngAnimateState.last;\r\n\r\n //only allow animations if the currently running animation is not structural\r\n //or if there is no animation running at all\r\n var skipAnimations = runner.isClassBased ?\r\n ngAnimateState.disabled || (lastAnimation && !lastAnimation.isClassBased) :\r\n false;\r\n\r\n //skip the animation if animations are disabled, a parent is already being animated,\r\n //the element is not currently attached to the document body or then completely close\r\n //the animation if any matching animations are not found at all.\r\n //NOTE: IE8 + IE9 should close properly (run closeAnimation()) in case an animation was found.\r\n if (skipAnimations || animationsDisabled(element, parentElement)) {\r\n fireDOMOperation();\r\n fireBeforeCallbackAsync();\r\n fireAfterCallbackAsync();\r\n closeAnimation();\r\n return;\r\n }\r\n\r\n var skipAnimation = false;\r\n if(totalActiveAnimations > 0) {\r\n var animationsToCancel = [];\r\n if(!runner.isClassBased) {\r\n if(animationEvent == 'leave' && runningAnimations['ng-leave']) {\r\n skipAnimation = true;\r\n } else {\r\n //cancel all animations when a structural animation takes place\r\n for(var klass in runningAnimations) {\r\n animationsToCancel.push(runningAnimations[klass]);\r\n cleanup(element, klass);\r\n }\r\n runningAnimations = {};\r\n totalActiveAnimations = 0;\r\n }\r\n } else if(lastAnimation.event == 'setClass') {\r\n animationsToCancel.push(lastAnimation);\r\n cleanup(element, className);\r\n }\r\n else if(runningAnimations[className]) {\r\n var current = runningAnimations[className];\r\n if(current.event == animationEvent) {\r\n skipAnimation = true;\r\n } else {\r\n animationsToCancel.push(current);\r\n cleanup(element, className);\r\n }\r\n }\r\n\r\n if(animationsToCancel.length > 0) {\r\n forEach(animationsToCancel, function(operation) {\r\n operation.cancel();\r\n });\r\n }\r\n }\r\n\r\n if(runner.isClassBased && !runner.isSetClassOperation && !skipAnimation) {\r\n skipAnimation = (animationEvent == 'addClass') == element.hasClass(className); //opposite of XOR\r\n }\r\n\r\n if(skipAnimation) {\r\n fireBeforeCallbackAsync();\r\n fireAfterCallbackAsync();\r\n fireDoneCallbackAsync();\r\n return;\r\n }\r\n\r\n if(animationEvent == 'leave') {\r\n //there's no need to ever remove the listener since the element\r\n //will be removed (destroyed) after the leave animation ends or\r\n //is cancelled midway\r\n element.one('$destroy', function(e) {\r\n var element = angular.element(this);\r\n var state = element.data(NG_ANIMATE_STATE);\r\n if(state) {\r\n var activeLeaveAnimation = state.active['ng-leave'];\r\n if(activeLeaveAnimation) {\r\n activeLeaveAnimation.cancel();\r\n cleanup(element, 'ng-leave');\r\n }\r\n }\r\n });\r\n }\r\n\r\n //the ng-animate class does nothing, but it's here to allow for\r\n //parent animations to find and cancel child animations when needed\r\n element.addClass(NG_ANIMATE_CLASS_NAME);\r\n\r\n var localAnimationCount = globalAnimationCounter++;\r\n totalActiveAnimations++;\r\n runningAnimations[className] = runner;\r\n\r\n element.data(NG_ANIMATE_STATE, {\r\n last : runner,\r\n active : runningAnimations,\r\n index : localAnimationCount,\r\n totalActive : totalActiveAnimations\r\n });\r\n\r\n //first we run the before animations and when all of those are complete\r\n //then we perform the DOM operation and run the next set of animations\r\n fireBeforeCallbackAsync();\r\n runner.before(function(cancelled) {\r\n var data = element.data(NG_ANIMATE_STATE);\r\n cancelled = cancelled ||\r\n !data || !data.active[className] ||\r\n (runner.isClassBased && data.active[className].event != animationEvent);\r\n\r\n fireDOMOperation();\r\n if(cancelled === true) {\r\n closeAnimation();\r\n } else {\r\n fireAfterCallbackAsync();\r\n runner.after(closeAnimation);\r\n }\r\n });\r\n\r\n function fireDOMCallback(animationPhase) {\r\n var eventName = '$animate:' + animationPhase;\r\n if(elementEvents && elementEvents[eventName] && elementEvents[eventName].length > 0) {\r\n $$asyncCallback(function() {\r\n element.triggerHandler(eventName, {\r\n event : animationEvent,\r\n className : className\r\n });\r\n });\r\n }\r\n }\r\n\r\n function fireBeforeCallbackAsync() {\r\n fireDOMCallback('before');\r\n }\r\n\r\n function fireAfterCallbackAsync() {\r\n fireDOMCallback('after');\r\n }\r\n\r\n function fireDoneCallbackAsync() {\r\n fireDOMCallback('close');\r\n if(doneCallback) {\r\n $$asyncCallback(function() {\r\n doneCallback();\r\n });\r\n }\r\n }\r\n\r\n //it is less complicated to use a flag than managing and canceling\r\n //timeouts containing multiple callbacks.\r\n function fireDOMOperation() {\r\n if(!fireDOMOperation.hasBeenRun) {\r\n fireDOMOperation.hasBeenRun = true;\r\n domOperation();\r\n }\r\n }\r\n\r\n function closeAnimation() {\r\n if(!closeAnimation.hasBeenRun) {\r\n closeAnimation.hasBeenRun = true;\r\n var data = element.data(NG_ANIMATE_STATE);\r\n if(data) {\r\n /* only structural animations wait for reflow before removing an\r\n animation, but class-based animations don't. An example of this\r\n failing would be when a parent HTML tag has a ng-class attribute\r\n causing ALL directives below to skip animations during the digest */\r\n if(runner && runner.isClassBased) {\r\n cleanup(element, className);\r\n } else {\r\n $$asyncCallback(function() {\r\n var data = element.data(NG_ANIMATE_STATE) || {};\r\n if(localAnimationCount == data.index) {\r\n cleanup(element, className, animationEvent);\r\n }\r\n });\r\n element.data(NG_ANIMATE_STATE, data);\r\n }\r\n }\r\n fireDoneCallbackAsync();\r\n }\r\n }\r\n }\r\n\r\n function cancelChildAnimations(element) {\r\n var node = extractElementNode(element);\r\n if (node) {\r\n var nodes = angular.isFunction(node.getElementsByClassName) ?\r\n node.getElementsByClassName(NG_ANIMATE_CLASS_NAME) :\r\n node.querySelectorAll('.' + NG_ANIMATE_CLASS_NAME);\r\n forEach(nodes, function(element) {\r\n element = angular.element(element);\r\n var data = element.data(NG_ANIMATE_STATE);\r\n if(data && data.active) {\r\n forEach(data.active, function(runner) {\r\n runner.cancel();\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n function cleanup(element, className) {\r\n if(isMatchingElement(element, $rootElement)) {\r\n if(!rootAnimateState.disabled) {\r\n rootAnimateState.running = false;\r\n rootAnimateState.structural = false;\r\n }\r\n } else if(className) {\r\n var data = element.data(NG_ANIMATE_STATE) || {};\r\n\r\n var removeAnimations = className === true;\r\n if(!removeAnimations && data.active && data.active[className]) {\r\n data.totalActive--;\r\n delete data.active[className];\r\n }\r\n\r\n if(removeAnimations || !data.totalActive) {\r\n element.removeClass(NG_ANIMATE_CLASS_NAME);\r\n element.removeData(NG_ANIMATE_STATE);\r\n }\r\n }\r\n }\r\n\r\n function animationsDisabled(element, parentElement) {\r\n if (rootAnimateState.disabled) return true;\r\n\r\n if(isMatchingElement(element, $rootElement)) {\r\n return rootAnimateState.disabled || rootAnimateState.running;\r\n }\r\n\r\n do {\r\n //the element did not reach the root element which means that it\r\n //is not apart of the DOM. Therefore there is no reason to do\r\n //any animations on it\r\n if(parentElement.length === 0) break;\r\n\r\n var isRoot = isMatchingElement(parentElement, $rootElement);\r\n var state = isRoot ? rootAnimateState : parentElement.data(NG_ANIMATE_STATE);\r\n var result = state && (!!state.disabled || state.running || state.totalActive > 0);\r\n if(isRoot || result) {\r\n return result;\r\n }\r\n\r\n if(isRoot) return true;\r\n }\r\n while(parentElement = parentElement.parent());\r\n\r\n return true;\r\n }\r\n }]);\r\n\r\n $animateProvider.register('', ['$window', '$sniffer', '$timeout', '$$animateReflow',\r\n function($window, $sniffer, $timeout, $$animateReflow) {\r\n // Detect proper transitionend/animationend event names.\r\n var CSS_PREFIX = '', TRANSITION_PROP, TRANSITIONEND_EVENT, ANIMATION_PROP, ANIMATIONEND_EVENT;\r\n\r\n // If unprefixed events are not supported but webkit-prefixed are, use the latter.\r\n // Otherwise, just use W3C names, browsers not supporting them at all will just ignore them.\r\n // Note: Chrome implements `window.onwebkitanimationend` and doesn't implement `window.onanimationend`\r\n // but at the same time dispatches the `animationend` event and not `webkitAnimationEnd`.\r\n // Register both events in case `window.onanimationend` is not supported because of that,\r\n // do the same for `transitionend` as Safari is likely to exhibit similar behavior.\r\n // Also, the only modern browser that uses vendor prefixes for transitions/keyframes is webkit\r\n // therefore there is no reason to test anymore for other vendor prefixes: http://caniuse.com/#search=transition\r\n if (window.ontransitionend === undefined && window.onwebkittransitionend !== undefined) {\r\n CSS_PREFIX = '-webkit-';\r\n TRANSITION_PROP = 'WebkitTransition';\r\n TRANSITIONEND_EVENT = 'webkitTransitionEnd transitionend';\r\n } else {\r\n TRANSITION_PROP = 'transition';\r\n TRANSITIONEND_EVENT = 'transitionend';\r\n }\r\n\r\n if (window.onanimationend === undefined && window.onwebkitanimationend !== undefined) {\r\n CSS_PREFIX = '-webkit-';\r\n ANIMATION_PROP = 'WebkitAnimation';\r\n ANIMATIONEND_EVENT = 'webkitAnimationEnd animationend';\r\n } else {\r\n ANIMATION_PROP = 'animation';\r\n ANIMATIONEND_EVENT = 'animationend';\r\n }\r\n\r\n var DURATION_KEY = 'Duration';\r\n var PROPERTY_KEY = 'Property';\r\n var DELAY_KEY = 'Delay';\r\n var ANIMATION_ITERATION_COUNT_KEY = 'IterationCount';\r\n var NG_ANIMATE_PARENT_KEY = '$$ngAnimateKey';\r\n var NG_ANIMATE_CSS_DATA_KEY = '$$ngAnimateCSS3Data';\r\n var NG_ANIMATE_BLOCK_CLASS_NAME = 'ng-animate-block-transitions';\r\n var ELAPSED_TIME_MAX_DECIMAL_PLACES = 3;\r\n var CLOSING_TIME_BUFFER = 1.5;\r\n var ONE_SECOND = 1000;\r\n\r\n var lookupCache = {};\r\n var parentCounter = 0;\r\n var animationReflowQueue = [];\r\n var cancelAnimationReflow;\r\n function afterReflow(element, callback) {\r\n if(cancelAnimationReflow) {\r\n cancelAnimationReflow();\r\n }\r\n animationReflowQueue.push(callback);\r\n cancelAnimationReflow = $$animateReflow(function() {\r\n forEach(animationReflowQueue, function(fn) {\r\n fn();\r\n });\r\n\r\n animationReflowQueue = [];\r\n cancelAnimationReflow = null;\r\n lookupCache = {};\r\n });\r\n }\r\n\r\n var closingTimer = null;\r\n var closingTimestamp = 0;\r\n var animationElementQueue = [];\r\n function animationCloseHandler(element, totalTime) {\r\n var node = extractElementNode(element);\r\n element = angular.element(node);\r\n\r\n //this item will be garbage collected by the closing\r\n //animation timeout\r\n animationElementQueue.push(element);\r\n\r\n //but it may not need to cancel out the existing timeout\r\n //if the timestamp is less than the previous one\r\n var futureTimestamp = Date.now() + totalTime;\r\n if(futureTimestamp <= closingTimestamp) {\r\n return;\r\n }\r\n\r\n $timeout.cancel(closingTimer);\r\n\r\n closingTimestamp = futureTimestamp;\r\n closingTimer = $timeout(function() {\r\n closeAllAnimations(animationElementQueue);\r\n animationElementQueue = [];\r\n }, totalTime, false);\r\n }\r\n\r\n function closeAllAnimations(elements) {\r\n forEach(elements, function(element) {\r\n var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY);\r\n if(elementData) {\r\n (elementData.closeAnimationFn || noop)();\r\n }\r\n });\r\n }\r\n\r\n function getElementAnimationDetails(element, cacheKey) {\r\n var data = cacheKey ? lookupCache[cacheKey] : null;\r\n if(!data) {\r\n var transitionDuration = 0;\r\n var transitionDelay = 0;\r\n var animationDuration = 0;\r\n var animationDelay = 0;\r\n var transitionDelayStyle;\r\n var animationDelayStyle;\r\n var transitionDurationStyle;\r\n var transitionPropertyStyle;\r\n\r\n //we want all the styles defined before and after\r\n forEach(element, function(element) {\r\n if (element.nodeType == ELEMENT_NODE) {\r\n var elementStyles = $window.getComputedStyle(element) || {};\r\n\r\n transitionDurationStyle = elementStyles[TRANSITION_PROP + DURATION_KEY];\r\n\r\n transitionDuration = Math.max(parseMaxTime(transitionDurationStyle), transitionDuration);\r\n\r\n transitionPropertyStyle = elementStyles[TRANSITION_PROP + PROPERTY_KEY];\r\n\r\n transitionDelayStyle = elementStyles[TRANSITION_PROP + DELAY_KEY];\r\n\r\n transitionDelay = Math.max(parseMaxTime(transitionDelayStyle), transitionDelay);\r\n\r\n animationDelayStyle = elementStyles[ANIMATION_PROP + DELAY_KEY];\r\n\r\n animationDelay = Math.max(parseMaxTime(animationDelayStyle), animationDelay);\r\n\r\n var aDuration = parseMaxTime(elementStyles[ANIMATION_PROP + DURATION_KEY]);\r\n\r\n if(aDuration > 0) {\r\n aDuration *= parseInt(elementStyles[ANIMATION_PROP + ANIMATION_ITERATION_COUNT_KEY], 10) || 1;\r\n }\r\n\r\n animationDuration = Math.max(aDuration, animationDuration);\r\n }\r\n });\r\n data = {\r\n total : 0,\r\n transitionPropertyStyle: transitionPropertyStyle,\r\n transitionDurationStyle: transitionDurationStyle,\r\n transitionDelayStyle: transitionDelayStyle,\r\n transitionDelay: transitionDelay,\r\n transitionDuration: transitionDuration,\r\n animationDelayStyle: animationDelayStyle,\r\n animationDelay: animationDelay,\r\n animationDuration: animationDuration\r\n };\r\n if(cacheKey) {\r\n lookupCache[cacheKey] = data;\r\n }\r\n }\r\n return data;\r\n }\r\n\r\n function parseMaxTime(str) {\r\n var maxValue = 0;\r\n var values = angular.isString(str) ?\r\n str.split(/\\s*,\\s*/) :\r\n [];\r\n forEach(values, function(value) {\r\n maxValue = Math.max(parseFloat(value) || 0, maxValue);\r\n });\r\n return maxValue;\r\n }\r\n\r\n function getCacheKey(element) {\r\n var parentElement = element.parent();\r\n var parentID = parentElement.data(NG_ANIMATE_PARENT_KEY);\r\n if(!parentID) {\r\n parentElement.data(NG_ANIMATE_PARENT_KEY, ++parentCounter);\r\n parentID = parentCounter;\r\n }\r\n return parentID + '-' + extractElementNode(element).getAttribute('class');\r\n }\r\n\r\n function animateSetup(animationEvent, element, className, calculationDecorator) {\r\n var cacheKey = getCacheKey(element);\r\n var eventCacheKey = cacheKey + ' ' + className;\r\n var itemIndex = lookupCache[eventCacheKey] ? ++lookupCache[eventCacheKey].total : 0;\r\n\r\n var stagger = {};\r\n if(itemIndex > 0) {\r\n var staggerClassName = className + '-stagger';\r\n var staggerCacheKey = cacheKey + ' ' + staggerClassName;\r\n var applyClasses = !lookupCache[staggerCacheKey];\r\n\r\n applyClasses && element.addClass(staggerClassName);\r\n\r\n stagger = getElementAnimationDetails(element, staggerCacheKey);\r\n\r\n applyClasses && element.removeClass(staggerClassName);\r\n }\r\n\r\n /* the animation itself may need to add/remove special CSS classes\r\n * before calculating the anmation styles */\r\n calculationDecorator = calculationDecorator ||\r\n function(fn) { return fn(); };\r\n\r\n element.addClass(className);\r\n\r\n var formerData = element.data(NG_ANIMATE_CSS_DATA_KEY) || {};\r\n\r\n var timings = calculationDecorator(function() {\r\n return getElementAnimationDetails(element, eventCacheKey);\r\n });\r\n\r\n var transitionDuration = timings.transitionDuration;\r\n var animationDuration = timings.animationDuration;\r\n if(transitionDuration === 0 && animationDuration === 0) {\r\n element.removeClass(className);\r\n return false;\r\n }\r\n\r\n element.data(NG_ANIMATE_CSS_DATA_KEY, {\r\n running : formerData.running || 0,\r\n itemIndex : itemIndex,\r\n stagger : stagger,\r\n timings : timings,\r\n closeAnimationFn : noop\r\n });\r\n\r\n //temporarily disable the transition so that the enter styles\r\n //don't animate twice (this is here to avoid a bug in Chrome/FF).\r\n var isCurrentlyAnimating = formerData.running > 0 || animationEvent == 'setClass';\r\n if(transitionDuration > 0) {\r\n blockTransitions(element, className, isCurrentlyAnimating);\r\n }\r\n\r\n //staggering keyframe animations work by adjusting the `animation-delay` CSS property\r\n //on the given element, however, the delay value can only calculated after the reflow\r\n //since by that time $animate knows how many elements are being animated. Therefore,\r\n //until the reflow occurs the element needs to be blocked (where the keyframe animation\r\n //is set to `none 0s`). This blocking mechanism should only be set for when a stagger\r\n //animation is detected and when the element item index is greater than 0.\r\n if(animationDuration > 0 && stagger.animationDelay > 0 && stagger.animationDuration === 0) {\r\n blockKeyframeAnimations(element);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n function isStructuralAnimation(className) {\r\n return className == 'ng-enter' || className == 'ng-move' || className == 'ng-leave';\r\n }\r\n\r\n function blockTransitions(element, className, isAnimating) {\r\n if(isStructuralAnimation(className) || !isAnimating) {\r\n extractElementNode(element).style[TRANSITION_PROP + PROPERTY_KEY] = 'none';\r\n } else {\r\n element.addClass(NG_ANIMATE_BLOCK_CLASS_NAME);\r\n }\r\n }\r\n\r\n function blockKeyframeAnimations(element) {\r\n extractElementNode(element).style[ANIMATION_PROP] = 'none 0s';\r\n }\r\n\r\n function unblockTransitions(element, className) {\r\n var prop = TRANSITION_PROP + PROPERTY_KEY;\r\n var node = extractElementNode(element);\r\n if(node.style[prop] && node.style[prop].length > 0) {\r\n node.style[prop] = '';\r\n }\r\n element.removeClass(NG_ANIMATE_BLOCK_CLASS_NAME);\r\n }\r\n\r\n function unblockKeyframeAnimations(element) {\r\n var prop = ANIMATION_PROP;\r\n var node = extractElementNode(element);\r\n if(node.style[prop] && node.style[prop].length > 0) {\r\n node.style[prop] = '';\r\n }\r\n }\r\n\r\n function animateRun(animationEvent, element, className, activeAnimationComplete) {\r\n var node = extractElementNode(element);\r\n var elementData = element.data(NG_ANIMATE_CSS_DATA_KEY);\r\n if(node.getAttribute('class').indexOf(className) == -1 || !elementData) {\r\n activeAnimationComplete();\r\n return;\r\n }\r\n\r\n var activeClassName = '';\r\n forEach(className.split(' '), function(klass, i) {\r\n activeClassName += (i > 0 ? ' ' : '') + klass + '-active';\r\n });\r\n\r\n var stagger = elementData.stagger;\r\n var timings = elementData.timings;\r\n var itemIndex = elementData.itemIndex;\r\n var maxDuration = Math.max(timings.transitionDuration, timings.animationDuration);\r\n var maxDelay = Math.max(timings.transitionDelay, timings.animationDelay);\r\n var maxDelayTime = maxDelay * ONE_SECOND;\r\n\r\n var startTime = Date.now();\r\n var css3AnimationEvents = ANIMATIONEND_EVENT + ' ' + TRANSITIONEND_EVENT;\r\n\r\n var style = '', appliedStyles = [];\r\n if(timings.transitionDuration > 0) {\r\n var propertyStyle = timings.transitionPropertyStyle;\r\n if(propertyStyle.indexOf('all') == -1) {\r\n style += CSS_PREFIX + 'transition-property: ' + propertyStyle + ';';\r\n style += CSS_PREFIX + 'transition-duration: ' + timings.transitionDurationStyle + ';';\r\n appliedStyles.push(CSS_PREFIX + 'transition-property');\r\n appliedStyles.push(CSS_PREFIX + 'transition-duration');\r\n }\r\n }\r\n\r\n if(itemIndex > 0) {\r\n if(stagger.transitionDelay > 0 && stagger.transitionDuration === 0) {\r\n var delayStyle = timings.transitionDelayStyle;\r\n style += CSS_PREFIX + 'transition-delay: ' +\r\n prepareStaggerDelay(delayStyle, stagger.transitionDelay, itemIndex) + '; ';\r\n appliedStyles.push(CSS_PREFIX + 'transition-delay');\r\n }\r\n\r\n if(stagger.animationDelay > 0 && stagger.animationDuration === 0) {\r\n style += CSS_PREFIX + 'animation-delay: ' +\r\n prepareStaggerDelay(timings.animationDelayStyle, stagger.animationDelay, itemIndex) + '; ';\r\n appliedStyles.push(CSS_PREFIX + 'animation-delay');\r\n }\r\n }\r\n\r\n if(appliedStyles.length > 0) {\r\n //the element being animated may sometimes contain comment nodes in\r\n //the jqLite object, so we're safe to use a single variable to house\r\n //the styles since there is always only one element being animated\r\n var oldStyle = node.getAttribute('style') || '';\r\n node.setAttribute('style', oldStyle + ' ' + style);\r\n }\r\n\r\n element.on(css3AnimationEvents, onAnimationProgress);\r\n element.addClass(activeClassName);\r\n elementData.closeAnimationFn = function() {\r\n onEnd();\r\n activeAnimationComplete();\r\n };\r\n\r\n var staggerTime = itemIndex * (Math.max(stagger.animationDelay, stagger.transitionDelay) || 0);\r\n var animationTime = (maxDelay + maxDuration) * CLOSING_TIME_BUFFER;\r\n var totalTime = (staggerTime + animationTime) * ONE_SECOND;\r\n\r\n elementData.running++;\r\n animationCloseHandler(element, totalTime);\r\n return onEnd;\r\n\r\n // This will automatically be called by $animate so\r\n // there is no need to attach this internally to the\r\n // timeout done method.\r\n function onEnd(cancelled) {\r\n element.off(css3AnimationEvents, onAnimationProgress);\r\n element.removeClass(activeClassName);\r\n animateClose(element, className);\r\n var node = extractElementNode(element);\r\n for (var i in appliedStyles) {\r\n node.style.removeProperty(appliedStyles[i]);\r\n }\r\n }\r\n\r\n function onAnimationProgress(event) {\r\n event.stopPropagation();\r\n var ev = event.originalEvent || event;\r\n var timeStamp = ev.$manualTimeStamp || ev.timeStamp || Date.now();\r\n\r\n /* Firefox (or possibly just Gecko) likes to not round values up\r\n * when a ms measurement is used for the animation */\r\n var elapsedTime = parseFloat(ev.elapsedTime.toFixed(ELAPSED_TIME_MAX_DECIMAL_PLACES));\r\n\r\n /* $manualTimeStamp is a mocked timeStamp value which is set\r\n * within browserTrigger(). This is only here so that tests can\r\n * mock animations properly. Real events fallback to event.timeStamp,\r\n * or, if they don't, then a timeStamp is automatically created for them.\r\n * We're checking to see if the timeStamp surpasses the expected delay,\r\n * but we're using elapsedTime instead of the timeStamp on the 2nd\r\n * pre-condition since animations sometimes close off early */\r\n if(Math.max(timeStamp - startTime, 0) >= maxDelayTime && elapsedTime >= maxDuration) {\r\n activeAnimationComplete();\r\n }\r\n }\r\n }\r\n\r\n function prepareStaggerDelay(delayStyle, staggerDelay, index) {\r\n var style = '';\r\n forEach(delayStyle.split(','), function(val, i) {\r\n style += (i > 0 ? ',' : '') +\r\n (index * staggerDelay + parseInt(val, 10)) + 's';\r\n });\r\n return style;\r\n }\r\n\r\n function animateBefore(animationEvent, element, className, calculationDecorator) {\r\n if(animateSetup(animationEvent, element, className, calculationDecorator)) {\r\n return function(cancelled) {\r\n cancelled && animateClose(element, className);\r\n };\r\n }\r\n }\r\n\r\n function animateAfter(animationEvent, element, className, afterAnimationComplete) {\r\n if(element.data(NG_ANIMATE_CSS_DATA_KEY)) {\r\n return animateRun(animationEvent, element, className, afterAnimationComplete);\r\n } else {\r\n animateClose(element, className);\r\n afterAnimationComplete();\r\n }\r\n }\r\n\r\n function animate(animationEvent, element, className, animationComplete) {\r\n //If the animateSetup function doesn't bother returning a\r\n //cancellation function then it means that there is no animation\r\n //to perform at all\r\n var preReflowCancellation = animateBefore(animationEvent, element, className);\r\n if(!preReflowCancellation) {\r\n animationComplete();\r\n return;\r\n }\r\n\r\n //There are two cancellation functions: one is before the first\r\n //reflow animation and the second is during the active state\r\n //animation. The first function will take care of removing the\r\n //data from the element which will not make the 2nd animation\r\n //happen in the first place\r\n var cancel = preReflowCancellation;\r\n afterReflow(element, function() {\r\n unblockTransitions(element, className);\r\n unblockKeyframeAnimations(element);\r\n //once the reflow is complete then we point cancel to\r\n //the new cancellation function which will remove all of the\r\n //animation properties from the active animation\r\n cancel = animateAfter(animationEvent, element, className, animationComplete);\r\n });\r\n\r\n return function(cancelled) {\r\n (cancel || noop)(cancelled);\r\n };\r\n }\r\n\r\n function animateClose(element, className) {\r\n element.removeClass(className);\r\n var data = element.data(NG_ANIMATE_CSS_DATA_KEY);\r\n if(data) {\r\n if(data.running) {\r\n data.running--;\r\n }\r\n if(!data.running || data.running === 0) {\r\n element.removeData(NG_ANIMATE_CSS_DATA_KEY);\r\n }\r\n }\r\n }\r\n\r\n return {\r\n enter : function(element, animationCompleted) {\r\n return animate('enter', element, 'ng-enter', animationCompleted);\r\n },\r\n\r\n leave : function(element, animationCompleted) {\r\n return animate('leave', element, 'ng-leave', animationCompleted);\r\n },\r\n\r\n move : function(element, animationCompleted) {\r\n return animate('move', element, 'ng-move', animationCompleted);\r\n },\r\n\r\n beforeSetClass : function(element, add, remove, animationCompleted) {\r\n var className = suffixClasses(remove, '-remove') + ' ' +\r\n suffixClasses(add, '-add');\r\n var cancellationMethod = animateBefore('setClass', element, className, function(fn) {\r\n /* when classes are removed from an element then the transition style\r\n * that is applied is the transition defined on the element without the\r\n * CSS class being there. This is how CSS3 functions outside of ngAnimate.\r\n * http://plnkr.co/edit/j8OzgTNxHTb4n3zLyjGW?p=preview */\r\n var klass = element.attr('class');\r\n element.removeClass(remove);\r\n element.addClass(add);\r\n var timings = fn();\r\n element.attr('class', klass);\r\n return timings;\r\n });\r\n\r\n if(cancellationMethod) {\r\n afterReflow(element, function() {\r\n unblockTransitions(element, className);\r\n unblockKeyframeAnimations(element);\r\n animationCompleted();\r\n });\r\n return cancellationMethod;\r\n }\r\n animationCompleted();\r\n },\r\n\r\n beforeAddClass : function(element, className, animationCompleted) {\r\n var cancellationMethod = animateBefore('addClass', element, suffixClasses(className, '-add'), function(fn) {\r\n\r\n /* when a CSS class is added to an element then the transition style that\r\n * is applied is the transition defined on the element when the CSS class\r\n * is added at the time of the animation. This is how CSS3 functions\r\n * outside of ngAnimate. */\r\n element.addClass(className);\r\n var timings = fn();\r\n element.removeClass(className);\r\n return timings;\r\n });\r\n\r\n if(cancellationMethod) {\r\n afterReflow(element, function() {\r\n unblockTransitions(element, className);\r\n unblockKeyframeAnimations(element);\r\n animationCompleted();\r\n });\r\n return cancellationMethod;\r\n }\r\n animationCompleted();\r\n },\r\n\r\n setClass : function(element, add, remove, animationCompleted) {\r\n remove = suffixClasses(remove, '-remove');\r\n add = suffixClasses(add, '-add');\r\n var className = remove + ' ' + add;\r\n return animateAfter('setClass', element, className, animationCompleted);\r\n },\r\n\r\n addClass : function(element, className, animationCompleted) {\r\n return animateAfter('addClass', element, suffixClasses(className, '-add'), animationCompleted);\r\n },\r\n\r\n beforeRemoveClass : function(element, className, animationCompleted) {\r\n var cancellationMethod = animateBefore('removeClass', element, suffixClasses(className, '-remove'), function(fn) {\r\n /* when classes are removed from an element then the transition style\r\n * that is applied is the transition defined on the element without the\r\n * CSS class being there. This is how CSS3 functions outside of ngAnimate.\r\n * http://plnkr.co/edit/j8OzgTNxHTb4n3zLyjGW?p=preview */\r\n var klass = element.attr('class');\r\n element.removeClass(className);\r\n var timings = fn();\r\n element.attr('class', klass);\r\n return timings;\r\n });\r\n\r\n if(cancellationMethod) {\r\n afterReflow(element, function() {\r\n unblockTransitions(element, className);\r\n unblockKeyframeAnimations(element);\r\n animationCompleted();\r\n });\r\n return cancellationMethod;\r\n }\r\n animationCompleted();\r\n },\r\n\r\n removeClass : function(element, className, animationCompleted) {\r\n return animateAfter('removeClass', element, suffixClasses(className, '-remove'), animationCompleted);\r\n }\r\n };\r\n\r\n function suffixClasses(classes, suffix) {\r\n var className = '';\r\n classes = angular.isArray(classes) ? classes : classes.split(/\\s+/);\r\n forEach(classes, function(klass, i) {\r\n if(klass && klass.length > 0) {\r\n className += (i > 0 ? ' ' : '') + klass + suffix;\r\n }\r\n });\r\n return className;\r\n }\r\n }]);\r\n }]);\r\n\r\n\r\n})(window, window.angular);\r\n","'use strict';\r\nangular.module(\"ngLocale\", [], [\"$provide\", function($provide) {\r\nvar PLURAL_CATEGORY = {ZERO: \"zero\", ONE: \"one\", TWO: \"two\", FEW: \"few\", MANY: \"many\", OTHER: \"other\"};\r\n$provide.value(\"$locale\", {\r\n \"DATETIME_FORMATS\": {\r\n \"AMPMS\": [\r\n \"AM\",\r\n \"PM\"\r\n ],\r\n \"DAY\": [\r\n \"dimanche\",\r\n \"lundi\",\r\n \"mardi\",\r\n \"mercredi\",\r\n \"jeudi\",\r\n \"vendredi\",\r\n \"samedi\"\r\n ],\r\n \"MONTH\": [\r\n \"janvier\",\r\n \"f\\u00e9vrier\",\r\n \"mars\",\r\n \"avril\",\r\n \"mai\",\r\n \"juin\",\r\n \"juillet\",\r\n \"ao\\u00fbt\",\r\n \"septembre\",\r\n \"octobre\",\r\n \"novembre\",\r\n \"d\\u00e9cembre\"\r\n ],\r\n \"SHORTDAY\": [\r\n \"dim.\",\r\n \"lun.\",\r\n \"mar.\",\r\n \"mer.\",\r\n \"jeu.\",\r\n \"ven.\",\r\n \"sam.\"\r\n ],\r\n \"SHORTMONTH\": [\r\n \"janv.\",\r\n \"f\\u00e9vr.\",\r\n \"mars\",\r\n \"avr.\",\r\n \"mai\",\r\n \"juin\",\r\n \"juil.\",\r\n \"ao\\u00fbt\",\r\n \"sept.\",\r\n \"oct.\",\r\n \"nov.\",\r\n \"d\\u00e9c.\"\r\n ],\r\n \"fullDate\": \"EEEE d MMMM y\",\r\n \"longDate\": \"d MMMM y\",\r\n \"medium\": \"d MMM y HH:mm:ss\",\r\n \"mediumDate\": \"d MMM y\",\r\n \"mediumTime\": \"HH:mm:ss\",\r\n \"short\": \"dd/MM/yy HH:mm\",\r\n \"shortDate\": \"dd/MM/yy\",\r\n \"shortTime\": \"HH:mm\"\r\n },\r\n \"NUMBER_FORMATS\": {\r\n \"CURRENCY_SYM\": \"\\u20ac\",\r\n \"DECIMAL_SEP\": \",\",\r\n \"GROUP_SEP\": \"\\u00a0\",\r\n \"PATTERNS\": [\r\n {\r\n \"gSize\": 3,\r\n \"lgSize\": 3,\r\n \"macFrac\": 0,\r\n \"maxFrac\": 3,\r\n \"minFrac\": 0,\r\n \"minInt\": 1,\r\n \"negPre\": \"-\",\r\n \"negSuf\": \"\",\r\n \"posPre\": \"\",\r\n \"posSuf\": \"\"\r\n },\r\n {\r\n \"gSize\": 3,\r\n \"lgSize\": 3,\r\n \"macFrac\": 0,\r\n \"maxFrac\": 2,\r\n \"minFrac\": 2,\r\n \"minInt\": 1,\r\n \"negPre\": \"(\",\r\n \"negSuf\": \"\\u00a0\\u00a4)\",\r\n \"posPre\": \"\",\r\n \"posSuf\": \"\\u00a0\\u00a4\"\r\n }\r\n ]\r\n },\r\n \"id\": \"fr-fr\",\r\n \"pluralCat\": function (n) { if (n >= 0 && n <= 2 && n != 2) { return PLURAL_CATEGORY.ONE; } return PLURAL_CATEGORY.OTHER;}\r\n});\r\n}]);","var AgrimarketApp = angular.module('AgrimarketApp', ['ngRoute', 'angucomplete', 'angucomplete-alt', 'AgrimarketControllers', 'AgrimarketFactories', 'AgrimarketServices', 'ngResource',\r\n 'ngSanitize',\r\n 'ngRoute',\r\n 'angularFileUpload']);\r\nvar AgrimarketFactories = angular.module('AgrimarketFactories', []);\r\nvar AgrimarketDirectives = angular.module('AgrimarketDirectives', []);\r\nvar AgrimarketServices = angular.module('AgrimarketServices', ['AgrimarketFactories']);\r\nvar AgrimarketControllers = angular.module('AgrimarketControllers', ['AgrimarketFactories', 'AgrimarketDirectives', 'AgrimarketServices', 'dirPagination']);\r\n\r\nwindow.mobileAndTabletcheck = function () {\r\n var check = false;\r\n (function (a) { if (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(a.substr(0, 4))) check = true; })(navigator.userAgent || navigator.vendor || window.opera);\r\n return check;\r\n};\r\n\r\nwindow.redirectToMobile = function (urlIndex, urlMobile) {\r\n if (window.location.href.indexOf('#/resetPassword') > 0)\r\n window.location.href = window.location.href.replace(urlIndex + '#', urlMobile);\r\n else {\r\n var newHref = window.location.href.replace(urlIndex.replace(\"index.html\", \"\") + '#', urlMobile).replace(\"/?\", \"?\");\r\n var urlSplitted = newHref.split('?');\r\n var params = \"\";\r\n if (urlSplitted.length > 0)\r\n params = urlSplitted[1];\r\n if (newHref.toLowerCase().indexOf('logintiers=') > 0 && newHref.toLowerCase().indexOf('jeton=') > 0 && (newHref.toLowerCase().indexOf('logincerelio') > 0 || newHref.toLowerCase().indexOf('loginuac') < 0)) {\r\n if (params)\r\n window.location.href = urlMobile + '/loginCerelio?' + params;\r\n }\r\n else {\r\n if (params && newHref.indexOf(urlMobile) > 0)\r\n window.location.href = newHref;\r\n else\r\n window.location.href = urlMobile;\r\n }\r\n }\r\n};\r\n\r\nAgrimarketFactories.factory('HttpInterceptor', function ($q, $location, $rootScope) {\r\n return {\r\n 'request': function (config) {\r\n return config;\r\n },\r\n\r\n 'requestError': function (rejection) {\r\n return $q.reject(rejection);\r\n },\r\n\r\n 'response': function (response) {\r\n return response;\r\n },\r\n\r\n 'responseError': function (rejection) {\r\n // redirection pour les pertes de session du header request \r\n // code status 401 : Unauthorized\r\n // 0 : NSHTTPURLResponse : aucune réponse\r\n if ($location.$$path.indexOf(\"login\") == -1 && rejection.status !== 200 && rejection.status !== 400 && rejection.status !== 503 && rejection.status !== 404 && rejection.status !== 501) {\r\n if (sessionStorage.getItem(\"hasRefresh\") !== \"true\")\r\n sessionStorage.clear();\r\n $location.path(\"/login\");\r\n } else if (rejection.status === 503) {\r\n if (!sessionStorage.getItem(\"IdUserAdmin\") || sessionStorage.getItem(\"IdUserAdmin\") === \"undefined\" || sessionStorage.getItem(\"IdUserAdmin\") === \"null\")\r\n sessionStorage.clear();\r\n\r\n $rootScope.isLogged = false;\r\n $location.path(\"/siteUnavailable\");\r\n } else if (rejection.status === 501) {\r\n console.log('rejection.status === 501');\r\n $location.path(\"/disableSubscription\");\r\n } else if ($location.$$path.indexOf(\"login\") == -1 && rejection.status === 400 && sessionStorage.getItem(\"hasRefresh\") === \"true\") {\r\n sessionStorage.clear();\r\n $location.path(\"/login\");\r\n }\r\n return $q.reject(rejection);\r\n }\r\n };\r\n});\r\n\r\nAgrimarketApp.config([\r\n '$routeProvider', '$httpProvider',\r\n function ($routeProvider, $httpProvider) {\r\n\r\n $httpProvider.defaults.useXDomain = true;\r\n\r\n $httpProvider.defaults.headers.common[\"accept\"] = \"application/json\"; // type de fichier reçu\r\n\r\n delete $httpProvider.defaults.headers.common[\"X-Requested-With\"];\r\n\r\n window.routes =\r\n {\r\n //Acces via BackDoor Agrimarket \r\n '/backdoor/': {\r\n templateUrl: 'app/Partials/backoffice/backdoor/backdoorConnexion.html',\r\n controller: 'backdoorController',\r\n requireLogin: false\r\n },\r\n\r\n //indique que l'utilisateur doit s'authentifier pour y accéder\r\n '/backdoor/profile': {\r\n templateUrl: 'app/Partials/backoffice/backdoor/profileBackdoor.html',\r\n controller: 'loginController',\r\n requireLogin: false\r\n },\r\n '/siteUnavailable': {\r\n templateUrl: 'app/Partials/siteUnavailable.html',\r\n controller: 'siteUnavailableController',\r\n requireLogin: false\r\n },\r\n '/login/': {\r\n templateUrl: 'app/Partials/login.html',\r\n controller: 'loginController',\r\n requireLogin: false\r\n },\r\n '/loginHash/:paramForLoginHash?/:hashForLoginHash?/:page?/:showMenu?/:idLanguage?': {\r\n templateUrl: 'blank.html',\r\n controller: 'loginController',\r\n requireLogin: false\r\n },\r\n '/loginEditMode/:redirect?': {\r\n templateUrl: 'blank.html',\r\n controller: 'loginController',\r\n requireLogin: false\r\n },\r\n '/refresh/': {\r\n templateUrl: 'blank.html',\r\n controller: 'loginController',\r\n requireLogin: false\r\n },\r\n '/loginCerelio/:loginTiers?/:jeton?': {\r\n templateUrl: 'blank.html',\r\n controller: 'loginController',\r\n requireLogin: false\r\n },\r\n '/loginUAC/:loginTiers?/:jeton?/:AdresseIpSlc?': {\r\n templateUrl: 'app/Partials/login.html',\r\n controller: 'loginController',\r\n requireLogin: false\r\n },\r\n '/access/:paramConnectorUrlReferrer?/:hideMenu?': {\r\n templateUrl: 'blank.html',\r\n controller: 'loginController',\r\n requireLogin: false\r\n },\r\n '/loginOuifield': {\r\n templateUrl: 'blank.html',\r\n controller: 'loginController',\r\n requireLogin: false\r\n },\r\n '/loginConnectorSso/:token?/:param?/:page?/:showMenu?': {\r\n templateUrl: 'blank.html',\r\n controller: 'loginController',\r\n requireLogin: false\r\n },\r\n '/UnsubscribeNewsMarketInfo/': {\r\n templateUrl: 'app/Partials/UnsubscribeNewsMarketInfo.html',\r\n controller: 'UnsubscribeNewsMarketInfoController',\r\n requireLogin: false\r\n },\r\n '/disconnect': {\r\n templateUrl: 'blank.html',\r\n controller: 'DisconnectController',\r\n requireLogin: false\r\n },\r\n '/validateCGU': {\r\n templateUrl: 'app/Partials/ValidateCGU.html',\r\n controller: 'ValidateCGUController',\r\n requireLogin: false\r\n },\r\n '/disableSubscription': {\r\n templateUrl: 'app/Partials/disableSubscription.html',\r\n controller: 'disableSubscriptionController',\r\n requireLogin: false\r\n },\r\n '/user/commitments/view/:commitmentView': {\r\n templateUrl: 'app/Partials/frontoffice/commitments/commitments.html',\r\n controller: 'commitmentsController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesTypeCommitments: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(26);\r\n }\r\n ],\r\n colonnesContractTypeCommitmentAndProduct: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(27);\r\n }\r\n ],\r\n colonnesContractProduct: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(36);\r\n }\r\n ],\r\n colonnesContractTypeCommitment: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(37);\r\n }\r\n ],\r\n colonnesListFixationsByIdCommitment: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(84);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/commitmentsAll': {\r\n templateUrl: 'app/Partials/frontoffice/commitments/commitmentsAll.html',\r\n controller: 'commitmentsAllController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesCropProductTonnages: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(82);\r\n }\r\n ]\r\n }\r\n },\r\n '/resetPassword/:keyPassword?': {\r\n templateUrl: 'app/Partials/resetPassword.html',\r\n controller: 'resetPasswordController',\r\n requireLogin: false\r\n },\r\n '/user/offers/view/:typeOffer/:idContractCommitment?/:quantity?/:targetPrice?/:idTypeFixationOnlyTargetPrice?/:idFirstComponentContractOrContractBase?': {\r\n templateUrl: 'app/Partials/frontoffice/offer/list/offersMonitoring.html',\r\n controller: 'userOfferController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesOffersFirmUser: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(22);\r\n }\r\n ],\r\n colonnesOffersFirmTc: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(24);\r\n }\r\n ],\r\n colonnesOffersCommitmentUser: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(23);\r\n }\r\n ],\r\n colonnesOffersCommitmentTc: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(25);\r\n }\r\n ],\r\n colonnesOffersOptionUser: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(50);\r\n }\r\n ],\r\n colonnesOffersOptionTc: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(51);\r\n }\r\n ],\r\n colonnesOffersBlankContract: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(97);\r\n }\r\n ],\r\n colonnesOffersCommitmentSurfaceUser: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(110);\r\n }\r\n ],\r\n colonnesOffersCommitmentSurfaceTc: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(111);\r\n }\r\n ],\r\n colonnesOffersMultiCropsUser: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(116);\r\n }\r\n ],\r\n colonnesOffersMultiCropsTc: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(117);\r\n }\r\n ],\r\n }\r\n },\r\n '/admin/offers/:idStatus?': {\r\n templateUrl: 'app/Partials/backoffice/offers.html',\r\n controller: 'offersController',\r\n requireLogin: true\r\n },\r\n '/user/subscribe/contractBase/:idContractCommitment?/:idContractFuture?/:quantity?/:targetPrice?': {\r\n templateUrl: 'app/Partials/frontoffice/subscribe/contractBase/subscribe.html',\r\n controller: 'subscribeContractBaseController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesContractTypeCommitmentAndProduct: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(27);\r\n }\r\n ],\r\n colonnesContractFutureCompatibles: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(56);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/subscribe/contractFirm/:idContractCommitment?/:idTypeFixation?/:idContractBase?/:quantity?/:targetPrice?': {\r\n templateUrl: 'app/Partials/frontoffice/subscribe/contractFirm/subscribe.html',\r\n controller: 'userSubscribeContractFirmController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesContractTypeCommitmentAndProduct: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(27);\r\n }\r\n ],\r\n colonnesContractBaseCompatibles: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(55);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/subscribe/contractCommitment': {\r\n templateUrl: 'app/Partials/frontoffice/subscribe/contractCommitment/subscribe.html',\r\n controller: 'userSubscribeContractCommitmentController',\r\n requireLogin: true\r\n },\r\n '/user/subscribe/contractSurfaceCommitment': {\r\n templateUrl: 'app/Partials/frontoffice/subscribe/contractSurfaceCommitment/subscribe.html',\r\n controller: 'userSubscribeContractSurfaceCommitmentController',\r\n requireLogin: true\r\n },\r\n '/user/subscribe/contractoption': {\r\n templateUrl: 'app/Partials/frontoffice/subscribe/contractOption/subscribeOption.html',\r\n controller: 'subscribeContractOptionController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesStrikeOption: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(119);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/subscribe/contractBlank': {\r\n templateUrl: 'app/Partials/frontoffice/subscribe/contractBlank/subscribe.html',\r\n controller: 'userSubscribeContractBlankController',\r\n requireLogin: true\r\n },\r\n '/user/subscribe/contractMultiCrops': {\r\n templateUrl: 'app/Partials/frontoffice/subscribe/contractMultiCrops/subscribe.html',\r\n controller: 'subscribeContractMultiCropsController',\r\n requireLogin: true\r\n },\r\n '/user/contracts/firm/view/:typeContract': {\r\n templateUrl: 'app/Partials/frontoffice/contracts/firm/monitoring.html',\r\n controller: 'userContractsFirmMonitoringController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesValidated: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(29);\r\n }\r\n ],\r\n colonnesPriced: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(30);\r\n }\r\n ],\r\n colonnesCanceled: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(31);\r\n }\r\n ],\r\n colonnesPending: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(60);\r\n }\r\n ],\r\n colonnesDelayedSigning: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(101);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/contracts/commitment/view/:typeContract': {\r\n templateUrl: 'app/Partials/frontoffice/contracts/commitment/monitoring.html',\r\n controller: 'userContractsCommitmentMonitoringController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesContractsCommitmentValidated: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(32);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/contracts/surfaceCommitment/view/:typeContract': {\r\n templateUrl: 'app/Partials/frontoffice/contracts/surfaceCommitment/monitoring.html',\r\n controller: 'userContractsSurfaceCommitmentMonitoringController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesContractsSurfaceCommitmentValidated: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(108);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/contracts/base/view/:typeContract': {\r\n templateUrl: 'app/Partials/frontoffice/contracts/base/monitoring.html',\r\n controller: 'userContractsBaseMonitoringController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesContractsBaseValidated: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(66);\r\n }\r\n ],\r\n colonnesContractsBasePending: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(67);\r\n }\r\n ],\r\n colonnesContractsBasePriced: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(68);\r\n }\r\n ],\r\n colonnesContractsBaseCanceled: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(69);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/contracts/option/view/:typeContract': {\r\n templateUrl: 'app/Partials/frontoffice/contracts/option/monitoring.html',\r\n controller: 'userContractsOptionMonitoringController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesContractsOptionExpired: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(78);\r\n }\r\n ],\r\n colonnesContractsOptionPending: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(79);\r\n }\r\n ],\r\n }\r\n },\r\n '/user/supply/delivery': {\r\n templateUrl: 'app/Partials/frontoffice/supply/delivery.html',\r\n controller: 'deliveryController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(96);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/supply/commands/:idExtCommand?': {\r\n templateUrl: 'app/Partials/frontoffice/supply/commands.html',\r\n controller: 'commandsController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(95);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/supply/request/asking': {\r\n templateUrl: 'app/Partials/frontoffice/supply/requestPrices.html',\r\n controller: 'requestPricesController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesCart: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(10);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/supply/request/asked': {\r\n templateUrl: 'app/Partials/frontoffice/supply/monitoringRequest.html',\r\n controller: 'monitoringRequestController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(11);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/smsalert': {\r\n templateUrl: 'app/Partials/frontoffice/smsalert/smsalert.html',\r\n controller: 'userSmsAlertController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(86);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/offer/createoffer/:idoffer': {\r\n templateUrl: 'app/Partials/backoffice/createoffer.html',\r\n controller: 'createofferController',\r\n requireLogin: true\r\n },\r\n '/admin/offer/dupliquer/:idoffer': {\r\n templateUrl: 'app/Partials/backoffice/createoffer.html',\r\n controller: 'createofferController',\r\n requireLogin: true\r\n },\r\n '/admin/offer/builtPriceManager/:idoffer': {\r\n templateUrl: 'app/Partials/backoffice/manage/builtPriceManager.html',\r\n controller: 'builtPriceManagerController',\r\n requireLogin: true\r\n },\r\n '/admin/contracts/firm/view/:typeContract': {\r\n templateUrl: 'app/Partials/backoffice/contracts/firm/monitoring.html',\r\n controller: 'contractsFirmMonitoringController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesValidatedNotCover: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(16);\r\n }\r\n ],\r\n colonnesValidatedCovered: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(17);\r\n }\r\n ],\r\n colonnesValidatedPendingCover: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(18);\r\n }\r\n ],\r\n colonnesCanceled: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(19);\r\n }\r\n ],\r\n colonnesPricedNotCover: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(20);\r\n }\r\n ],\r\n colonnesPricedPendingCover: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(21);\r\n }\r\n ],\r\n colonnesPendingNotCover: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(52);\r\n }\r\n ],\r\n colonnesPendingCovered: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(53);\r\n }\r\n ],\r\n colonnesPendingPendingCover: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(54);\r\n }\r\n ],\r\n colonnesToValidated: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(98);\r\n }\r\n ],\r\n columnsDelayedSigning: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(103);\r\n }\r\n ],\r\n }\r\n },\r\n '/admin/contracts/builtPrice/view/:typeContract': {\r\n templateUrl: 'app/Partials/backoffice/contracts/builtPrice/monitoring.html',\r\n controller: 'contractsBuiltPriceMonitoringController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesContractsSubscription: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(104);\r\n }\r\n ],\r\n colonnesContractsObservation: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(105);\r\n }\r\n ],\r\n colonnesContractsFixed: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(106);\r\n }\r\n ],\r\n colonnesContractsCanceled: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(107);\r\n }\r\n ], \r\n }\r\n },\r\n '/admin/contracts/commitment/view/:typeContract': {\r\n templateUrl: 'app/Partials/backoffice/contracts/commitment/monitoring.html',\r\n controller: 'contractsCommitmentMonitoringController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesContractsCommitmentValidated: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(28);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/contracts/surfaceCommitment/view/:typeContract': {\r\n templateUrl: 'app/Partials/backoffice/contracts/surfaceCommitment/monitoring.html',\r\n controller: 'contractsSurfaceCommitmentMonitoringController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesContractsSurfaceCommitmentValidated: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(112);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/contracts/base/view/:typeContract': {\r\n templateUrl: 'app/Partials/backoffice/contracts/base/monitoring.html',\r\n controller: 'contractsBaseMonitoringController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesContractsBaseValidated: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(62);\r\n }\r\n ],\r\n colonnesContractsBasePending: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(63);\r\n }\r\n ],\r\n colonnesContractsBasePriced: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(64);\r\n }\r\n ],\r\n colonnesContractsBaseCanceled: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(65);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/contracts/option/view/:typeContract': {\r\n templateUrl: 'app/Partials/backoffice/contracts/option/monitoring.html',\r\n controller: 'contractsOptionMonitoringController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesContractsOptionExpired: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(75);\r\n }\r\n ],\r\n colonnesContractsOptionPending: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(76);\r\n }\r\n ],\r\n colonnesContractsOptionDetails: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(77);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/editorial/view/mails/:idLanguage?/:viewMode?': {\r\n templateUrl: 'app/Partials/backoffice/editorial/editorialMail.html',\r\n controller: 'editorialMailController',\r\n requireLogin: true\r\n },\r\n '/admin/editorial/view/contracts/:idLanguage?': {\r\n templateUrl: 'app/Partials/backoffice/editorial/editorialContract.html',\r\n controller: 'editorialContractController',\r\n requireLogin: true\r\n },\r\n '/admin/editorial/comMarketInfo/:msgConf?': {\r\n templateUrl: 'app/Partials/backoffice/editorial/comMarketInfo.html',\r\n controller: 'comMarketInfoController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesCommunicationMarketInfo: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(39);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/editorial/saveComMarketInfo/:id?': {\r\n templateUrl: 'app/Partials/backoffice/editorial/saveComMarketInfo.html',\r\n controller: 'saveComMarketInfoController',\r\n requireLogin: true\r\n },\r\n '/admin/editorial/alertMail': {\r\n templateUrl: 'app/Partials/backoffice/editorial/alertMail.html',\r\n controller: 'alertMailController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesAlertMail: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(114);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/editorial/createAlertMail/:idAlertMail': {\r\n templateUrl: 'app/Partials/backoffice/editorial/createAlertMail.html',\r\n controller: 'createAlertMailController',\r\n requireLogin: true\r\n },\r\n '/admin/editorial/duplicateAlertMail/:idAlertMail': {\r\n templateUrl: 'app/Partials/backoffice/editorial/createAlertMail.html',\r\n controller: 'createAlertMailController',\r\n requireLogin: true\r\n },\r\n '/admin/contents/notifications': {\r\n templateUrl: 'app/Partials/backoffice/contents/notifications/notifications.html',\r\n controller: 'notificationsController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesNotifications: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(100);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/contents/saveNotification/:idNotification?': {\r\n templateUrl: 'app/Partials/backoffice/contents/notifications/saveNotification.html',\r\n controller: 'saveNotificationController',\r\n requireLogin: true\r\n },\r\n '/admin/editorial/editionMobile': {\r\n templateUrl: 'app/partials/backoffice/editorial/editionMobile.html',\r\n controller: 'editorialMobileController',\r\n requireLogin: true\r\n },\r\n '/admin/editorial/editTemplateContract/:idtemplate': {\r\n templateUrl: 'app/partials/backoffice/editorial/viewsMode/editTemplateContract.html',\r\n controller: 'editTemplateContractController',\r\n requireLogin: true\r\n },\r\n '/admin/editorial/editTemplateMail/:idTypeTemplateMail/:idRole/:idLanguage/:viewMode?': {\r\n templateUrl: 'app/partials/backoffice/editorial/viewsMode/editTemplateMail.html',\r\n controller: 'editTemplateMailController',\r\n requireLogin: true\r\n },\r\n '/admin/parameters/crops': {\r\n templateUrl: 'app/Partials/backoffice/parameters/crops.html',\r\n controller: 'cropsController',\r\n requireLogin: true\r\n },\r\n '/admin/parameters/global': {\r\n templateUrl: 'app/Partials/backoffice/parameters/global.html',\r\n controller: 'globalController',\r\n requireLogin: true\r\n\r\n },\r\n '/admin/parameters/products': {\r\n templateUrl: 'app/Partials/backoffice/parameters/products.html',\r\n controller: 'productsController',\r\n requireLogin: true\r\n\r\n },\r\n '/admin/parameters/homePageApplicationMobiles': {\r\n templateUrl: 'app/Partials/backoffice/parameters/homePageApplicationMobiles.html',\r\n controller: 'homePageApplicationMobilesController',\r\n requireLogin: true\r\n\r\n },\r\n '/admin/parameters/compagnies': {\r\n templateUrl: 'app/Partials/backoffice/parameters/compagnies.html',\r\n controller: 'compagniesController',\r\n requireLogin: true\r\n\r\n },\r\n '/admin/parameters/closeDay': {\r\n templateUrl: 'app/Partials/backoffice/parameters/closeDay.html',\r\n controller: 'closeDayController',\r\n requireLogin: true\r\n\r\n },\r\n '/admin/routing/cover/view/:typeView': {\r\n templateUrl: 'app/Partials/backoffice/routing/cover.html',\r\n controller: 'coverController',\r\n requireLogin: true\r\n },\r\n '/admin/routing/portfolio/view/:typeView': {\r\n templateUrl: 'app/Partials/backoffice/routing/portfolio.html',\r\n controller: 'portfolioController',\r\n requireLogin: true,\r\n resolve: {\r\n contractsColumns: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(93);\r\n }\r\n ],\r\n ordersColumns: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(94);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/dataManagment/weatherData': {\r\n templateUrl: 'app/Partials/backoffice/dataManagment/weatherData.html',\r\n controller: 'weatherDataController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesAccuWeatherCall: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(115);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/parameters/conditions/view/:typeView': {\r\n templateUrl: 'app/Partials/backoffice/parameters/conditions.html',\r\n controller: 'conditionsController',\r\n requireLogin: true\r\n },\r\n '/admin/parameters/categoryoffer': {\r\n templateUrl: 'app/Partials/backoffice/parameters/categoryOffer.html',\r\n controller: 'categoryOfferController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(92);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/contents/quotes': {\r\n templateUrl: 'app/Partials/backoffice/contents/quotes.html',\r\n controller: 'quoteAdminController',\r\n requireLogin: true\r\n },\r\n '/admin/manage/users': {\r\n templateUrl: 'app/Partials/backoffice/manage/users.html',\r\n controller: 'manageUsersController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(7);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/manage/groupusers': {\r\n templateUrl: 'app/Partials/backoffice/manage/groupusers.html',\r\n controller: 'manageGroupUsersController',\r\n requireLogin: true\r\n },\r\n '/admin/manage/tc': {\r\n templateUrl: 'app/Partials/backoffice/manage/users.html',\r\n controller: 'manageUsersController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(8);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/manage/admins': {\r\n templateUrl: 'app/Partials/backoffice/manage/admins.html',\r\n controller: '',\r\n requireLogin: true\r\n },\r\n '/tc/manage/users': {\r\n templateUrl: 'app/Partials/frontoffice/manage/usersOfTC.html',\r\n controller: 'manageUsersOfTcController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(9);\r\n }\r\n ]\r\n }\r\n },\r\n\r\n '/tc/contracts/firm/view/:typeContract': {\r\n templateUrl: 'app/Partials/frontoffice/manage/contractsOfTcUsers/monitoring.html',\r\n controller: 'manageContractsOfTcUsersController',\r\n requireLogin: true,\r\n resolve: {\r\n columnsValidated: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(12);\r\n }\r\n ],\r\n columnsPriced: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(13);\r\n }\r\n ],\r\n columnsCanceled: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(14);\r\n }\r\n ],\r\n columnsPending: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(61);\r\n }\r\n ],\r\n columnsDelayedSigning: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(102);\r\n }\r\n ],\r\n }\r\n },\r\n\r\n '/tc/contracts/base/view/:typeContract': {\r\n templateUrl: 'app/Partials/frontoffice/manage/base/monitoring.html',\r\n controller: 'manageContractsBaseOfTcUserController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesContractsBaseValidated: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(70);\r\n }\r\n ],\r\n colonnesContractsBasePending: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(71);\r\n }\r\n ],\r\n colonnesContractsBasePriced: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(72);\r\n }\r\n ],\r\n colonnesContractsBaseCanceled: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(73);\r\n }\r\n ]\r\n }\r\n },\r\n\r\n '/tc/contracts/commitment/view/:typeContract': {\r\n templateUrl: 'app/Partials/frontoffice/manage/commitment/monitoring.html',\r\n controller: 'manageContractsCommitmentOfTcUserController',\r\n requireLogin: false,\r\n resolve: {\r\n colonnesContractsCommitmentValidated: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(74);\r\n }\r\n ]\r\n }\r\n },\r\n\r\n '/tc/contracts/surfaceCommitment/view/:typeContract': {\r\n templateUrl: 'app/Partials/frontoffice/manage/surfaceCommitment/monitoring.html',\r\n controller: 'manageContractsSurfaceCommitmentOfTcUserController',\r\n requireLogin: false,\r\n resolve: {\r\n colonnesContractsSurfaceCommitmentValidated: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(109);\r\n }\r\n ]\r\n }\r\n },\r\n\r\n\r\n '/user/dashboard': {\r\n templateUrl: 'app/Partials/frontoffice/dashboard.html',\r\n controller: 'dashboardController',\r\n requireLogin: true\r\n },\r\n '/tc/dashboard': {\r\n templateUrl: 'app/Partials/frontoffice/dashboard.html',\r\n controller: 'dashboardController',\r\n requireLogin: true\r\n },\r\n '/user/userManagement/:typeTab?': {\r\n templateUrl: 'app/Partials/frontoffice/user/userManagement.html',\r\n controller: 'userManagementController',\r\n requireLogin: true\r\n },\r\n\r\n /*** Mes comptes ***/\r\n '/user/accounts/outstandings': {\r\n templateUrl: 'app/Partials/frontoffice/accounts/outstandings.html',\r\n controller: 'outstandingsController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(4);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/accounts/bills': {\r\n templateUrl: 'app/Partials/frontoffice/accounts/bills.html',\r\n controller: 'billsController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(5);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/accounts/accountStatement': {\r\n templateUrl: 'app/Partials/frontoffice/documentOrigin.html',\r\n controller: 'accountstatementController',\r\n requireLogin: true\r\n },\r\n /*** Fin de Mes comptes ***/\r\n\r\n /*** Gestion de contenus ***/\r\n '/admin/contents/news/': {\r\n templateUrl: 'app/Partials/backoffice/contents/news/news.html',\r\n controller: 'newsController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(2);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/contents/news/saveNews/:idnews': {\r\n templateUrl: 'app/partials/backoffice/contents/news/saveNews.html',\r\n controller: 'saveNewsController',\r\n requireLogin: true\r\n },\r\n '/admin/contents/fluxrss/': {\r\n templateUrl: 'app/Partials/backoffice/contents/flux.html',\r\n controller: 'fluxrssController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(1);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/contents/video/': {\r\n templateUrl: 'app/Partials/backoffice/contents/video.html',\r\n controller: 'videoController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(47);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/contents/content/': {\r\n templateUrl: 'app/Partials/backoffice/contents/content/contents.html',\r\n controller: 'contentsController',\r\n requireLogin: true\r\n },\r\n '/admin/contents/content/savePage/:indexMenu/:indexPage': {\r\n templateUrl: 'app/partials/backoffice/contents/content/savePage.html',\r\n controller: 'savePageController',\r\n requireLogin: true\r\n },\r\n '/user/content/:IdMenu?/:IdPage': {\r\n templateUrl: 'app/Partials/frontoffice/content.html',\r\n controller: 'contentUserController',\r\n requireLogin: true\r\n },\r\n '/tc/content/:IdMenu?/:IdPage': {\r\n templateUrl: 'app/Partials/frontoffice/content.html',\r\n controller: 'contentUserController',\r\n requireLogin: true\r\n },\r\n '/admin/contents/infoMarketHashtagri/view/:typeView': {\r\n templateUrl: 'app/Partials/backoffice/contents/infoMarketHashtagri/infoMarketHashtagri.html',\r\n controller: 'infoMarketHashtagriController',\r\n requireLogin: true\r\n },\r\n '/admin/contents/infoMarketHashtagri/saveContentInfoMarket/:idWritingContentInfoMarket': {\r\n templateUrl: 'app/partials/backoffice/contents/infoMarketHashtagri/saveContentInfoMarket.html',\r\n controller: 'saveContentInfoMarketController',\r\n requireLogin: true\r\n },\r\n\r\n '/admin/contents/carouselpicture/': {\r\n templateUrl: 'app/Partials/backoffice/contents/carouselPicture.html',\r\n controller: 'carouselPictureController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(91);\r\n }\r\n ]\r\n }\r\n },\r\n '/admin/ceremisDashboard': {\r\n templateUrl: 'app/partials/backoffice/ceremisDashboard.html',\r\n controller: 'ceremisDashboardController',\r\n requireLogin: true\r\n },\r\n\r\n '/admin/contents/contacts': {\r\n templateUrl: 'app/Partials/backoffice/contents/contacts.html',\r\n controller: 'contactsController',\r\n requireLogin: true\r\n },\r\n\r\n /*** Fin de Gestion de contenus ***/\r\n '/user/contributions/': {\r\n templateUrl: 'app/Partials/frontoffice/contributions/contributions.html',\r\n controller: 'contributionsController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnes: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(6);\r\n }\r\n ]\r\n }\r\n },\r\n '/user/documents/': {\r\n templateUrl: 'app/Partials/frontoffice/document.html',\r\n controller: 'documentsController',\r\n requireLogin: true\r\n },\r\n '/user/marketinfos/': {\r\n templateUrl: 'app/Partials/frontoffice/marketinfos/marketinfos.html',\r\n controller: 'marketinfostUserController',\r\n requireLogin: true\r\n },\r\n '/user/redirectOnOuiField/': {\r\n templateUrl: 'app/Partials/frontoffice/redirectOuiField.html',\r\n controller: 'redirectOuiFieldController',\r\n requireLogin: true\r\n },\r\n '/common/messenger/reception/': {\r\n templateUrl: 'app/Partials/common/messenger/messenger.html',\r\n controller: 'messengerController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesMessageSended: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(33);\r\n }\r\n ],\r\n colonnesMessageReceived: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(34);\r\n }\r\n ]\r\n }\r\n },\r\n '/common/messenger/sended/': {\r\n templateUrl: 'app/Partials/common/messenger/messenger.html',\r\n controller: 'messengerController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesMessageSended: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(33);\r\n }\r\n ],\r\n colonnesMessageReceived: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(34);\r\n }\r\n ]\r\n }\r\n },\r\n '/common/messenger/read/:IdMessage': {\r\n templateUrl: 'app/Partials/common/messenger/messenger.html',\r\n controller: 'messengerController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesMessageSended: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(33);\r\n }\r\n ],\r\n colonnesMessageReceived: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(34);\r\n }\r\n ]\r\n }\r\n },\r\n '/common/messenger/newmessage/:IdMessage?': {\r\n templateUrl: 'app/Partials/common/messenger/messenger.html',\r\n controller: 'messengerController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesMessageSended: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(33);\r\n }\r\n ],\r\n colonnesMessageReceived: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(34);\r\n }\r\n ]\r\n }\r\n },\r\n '/common/quotes/:withBtnBack?': {\r\n templateUrl: 'app/Partials/common/quote/quotes.html',\r\n controller: 'quoteController',\r\n requireLogin: true,\r\n resolve: {\r\n colonnesQuote: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(35);\r\n }\r\n ],\r\n colonnesQuoteWithoutRealTime: [\r\n 'userTableService', function (userTableService) {\r\n return userTableService.GetById(38);\r\n }\r\n ]\r\n }\r\n },\r\n '/tc/nomoduleactivated': {\r\n templateUrl: 'app/Partials/frontoffice/nomoduleactivated.html',\r\n requireLogin: true,\r\n },\r\n\r\n /************** TEST SOCKET ********************/\r\n '/testsocket/:ActionToOrder': {\r\n templateUrl: 'app/Partials/TestSocket/testsocket.html',\r\n controller: 'testsocketController',\r\n requireLogin: false\r\n }\r\n\r\n };\r\n\r\n //this loads up our routes dynamically from the previous object \r\n for (var path in window.routes) {\r\n $routeProvider.when(path, window.routes[path]);\r\n }\r\n $routeProvider.otherwise({ redirectTo: '/login' });\r\n\r\n $httpProvider.interceptors.push('HttpInterceptor');\r\n\r\n }\r\n]).run(function ($rootScope, currentUserFactory, configurationFactory, $location, $interval, messengerService, $timeout, enumFactory, $sce) {\r\n \r\n $rootScope.buildReactAppUrl = function (path, args) {\r\n if (path.length > 0 && path[0] !== \"/\")\r\n path = \"/\" + path;\r\n\r\n var params = args !== undefined ? Object.keys(args).map(function(str) { return str + \"=\" + args[str]; }) : [];\r\n\r\n if (sessionStorage.getItem(\"modeEdition\") === \"true\") {\r\n params.push(\"modeEdition=1\");\r\n }\r\n\r\n var strParams = params.join(\"&\");\r\n\r\n if (strParams.length > 0)\r\n strParams = \"?\" + strParams;\r\n\r\n if ($location.host() === \"localhost\")\r\n return $sce.trustAsResourceUrl(\"http://localhost:12999/v2\" + path + strParams);\r\n\r\n return \"/v2\" + path + strParams;\r\n };\r\n \r\n window.addEventListener('message', function (e) {\r\n var message = '';\r\n\r\n try {\r\n message = JSON.parse(e.data);\r\n } catch (ex) {\r\n return;\r\n }\r\n\r\n if (message.action == \"guidRequest\"){\r\n var json = JSON.parse(sessionStorage.getItem(\"LOG\"));\r\n if (json && json.token)\r\n e.source.postMessage(JSON.stringify({ type:\"guid\", guid: json.token }), \"*\");\r\n }\r\n else if (message.action == \"configRequest\"){\r\n e.source.postMessage(JSON.stringify({ type:\"config\", config: configurationFactory }), \"*\");\r\n }\r\n else if (message.action == \"sessionRequest\" && currentUserFactory.User){\r\n e.source.postMessage(JSON.stringify(\r\n { type:\"session\", idUser : (currentUserFactory.User.IdClientSelectedFromTc ? currentUserFactory.User.IdClientSelectedFromTc : currentUserFactory.User.IdUser), idCrop : $rootScope.crop.IdCrop, idConnection : $rootScope.idConnectionLogged }\r\n ), \"*\");\r\n } \r\n else if (message.action == \"redirect\"){\r\n window.location.assign(window.location.protocol + \"//\" + window.location.host + \"/#\" + message.url);\r\n }\r\n else if (message.action == \"setTitle\"){\r\n var reactTitle = this.document.getElementById(\"reactTitle\");\r\n if(reactTitle)\r\n {\r\n reactTitle.innerText = message.title;\r\n }\r\n }\r\n else if (message.action == \"setCrop\"){\r\n $rootScope.crop.IdCrop = message.idCrop != 0 ? message.idCrop : $rootScope.crop.IdCrop;\r\n }\r\n else if (message.action ==\"goToSubscribeDelayedSigning\"){\r\n $rootScope.isTcSigningForUser = currentUserFactory.User.IdRole === enumFactory.Roles.TC;\r\n $rootScope.goToDelayedSigning = true;\r\n $rootScope.idContractForDelayedSigning = message.idContract;\r\n if (message.idTypeContract == enumFactory.TypeContract.Ferme)\r\n window.location.assign(window.location.protocol + \"//\" + window.location.host + \"/#/user/subscribe/contractFirm/\");\r\n else if (message.idTypeContract == enumFactory.TypeContract.ContratVierge)\r\n window.location.assign(window.location.protocol + \"//\" + window.location.host + \"/#/user/subscribe/contractBlank/\");\r\n }\r\n else if (message.action ==\"goToSubscribe\"){\r\n $rootScope.idOfferSelected = message.idOffer;\r\n $rootScope.idExpirySelected = message.idOfferExpiry;\r\n $rootScope.idTypeOrderSelected = message.isSold ? enumFactory.TypeOrders.Vente.IdTypeOrder : enumFactory.TypeOrders.Prixobjectif.IdTypeOrder;\r\n $rootScope.idTypeCommitmentSelected = null;\r\n window.location.assign(window.location.protocol + \"//\" + window.location.host + \"/#/user/subscribe/contractBase//\"+ message.idContract);\r\n }\r\n });\r\n\r\n if (mobileAndTabletcheck() && configurationFactory.Url.hasOwnProperty(\"Mobile\") && configurationFactory.Url.Mobile)\r\n redirectToMobile(configurationFactory.Url.Index, configurationFactory.Url.Mobile);\r\n else {\r\n var googleAnalytics = window.googleAnalytics ? window.googleAnalytics : \"\";\r\n gtag('config', googleAnalytics);\r\n\r\n $rootScope.$on('$routeChangeSuccess', function (event) {\r\n gtag('event', 'page_view', {\r\n page_title: $location.$$path,\r\n page_location: $location.$$absUrl,\r\n page_path: $location.$$path\r\n });\r\n });\r\n\r\n $(window).on('beforeunload', function (e) {\r\n if (!sessionStorage.getItem(\"referrer\")) {\r\n if (sessionStorage.getItem(\"LOG\")) {\r\n sessionStorage.setItem(\"hasRefresh\", true);\r\n sessionStorage.removeItem(\"hasValidateCGU\");\r\n }\r\n else {\r\n $location.path(\"/login\");\r\n }\r\n }\r\n });\r\n\r\n $rootScope.goTo = function (path) {\r\n $location.path(path);\r\n };\r\n\r\n $rootScope.goToEditMode = function (redirect) {\r\n sessionStorage.setItem(\"IdUserAdmin\", $rootScope.User.IdUser);\r\n sessionStorage.setItem(\"IdUser\", $rootScope.DefaultUserEditionMode);\r\n sessionStorage.setItem(\"modeEdition\", true);\r\n $location.path(\"/loginEditMode/\" + redirect);\r\n };\r\n\r\n $rootScope.goToEditModeTc = function () {\r\n sessionStorage.setItem(\"IdUserAdmin\", $rootScope.User.IdUser);\r\n sessionStorage.setItem(\"IdUser\", $rootScope.DefaultTcEditionMode);\r\n sessionStorage.setItem(\"modeEdition\", true);\r\n $location.path(\"/loginEditMode/\");\r\n };\r\n\r\n $rootScope.getPagesByKey = function (key) {\r\n if ($rootScope.editableMenus) {\r\n var result = $rootScope.editableMenus.find(function seuil(menu) {\r\n return menu.Key === key;\r\n });\r\n\r\n if (result)\r\n return result.PagesEditableVms;\r\n }\r\n return [];\r\n };\r\n\r\n $rootScope.getValueByKey = function (key) {\r\n if ($rootScope.editableMenus) {\r\n var result = $rootScope.editableMenus.find(function seuil(menu) {\r\n return menu.Key === key;\r\n });\r\n\r\n if (result)\r\n return result.Label;\r\n }\r\n return \"\";\r\n };\r\n\r\n $rootScope.getPageValueByKey = function (keyMenu, keyPage) {\r\n if ($rootScope.editableMenus) {\r\n var result = $rootScope.editableMenus.find(function compare(menu) {\r\n return menu.Key === keyMenu;\r\n });\r\n\r\n if (result) {\r\n var r = result.PagesEditableVms.find(function c(page) {\r\n return page.Key === keyPage;\r\n });\r\n\r\n if (r !== null) {\r\n return r.Label;\r\n }\r\n }\r\n }\r\n return \"\";\r\n };\r\n\r\n //Pour gerer le cas des post qui ne marche pas sous IE9 et moins\r\n var rv = -1;\r\n if (navigator.appName == 'Microsoft Internet Explorer') {\r\n var ua = navigator.userAgent;\r\n var re = new RegExp(\"MSIE ([0-9]{1,}[\\\\.0-9]{0,})\");\r\n if (re.exec(ua) !== undefined && re.exec(ua) !== null)\r\n rv = parseFloat(RegExp.$1);\r\n }\r\n if (rv > -1) {\r\n if (rv <= 9.0) {\r\n xhook.addWithCredentials = false;\r\n jQuery.support.cors = true;\r\n var t = {};\r\n var urlApi = configurationFactory.Url['Api'].replace(\"/api/\", \"\");\r\n t[urlApi] = '/proxy.html';\r\n xdomain.slaves(t);\r\n xdomain.debug = true; //Pour afficher le debug dans la console\r\n }\r\n }\r\n\r\n var firstLoad = false;\r\n\r\n var eventlocation = $rootScope.$on(\"$locationChangeStart\", function (event, next) {\r\n // Gestion du bouton retour du navigateur sur la page du resetPassword\r\n if ($rootScope.currentPath == \"/resetPassword\" && next.indexOf(\"/login/\") == -1)\r\n $location.path('/');\r\n\r\n $interval.cancel($rootScope.refreshCotations);\r\n if ($location.$$path == \"/resetPassword\"){\r\n $rootScope.currentPath = $location.$$path;\r\n }\r\n else if (currentUserFactory.User && $location.$$path != \"/login\" && !sessionStorage.getItem(\"referrer\") && $location.$$path != \"/siteUnavailable\" && $location.$$path != \"/disableSubscription\" && $location.$$path != '/disconnect' && $location.$$path.indexOf('/loginEditMode/') == -1 && $location.$$path.indexOf('/loginUAC/') == -1 && $location.$$path.indexOf('/loginCerelio/') == -1 && $location.$$path.indexOf('/loginHash/') == -1 && $location.$$path !== \"/validateCGU\") {\r\n if (currentUserFactory.User.Role.toLowerCase() == \"tc\" ||\r\n $location.$$path.toLowerCase().indexOf(currentUserFactory.User.Role.toLowerCase()) >= 0 ||\r\n $location.$$path.toLowerCase().indexOf(\"common\") >= 0) {\r\n //Permet la navigation avec la flèche pour les connexion backdoor (profile TC)\r\n if ((($location.$$path.toLowerCase() === \"/backdoor/profile\") || ($location.$$path.toLowerCase() === \"/backdoor/\")) && sessionStorage.getItem(\"LOG_AVIV\")) {\r\n sessionStorage.removeItem(\"LOG\");\r\n $location.$$path = \"/backdoor/profile\";\r\n $rootScope.currentPath = $location.$$path;\r\n sessionStorage.setItem(\"currentPath\", $location.$$path);\r\n $location.path($location.$$path);\r\n } else {\r\n $rootScope.currentPath = $location.$$path;\r\n if ($location.$$path !== \"/\") {\r\n /*if ($rootScope.paramBDisableSubscription && $location.$$path.includes(\"/user/offers/view\")) {\r\n sessionStorage.setItem(\"currentPath\", \"/disableSubscription\");\r\n $location.path(\"/disableSubscription\");\r\n } else {*/\r\n sessionStorage.setItem(\"currentPath\", $location.$$path);\r\n //}\r\n }\r\n if ($rootScope.Modules.ModuleMessagerie.Active) {\r\n messengerService.GetNbMessage(function (data) {\r\n $rootScope.nbmessage = data;\r\n });\r\n }\r\n\r\n for (var i in window.routes) {\r\n if (next.indexOf(i) != -1) {\r\n if (window.routes[i].requireLogin && (!currentUserFactory && !currentUserFactory.User)) {\r\n $location.path('/');\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n //Permet la navigation avec la flèche pour les connexion backdoor (Profile User && Admin)\r\n if ((($location.$$path.toLowerCase() === \"/backdoor/profile\") || ($location.$$path.toLowerCase() === \"/backdoor/\")) && sessionStorage.getItem(\"LOG_AVIV\")) {\r\n sessionStorage.removeItem(\"LOG\");\r\n $location.$$path = \"/backdoor/profile\";\r\n $rootScope.currentPath = $location.$$path;\r\n if ($location.$$path !== \"/\") {\r\n sessionStorage.setItem(\"currentPath\", $location.$$path);\r\n }\r\n $location.path($location.$$path);\r\n } else {\r\n currentUserFactory.User = null;\r\n $location.path('/disconnect');\r\n }\r\n }\r\n } else if ($location.$$path != \"/login/\" && !sessionStorage.getItem(\"referrer\") && ($location.$$path != \"/siteUnavailable\" || $location.$$path === \"/siteUnavailable\" && sessionStorage.getItem(\"hasRefresh\") === \"true\") && $location.$$path != \"/login\" && $location.$$path != '/disconnect' && $location.$$path.indexOf('/loginEditMode/') == -1 && $location.$$path.indexOf('/loginUAC/') == -1 && $location.$$path.indexOf('/loginCerelio/') == -1 && $location.$$path.indexOf('/loginHash/') == -1 && ($location.$$path != \"/validateCGU\" || $location.$$path === \"/validateCGU\" && sessionStorage.getItem(\"hasRefresh\") === \"true\") && ($location.$$path != \"/disableSubscription\" || $location.$$path === \"/disableSubscription\" && sessionStorage.getItem(\"hasRefresh\") === \"true\")) {\r\n $rootScope.currentPath = $location.$$path;\r\n if ($location.$$path !== \"/\") {\r\n sessionStorage.setItem(\"currentPath\", $location.$$path);\r\n }\r\n var user = JSON.parse(sessionStorage.getItem(\"LOG\"));\r\n if (user)\r\n $location.path('/refresh/');\r\n }\r\n else { // Cas ou on l'on fait précédent du navigateur et qu'on ai connecté via un referrer\r\n if (!firstLoad && sessionStorage.getItem(\"referrer\")) {\r\n firstLoad = true;\r\n var newPath = \"/access/\" + sessionStorage.getItem(\"paramConnectorUrlReferrer\") + \"/\" + sessionStorage.getItem(\"hideMenu\");\r\n $location.path(newPath);\r\n }\r\n }\r\n });\r\n }\r\n});","AgrimarketFactories.factory(\"currentUserFactory\", [\r\n\tfunction () {\r\n\t\treturn {\r\n\t\t\tUser: null,\r\n\t\t\tConnection: null\r\n\t\t};\r\n\t}]);","AgrimarketFactories.factory(\"parametersFactory\", [\r\n\tfunction () {\r\n\t\treturn {\r\n\t\t\tParameters: null\r\n\t\t};\r\n\t}]);","AgrimarketFactories.factory(\"modulesFactory\", [\r\n\tfunction () {\r\n\t\treturn {\r\n\t\t\tModules: null\r\n\t\t};\r\n\t}]);","AgrimarketFactories.factory(\"editableObjectsFactory\", ['enumFactory',\r\n\tfunction (enumFactory) {\r\n\t\treturn {\r\n\t\t\tEditableObjects: null,\r\n\t\t\t\"icoVisible\": false,\r\n\t\t\t\"getItemByKey\": function (key) {\r\n\t\t\t\treturn this.EditableObjects[key];\r\n\t\t\t},\r\n\t\t\t\"getIsVisibleByKey\": function (key) {\r\n\t\t\t\tif (this.EditableObjects[key] !== undefined)\r\n\t\t\t\t\treturn this.EditableObjects[key].IsVisible;\r\n\t\t\t\telse\r\n\t\t\t\t\treturn true;\r\n\t\t\t},\r\n\t\t\t\"getContentByKey\": function (key) {\r\n\t\t\t\tif (this.EditableObjects[key] !== undefined) {\r\n\t\t\t\t\tswitch(this.EditableObjects[key].IdTypeEditableObject) {\r\n\t\t\t\t\t\tcase enumFactory.IdTypeEditableObject.ButtonCancel:\r\n return '<span class=\"icofont-close-circled\"></span>' +this.EditableObjects[key].Content;\r\n\t\t\t\t\t\tcase enumFactory.IdTypeEditableObject.ButtonConfirm:\r\n return '<span class=\"icofont-check-circled\"></span>' + this.EditableObjects[key].Content;\r\n\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\treturn this.EditableObjects[key].Content;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\t\t\t\t\t\r\n\t\t\t\telse\r\n\t\t\t\t\treturn undefined;\r\n\t\t\t},\r\n\t\t\t\"getIdTypeEditableObjectByKey\": function (key) {\r\n\t\t\t\tif (this.EditableObjects[key] !== undefined)\r\n\t\t\t\t\treturn this.EditableObjects[key].IdTypeEditableObject;\r\n\t\t\t\telse {\r\n\t\t\t\t\treturn undefined;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\r\n\t\t};\r\n\t}]);","AgrimarketFactories.factory(\"enumFactory\", [\r\n function () {\r\n var coops = {\r\n \"Ducroquet\": 'ducroquet',\r\n \"Uneal\": 'uneal',\r\n \"Nutrinor\": 'nutrinor',\r\n \"Prograin\": 'prograin',\r\n \"Creully\": 'creully'\r\n };\r\n var roles = {\r\n \"Admin\": 1,\r\n \"User\": 2,\r\n \"TC\": 3,\r\n \"Gateway\": 4\r\n };\r\n var typeUserActions = {\r\n \"EnvoyerIdentifiants\": 1,\r\n \"ActiverAcces\": 2,\r\n \"DesactiverAcces\": 3,\r\n \"ChangerDatesAbonnement\": 4,\r\n \"EnvoyerMail\": 5,\r\n \"GroupeUtilisateur\": 6,\r\n \"ActiverConnexionAgri\": 7,\r\n \"DesactiverConnexionAgri\": 8,\r\n \"EnregistrerLiaisonTC\": 9\r\n };\r\n var typeRequest = {\r\n \"Disponibilite\": 1,\r\n \"Tarif\": 2\r\n };\r\n return {\r\n Coops: coops,\r\n TypeQuotes: {\r\n \"Fixe\": 1,\r\n \"IndexeCoursCompensation\": 2,\r\n \"Indexe3FoisParJour\": 3,\r\n \"IndexeTempsReel\": 4\r\n },\r\n TypeOrders: {\r\n \"Vente\": { \"IdTypeOrder\": 1, \"Label\": \"Vente\", \"LabelAction\": \"Vente\" },\r\n \"Prixobjectif\": { \"IdTypeOrder\": 2, \"Label\": \"Prix objectif\", \"LabelAction\": \"Prix objectif\" },\r\n \"Engagement\": { \"IdTypeOrder\": 3, \"Label\": \"Engagement\", \"LabelAction\": \"S'engager\" },\r\n \"Option\": { \"IdTypeOrder\": 4, \"Label\": \"Option\", \"LabelAction\": \"Souscrire \" },\r\n \"ContratVierge\": { \"IdTypeOrder\": 5, \"Label\": \"Vente contrat vierge\", \"LabelAction\": \"Vente\" },\r\n \"EngagementSurface\": { \"IdTypeOrder\": 7, \"Label\": \"Engagement de surface\", \"LabelAction\": \"S'engager\" },\r\n },\r\n Action: {\r\n \"Action_Signing\": { \"EditableKey\": \"Action_Signing\", \"ContentDefault\": \"Signer\" },\r\n \"Action_Modification\": { \"EditableKey\": \"Action_Modification\", \"ContentDefault\": \"Modifier\" },\r\n \"Action_Cancel\": { \"EditableKey\": \"Action_Cancel\", \"ContentDefault\": \"Annuler\" },\r\n \"Action_Detail\": { \"EditableKey\": \"Action_Detail\", \"ContentDefault\": \"Détail\" },\r\n \"Action_DisplayPdf\": { \"EditableKey\": \"Action_DisplayPdf\", \"ContentDefault\": \"Visualiser son contrat Pdf\" },\r\n \"Action_Delete\": { \"EditableKey\": \"Action_Delete\", \"ContentDefault\": \"Supprimer\" },\r\n \"Action_Validate\": { \"EditableKey\": \"Action_Validate\", \"ContentDefault\": \"Valider\" },\r\n \"Action_Refuse\": { \"EditableKey\": \"Action_Refuse\", \"ContentDefault\": \"Refuser\" },\r\n \"Action_Duplicate\": { \"EditableKey\": \"Action_Duplicate\", \"ContentDefault\": \"Dupliquer\" },\r\n },\r\n ActionOption: {\r\n \"Action_Execute\": { \"EditableKey\": \"Action_Execute\", \"ContentDefault\": \"Exécuter\" },\r\n \"Action_Abandon\": { \"EditableKey\": \"Action_Abandon\", \"ContentDefault\": \"Abandonner\" },\r\n },\r\n CommitmentAction: {\r\n \"CommitFixation\": { \"EditableKey\": \"CommitFixation\", \"ContentDefault\": \"Fixations\" }\r\n },\r\n StateArticle : {\r\n \"DELIVERED\": 1,\r\n \"NOT_DELIVERED\": 2,\r\n \"PARTIALLY_DELIVERED\": 3\r\n },\r\n ProductAndTypeCommitAction: {\r\n \"CommitOffer\": { \"EditableKey\": \"CommitOffer\", \"ContentDefault\": \"Offre\", \"IsVisible\": true },\r\n \"CommitDetail\": { \"EditableKey\": \"CommitDetail\", \"ContentDefault\": \"Detail\", \"IsVisible\": true },\r\n },\r\n ContractState: {\r\n \"AttenteValidation\": 1,\r\n \"Valide\": 2,\r\n \"Annulé\": 3,\r\n \"Refusé\": 4,\r\n \"AttenteAnnulationOrdreLie\": 5,\r\n \"AttenteDernierComposant\": 6,\r\n \"Abandonne\": 7,\r\n \"EnAttenteExecution\": 8,\r\n \"Exécuté\": 9,\r\n \"PrixConstruitSouscrit\": 13,\r\n \"PrixConstruitEnCoursCalcul\": 14\r\n\r\n },\r\n GroupParameters: {\r\n \"Crop\": 1,\r\n \"Offer\": 2,\r\n \"Cover\": 3,\r\n \"Documentation\": 4,\r\n \"MyAccount\": 5,\r\n \"DelayedCover\": 6,\r\n \"ContractingDelay\": 7,\r\n \"ManagementSite\": 9,\r\n \"ManagementMessage\": 10\r\n },\r\n Module: {\r\n \"Cover\": 1,\r\n \"Ecommerce\": 2,\r\n \"News\": 3,\r\n \"Cotation\": 4,\r\n \"Hashtagri\": 10,\r\n \"Option\": 18\r\n },\r\n TypeCover:\r\n {\r\n \"Automatique\": 1,\r\n \"Differee\": 2,\r\n \"Manuel\": 3\r\n },\r\n TypeOffer:\r\n {\r\n \"Ferme\": 1,\r\n \"Engagement\": 2,\r\n \"Option\": 3,\r\n \"ContratVierge\": 4,\r\n \"PrixConstruit\": 5,\r\n \"EngagementSurface\": 6,\r\n \"MultiCampagne\": 7\r\n },\r\n TypeContract:\r\n {\r\n \"Ferme\": 1,\r\n \"Engagement\": 2,\r\n \"ContratVierge\": 3,\r\n \"PrixConstruit\": 4,\r\n \"EngagementSurface\": 5,\r\n \"MultiCampagne\": 6\r\n },\r\n TypeCommitment:\r\n {\r\n \"Libre\": 1\r\n },\r\n StatusBills:\r\n {\r\n \"IsPayed\": 1,\r\n \"IsNotPayed\": 2,\r\n \"Undetermined\": 3\r\n },\r\n TypeParameters:\r\n {\r\n \"String\": 1,\r\n \"RadioButton\": 2,\r\n \"CheckBox\": 3,\r\n \"DropDownList\": 4,\r\n \"TimePicker\": 5,\r\n \"FileUpload\": 6,\r\n \"HourTimePicker\": 7,\r\n \"DoubleHourTimePicker\": 8,\r\n \"DoubleDouble\": 9\r\n },\r\n TypeTemplates: {\r\n \"Vente\": 1,\r\n \"Objectif\": 2,\r\n \"Engagement\": 3,\r\n \"Option\": 4,\r\n \"VenteBase\": 5,\r\n \"ObjectifBase\": 6,\r\n \"BlankContract\": 7,\r\n \"ExerciseOption\": 8,\r\n \"ContratBuiltPrice\": 9,\r\n \"ExitAnticipatedBuiltPrice\": 10,\r\n \"TargetExerciseOption\": 11,\r\n \"EngagementSurface\": 12,\r\n \"MultiCrop\": 13\r\n },\r\n TypeChart: [\r\n { Name: \"Courbe\", Value: \"line\" },\r\n { Name: \"Chandelle\", Value: \"candlestick\" },\r\n { Name: \"OHLC\", Value: \"ohlc\" }\r\n ],\r\n TypeDashboardActuality:\r\n {\r\n 'NEWS': 1,\r\n 'RSS': 2,\r\n 'HASHTAGRI': 3,\r\n 'VIDEO': 4,\r\n 'CAROUSEL' : 5,\r\n 'CONTACTS' : 6\r\n },\r\n Roles: roles,\r\n UserTable: {\r\n \"FluxRss\": 1,\r\n \"News\": 2,\r\n \"Commands\": 3,\r\n \"Outstandings\": 4,\r\n \"Bills\": 5,\r\n \"Contributions\": 6,\r\n \"ManageUser\": 7,\r\n \"ManageTc\": 8,\r\n \"ManageUserFromTc\": 9\r\n },\r\n Profiles: [\r\n { Name: \"Tous\", Value: 0 },\r\n { Name: \"Agriculteur\", Value: roles.User },\r\n { Name: \"TC\", Value: roles.TC }\r\n ],\r\n TypeInvoiceState: {\r\n \"Facture\": 1,\r\n \"NonFacture\": 2\r\n },\r\n CommandState: {\r\n \"Sold\": 1,\r\n \"NoSold\": 2\r\n },\r\n DropDownList: {\r\n \"Tous\": -1,\r\n \"Aucun\": 0\r\n },\r\n TypeBills: {\r\n \"Appros\": 1,\r\n \"Apport\": 2,\r\n \"Cereal\": 3\r\n },\r\n TypeUserActions: typeUserActions,\r\n TypeUserActionsList: [\r\n { Name: \"Envoyer les identifiants\", Value: typeUserActions.EnvoyerIdentifiants },\r\n { Name: \"Activer l'accès Extranet\", Value: typeUserActions.ActiverAcces },\r\n { Name: \"Désactiver l'accès Extranet\", Value: typeUserActions.DesactiverAcces },\r\n { Name: \"Changer les dates d'abonnement\", Value: typeUserActions.ChangerDatesAbonnement },\r\n { Name: \"Envoyer un mail\", Value: typeUserActions.EnvoyerMail },\r\n { Name: \"Groupe utilisateur\", Value: typeUserActions.GroupeUtilisateur },\r\n { Name: \"Activer la connexion pour un agri\", Value: typeUserActions.ActiverConnexionAgri },\r\n { Name: \"Désactiver la connexion pour un agri\", Value: typeUserActions.DesactiverConnexionAgri },\r\n { Name: \"Liaison TC\", Value: typeUserActions.EnregistrerLiaisonTC }\r\n ],\r\n TypeRequest: typeRequest,\r\n TypeRequestList: [\r\n { Name: \"Demande de disponibilité\", Value: typeRequest.Disponibilite },\r\n { Name: \"Demande de tarif\", Value: typeRequest.Tarif }\r\n ],\r\n ListRoles: [\r\n { Name: \"Admin\", Value: roles.Admin },\r\n { Name: \"Agriculteur\", Value: roles.User },\r\n { Name: \"TC\", Value: roles.TC }\r\n ],\r\n TypesMails: {\r\n \"Confirmation prise d'une vente\": 1,\r\n \"Modification d'un prix objectif\": 2,\r\n \"Annulation d'un prix objectif\": 3,\r\n \"Validation d'un prix objectif\": 4,\r\n \"Fin de validité d'un prix objectif\": 5,\r\n \"Annulation partielle d'un ordre\": 6,\r\n \"Rejet d'un ordre\": 7,\r\n \"Mot de passe perdu\": 8,\r\n \"Envoyer les identifiants\": 9,\r\n \"Demande de tarif / disponibilité\": 11,\r\n \"Rejet prix objectif coupure du routage d'ordre\": 12,\r\n \"Rejet couverture différée coupure du routage d'ordre\": 13,\r\n \"Demande de couverture manuelle pour un prix Objectif\": 14,\r\n \"Seuil de tonnage limite atteinte\": 15,\r\n \"Annulation d'' un ordre\": 16,\r\n \"Confirmation d'un prix objectif\": 17,\r\n \"Alerte mail\": 49\r\n },\r\n OfferStatus: {\r\n \"Enabled\": 1,\r\n \"Disabled\": 2,\r\n \"Expired\": 3\r\n },\r\n IdStateCover: {\r\n \"NotCovered\": 1,\r\n \"PendingCover\": 2,\r\n \"Covered\": 3\r\n },\r\n IdTypeEditableObject: {\r\n \"Texte\": 1,\r\n \"ButtonConfirm\": 2,\r\n \"ButtonCancel\": 3\r\n },\r\n ElementsInfoMarketHomePage: {\r\n \"Quotes\": { \"IdElementInfoMarketHomePage\": 1, \"Label\": \"Cotations\", \"LabelDefault\": \"Cotations\" },\r\n \"News\": { \"IdElementInfoMarketHomePage\": 2, \"Label\": \"News\", \"LabelDefault\": \"News\" },\r\n \"Synthesis\": { \"IdElementInfoMarketHomePage\": 3, \"Label\": \"Synthèse\", \"LabelDefault\": \"Synthèse\" }\r\n },\r\n ValidityDurations: {\r\n \"Day\": 1,\r\n \"Week\": 2,\r\n \"Month\": 3,\r\n \"EndDateOffer\": 4\r\n },\r\n TabContract: {\r\n \"Validated\": 1,\r\n \"Priced\": 2,\r\n \"Canceled\": 3,\r\n \"Pending\": 4,\r\n \"ToValidated\": 5,\r\n \"delayedSigning\": 6,\r\n },\r\n ContentBlocDispositions: [\r\n { Id: 1, Label: 'Cotations Global Macro' },\r\n { Id: 2, Label: 'Cotations Physique' },\r\n { Id: 3, Label: 'Cotations Futures' },\r\n { Id: 4, Label: 'News Météo' },\r\n { Id: 5, Label: 'News USDA' }\r\n ],\r\n TypeBlockEditables: {\r\n \"Bandeau\": 1,\r\n \"TAB\": 2\r\n },\r\n TypeCategoryInfoMarket: {\r\n \"Cereales\": 1,\r\n \"Oleagineux\": 2,\r\n \"GlobalMacro\": 3,\r\n \"Eleveurs\": 4,\r\n \"INFOOS\": 5\r\n },\r\n TypeOfferCommitment: {\r\n \"EngagementFacultatif\": 1,\r\n \"EngagementObligatoire\": 2,\r\n \"ObligerSansEngagement\": 3\r\n },\r\n EuronextRoyalTy: {\r\n \"Choice1\": 1, // Le client paye la redevance directement à Euronext -> La page existante ne bouge pas, on affiche en différé 15 min\r\n \"Choice2\": 2, // Le client paye la redevance directement à Euronext mais moins chère -> On cache les colonnes lié au carnet d’ordre, on affiche en différé 15 min\r\n \"Choice3\": 3, // Le client ne paye pas la redevance -> On cache les colonnes lié au carnet d’ordre, on affiche plus que le settle de la veille (maj à minuit)\r\n \"Choice4\": 4, // Le client ne paye pas la redevance Euronext mais souhaite garder le différé 15 min -> Redirection vers la page de cotations Logaviv\r\n \"Choice5\": 5 // on cache la page de cotation\r\n },\r\n TypeSends: {\r\n \"Immediat\": 1,\r\n \"Journalier\": 2,\r\n \"Hebdomadaire\": 3,\r\n \"Mensuel\": 4\r\n },\r\n ValuesIncidenceRuleGroup: {//Paramètre : Id:79 (Règle sur les incidences des groupes)\r\n \"MoinsAvantageuse\": 1,\r\n \"PlusAvantageuse\": 2\r\n },\r\n TypeTargetPriceMessage: {\r\n \"Mail\": 1,\r\n \"Sms\": 2\r\n },\r\n TypeFixations: {\r\n \"Base\": { \"IdTypeFixation\": 1, \"Label\": \"Fixation base\", \"LabelAction\": \"Fixation base\" },\r\n \"Future\": { \"IdTypeFixation\": 2, \"Label\": \"Prix de référence\", \"LabelAction\": \"Prix de référence\" },\r\n \"GlobalPrice\": { \"IdTypeFixation\": 3, \"Label\": \"Fixation prix\", \"LabelAction\": \"Fixation prix\" },\r\n \"ExerciceOption\": { \"IdTypeFixation\": 4, \"Label\": \"Exercice d'option\", \"LabelAction\": \"Exercice d'option\" }\r\n },\r\n TypeOption: {\r\n \"Call\": 1,\r\n \"Put\": 2\r\n },\r\n SubscribeActions: {\r\n \"BaseSold\": { \"IdTypeFixation\": 1, \"IdTypeOrder\": 1, \"LabelDefault\": \"Fixation base\", \"Label\": \"Fixation base\" },\r\n \"BaseTargetPrice\": { \"IdTypeFixation\": 1, \"IdTypeOrder\": 2, \"LabelDefault\": \"Objectif base\", \"Label\": \"Objectif base\" },\r\n \"FutureSold\": { \"IdTypeFixation\": 2, \"IdTypeOrder\": 1, \"LabelDefault\": \"Fixation prix de ref\", \"Label\": \"Fixation prix de ref\" },\r\n \"FutureTargetPrice\": { \"IdTypeFixation\": 2, \"IdTypeOrder\": 2, \"LabelDefault\": \"Objectif prix de ref\", \"Label\": \"Objectif prix de ref\" },\r\n \"GlobalSold\": { \"IdTypeFixation\": 3, \"IdTypeOrder\": 1, \"LabelDefault\": \"Fixation prix\", \"Label\": \"Fixation prix\" },\r\n \"GlobalTargetPrice\": { \"IdTypeFixation\": 3, \"IdTypeOrder\": 2, \"LabelDefault\": \"Objectif prix\", \"Label\": \"Objectif prix\" },\r\n \"SoldExerciceOption\": { \"IdTypeFixation\": 4, \"IdTypeOrder\": 1, \"LabelDefault\": \"Exercice\", \"Label\": \"Exercice\" },\r\n \"TargetExerciceOption\": { \"IdTypeFixation\": 4, \"IdTypeOrder\": 2, \"LabelDefault\": \"Objectif d'exercice\", \"Label\": \"Objectif d'exercice\" },\r\n \"CommitCommitment\": { \"IdTypeFixation\": null, \"IdTypeOrder\": 3, \"LabelDefault\": \"Engagement\", \"Label\": \"S'engager\" },\r\n \"CommitCommitmentSurface\": { \"IdTypeFixation\": null, \"IdTypeOrder\": 3, \"LabelDefault\": \"Engagement de surface\", \"Label\": \"S'engager\" },\r\n \"SubscribeOption\": { \"IdTypeFixation\": null, \"IdTypeOrder\": 4, \"LabelDefault\": \"Souscription option\", \"Label\": \"Souscrire\" },\r\n \"SubscribeBlankContract\": { \"IdTypeFixation\": null, \"IdTypeOrder\": 5, \"LabelDefault\": \"Vente\", \"Label\": \"Vente\" },\r\n },\r\n TypeCategoryTypeTemplateMail: {\r\n \"Contract\": 1,\r\n \"Base\": 2,\r\n \"Commitment\": 3,\r\n \"Option\": 4,\r\n \"RoutingOrder\": 5,\r\n \"Other\": 6,\r\n \"BuiltPrice\": 7,\r\n \"Offer\": 8,\r\n \"MultiCrop\": 9,\r\n },\r\n TypeEffortTc: {\r\n \"Base\": 1,\r\n \"Price\": 2\r\n },\r\n TypeFixationBases: {\r\n \"Obligatoire\": 1,\r\n \"Libre\": 2,\r\n \"Automatic\": 3\r\n },\r\n TypeCalculOption: {\r\n \"Manual\": 1,\r\n \"Automatic\": 2\r\n },\r\n UsersOfTcActions: {\r\n \"Action_EditInfosPerso\": { \"EditableKey\": \"Action_EditInfosPerso\", \"ContentDefault\": \"Modifier\" },\r\n \"Action_SendIdentifiers\": { \"EditableKey\": \"Action_SendIdentifiers\", \"ContentDefault\": \"Envoyer les identifiants\" }\r\n },\r\n OfferActions: {\r\n \"Action_SetLimitsAlertSms\": { \"EditableKey\": \"Action_SetLimitsAlertSms\", \"ContentDefault\": \"Alerte\" }\r\n },\r\n Origins: {\r\n \"Web\": 1,\r\n \"Projection\": 2,\r\n \"Passerelle\": 3,\r\n \"Mobile\": 4,\r\n \"AppMobile\": 5\r\n },\r\n AthenaOrderTypes: {\r\n \"Market\": { Name: \"Marché\", Id: 1 },\r\n \"Limit\": { Name: \"Objectif\", Id: 2 }\r\n },\r\n VisibilityOffer: {\r\n \"All\": 1,\r\n \"Tc_Only\": 2,\r\n \"User_Only\": 3,\r\n \"Dr_Ra\": 4,\r\n \"Siege\": 5\r\n },\r\n AthenaOrderStates: {\r\n \"PendingCancel\": -3,\r\n \"ModificationAborted\": -2,\r\n \"PendingNew\": -1,\r\n \"New\": 0,\r\n \"PartiallyFilled\": 1,\r\n \"Filled\": 2,\r\n \"Cancel\": 4,\r\n \"Reject\": 8\r\n },\r\n TypeFreeInputs:{\r\n \"Numeric\": 1,\r\n \"AlphaNumeric\": 2\r\n },\r\n TypePages:{\r\n \"Content\": 1,\r\n \"DirectUrl\": 2\r\n },\r\n TypePageAccess:{\r\n \"Page\": 1,\r\n \"iFrame\": 2\r\n }\r\n };\r\n }]);","/* jshint ignore:start */\r\n/*!\r\n * dragtable\r\n *\r\n * @Version 2.0.13\r\n *\r\n * Copyright (c) 2010-2013, Andres akottr@gmail.com\r\n * Dual licensed under the MIT (MIT-LICENSE.txt)\r\n * and GPL (GPL-LICENSE.txt) licenses.\r\n *\r\n * Inspired by the the dragtable from Dan Vanderkam (danvk.org/dragtable/)\r\n * Thanks to the jquery and jqueryui comitters\r\n *\r\n * Any comment, bug report, feature-request is welcome\r\n * Feel free to contact me.\r\n */\r\n\r\n/* TOKNOW:\r\n * For IE7 you need this css rule:\r\n * table {\r\n * border-collapse: collapse;\r\n * }\r\n * Or take a clean reset.css (see http://meyerweb.com/eric/tools/css/reset/)\r\n */\r\n\r\n/* TODO: investigate\r\n * Does not work properly with css rule:\r\n * html {\r\n * overflow: -moz-scrollbars-vertical;\r\n * }\r\n * Workaround:\r\n * Fixing Firefox issues by scrolling down the page\r\n * http://stackoverflow.com/questions/2451528/jquery-ui-sortable-scroll-helper-element-offset-firefox-issue\r\n *\r\n * var start = $.noop;\r\n * var beforeStop = $.noop;\r\n * if($.browser.mozilla) {\r\n * var start = function (event, ui) {\r\n * if( ui.helper !== undefined )\r\n * ui.helper.css('position','absolute').css('margin-top', $(window).scrollTop() );\r\n * }\r\n * var beforeStop = function (event, ui) {\r\n * if( ui.offset !== undefined )\r\n * ui.helper.css('margin-top', 0);\r\n * }\r\n * }\r\n *\r\n * and pass this as start and stop function to the sortable initialisation\r\n * start: start,\r\n * beforeStop: beforeStop\r\n */\r\n/*\r\n * Special thx to all pull requests comitters\r\n */\r\n\r\n(function($) {\r\n $.widget(\"akottr.dragtable\", {\r\n options: {\r\n revert: false, // smooth revert\r\n dragHandle: '.table-handle', // handle for moving cols, if not exists the whole 'th' is the handle\r\n maxMovingRows: 40, // 1 -> only header. 40 row should be enough, the rest is usually not in the viewport\r\n excludeFooter: false, // excludes the footer row(s) while moving other columns. Make sense if there is a footer with a colspan. \r\n onlyHeaderThreshold: 100, // TODO: not implemented yet, switch automatically between entire col moving / only header moving\r\n dragaccept: null, // draggable cols -> default all\r\n persistState: null, // url or function -> plug in your custom persistState function right here. function call is persistState(originalTable)\r\n restoreState: null, // JSON-Object or function: some kind of experimental aka Quick-Hack TODO: do it better\r\n exact: true, // removes pixels, so that the overlay table width fits exactly the original table width\r\n clickDelay: 10, // ms to wait before rendering sortable list and delegating click event\r\n containment: null, // @see http://api.jqueryui.com/sortable/#option-containment, use it if you want to move in 2 dimesnions (together with axis: null)\r\n cursor: 'move', // @see http://api.jqueryui.com/sortable/#option-cursor\r\n cursorAt: false, // @see http://api.jqueryui.com/sortable/#option-cursorAt\r\n distance: 0, // @see http://api.jqueryui.com/sortable/#option-distance, for immediate feedback use \"0\"\r\n tolerance: 'pointer', // @see http://api.jqueryui.com/sortable/#option-tolerance\r\n axis: 'x', // @see http://api.jqueryui.com/sortable/#option-axis, Only vertical moving is allowed. Use 'x' or null. Use this in conjunction with the 'containment' setting\r\n beforeStart: $.noop, // returning FALSE will stop the execution chain.\r\n beforeMoving: $.noop,\r\n beforeReorganize: $.noop,\r\n beforeStop: $.noop\r\n },\r\n originalTable: {\r\n el: null,\r\n selectedHandle: null,\r\n sortOrder: null,\r\n startIndex: 0,\r\n endIndex: 0\r\n },\r\n sortableTable: {\r\n el: $(),\r\n selectedHandle: $(),\r\n movingRow: $()\r\n },\r\n persistState: function() {\r\n var _this = this;\r\n this.originalTable.el.find('th').each(function(i) {\r\n if (this.id !== '') {\r\n _this.originalTable.sortOrder[this.id] = i;\r\n }\r\n });\r\n $.ajax({\r\n url: this.options.persistState,\r\n data: this.originalTable.sortOrder\r\n });\r\n },\r\n /*\r\n * persistObj looks like\r\n * {'id1':'2','id3':'3','id2':'1'}\r\n * table looks like\r\n * | id2 | id1 | id3 |\r\n */\r\n _restoreState: function(persistObj) {\r\n for (var n in persistObj) {\r\n this.originalTable.startIndex = $('#' + n).closest('th').prevAll().size() + 1;\r\n this.originalTable.endIndex = parseInt(persistObj[n] + 1, 10);\r\n this._bubbleCols();\r\n }\r\n },\r\n // bubble the moved col left or right\r\n _bubbleCols: function() {\r\n var i, j, col1, col2;\r\n var from = this.originalTable.startIndex;\r\n var to = this.originalTable.endIndex;\r\n /* Find children thead and tbody.\r\n * Only to process the immediate tr-children. Bugfix for inner tables\r\n */\r\n var thtb = this.originalTable.el.children();\r\n if (this.options.excludeFooter) {\r\n thtb = thtb.not('tfoot');\r\n }\r\n if (from < to) {\r\n for (i = from; i < to; i++) {\r\n col1 = thtb.find('> tr > td:nth-child(' + i + ')')\r\n .add(thtb.find('> tr > th:nth-child(' + i + ')'));\r\n col2 = thtb.find('> tr > td:nth-child(' + (i + 1) + ')')\r\n .add(thtb.find('> tr > th:nth-child(' + (i + 1) + ')'));\r\n for (j = 0; j < col1.length; j++) {\r\n swapNodes(col1[j], col2[j]);\r\n }\r\n }\r\n } else {\r\n for (i = from; i > to; i--) {\r\n col1 = thtb.find('> tr > td:nth-child(' + i + ')')\r\n .add(thtb.find('> tr > th:nth-child(' + i + ')'));\r\n col2 = thtb.find('> tr > td:nth-child(' + (i - 1) + ')')\r\n .add(thtb.find('> tr > th:nth-child(' + (i - 1) + ')'));\r\n for (j = 0; j < col1.length; j++) {\r\n swapNodes(col1[j], col2[j]);\r\n }\r\n }\r\n }\r\n },\r\n _rearrangeTableBackroundProcessing: function() {\r\n var _this = this;\r\n return function() {\r\n _this._bubbleCols();\r\n _this.options.beforeStop(_this.originalTable);\r\n _this.sortableTable.el.remove();\r\n restoreTextSelection();\r\n // persist state if necessary\r\n if (_this.options.persistState !== null) {\r\n $.isFunction(_this.options.persistState) ? _this.options.persistState(_this.originalTable) : _this.persistState();\r\n }\r\n };\r\n },\r\n _rearrangeTable: function() {\r\n var _this = this;\r\n return function() {\r\n // remove handler-class -> handler is now finished\r\n _this.originalTable.selectedHandle.removeClass('dragtable-handle-selected');\r\n // add disabled class -> reorgorganisation starts soon\r\n _this.sortableTable.el.sortable(\"disable\");\r\n _this.sortableTable.el.addClass('dragtable-disabled');\r\n _this.options.beforeReorganize(_this.originalTable, _this.sortableTable);\r\n // do reorganisation asynchronous\r\n // for chrome a little bit more than 1 ms because we want to force a rerender\r\n _this.originalTable.endIndex = _this.sortableTable.movingRow.prevAll().size() + 1;\r\n setTimeout(_this._rearrangeTableBackroundProcessing(), 50);\r\n };\r\n },\r\n /*\r\n * Disrupts the table. The original table stays the same.\r\n * But on a layer above the original table we are constructing a list (ul > li)\r\n * each li with a separate table representig a single col of the original table.\r\n */\r\n _generateSortable: function(e) {\r\n !e.cancelBubble && (e.cancelBubble = true);\r\n var _this = this;\r\n // table attributes\r\n var attrs = this.originalTable.el[0].attributes;\r\n var attrsString = '';\r\n for (var i = 0; i < attrs.length; i++) {\r\n \tif (attrs[i].value && attrs[i].value != 'id' && attrs[i].nodeName != 'width') {\r\n attrsString += attrs[i].nodeName + '=\"' + attrs[i].value + '\" ';\r\n }\r\n }\r\n\r\n // row attributes\r\n var rowAttrsArr = [];\r\n //compute height, special handling for ie needed :-(\r\n var heightArr = [];\r\n this.originalTable.el.find('tr').slice(0, this.options.maxMovingRows).each(function(i, v) {\r\n // row attributes\r\n var attrs = this.attributes;\r\n var attrsString = \"\";\r\n for (var j = 0; j < attrs.length; j++) {\r\n if (attrs[j].value && attrs[j].nodeName != 'id') {\r\n attrsString += \" \" + attrs[j].nodeName + '=\"' + attrs[j].value + '\"';\r\n }\r\n }\r\n rowAttrsArr.push(attrsString);\r\n heightArr.push($(this).height());\r\n });\r\n\r\n // compute width, no special handling for ie needed :-)\r\n var widthArr = [];\r\n // compute total width, needed for not wrapping around after the screen ends (floating)\r\n var totalWidth = 0;\r\n /* Find children thead and tbody.\r\n * Only to process the immediate tr-children. Bugfix for inner tables\r\n */\r\n var thtb = _this.originalTable.el.children();\r\n if (this.options.excludeFooter) {\r\n thtb = thtb.not('tfoot');\r\n }\r\n thtb.find('> tr > th').each(function(i, v) {\r\n var w = $(this).outerWidth();\r\n widthArr.push(w);\r\n totalWidth += w;\r\n });\r\n if(_this.options.exact) {\r\n var difference = totalWidth - _this.originalTable.el.outerWidth();\r\n widthArr[0] -= difference;\r\n }\r\n // one extra px on right and left side\r\n\t totalWidth += 2;\r\n\r\n var sortableHtml = '<ul class=\"dragtable-sortable\" style=\"position:absolute; width:' + totalWidth + 'px;\">';\r\n // assemble the needed html\r\n thtb.find('> tr > th').each(function(i, v) {\r\n sortableHtml += '<li>';\r\n sortableHtml += '<table ' + attrsString + '>';\r\n var row = thtb.find('> tr > th:nth-child(' + (i + 1) + ')');\r\n if (_this.options.maxMovingRows > 1) {\r\n row = row.add(thtb.find('> tr > td:nth-child(' + (i + 1) + ')').slice(0, _this.options.maxMovingRows - 1));\r\n }\r\n row.each(function(j) {\r\n // TODO: May cause duplicate style-Attribute\r\n var row_content = $(this).clone().wrap('<div></div>').parent().html();\r\n if (row_content.toLowerCase().indexOf('<th') === 0) sortableHtml += \"<thead>\";\r\n sortableHtml += '<tr style=\"height:' + heightArr[j] + 'px;\">';\r\n sortableHtml += row_content;\r\n if (row_content.toLowerCase().indexOf('<th') === 0) sortableHtml += \"</thead>\";\r\n sortableHtml += '</tr>';\r\n });\r\n sortableHtml += '</table>';\r\n sortableHtml += '</li>';\r\n });\r\n sortableHtml += '</ul>';\r\n this.sortableTable.el = this.originalTable.el.before(sortableHtml).prev();\r\n // set width if necessary\r\n this.sortableTable.el.find('> li > table').each(function(i, v) {\r\n $(this).css('width', widthArr[i] + 'px');\r\n });\r\n\r\n // assign this.sortableTable.selectedHandle\r\n this.sortableTable.selectedHandle = this.sortableTable.el.find('th .dragtable-handle-selected');\r\n\r\n var items = !this.options.dragaccept ? 'li' : 'li:has(' + this.options.dragaccept + ')';\r\n this.sortableTable.el.sortable({\r\n items: items,\r\n stop: this._rearrangeTable(),\r\n // pass thru options for sortable widget\r\n revert: this.options.revert,\r\n tolerance: this.options.tolerance,\r\n containment: this.options.containment,\r\n cursor: this.options.cursor,\r\n cursorAt: this.options.cursorAt,\r\n distance: this.options.distance,\r\n axis: this.options.axis\r\n });\r\n\r\n // assign start index\r\n this.originalTable.startIndex = $(e.target).closest('th').prevAll().size() + 1;\r\n\r\n this.options.beforeMoving(this.originalTable, this.sortableTable);\r\n // Start moving by delegating the original event to the new sortable table\r\n this.sortableTable.movingRow = this.sortableTable.el.find('> li:nth-child(' + this.originalTable.startIndex + ')');\r\n\r\n // prevent the user from drag selecting \"highlighting\" surrounding page elements\r\n disableTextSelection();\r\n // clone the initial event and trigger the sort with it\r\n this.sortableTable.movingRow.trigger($.extend($.Event(e.type), {\r\n which: 1,\r\n clientX: e.clientX,\r\n clientY: e.clientY,\r\n pageX: e.pageX,\r\n pageY: e.pageY,\r\n screenX: e.screenX,\r\n screenY: e.screenY\r\n }));\r\n\r\n // Some inner divs to deliver the posibillity to style the placeholder more sophisticated\r\n var placeholder = this.sortableTable.el.find('.ui-sortable-placeholder');\r\n if(!placeholder.height() <= 0) {\r\n placeholder.css('height', this.sortableTable.el.find('.ui-sortable-helper').height());\r\n }\r\n\r\n\r\n //console.log($('.dragtable-sortable').html());\r\n\r\n\r\n placeholder.html('<div class=\"outer\" style=\"height:100%;\"><div class=\"inner\" style=\"height:100%;\"></div></div>');\r\n },\r\n bindTo: {},\r\n _create: function() {\r\n this.originalTable = {\r\n el: this.element,\r\n selectedHandle: $(),\r\n sortOrder: {},\r\n startIndex: 0,\r\n endIndex: 0\r\n };\r\n // bind draggable to 'th' by default\r\n this.bindTo = this.originalTable.el.find('th');\r\n // filter only the cols that are accepted\r\n if (this.options.dragaccept) {\r\n this.bindTo = this.bindTo.filter(this.options.dragaccept);\r\n }\r\n // bind draggable to handle if exists\r\n if (this.bindTo.find(this.options.dragHandle).size() > 0) {\r\n this.bindTo = this.bindTo.find(this.options.dragHandle);\r\n }\r\n // restore state if necessary\r\n if (this.options.restoreState !== null) {\r\n $.isFunction(this.options.restoreState) ? this.options.restoreState(this.originalTable) : this._restoreState(this.options.restoreState);\r\n }\r\n var _this = this;\r\n this.bindTo.mousedown(function(evt) {\r\n // listen only to left mouse click\r\n if(evt.which!==1) return;\r\n if (_this.options.beforeStart(_this.originalTable) === false) {\r\n return;\r\n }\r\n clearTimeout(this.downTimer);\r\n this.downTimer = setTimeout(function() {\r\n _this.originalTable.selectedHandle = $(this);\r\n _this.originalTable.selectedHandle.addClass('dragtable-handle-selected');\r\n _this._generateSortable(evt);\r\n }, _this.options.clickDelay);\r\n }).mouseup(function(evt) {\r\n clearTimeout(this.downTimer);\r\n });\r\n },\r\n redraw: function(){\r\n this.destroy();\r\n this._create();\r\n },\r\n destroy: function() {\r\n this.bindTo.unbind('mousedown');\r\n $.Widget.prototype.destroy.apply(this, arguments); // default destroy\r\n // now do other stuff particular to this widget\r\n }\r\n });\r\n\r\n /** closure-scoped \"private\" functions **/\r\n\r\n var body_onselectstart_save = $(document.body).attr('onselectstart'),\r\n body_unselectable_save = $(document.body).attr('unselectable');\r\n\r\n // css properties to disable user-select on the body tag by appending a <style> tag to the <head>\r\n // remove any current document selections\r\n\r\n function disableTextSelection() {\r\n // jQuery doesn't support the element.text attribute in MSIE 8\r\n // http://stackoverflow.com/questions/2692770/style-style-textcss-appendtohead-does-not-work-in-ie\r\n var $style = $('<style id=\"__dragtable_disable_text_selection__\" type=\"text/css\">body { -ms-user-select:none;-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;user-select:none; }</style>');\r\n $(document.head).append($style);\r\n $(document.body).attr('onselectstart', 'return false;').attr('unselectable', 'on');\r\n if (window.getSelection) {\r\n window.getSelection().removeAllRanges();\r\n } else {\r\n document.selection.empty(); // MSIE http://msdn.microsoft.com/en-us/library/ms535869%28v=VS.85%29.aspx\r\n }\r\n }\r\n\r\n // remove the <style> tag, and restore the original <body> onselectstart attribute\r\n\r\n function restoreTextSelection() {\r\n $('#__dragtable_disable_text_selection__').remove();\r\n if (body_onselectstart_save) {\r\n $(document.body).attr('onselectstart', body_onselectstart_save);\r\n } else {\r\n $(document.body).removeAttr('onselectstart');\r\n }\r\n if (body_unselectable_save) {\r\n $(document.body).attr('unselectable', body_unselectable_save);\r\n } else {\r\n $(document.body).removeAttr('unselectable');\r\n }\r\n }\r\n\r\n function swapNodes(a, b) {\r\n var aparent = a.parentNode;\r\n var asibling = a.nextSibling === b ? a : a.nextSibling;\r\n b.parentNode.insertBefore(a, b);\r\n aparent.insertBefore(b, asibling);\r\n }\r\n})(jQuery);\r\n/* jshint ignore:end */","AgrimarketControllers.filter('sumByKey', function () {\r\n\treturn function(data, key) {\r\n\t\tif (typeof (data) === 'undefined' || typeof (key) === 'undefined') {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tvar sum = 0;\r\n\t\tfor (var i = data.length - 1; i >= 0; i--) {\r\n\t\t\tsum += Number(data[i][key]);\r\n\t\t}\r\n\r\n\t\treturn sum;\r\n\t};\r\n});","AgrimarketControllers.filter('roundByDecimalAndConverter', function () {\r\n return function (data, nbdecimal, converterCoeff) {\r\n if (typeof (data) === 'undefined' || data === null || typeof (nbdecimal) === 'undefined') {\r\n return null;\r\n }\r\n if (typeof (converterCoeff) !== 'undefined' && converterCoeff)\r\n data = data * converterCoeff;\r\n\r\n if (!nbdecimal && nbdecimal !== 0)\r\n nbdecimal = 2;\r\n\r\n var factory = Math.pow(10, nbdecimal);\r\n return Math.round(data * factory) / factory;\r\n };\r\n});\r\n","AgrimarketControllers.filter('unique', function () {\r\n\treturn function (input, key) {\r\n\t\tvar unique = {};\r\n var uniqueList = [];\r\n if (input) {\r\n for (var i = 0; i < input.length; i++) {\r\n if (typeof unique[input[i][key]] == \"undefined\") {\r\n unique[input[i][key]] = \"\";\r\n uniqueList.push(input[i]);\r\n }\r\n }\r\n }\r\n\t\treturn uniqueList;\r\n\t};\r\n});\r\n","AgrimarketControllers.filter('formatDataTable', function ($filter, $sce) {\r\n\treturn function (data, key) {\r\n\t\tvar result = \"\";\r\n if (data !== null && data !== undefined) { // ne pas mettre if(data), car data peut valoir false\r\n\r\n\t\t\t// Gestion du tofixed\r\n\t\t\tvar numToFixed = null;\r\n\t\t\tif (key && key.indexOf('tofixed') !== -1 && key.length == 8) {\r\n\t\t\t\tnumToFixed = key.slice(-1);\r\n\t\t\t\tkey = 'tofixed';\r\n }\r\n\r\n\t\t\tswitch (key) {\r\n\t\t\t\tcase 'date': result = $filter('date')(data, 'dd/MM/yyyy').toString();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'fulldate': result = $filter('date')(data, 'dd/MM/yyyy HH:mm:ss').toString();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase \"fulldatewithoutsec\": result = $filter(\"date\")(data, \"dd/MM/yyyy HH:mm\").toString();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'hours': result = $filter('date')(data, 'HH:mm').toString();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'bool': result = data ? \"oui\" : \"non\";\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'lien': result = \"<a target='_blank' href='\" + data + \"'>\" + data + \"</a>\";\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'liste': result += \"<ul>\";\r\n\t\t\t\t\tdata.forEach(function (item) { result += \"<li>\" + item + \"</li>\"; });\r\n\t\t\t\t\tresult += \"</ul>\";\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'tofixed': result = data.toFixed(numToFixed).toString();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault: result = data.toString();\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn $sce.trustAsHtml(result);\r\n\t};\r\n});","AgrimarketControllers.filter('formatMd5', function () {\r\n return function (value, key) {\r\n if (!value)\r\n return \"\";\r\n\r\n if (sessionStorage.getItem(\"hasRefresh\") !== \"true\" && !sessionStorage.getItem(\"IdUser\") && ((!sessionStorage.getItem(\"IdUserAdmin\")) || (sessionStorage.getItem(\"IdUserAdmin\") && sessionStorage.getItem(\"modeEdition\"))) && sessionStorage.getItem(\"hasValidateCGU\") !== \"true\")\r\n return md5(value);\r\n\r\n return value;\r\n };\r\n});\r\n","AgrimarketControllers.filter('pdfLinkContract', function (configurationFactory) {\r\n return function (value) {\r\n\r\n var url = configurationFactory.Url['Api'] + 'PdfGenerate/GetContract?h=[h]&k=[k]' ;\r\n\r\n return url.replace('[k]',value.k).replace('[h]',value.h);\r\n };\r\n});\r\n\r\n\r\nAgrimarketControllers.filter('pdfLinkDocument', function (configurationFactory) {\r\n return function (value) {\r\n\r\n var url = configurationFactory.Url['Api'] + 'PdfGenerate/GetDocument?h=[h]&k=[k]' ;\r\n\r\n return url.replace('[k]',value.k).replace('[h]',value.h);\r\n };\r\n});\r\n\r\nAgrimarketControllers.filter('pdfLinkContractBase', function (configurationFactory) {\r\n return function (value) {\r\n\r\n var url = configurationFactory.Url['Api'] + 'PdfGenerate/GetContractBase?h=[h]&k=[k]' ;\r\n\r\n return url.replace('[k]',value.k).replace('[h]',value.h);\r\n };\r\n});\r\n\r\nAgrimarketControllers.filter('pdfLinkContractOption', function (configurationFactory) {\r\n return function (value) {\r\n\r\n var url = configurationFactory.Url['Api'] + 'PdfGenerate/GetContractOption?h=[h]&k=[k]' ;\r\n\r\n return url.replace('[k]',value.k).replace('[h]',value.h);\r\n };\r\n});\r\n\r\nAgrimarketControllers.filter('pdfLinkExerciseOption', function (configurationFactory) {\r\n return function (value) {\r\n\r\n var url = configurationFactory.Url['Api'] + 'PdfGenerate/GetExerciseOption?h=[h]&k=[k]' ;\r\n\r\n return url.replace('[k]',value.k).replace('[h]',value.h);\r\n };\r\n});\r\n\r\nAgrimarketControllers.filter('pdfLinkProjPdf', function (configurationFactory) {\r\n return function (value) {\r\n\r\n var url = configurationFactory.Url['Api'] + 'PdfGenerate/GetProjPdf?id=' ;\r\n\r\n return url + value ;\r\n };\r\n});\r\n\r\n\r\n\r\n\r\n","AgrimarketControllers.filter('uploadLinkInline', function (configurationFactory) {\r\n return function (value) {\r\n\r\n var url = configurationFactory.Url['Api'] + 'Upload/GetInlineAttachment?p=' + value ;\r\n\r\n return url;\r\n };\r\n});\r\n\r\n\r\n\r\n","AgrimarketControllers.filter('trustUrl', ['$sce', function ($sce) {\r\n return function (url) {\r\n return $sce.trustAsResourceUrl(url);\r\n };\r\n}]);",";(function($){\r\n/**\r\n * jqGrid French Translation\r\n * Tony Tomov tony@trirand.com\r\n * http://trirand.com/blog/ \r\n * Dual licensed under the MIT and GPL licenses:\r\n * http://www.opensource.org/licenses/mit-license.php\r\n * http://www.gnu.org/licenses/gpl.html\r\n**/\r\n$.jgrid = $.jgrid || {};\r\n$.extend($.jgrid,{\r\n\tdefaults : {\r\n\t\trecordtext: \"Enregistrements {0} - {1} sur {2}\",\r\n\t\temptyrecords: \"Aucun enregistrement à afficher\",\r\n\t\tloadtext: \"Chargement...\",\r\n\t\tpgtext : \"Page {0} sur {1}\"\r\n\t},\r\n\tsearch : {\r\n\t\tcaption: \"Recherche...\",\r\n\t\tFind: \"Chercher\",\r\n\t\tReset: \"Réinitialiser\",\r\n\t\todata: [{ oper:'eq', text:\"égal\"},{ oper:'ne', text:\"différent\"},{ oper:'lt', text:\"inférieur\"},{ oper:'le', text:\"inférieur ou égal\"},{ oper:'gt', text:\"supérieur\"},{ oper:'ge', text:\"supérieur ou égal\"},{ oper:'bw', text:\"commence par\"},{ oper:'bn', text:\"ne commence pas par\"},{ oper:'in', text:\"est dans\"},{ oper:'ni', text:\"n'est pas dans\"},{ oper:'ew', text:\"finit par\"},{ oper:'en', text:\"ne finit pas par\"},{ oper:'cn', text:\"contient\"},{ oper:'nc', text:\"ne contient pas\"}],\r\n\t\tgroupOps: [\t{ op: \"AND\", text: \"tous\" },\t{ op: \"OR\", text: \"au moins un\" }\t]\r\n\t},\r\n\tedit : {\r\n\t\taddCaption: \"Ajouter\",\r\n\t\teditCaption: \"Editer\",\r\n\t\tbSubmit: \"Valider\",\r\n\t\tbCancel: \"Annuler\",\r\n\t\tbClose: \"Fermer\",\r\n\t\tsaveData: \"Les données ont changé ! Enregistrer les modifications ?\",\r\n\t\tbYes: \"Oui\",\r\n\t\tbNo: \"Non\",\r\n\t\tbExit: \"Annuler\",\r\n\t\tmsg: {\r\n\t\t\trequired: \"Champ obligatoire\",\r\n\t\t\tnumber: \"Saisissez un nombre correct\",\r\n\t\t\tminValue: \"La valeur doit être supérieure ou égale à \",\r\n\t\t\tmaxValue: \"La valeur doit être inférieure ou égale à \",\r\n\t\t\temail: \"n'est pas un email correct\",\r\n\t\t\tinteger: \"Saisissez un entier correct\",\r\n\t\t\turl: \"n'est pas une adresse correcte. Préfixe requis ('http://' or 'https://')\",\r\n\t\t\tnodefined : \" n'est pas défini!\",\r\n\t\t\tnovalue : \" la valeur de retour est requise!\",\r\n\t\t\tcustomarray : \"Une fonction personnalisée devrait retourner un tableau (array)!\",\r\n\t\t\tcustomfcheck : \"Une fonction personnalisée devrait être présente dans le cas d'une vérification personnalisée!\"\r\n\t\t}\r\n\t},\r\n\tview : {\r\n\t\tcaption: \"Voir les enregistrement\",\r\n\t\tbClose: \"Fermer\"\r\n\t},\r\n\tdel : {\r\n\t\tcaption: \"Supprimer\",\r\n\t\tmsg: \"Supprimer les enregistrements sélectionnés ?\",\r\n\t\tbSubmit: \"Supprimer\",\r\n\t\tbCancel: \"Annuler\"\r\n\t},\r\n\tnav : {\r\n\t\tedittext: \" \",\r\n\t\tedittitle: \"Editer la ligne sélectionnée\",\r\n\t\taddtext:\" \",\r\n\t\taddtitle: \"Ajouter une ligne\",\r\n\t\tdeltext: \" \",\r\n\t\tdeltitle: \"Supprimer la ligne sélectionnée\",\r\n\t\tsearchtext: \" \",\r\n\t\tsearchtitle: \"Chercher un enregistrement\",\r\n\t\trefreshtext: \"\",\r\n\t\trefreshtitle: \"Recharger le tableau\",\r\n\t\talertcap: \"Avertissement\",\r\n\t\talerttext: \"Veuillez sélectionner une ligne\",\r\n\t\tviewtext: \"\",\r\n\t\tviewtitle: \"Afficher la ligne sélectionnée\"\r\n\t},\r\n\tcol : {\r\n\t\tcaption: \"Afficher/Masquer les colonnes\",\r\n\t\tbSubmit: \"Valider\",\r\n\t\tbCancel: \"Annuler\"\r\n\t},\r\n\terrors : {\r\n\t\terrcap : \"Erreur\",\r\n\t\tnourl : \"Aucune adresse n'est paramétrée\",\r\n\t\tnorecords: \"Aucun enregistrement à traiter\",\r\n\t\tmodel : \"Nombre de titres (colNames) <> Nombre de données (colModel)!\"\r\n\t},\r\n\tformatter : {\r\n\t\tinteger : {thousandsSeparator: \" \", defaultValue: '0'},\r\n\t\tnumber : {decimalSeparator:\",\", thousandsSeparator: \" \", decimalPlaces: 2, defaultValue: '0,00'},\r\n\t\tcurrency : {decimalSeparator:\",\", thousandsSeparator: \" \", decimalPlaces: 2, prefix: \"\", suffix:\"\", defaultValue: '0,00'},\r\n\t\tdate : {\r\n\t\t\tdayNames: [\r\n\t\t\t\t\"Dim\", \"Lun\", \"Mar\", \"Mer\", \"Jeu\", \"Ven\", \"Sam\",\r\n\t\t\t\t\"Dimanche\", \"Lundi\", \"Mardi\", \"Mercredi\", \"Jeudi\", \"Vendredi\", \"Samedi\"\r\n\t\t\t],\r\n\t\t\tmonthNames: [\r\n\t\t\t\t\"Jan\", \"Fév\", \"Mar\", \"Avr\", \"Mai\", \"Jui\", \"Jul\", \"Aou\", \"Sep\", \"Oct\", \"Nov\", \"Déc\",\r\n\t\t\t\t\"Janvier\", \"Février\", \"Mars\", \"Avril\", \"Mai\", \"Juin\", \"Juillet\", \"Aout\", \"Septembre\", \"Octobre\", \"Novembre\", \"Décembre\"\r\n\t\t\t],\r\n\t\t\tAmPm : [\"am\",\"pm\",\"AM\",\"PM\"],\r\n\t\t\tS: function (j) {return j == 1 ? 'er' : 'e';},\r\n\t\t\tsrcformat: 'Y-m-d',\r\n\t\t\tnewformat: 'd/m/Y',\r\n\t\t\tparseRe : /[Tt\\\\\\/:_;.,\\t\\s-]/,\r\n\t\t\tmasks : {\r\n\t\t\t\tISO8601Long:\"Y-m-d H:i:s\",\r\n\t\t\t\tISO8601Short:\"Y-m-d\",\r\n\t\t\t\tShortDate: \"n/j/Y\",\r\n\t\t\t\tLongDate: \"l, F d, Y\",\r\n\t\t\t\tFullDateTime: \"l, F d, Y g:i:s A\",\r\n\t\t\t\tMonthDay: \"F d\",\r\n\t\t\t\tShortTime: \"g:i A\",\r\n\t\t\t\tLongTime: \"g:i:s A\",\r\n\t\t\t\tSortableDateTime: \"Y-m-d\\\\TH:i:s\",\r\n\t\t\t\tUniversalSortableDateTime: \"Y-m-d H:i:sO\",\r\n\t\t\t\tYearMonth: \"F, Y\"\r\n\t\t\t},\r\n\t\t\treformatAfterEdit : false\r\n\t\t},\r\n\t\tbaseLinkUrl: '',\r\n\t\tshowAction: '',\r\n\t\ttarget: '',\r\n\t\tcheckbox : {disabled:true},\r\n\t\tidName : 'id'\r\n\t}\r\n});\r\n})(jQuery);\r\n","// ==ClosureCompiler==\r\n// @compilation_level SIMPLE_OPTIMIZATIONS\r\n\r\n/**\r\n * @license Highstock JS v1.3.7 (2013-10-24)\r\n *\r\n * (c) 2009-2013 Torstein Hønsi\r\n *\r\n * License: www.highcharts.com/license\r\n */\r\n\r\n// JSLint options:\r\n/*global Highcharts, document, window, navigator, setInterval, clearInterval, clearTimeout, setTimeout, location, jQuery, $, console, each, grep */\r\n\r\n(function () {\r\n// encapsulated variables\r\nvar UNDEFINED,\r\n\tdoc = document,\r\n\twin = window,\r\n\tmath = Math,\r\n\tmathRound = math.round,\r\n\tmathFloor = math.floor,\r\n\tmathCeil = math.ceil,\r\n\tmathMax = math.max,\r\n\tmathMin = math.min,\r\n\tmathAbs = math.abs,\r\n\tmathCos = math.cos,\r\n\tmathSin = math.sin,\r\n\tmathPI = math.PI,\r\n\tdeg2rad = mathPI * 2 / 360,\r\n\r\n\r\n\t// some variables\r\n\tuserAgent = navigator.userAgent,\r\n\tisOpera = win.opera,\r\n\tisIE = /msie/i.test(userAgent) && !isOpera,\r\n\tdocMode8 = doc.documentMode === 8,\r\n\tisWebKit = /AppleWebKit/.test(userAgent),\r\n\tisFirefox = /Firefox/.test(userAgent),\r\n\tisTouchDevice = /(Mobile|Android|Windows Phone)/.test(userAgent),\r\n\tSVG_NS = 'http://www.w3.org/2000/svg',\r\n\thasSVG = !!doc.createElementNS && !!doc.createElementNS(SVG_NS, 'svg').createSVGRect,\r\n\thasBidiBug = isFirefox && parseInt(userAgent.split('Firefox/')[1], 10) < 4, // issue #38\r\n\tuseCanVG = !hasSVG && !isIE && !!doc.createElement('canvas').getContext,\r\n\tRenderer,\r\n\thasTouch = doc.documentElement.ontouchstart !== UNDEFINED,\r\n\tsymbolSizes = {},\r\n\tidCounter = 0,\r\n\tgarbageBin,\r\n\tdefaultOptions,\r\n\tdateFormat, // function\r\n\tglobalAnimation,\r\n\tpathAnim,\r\n\ttimeUnits,\r\n\tnoop = function () {},\r\n\tcharts = [],\r\n\tPRODUCT = 'Highstock',\r\n\tVERSION = '1.3.7',\r\n\r\n\t// some constants for frequently used strings\r\n\tDIV = 'div',\r\n\tABSOLUTE = 'absolute',\r\n\tRELATIVE = 'relative',\r\n\tHIDDEN = 'hidden',\r\n\tPREFIX = 'highcharts-',\r\n\tVISIBLE = 'visible',\r\n\tPX = 'px',\r\n\tNONE = 'none',\r\n\tM = 'M',\r\n\tL = 'L',\r\n\t/*\r\n\t * Empirical lowest possible opacities for TRACKER_FILL\r\n\t * IE6: 0.002\r\n\t * IE7: 0.002\r\n\t * IE8: 0.002\r\n\t * IE9: 0.00000000001 (unlimited)\r\n\t * IE10: 0.0001 (exporting only)\r\n\t * FF: 0.00000000001 (unlimited)\r\n\t * Chrome: 0.000001\r\n\t * Safari: 0.000001\r\n\t * Opera: 0.00000000001 (unlimited)\r\n\t */\r\n\tTRACKER_FILL = 'rgba(192,192,192,' + (hasSVG ? 0.0001 : 0.002) + ')', // invisible but clickable\r\n\t//TRACKER_FILL = 'rgba(192,192,192,0.5)',\r\n\tNORMAL_STATE = '',\r\n\tHOVER_STATE = 'hover',\r\n\tSELECT_STATE = 'select',\r\n\tMILLISECOND = 'millisecond',\r\n\tSECOND = 'second',\r\n\tMINUTE = 'minute',\r\n\tHOUR = 'hour',\r\n\tDAY = 'day',\r\n\tWEEK = 'week',\r\n\tMONTH = 'month',\r\n\tYEAR = 'year',\r\n\r\n\t// constants for attributes\r\n\tLINEAR_GRADIENT = 'linearGradient',\r\n\tSTOPS = 'stops',\r\n\tSTROKE_WIDTH = 'stroke-width',\r\n\r\n\t// time methods, changed based on whether or not UTC is used\r\n\tmakeTime,\r\n\tgetMinutes,\r\n\tgetHours,\r\n\tgetDay,\r\n\tgetDate,\r\n\tgetMonth,\r\n\tgetFullYear,\r\n\tsetMinutes,\r\n\tsetHours,\r\n\tsetDate,\r\n\tsetMonth,\r\n\tsetFullYear,\r\n\r\n\r\n\t// lookup over the types and the associated classes\r\n\tseriesTypes = {};\r\n\r\n// The Highcharts namespace\r\nwin.Highcharts = win.Highcharts ? error(16, true) : {};\r\n\r\n/**\r\n * Extend an object with the members of another\r\n * @param {Object} a The object to be extended\r\n * @param {Object} b The object to add to the first one\r\n */\r\nfunction extend(a, b) {\r\n\tvar n;\r\n\tif (!a) {\r\n\t\ta = {};\r\n\t}\r\n\tfor (n in b) {\r\n\t\ta[n] = b[n];\r\n\t}\r\n\treturn a;\r\n}\r\n\t\r\n/**\r\n * Deep merge two or more objects and return a third object.\r\n * Previously this function redirected to jQuery.extend(true), but this had two limitations.\r\n * First, it deep merged arrays, which lead to workarounds in Highcharts. Second,\r\n * it copied properties from extended prototypes. \r\n */\r\nfunction merge() {\r\n\tvar i,\r\n\t\tlen = arguments.length,\r\n\t\tret = {},\r\n\t\tdoCopy = function (copy, original) {\r\n\t\t\tvar value, key;\r\n\r\n\t\t\t// An object is replacing a primitive\r\n\t\t\tif (typeof copy !== 'object') {\r\n\t\t\t\tcopy = {};\r\n\t\t\t}\r\n\r\n\t\t\tfor (key in original) {\r\n\t\t\t\tif (original.hasOwnProperty(key)) {\r\n\t\t\t\t\tvalue = original[key];\r\n\r\n\t\t\t\t\t// Copy the contents of objects, but not arrays or DOM nodes\r\n\t\t\t\t\tif (value && typeof value === 'object' && Object.prototype.toString.call(value) !== '[object Array]'\r\n\t\t\t\t\t\t\t&& typeof value.nodeType !== 'number') {\r\n\t\t\t\t\t\tcopy[key] = doCopy(copy[key] || {}, value);\r\n\t\t\t\t\r\n\t\t\t\t\t// Primitives and arrays are copied over directly\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tcopy[key] = original[key];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn copy;\r\n\t\t};\r\n\r\n\t// For each argument, extend the return\r\n\tfor (i = 0; i < len; i++) {\r\n\t\tret = doCopy(ret, arguments[i]);\r\n\t}\r\n\r\n\treturn ret;\r\n}\r\n\r\n/**\r\n * Take an array and turn into a hash with even number arguments as keys and odd numbers as\r\n * values. Allows creating constants for commonly used style properties, attributes etc.\r\n * Avoid it in performance critical situations like looping\r\n */\r\nfunction hash() {\r\n\tvar i = 0,\r\n\t\targs = arguments,\r\n\t\tlength = args.length,\r\n\t\tobj = {};\r\n\tfor (; i < length; i++) {\r\n\t\tobj[args[i++]] = args[i];\r\n\t}\r\n\treturn obj;\r\n}\r\n\r\n/**\r\n * Shortcut for parseInt\r\n * @param {Object} s\r\n * @param {Number} mag Magnitude\r\n */\r\nfunction pInt(s, mag) {\r\n\treturn parseInt(s, mag || 10);\r\n}\r\n\r\n/**\r\n * Check for string\r\n * @param {Object} s\r\n */\r\nfunction isString(s) {\r\n\treturn typeof s === 'string';\r\n}\r\n\r\n/**\r\n * Check for object\r\n * @param {Object} obj\r\n */\r\nfunction isObject(obj) {\r\n\treturn typeof obj === 'object';\r\n}\r\n\r\n/**\r\n * Check for array\r\n * @param {Object} obj\r\n */\r\nfunction isArray(obj) {\r\n\treturn Object.prototype.toString.call(obj) === '[object Array]';\r\n}\r\n\r\n/**\r\n * Check for number\r\n * @param {Object} n\r\n */\r\nfunction isNumber(n) {\r\n\treturn typeof n === 'number';\r\n}\r\n\r\nfunction log2lin(num) {\r\n\treturn math.log(num) / math.LN10;\r\n}\r\nfunction lin2log(num) {\r\n\treturn math.pow(10, num);\r\n}\r\n\r\n/**\r\n * Remove last occurence of an item from an array\r\n * @param {Array} arr\r\n * @param {Mixed} item\r\n */\r\nfunction erase(arr, item) {\r\n\tvar i = arr.length;\r\n\twhile (i--) {\r\n\t\tif (arr[i] === item) {\r\n\t\t\tarr.splice(i, 1);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\t//return arr;\r\n}\r\n\r\n/**\r\n * Returns true if the object is not null or undefined. Like MooTools' $.defined.\r\n * @param {Object} obj\r\n */\r\nfunction defined(obj) {\r\n\treturn obj !== UNDEFINED && obj !== null;\r\n}\r\n\r\n/**\r\n * Set or get an attribute or an object of attributes. Can't use jQuery attr because\r\n * it attempts to set expando properties on the SVG element, which is not allowed.\r\n *\r\n * @param {Object} elem The DOM element to receive the attribute(s)\r\n * @param {String|Object} prop The property or an abject of key-value pairs\r\n * @param {String} value The value if a single property is set\r\n */\r\nfunction attr(elem, prop, value) {\r\n\tvar key,\r\n\t\tsetAttribute = 'setAttribute',\r\n\t\tret;\r\n\r\n\t// if the prop is a string\r\n\tif (isString(prop)) {\r\n\t\t// set the value\r\n\t\tif (defined(value)) {\r\n\r\n\t\t\telem[setAttribute](prop, value);\r\n\r\n\t\t// get the value\r\n\t\t} else if (elem && elem.getAttribute) { // elem not defined when printing pie demo...\r\n\t\t\tret = elem.getAttribute(prop);\r\n\t\t}\r\n\r\n\t// else if prop is defined, it is a hash of key/value pairs\r\n\t} else if (defined(prop) && isObject(prop)) {\r\n\t\tfor (key in prop) {\r\n\t\t\telem[setAttribute](key, prop[key]);\r\n\t\t}\r\n\t}\r\n\treturn ret;\r\n}\r\n/**\r\n * Check if an element is an array, and if not, make it into an array. Like\r\n * MooTools' $.splat.\r\n */\r\nfunction splat(obj) {\r\n\treturn isArray(obj) ? obj : [obj];\r\n}\r\n\r\n\r\n/**\r\n * Return the first value that is defined. Like MooTools' $.pick.\r\n */\r\nfunction pick() {\r\n\tvar args = arguments,\r\n\t\ti,\r\n\t\targ,\r\n\t\tlength = args.length;\r\n\tfor (i = 0; i < length; i++) {\r\n\t\targ = args[i];\r\n\t\tif (typeof arg !== 'undefined' && arg !== null) {\r\n\t\t\treturn arg;\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Set CSS on a given element\r\n * @param {Object} el\r\n * @param {Object} styles Style object with camel case property names\r\n */\r\nfunction css(el, styles) {\r\n\tif (isIE) {\r\n\t\tif (styles && styles.opacity !== UNDEFINED) {\r\n\t\t\tstyles.filter = 'alpha(opacity=' + (styles.opacity * 100) + ')';\r\n\t\t}\r\n\t}\r\n\textend(el.style, styles);\r\n}\r\n\r\n/**\r\n * Utility function to create element with attributes and styles\r\n * @param {Object} tag\r\n * @param {Object} attribs\r\n * @param {Object} styles\r\n * @param {Object} parent\r\n * @param {Object} nopad\r\n */\r\nfunction createElement(tag, attribs, styles, parent, nopad) {\r\n\tvar el = doc.createElement(tag);\r\n\tif (attribs) {\r\n\t\textend(el, attribs);\r\n\t}\r\n\tif (nopad) {\r\n\t\tcss(el, {padding: 0, border: NONE, margin: 0});\r\n\t}\r\n\tif (styles) {\r\n\t\tcss(el, styles);\r\n\t}\r\n\tif (parent) {\r\n\t\tparent.appendChild(el);\r\n\t}\r\n\treturn el;\r\n}\r\n\r\n/**\r\n * Extend a prototyped class by new members\r\n * @param {Object} parent\r\n * @param {Object} members\r\n */\r\nfunction extendClass(parent, members) {\r\n\tvar object = function () {};\r\n\tobject.prototype = new parent();\r\n\textend(object.prototype, members);\r\n\treturn object;\r\n}\r\n\r\n/**\r\n * Format a number and return a string based on input settings\r\n * @param {Number} number The input number to format\r\n * @param {Number} decimals The amount of decimals\r\n * @param {String} decPoint The decimal point, defaults to the one given in the lang options\r\n * @param {String} thousandsSep The thousands separator, defaults to the one given in the lang options\r\n */\r\nfunction numberFormat(number, decimals, decPoint, thousandsSep) {\r\n\tvar lang = defaultOptions.lang,\r\n\t\t// http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_number_format/\r\n\t\tn = +number || 0,\r\n\t\tc = decimals === -1 ?\r\n\t\t\t(n.toString().split('.')[1] || '').length : // preserve decimals\r\n\t\t\t(isNaN(decimals = mathAbs(decimals)) ? 2 : decimals),\r\n\t\td = decPoint === undefined ? lang.decimalPoint : decPoint,\r\n\t\tt = thousandsSep === undefined ? lang.thousandsSep : thousandsSep,\r\n\t\ts = n < 0 ? \"-\" : \"\",\r\n\t\ti = String(pInt(n = mathAbs(n).toFixed(c))),\r\n\t\tj = i.length > 3 ? i.length % 3 : 0;\r\n\r\n\treturn s + (j ? i.substr(0, j) + t : \"\") + i.substr(j).replace(/(\\d{3})(?=\\d)/g, \"$1\" + t) +\r\n\t\t(c ? d + mathAbs(n - i).toFixed(c).slice(2) : \"\");\r\n}\r\n\r\n/**\r\n * Pad a string to a given length by adding 0 to the beginning\r\n * @param {Number} number\r\n * @param {Number} length\r\n */\r\nfunction pad(number, length) {\r\n\t// Create an array of the remaining length +1 and join it with 0's\r\n\treturn new Array((length || 2) + 1 - String(number).length).join(0) + number;\r\n}\r\n\r\n/**\r\n * Wrap a method with extended functionality, preserving the original function\r\n * @param {Object} obj The context object that the method belongs to \r\n * @param {String} method The name of the method to extend\r\n * @param {Function} func A wrapper function callback. This function is called with the same arguments\r\n * as the original function, except that the original function is unshifted and passed as the first \r\n * argument. \r\n */\r\nfunction wrap(obj, method, func) {\r\n\tvar proceed = obj[method];\r\n\tobj[method] = function () {\r\n\t\tvar args = Array.prototype.slice.call(arguments);\r\n\t\targs.unshift(proceed);\r\n\t\treturn func.apply(this, args);\r\n\t};\r\n}\r\n\r\n/**\r\n * Based on http://www.php.net/manual/en/function.strftime.php\r\n * @param {String} format\r\n * @param {Number} timestamp\r\n * @param {Boolean} capitalize\r\n */\r\ndateFormat = function (format, timestamp, capitalize) {\r\n\tif (!defined(timestamp) || isNaN(timestamp)) {\r\n\t\treturn 'Invalid date';\r\n\t}\r\n\tformat = pick(format, '%Y-%m-%d %H:%M:%S');\r\n\r\n\tvar date = new Date(timestamp),\r\n\t\tkey, // used in for constuct below\r\n\t\t// get the basic time values\r\n\t\thours = date[getHours](),\r\n\t\tday = date[getDay](),\r\n\t\tdayOfMonth = date[getDate](),\r\n\t\tmonth = date[getMonth](),\r\n\t\tfullYear = date[getFullYear](),\r\n\t\tlang = defaultOptions.lang,\r\n\t\tlangWeekdays = lang.weekdays,\r\n\r\n\t\t// List all format keys. Custom formats can be added from the outside. \r\n\t\treplacements = extend({\r\n\r\n\t\t\t// Day\r\n\t\t\t'a': langWeekdays[day].substr(0, 3), // Short weekday, like 'Mon'\r\n\t\t\t'A': langWeekdays[day], // Long weekday, like 'Monday'\r\n\t\t\t'd': pad(dayOfMonth), // Two digit day of the month, 01 to 31\r\n\t\t\t'e': dayOfMonth, // Day of the month, 1 through 31\r\n\r\n\t\t\t// Week (none implemented)\r\n\t\t\t//'W': weekNumber(),\r\n\r\n\t\t\t// Month\r\n\t\t\t'b': lang.shortMonths[month], // Short month, like 'Jan'\r\n\t\t\t'B': lang.months[month], // Long month, like 'January'\r\n\t\t\t'm': pad(month + 1), // Two digit month number, 01 through 12\r\n\r\n\t\t\t// Year\r\n\t\t\t'y': fullYear.toString().substr(2, 2), // Two digits year, like 09 for 2009\r\n\t\t\t'Y': fullYear, // Four digits year, like 2009\r\n\r\n\t\t\t// Time\r\n\t\t\t'H': pad(hours), // Two digits hours in 24h format, 00 through 23\r\n\t\t\t'I': pad((hours % 12) || 12), // Two digits hours in 12h format, 00 through 11\r\n\t\t\t'l': (hours % 12) || 12, // Hours in 12h format, 1 through 12\r\n\t\t\t'M': pad(date[getMinutes]()), // Two digits minutes, 00 through 59\r\n\t\t\t'p': hours < 12 ? 'AM' : 'PM', // Upper case AM or PM\r\n\t\t\t'P': hours < 12 ? 'am' : 'pm', // Lower case AM or PM\r\n\t\t\t'S': pad(date.getSeconds()), // Two digits seconds, 00 through 59\r\n\t\t\t'L': pad(mathRound(timestamp % 1000), 3) // Milliseconds (naming from Ruby)\r\n\t\t}, Highcharts.dateFormats);\r\n\r\n\r\n\t// do the replaces\r\n\tfor (key in replacements) {\r\n\t\twhile (format.indexOf('%' + key) !== -1) { // regex would do it in one line, but this is faster\r\n\t\t\tformat = format.replace('%' + key, typeof replacements[key] === 'function' ? replacements[key](timestamp) : replacements[key]);\r\n\t\t}\r\n\t}\r\n\r\n\t// Optionally capitalize the string and return\r\n\treturn capitalize ? format.substr(0, 1).toUpperCase() + format.substr(1) : format;\r\n};\r\n\r\n/** \r\n * Format a single variable. Similar to sprintf, without the % prefix.\r\n */\r\nfunction formatSingle(format, val) {\r\n\tvar floatRegex = /f$/,\r\n\t\tdecRegex = /\\.([0-9])/,\r\n\t\tlang = defaultOptions.lang,\r\n\t\tdecimals;\r\n\r\n\tif (floatRegex.test(format)) { // float\r\n\t\tdecimals = format.match(decRegex);\r\n\t\tdecimals = decimals ? decimals[1] : -1;\r\n\t\tval = numberFormat(\r\n\t\t\tval,\r\n\t\t\tdecimals,\r\n\t\t\tlang.decimalPoint,\r\n\t\t\tformat.indexOf(',') > -1 ? lang.thousandsSep : ''\r\n\t\t);\r\n\t} else {\r\n\t\tval = dateFormat(format, val);\r\n\t}\r\n\treturn val;\r\n}\r\n\r\n/**\r\n * Format a string according to a subset of the rules of Python's String.format method.\r\n */\r\nfunction format(str, ctx) {\r\n\tvar splitter = '{',\r\n\t\tisInside = false,\r\n\t\tsegment,\r\n\t\tvalueAndFormat,\r\n\t\tpath,\r\n\t\ti,\r\n\t\tlen,\r\n\t\tret = [],\r\n\t\tval,\r\n\t\tindex;\r\n\t\r\n\twhile ((index = str.indexOf(splitter)) !== -1) {\r\n\t\t\r\n\t\tsegment = str.slice(0, index);\r\n\t\tif (isInside) { // we're on the closing bracket looking back\r\n\t\t\t\r\n\t\t\tvalueAndFormat = segment.split(':');\r\n\t\t\tpath = valueAndFormat.shift().split('.'); // get first and leave format\r\n\t\t\tlen = path.length;\r\n\t\t\tval = ctx;\r\n\r\n\t\t\t// Assign deeper paths\r\n\t\t\tfor (i = 0; i < len; i++) {\r\n\t\t\t\tval = val[path[i]];\r\n\t\t\t}\r\n\r\n\t\t\t// Format the replacement\r\n\t\t\tif (valueAndFormat.length) {\r\n\t\t\t\tval = formatSingle(valueAndFormat.join(':'), val);\r\n\t\t\t}\r\n\r\n\t\t\t// Push the result and advance the cursor\r\n\t\t\tret.push(val);\r\n\t\t\t\r\n\t\t} else {\r\n\t\t\tret.push(segment);\r\n\t\t\t\r\n\t\t}\r\n\t\tstr = str.slice(index + 1); // the rest\r\n\t\tisInside = !isInside; // toggle\r\n\t\tsplitter = isInside ? '}' : '{'; // now look for next matching bracket\r\n\t}\r\n\tret.push(str);\r\n\treturn ret.join('');\r\n}\r\n\r\n/**\r\n * Get the magnitude of a number\r\n */\r\nfunction getMagnitude(num) {\r\n\treturn math.pow(10, mathFloor(math.log(num) / math.LN10));\r\n}\r\n\r\n/**\r\n * Take an interval and normalize it to multiples of 1, 2, 2.5 and 5\r\n * @param {Number} interval\r\n * @param {Array} multiples\r\n * @param {Number} magnitude\r\n * @param {Object} options\r\n */\r\nfunction normalizeTickInterval(interval, multiples, magnitude, options) {\r\n\tvar normalized, i;\r\n\r\n\t// round to a tenfold of 1, 2, 2.5 or 5\r\n\tmagnitude = pick(magnitude, 1);\r\n\tnormalized = interval / magnitude;\r\n\r\n\t// multiples for a linear scale\r\n\tif (!multiples) {\r\n\t\tmultiples = [1, 2, 2.5, 5, 10];\r\n\r\n\t\t// the allowDecimals option\r\n\t\tif (options && options.allowDecimals === false) {\r\n\t\t\tif (magnitude === 1) {\r\n\t\t\t\tmultiples = [1, 2, 5, 10];\r\n\t\t\t} else if (magnitude <= 0.1) {\r\n\t\t\t\tmultiples = [1 / magnitude];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// normalize the interval to the nearest multiple\r\n\tfor (i = 0; i < multiples.length; i++) {\r\n\t\tinterval = multiples[i];\r\n\t\tif (normalized <= (multiples[i] + (multiples[i + 1] || multiples[i])) / 2) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\t// multiply back to the correct magnitude\r\n\tinterval *= magnitude;\r\n\r\n\treturn interval;\r\n}\r\n\r\n/**\r\n * Get a normalized tick interval for dates. Returns a configuration object with\r\n * unit range (interval), count and name. Used to prepare data for getTimeTicks. \r\n * Previously this logic was part of getTimeTicks, but as getTimeTicks now runs\r\n * of segments in stock charts, the normalizing logic was extracted in order to \r\n * prevent it for running over again for each segment having the same interval. \r\n * #662, #697.\r\n */\r\nfunction normalizeTimeTickInterval(tickInterval, unitsOption) {\r\n\tvar units = unitsOption || [[\r\n\t\t\t\tMILLISECOND, // unit name\r\n\t\t\t\t[1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\r\n\t\t\t], [\r\n\t\t\t\tSECOND,\r\n\t\t\t\t[1, 2, 5, 10, 15, 30]\r\n\t\t\t], [\r\n\t\t\t\tMINUTE,\r\n\t\t\t\t[1, 2, 5, 10, 15, 30]\r\n\t\t\t], [\r\n\t\t\t\tHOUR,\r\n\t\t\t\t[1, 2, 3, 4, 6, 8, 12]\r\n\t\t\t], [\r\n\t\t\t\tDAY,\r\n\t\t\t\t[1, 2]\r\n\t\t\t], [\r\n\t\t\t\tWEEK,\r\n\t\t\t\t[1, 2]\r\n\t\t\t], [\r\n\t\t\t\tMONTH,\r\n\t\t\t\t[1, 2, 3, 4, 6]\r\n\t\t\t], [\r\n\t\t\t\tYEAR,\r\n\t\t\t\tnull\r\n\t\t\t]],\r\n\t\tunit = units[units.length - 1], // default unit is years\r\n\t\tinterval = timeUnits[unit[0]],\r\n\t\tmultiples = unit[1],\r\n\t\tcount,\r\n\t\ti;\r\n\t\t\r\n\t// loop through the units to find the one that best fits the tickInterval\r\n\tfor (i = 0; i < units.length; i++) {\r\n\t\tunit = units[i];\r\n\t\tinterval = timeUnits[unit[0]];\r\n\t\tmultiples = unit[1];\r\n\r\n\r\n\t\tif (units[i + 1]) {\r\n\t\t\t// lessThan is in the middle between the highest multiple and the next unit.\r\n\t\t\tvar lessThan = (interval * multiples[multiples.length - 1] +\r\n\t\t\t\t\t\ttimeUnits[units[i + 1][0]]) / 2;\r\n\r\n\t\t\t// break and keep the current unit\r\n\t\t\tif (tickInterval <= lessThan) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// prevent 2.5 years intervals, though 25, 250 etc. are allowed\r\n\tif (interval === timeUnits[YEAR] && tickInterval < 5 * interval) {\r\n\t\tmultiples = [1, 2, 5];\r\n\t}\r\n\r\n\t// get the count\r\n\tcount = normalizeTickInterval(\r\n\t\ttickInterval / interval, \r\n\t\tmultiples,\r\n\t\tunit[0] === YEAR ? mathMax(getMagnitude(tickInterval / interval), 1) : 1 // #1913, #2360\r\n\t);\r\n\t\r\n\treturn {\r\n\t\tunitRange: interval,\r\n\t\tcount: count,\r\n\t\tunitName: unit[0]\r\n\t};\r\n}\r\n\r\n/**\r\n * Set the tick positions to a time unit that makes sense, for example\r\n * on the first of each month or on every Monday. Return an array\r\n * with the time positions. Used in datetime axes as well as for grouping\r\n * data on a datetime axis.\r\n *\r\n * @param {Object} normalizedInterval The interval in axis values (ms) and the count\r\n * @param {Number} min The minimum in axis values\r\n * @param {Number} max The maximum in axis values\r\n * @param {Number} startOfWeek\r\n */\r\nfunction getTimeTicks(normalizedInterval, min, max, startOfWeek) {\r\n\tvar tickPositions = [],\r\n\t\ti,\r\n\t\thigherRanks = {},\r\n\t\tuseUTC = defaultOptions.global.useUTC,\r\n\t\tminYear, // used in months and years as a basis for Date.UTC()\r\n\t\tminDate = new Date(min),\r\n\t\tinterval = normalizedInterval.unitRange,\r\n\t\tcount = normalizedInterval.count;\r\n\r\n\tif (defined(min)) { // #1300\r\n\t\tif (interval >= timeUnits[SECOND]) { // second\r\n\t\t\tminDate.setMilliseconds(0);\r\n\t\t\tminDate.setSeconds(interval >= timeUnits[MINUTE] ? 0 :\r\n\t\t\t\tcount * mathFloor(minDate.getSeconds() / count));\r\n\t\t}\r\n\t\r\n\t\tif (interval >= timeUnits[MINUTE]) { // minute\r\n\t\t\tminDate[setMinutes](interval >= timeUnits[HOUR] ? 0 :\r\n\t\t\t\tcount * mathFloor(minDate[getMinutes]() / count));\r\n\t\t}\r\n\t\r\n\t\tif (interval >= timeUnits[HOUR]) { // hour\r\n\t\t\tminDate[setHours](interval >= timeUnits[DAY] ? 0 :\r\n\t\t\t\tcount * mathFloor(minDate[getHours]() / count));\r\n\t\t}\r\n\t\r\n\t\tif (interval >= timeUnits[DAY]) { // day\r\n\t\t\tminDate[setDate](interval >= timeUnits[MONTH] ? 1 :\r\n\t\t\t\tcount * mathFloor(minDate[getDate]() / count));\r\n\t\t}\r\n\t\r\n\t\tif (interval >= timeUnits[MONTH]) { // month\r\n\t\t\tminDate[setMonth](interval >= timeUnits[YEAR] ? 0 :\r\n\t\t\t\tcount * mathFloor(minDate[getMonth]() / count));\r\n\t\t\tminYear = minDate[getFullYear]();\r\n\t\t}\r\n\t\r\n\t\tif (interval >= timeUnits[YEAR]) { // year\r\n\t\t\tminYear -= minYear % count;\r\n\t\t\tminDate[setFullYear](minYear);\r\n\t\t}\r\n\t\r\n\t\t// week is a special case that runs outside the hierarchy\r\n\t\tif (interval === timeUnits[WEEK]) {\r\n\t\t\t// get start of current week, independent of count\r\n\t\t\tminDate[setDate](minDate[getDate]() - minDate[getDay]() +\r\n\t\t\t\tpick(startOfWeek, 1));\r\n\t\t}\r\n\t\r\n\t\r\n\t\t// get tick positions\r\n\t\ti = 1;\r\n\t\tminYear = minDate[getFullYear]();\r\n\t\tvar time = minDate.getTime(),\r\n\t\t\tminMonth = minDate[getMonth](),\r\n\t\t\tminDateDate = minDate[getDate](),\r\n\t\t\ttimezoneOffset = useUTC ? \r\n\t\t\t\t0 : \r\n\t\t\t\t(24 * 3600 * 1000 + minDate.getTimezoneOffset() * 60 * 1000) % (24 * 3600 * 1000); // #950\r\n\t\r\n\t\t// iterate and add tick positions at appropriate values\r\n\t\twhile (time < max) {\r\n\t\t\ttickPositions.push(time);\r\n\t\r\n\t\t\t// if the interval is years, use Date.UTC to increase years\r\n\t\t\tif (interval === timeUnits[YEAR]) {\r\n\t\t\t\ttime = makeTime(minYear + i * count, 0);\r\n\t\r\n\t\t\t// if the interval is months, use Date.UTC to increase months\r\n\t\t\t} else if (interval === timeUnits[MONTH]) {\r\n\t\t\t\ttime = makeTime(minYear, minMonth + i * count);\r\n\t\r\n\t\t\t// if we're using global time, the interval is not fixed as it jumps\r\n\t\t\t// one hour at the DST crossover\r\n\t\t\t} else if (!useUTC && (interval === timeUnits[DAY] || interval === timeUnits[WEEK])) {\r\n\t\t\t\ttime = makeTime(minYear, minMonth, minDateDate +\r\n\t\t\t\t\ti * count * (interval === timeUnits[DAY] ? 1 : 7));\r\n\t\r\n\t\t\t// else, the interval is fixed and we use simple addition\r\n\t\t\t} else {\r\n\t\t\t\ttime += interval * count;\r\n\t\t\t}\r\n\t\r\n\t\t\ti++;\r\n\t\t}\r\n\t\r\n\t\t// push the last time\r\n\t\ttickPositions.push(time);\r\n\r\n\r\n\t\t// mark new days if the time is dividible by day (#1649, #1760)\r\n\t\teach(grep(tickPositions, function (time) {\r\n\t\t\treturn interval <= timeUnits[HOUR] && time % timeUnits[DAY] === timezoneOffset;\r\n\t\t}), function (time) {\r\n\t\t\thigherRanks[time] = DAY;\r\n\t\t});\r\n\t}\r\n\r\n\r\n\t// record information on the chosen unit - for dynamic label formatter\r\n\ttickPositions.info = extend(normalizedInterval, {\r\n\t\thigherRanks: higherRanks,\r\n\t\ttotalRange: interval * count\r\n\t});\r\n\r\n\treturn tickPositions;\r\n}\r\n\r\n/**\r\n * Helper class that contains variuos counters that are local to the chart.\r\n */\r\nfunction ChartCounters() {\r\n\tthis.color = 0;\r\n\tthis.symbol = 0;\r\n}\r\n\r\nChartCounters.prototype = {\r\n\t/**\r\n\t * Wraps the color counter if it reaches the specified length.\r\n\t */\r\n\twrapColor: function (length) {\r\n\t\tif (this.color >= length) {\r\n\t\t\tthis.color = 0;\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Wraps the symbol counter if it reaches the specified length.\r\n\t */\r\n\twrapSymbol: function (length) {\r\n\t\tif (this.symbol >= length) {\r\n\t\t\tthis.symbol = 0;\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * Utility method that sorts an object array and keeping the order of equal items.\r\n * ECMA script standard does not specify the behaviour when items are equal.\r\n */\r\nfunction stableSort(arr, sortFunction) {\r\n\tvar length = arr.length,\r\n\t\tsortValue,\r\n\t\ti;\r\n\r\n\t// Add index to each item\r\n\tfor (i = 0; i < length; i++) {\r\n\t\tarr[i].ss_i = i; // stable sort index\r\n\t}\r\n\r\n\tarr.sort(function (a, b) {\r\n\t\tsortValue = sortFunction(a, b);\r\n\t\treturn sortValue === 0 ? a.ss_i - b.ss_i : sortValue;\r\n\t});\r\n\r\n\t// Remove index from items\r\n\tfor (i = 0; i < length; i++) {\r\n\t\tdelete arr[i].ss_i; // stable sort index\r\n\t}\r\n}\r\n\r\n/**\r\n * Non-recursive method to find the lowest member of an array. Math.min raises a maximum\r\n * call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This\r\n * method is slightly slower, but safe.\r\n */\r\nfunction arrayMin(data) {\r\n\tvar i = data.length,\r\n\t\tmin = data[0];\r\n\r\n\twhile (i--) {\r\n\t\tif (data[i] < min) {\r\n\t\t\tmin = data[i];\r\n\t\t}\r\n\t}\r\n\treturn min;\r\n}\r\n\r\n/**\r\n * Non-recursive method to find the lowest member of an array. Math.min raises a maximum\r\n * call stack size exceeded error in Chrome when trying to apply more than 150.000 points. This\r\n * method is slightly slower, but safe.\r\n */\r\nfunction arrayMax(data) {\r\n\tvar i = data.length,\r\n\t\tmax = data[0];\r\n\r\n\twhile (i--) {\r\n\t\tif (data[i] > max) {\r\n\t\t\tmax = data[i];\r\n\t\t}\r\n\t}\r\n\treturn max;\r\n}\r\n\r\n/**\r\n * Utility method that destroys any SVGElement or VMLElement that are properties on the given object.\r\n * It loops all properties and invokes destroy if there is a destroy method. The property is\r\n * then delete'ed.\r\n * @param {Object} The object to destroy properties on\r\n * @param {Object} Exception, do not destroy this property, only delete it.\r\n */\r\nfunction destroyObjectProperties(obj, except) {\r\n\tvar n;\r\n\tfor (n in obj) {\r\n\t\t// If the object is non-null and destroy is defined\r\n\t\tif (obj[n] && obj[n] !== except && obj[n].destroy) {\r\n\t\t\t// Invoke the destroy\r\n\t\t\tobj[n].destroy();\r\n\t\t}\r\n\r\n\t\t// Delete the property from the object.\r\n\t\tdelete obj[n];\r\n\t}\r\n}\r\n\r\n\r\n/**\r\n * Discard an element by moving it to the bin and delete\r\n * @param {Object} The HTML node to discard\r\n */\r\nfunction discardElement(element) {\r\n\t// create a garbage bin element, not part of the DOM\r\n\tif (!garbageBin) {\r\n\t\tgarbageBin = createElement(DIV);\r\n\t}\r\n\r\n\t// move the node and empty bin\r\n\tif (element) {\r\n\t\tgarbageBin.appendChild(element);\r\n\t}\r\n\tgarbageBin.innerHTML = '';\r\n}\r\n\r\n/**\r\n * Provide error messages for debugging, with links to online explanation \r\n */\r\nfunction error(code, stop) {\r\n\tvar msg = 'Highcharts error #' + code + ': www.highcharts.com/errors/' + code;\r\n\tif (stop) {\r\n\t\tthrow msg;\r\n\t} else if (win.console) {\r\n\t\tconsole.log(msg);\r\n\t}\r\n}\r\n\r\n/**\r\n * Fix JS round off float errors\r\n * @param {Number} num\r\n */\r\nfunction correctFloat(num) {\r\n\treturn parseFloat(\r\n\t\tnum.toPrecision(14)\r\n\t);\r\n}\r\n\r\n/**\r\n * Set the global animation to either a given value, or fall back to the\r\n * given chart's animation option\r\n * @param {Object} animation\r\n * @param {Object} chart\r\n */\r\nfunction setAnimation(animation, chart) {\r\n\tglobalAnimation = pick(animation, chart.animation);\r\n}\r\n\r\n/**\r\n * The time unit lookup\r\n */\r\n/*jslint white: true*/\r\ntimeUnits = hash(\r\n\tMILLISECOND, 1,\r\n\tSECOND, 1000,\r\n\tMINUTE, 60000,\r\n\tHOUR, 3600000,\r\n\tDAY, 24 * 3600000,\r\n\tWEEK, 7 * 24 * 3600000,\r\n\tMONTH, 31 * 24 * 3600000,\r\n\tYEAR, 31556952000\r\n);\r\n/*jslint white: false*/\r\n/**\r\n * Path interpolation algorithm used across adapters\r\n */\r\npathAnim = {\r\n\t/**\r\n\t * Prepare start and end values so that the path can be animated one to one\r\n\t */\r\n\tinit: function (elem, fromD, toD) {\r\n\t\tfromD = fromD || '';\r\n\t\tvar shift = elem.shift,\r\n\t\t\tbezier = fromD.indexOf('C') > -1,\r\n\t\t\tnumParams = bezier ? 7 : 3,\r\n\t\t\tendLength,\r\n\t\t\tslice,\r\n\t\t\ti,\r\n\t\t\tstart = fromD.split(' '),\r\n\t\t\tend = [].concat(toD), // copy\r\n\t\t\tstartBaseLine,\r\n\t\t\tendBaseLine,\r\n\t\t\tsixify = function (arr) { // in splines make move points have six parameters like bezier curves\r\n\t\t\t\ti = arr.length;\r\n\t\t\t\twhile (i--) {\r\n\t\t\t\t\tif (arr[i] === M) {\r\n\t\t\t\t\t\tarr.splice(i + 1, 0, arr[i + 1], arr[i + 2], arr[i + 1], arr[i + 2]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\tif (bezier) {\r\n\t\t\tsixify(start);\r\n\t\t\tsixify(end);\r\n\t\t}\r\n\r\n\t\t// pull out the base lines before padding\r\n\t\tif (elem.isArea) {\r\n\t\t\tstartBaseLine = start.splice(start.length - 6, 6);\r\n\t\t\tendBaseLine = end.splice(end.length - 6, 6);\r\n\t\t}\r\n\r\n\t\t// if shifting points, prepend a dummy point to the end path\r\n\t\tif (shift <= end.length / numParams && start.length === end.length) {\r\n\t\t\twhile (shift--) {\r\n\t\t\t\tend = [].concat(end).splice(0, numParams).concat(end);\r\n\t\t\t}\r\n\t\t}\r\n\t\telem.shift = 0; // reset for following animations\r\n\r\n\t\t// copy and append last point until the length matches the end length\r\n\t\tif (start.length) {\r\n\t\t\tendLength = end.length;\r\n\t\t\twhile (start.length < endLength) {\r\n\r\n\t\t\t\t//bezier && sixify(start);\r\n\t\t\t\tslice = [].concat(start).splice(start.length - numParams, numParams);\r\n\t\t\t\tif (bezier) { // disable first control point\r\n\t\t\t\t\tslice[numParams - 6] = slice[numParams - 2];\r\n\t\t\t\t\tslice[numParams - 5] = slice[numParams - 1];\r\n\t\t\t\t}\r\n\t\t\t\tstart = start.concat(slice);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (startBaseLine) { // append the base lines for areas\r\n\t\t\tstart = start.concat(startBaseLine);\r\n\t\t\tend = end.concat(endBaseLine);\r\n\t\t}\r\n\t\treturn [start, end];\r\n\t},\r\n\r\n\t/**\r\n\t * Interpolate each value of the path and return the array\r\n\t */\r\n\tstep: function (start, end, pos, complete) {\r\n\t\tvar ret = [],\r\n\t\t\ti = start.length,\r\n\t\t\tstartVal;\r\n\r\n\t\tif (pos === 1) { // land on the final path without adjustment points appended in the ends\r\n\t\t\tret = complete;\r\n\r\n\t\t} else if (i === end.length && pos < 1) {\r\n\t\t\twhile (i--) {\r\n\t\t\t\tstartVal = parseFloat(start[i]);\r\n\t\t\t\tret[i] =\r\n\t\t\t\t\tisNaN(startVal) ? // a letter instruction like M or L\r\n\t\t\t\t\t\tstart[i] :\r\n\t\t\t\t\t\tpos * (parseFloat(end[i] - startVal)) + startVal;\r\n\r\n\t\t\t}\r\n\t\t} else { // if animation is finished or length not matching, land on right value\r\n\t\t\tret = end;\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n};\r\n\r\n(function ($) {\r\n\t/**\r\n\t * The default HighchartsAdapter for jQuery\r\n\t */\r\n\twin.HighchartsAdapter = win.HighchartsAdapter || ($ && {\r\n\t\t\r\n\t\t/**\r\n\t\t * Initialize the adapter by applying some extensions to jQuery\r\n\t\t */\r\n\t\tinit: function (pathAnim) {\r\n\t\t\t\r\n\t\t\t// extend the animate function to allow SVG animations\r\n\t\t\tvar Fx = $.fx,\r\n\t\t\t\tStep = Fx.step,\r\n\t\t\t\tdSetter,\r\n\t\t\t\tTween = $.Tween,\r\n\t\t\t\tpropHooks = Tween && Tween.propHooks,\r\n\t\t\t\topacityHook = $.cssHooks.opacity;\r\n\t\t\t\r\n\t\t\t/*jslint unparam: true*//* allow unused param x in this function */\r\n\t\t\t$.extend($.easing, {\r\n\t\t\t\teaseOutQuad: function (x, t, b, c, d) {\r\n\t\t\t\t\treturn -c * (t /= d) * (t - 2) + b;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t/*jslint unparam: false*/\r\n\t\t\r\n\t\t\t// extend some methods to check for elem.attr, which means it is a Highcharts SVG object\r\n\t\t\t$.each(['cur', '_default', 'width', 'height', 'opacity'], function (i, fn) {\r\n\t\t\t\tvar obj = Step,\r\n\t\t\t\t\tbase,\r\n\t\t\t\t\telem;\r\n\t\t\t\t\t\r\n\t\t\t\t// Handle different parent objects\r\n\t\t\t\tif (fn === 'cur') {\r\n\t\t\t\t\tobj = Fx.prototype; // 'cur', the getter, relates to Fx.prototype\r\n\t\t\t\t\r\n\t\t\t\t} else if (fn === '_default' && Tween) { // jQuery 1.8 model\r\n\t\t\t\t\tobj = propHooks[fn];\r\n\t\t\t\t\tfn = 'set';\r\n\t\t\t\t}\r\n\t\t\r\n\t\t\t\t// Overwrite the method\r\n\t\t\t\tbase = obj[fn];\r\n\t\t\t\tif (base) { // step.width and step.height don't exist in jQuery < 1.7\r\n\t\t\r\n\t\t\t\t\t// create the extended function replacement\r\n\t\t\t\t\tobj[fn] = function (fx) {\r\n\t\t\r\n\t\t\t\t\t\t// Fx.prototype.cur does not use fx argument\r\n\t\t\t\t\t\tfx = i ? fx : this;\r\n\r\n\t\t\t\t\t\t// Don't run animations on textual properties like align (#1821)\r\n\t\t\t\t\t\tif (fx.prop === 'align') {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\t\t\r\n\t\t\t\t\t\t// shortcut\r\n\t\t\t\t\t\telem = fx.elem;\r\n\t\t\r\n\t\t\t\t\t\t// Fx.prototype.cur returns the current value. The other ones are setters\r\n\t\t\t\t\t\t// and returning a value has no effect.\r\n\t\t\t\t\t\treturn elem.attr ? // is SVG element wrapper\r\n\t\t\t\t\t\t\telem.attr(fx.prop, fn === 'cur' ? UNDEFINED : fx.now) : // apply the SVG wrapper's method\r\n\t\t\t\t\t\t\tbase.apply(this, arguments); // use jQuery's built-in method\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// Extend the opacity getter, needed for fading opacity with IE9 and jQuery 1.10+\r\n\t\t\twrap(opacityHook, 'get', function (proceed, elem, computed) {\r\n\t\t\t\treturn elem.attr ? (elem.opacity || 0) : proceed.call(this, elem, computed);\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t// Define the setter function for d (path definitions)\r\n\t\t\tdSetter = function (fx) {\r\n\t\t\t\tvar elem = fx.elem,\r\n\t\t\t\t\tends;\r\n\t\t\r\n\t\t\t\t// Normally start and end should be set in state == 0, but sometimes,\r\n\t\t\t\t// for reasons unknown, this doesn't happen. Perhaps state == 0 is skipped\r\n\t\t\t\t// in these cases\r\n\t\t\t\tif (!fx.started) {\r\n\t\t\t\t\tends = pathAnim.init(elem, elem.d, elem.toD);\r\n\t\t\t\t\tfx.start = ends[0];\r\n\t\t\t\t\tfx.end = ends[1];\r\n\t\t\t\t\tfx.started = true;\r\n\t\t\t\t}\r\n\t\t\r\n\t\t\r\n\t\t\t\t// interpolate each value of the path\r\n\t\t\t\telem.attr('d', pathAnim.step(fx.start, fx.end, fx.pos, elem.toD));\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\t// jQuery 1.8 style\r\n\t\t\tif (Tween) {\r\n\t\t\t\tpropHooks.d = {\r\n\t\t\t\t\tset: dSetter\r\n\t\t\t\t};\r\n\t\t\t// pre 1.8\r\n\t\t\t} else {\r\n\t\t\t\t// animate paths\r\n\t\t\t\tStep.d = dSetter;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t/**\r\n\t\t\t * Utility for iterating over an array. Parameters are reversed compared to jQuery.\r\n\t\t\t * @param {Array} arr\r\n\t\t\t * @param {Function} fn\r\n\t\t\t */\r\n\t\t\tthis.each = Array.prototype.forEach ?\r\n\t\t\t\tfunction (arr, fn) { // modern browsers\r\n\t\t\t\t\treturn Array.prototype.forEach.call(arr, fn);\r\n\t\t\t\t\t\r\n\t\t\t\t} : \r\n\t\t\t\tfunction (arr, fn) { // legacy\r\n\t\t\t\t\tvar i = 0, \r\n\t\t\t\t\t\tlen = arr.length;\r\n\t\t\t\t\tfor (; i < len; i++) {\r\n\t\t\t\t\t\tif (fn.call(arr[i], arr[i], i, arr) === false) {\r\n\t\t\t\t\t\t\treturn i;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t\r\n\t\t\t/**\r\n\t\t\t * Register Highcharts as a plugin in the respective framework\r\n\t\t\t */\r\n\t\t\t$.fn.highcharts = function () {\r\n\t\t\t\tvar constr = 'Chart', // default constructor\r\n\t\t\t\t\targs = arguments,\r\n\t\t\t\t\toptions,\r\n\t\t\t\t\tret,\r\n\t\t\t\t\tchart;\r\n\r\n\t\t\t\tif (isString(args[0])) {\r\n\t\t\t\t\tconstr = args[0];\r\n\t\t\t\t\targs = Array.prototype.slice.call(args, 1); \r\n\t\t\t\t}\r\n\t\t\t\toptions = args[0];\r\n\r\n\t\t\t\t// Create the chart\r\n\t\t\t\tif (options !== UNDEFINED) {\r\n\t\t\t\t\t/*jslint unused:false*/\r\n\t\t\t\t\toptions.chart = options.chart || {};\r\n\t\t\t\t\toptions.chart.renderTo = this[0];\r\n\t\t\t\t\tchart = new Highcharts[constr](options, args[1]);\r\n\t\t\t\t\tret = this;\r\n\t\t\t\t\t/*jslint unused:true*/\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// When called without parameters or with the return argument, get a predefined chart\r\n\t\t\t\tif (options === UNDEFINED) {\r\n\t\t\t\t\tret = charts[attr(this[0], 'data-highcharts-chart')];\r\n\t\t\t\t}\t\r\n\r\n\t\t\t\treturn ret;\r\n\t\t\t};\r\n\r\n\t\t},\r\n\r\n\t\t\r\n\t\t/**\r\n\t\t * Downloads a script and executes a callback when done.\r\n\t\t * @param {String} scriptLocation\r\n\t\t * @param {Function} callback\r\n\t\t */\r\n\t\tgetScript: $.getScript,\r\n\t\t\r\n\t\t/**\r\n\t\t * Return the index of an item in an array, or -1 if not found\r\n\t\t */\r\n\t\tinArray: $.inArray,\r\n\t\t\r\n\t\t/**\r\n\t\t * A direct link to jQuery methods. MooTools and Prototype adapters must be implemented for each case of method.\r\n\t\t * @param {Object} elem The HTML element\r\n\t\t * @param {String} method Which method to run on the wrapped element\r\n\t\t */\r\n\t\tadapterRun: function (elem, method) {\r\n\t\t\treturn $(elem)[method]();\r\n\t\t},\r\n\t\r\n\t\t/**\r\n\t\t * Filter an array\r\n\t\t */\r\n\t\tgrep: $.grep,\r\n\t\r\n\t\t/**\r\n\t\t * Map an array\r\n\t\t * @param {Array} arr\r\n\t\t * @param {Function} fn\r\n\t\t */\r\n\t\tmap: function (arr, fn) {\r\n\t\t\t//return jQuery.map(arr, fn);\r\n\t\t\tvar results = [],\r\n\t\t\t\ti = 0,\r\n\t\t\t\tlen = arr.length;\r\n\t\t\tfor (; i < len; i++) {\r\n\t\t\t\tresults[i] = fn.call(arr[i], arr[i], i, arr);\r\n\t\t\t}\r\n\t\t\treturn results;\r\n\t\r\n\t\t},\r\n\t\r\n\t\t/**\r\n\t\t * Get the position of an element relative to the top left of the page\r\n\t\t */\r\n\t\toffset: function (el) {\r\n\t\t\treturn $(el).offset();\r\n\t\t},\r\n\t\r\n\t\t/**\r\n\t\t * Add an event listener\r\n\t\t * @param {Object} el A HTML element or custom object\r\n\t\t * @param {String} event The event type\r\n\t\t * @param {Function} fn The event handler\r\n\t\t */\r\n\t\taddEvent: function (el, event, fn) {\r\n\t\t\t$(el).bind(event, fn);\r\n\t\t},\r\n\t\r\n\t\t/**\r\n\t\t * Remove event added with addEvent\r\n\t\t * @param {Object} el The object\r\n\t\t * @param {String} eventType The event type. Leave blank to remove all events.\r\n\t\t * @param {Function} handler The function to remove\r\n\t\t */\r\n\t\tremoveEvent: function (el, eventType, handler) {\r\n\t\t\t// workaround for jQuery issue with unbinding custom events:\r\n\t\t\t// http://forum.jQuery.com/topic/javascript-error-when-unbinding-a-custom-event-using-jQuery-1-4-2\r\n\t\t\tvar func = doc.removeEventListener ? 'removeEventListener' : 'detachEvent';\r\n\t\t\tif (doc[func] && el && !el[func]) {\r\n\t\t\t\tel[func] = function () {};\r\n\t\t\t}\r\n\t\r\n\t\t\t$(el).unbind(eventType, handler);\r\n\t\t},\r\n\t\r\n\t\t/**\r\n\t\t * Fire an event on a custom object\r\n\t\t * @param {Object} el\r\n\t\t * @param {String} type\r\n\t\t * @param {Object} eventArguments\r\n\t\t * @param {Function} defaultFunction\r\n\t\t */\r\n\t\tfireEvent: function (el, type, eventArguments, defaultFunction) {\r\n\t\t\tvar event = $.Event(type),\r\n\t\t\t\tdetachedType = 'detached' + type,\r\n\t\t\t\tdefaultPrevented;\r\n\t\r\n\t\t\t// Remove warnings in Chrome when accessing layerX and layerY. Although Highcharts\r\n\t\t\t// never uses these properties, Chrome includes them in the default click event and\r\n\t\t\t// raises the warning when they are copied over in the extend statement below.\r\n\t\t\t//\r\n\t\t\t// To avoid problems in IE (see #1010) where we cannot delete the properties and avoid\r\n\t\t\t// testing if they are there (warning in chrome) the only option is to test if running IE.\r\n\t\t\tif (!isIE && eventArguments) {\r\n\t\t\t\tdelete eventArguments.layerX;\r\n\t\t\t\tdelete eventArguments.layerY;\r\n\t\t\t}\r\n\t\r\n\t\t\textend(event, eventArguments);\r\n\t\r\n\t\t\t// Prevent jQuery from triggering the object method that is named the\r\n\t\t\t// same as the event. For example, if the event is 'select', jQuery\r\n\t\t\t// attempts calling el.select and it goes into a loop.\r\n\t\t\tif (el[type]) {\r\n\t\t\t\tel[detachedType] = el[type];\r\n\t\t\t\tel[type] = null;\r\n\t\t\t}\r\n\t\r\n\t\t\t// Wrap preventDefault and stopPropagation in try/catch blocks in\r\n\t\t\t// order to prevent JS errors when cancelling events on non-DOM\r\n\t\t\t// objects. #615.\r\n\t\t\t/*jslint unparam: true*/\r\n\t\t\t$.each(['preventDefault', 'stopPropagation'], function (i, fn) {\r\n\t\t\t\tvar base = event[fn];\r\n\t\t\t\tevent[fn] = function () {\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tbase.call(event);\r\n\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\tif (fn === 'preventDefault') {\r\n\t\t\t\t\t\t\tdefaultPrevented = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t};\r\n\t\t\t});\r\n\t\t\t/*jslint unparam: false*/\r\n\t\r\n\t\t\t// trigger it\r\n\t\t\t$(el).trigger(event);\r\n\t\r\n\t\t\t// attach the method\r\n\t\t\tif (el[detachedType]) {\r\n\t\t\t\tel[type] = el[detachedType];\r\n\t\t\t\tel[detachedType] = null;\r\n\t\t\t}\r\n\t\r\n\t\t\tif (defaultFunction && !event.isDefaultPrevented() && !defaultPrevented) {\r\n\t\t\t\tdefaultFunction(event);\r\n\t\t\t}\r\n\t\t},\r\n\t\t\r\n\t\t/**\r\n\t\t * Extension method needed for MooTools\r\n\t\t */\r\n\t\twashMouseEvent: function (e) {\r\n\t\t\tvar ret = e.originalEvent || e;\r\n\t\t\t\r\n\t\t\t// computed by jQuery, needed by IE8\r\n\t\t\tif (ret.pageX === UNDEFINED) { // #1236\r\n\t\t\t\tret.pageX = e.pageX;\r\n\t\t\t\tret.pageY = e.pageY;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn ret;\r\n\t\t},\r\n\t\r\n\t\t/**\r\n\t\t * Animate a HTML element or SVG element wrapper\r\n\t\t * @param {Object} el\r\n\t\t * @param {Object} params\r\n\t\t * @param {Object} options jQuery-like animation options: duration, easing, callback\r\n\t\t */\r\n\t\tanimate: function (el, params, options) {\r\n\t\t\tvar $el = $(el);\r\n\t\t\tif (!el.style) {\r\n\t\t\t\tel.style = {}; // #1881\r\n\t\t\t}\r\n\t\t\tif (params.d) {\r\n\t\t\t\tel.toD = params.d; // keep the array form for paths, used in $.fx.step.d\r\n\t\t\t\tparams.d = 1; // because in jQuery, animating to an array has a different meaning\r\n\t\t\t}\r\n\t\r\n\t\t\t$el.stop();\r\n\t\t\tif (params.opacity !== UNDEFINED && el.attr) {\r\n\t\t\t\tparams.opacity += 'px'; // force jQuery to use same logic as width and height (#2161)\r\n\t\t\t}\r\n\t\t\t$el.animate(params, options);\r\n\t\r\n\t\t},\r\n\t\t/**\r\n\t\t * Stop running animation\r\n\t\t */\r\n\t\tstop: function (el) {\r\n\t\t\t$(el).stop();\r\n\t\t}\r\n\t});\r\n}(win.jQuery));\r\n\r\n\r\n// check for a custom HighchartsAdapter defined prior to this file\r\nvar globalAdapter = win.HighchartsAdapter,\r\n\tadapter = globalAdapter || {};\r\n\t\r\n// Initialize the adapter\r\nif (globalAdapter) {\r\n\tglobalAdapter.init.call(globalAdapter, pathAnim);\r\n}\r\n\r\n\r\n// Utility functions. If the HighchartsAdapter is not defined, adapter is an empty object\r\n// and all the utility functions will be null. In that case they are populated by the\r\n// default adapters below.\r\nvar adapterRun = adapter.adapterRun,\r\n\tgetScript = adapter.getScript,\r\n\tinArray = adapter.inArray,\r\n\teach = adapter.each,\r\n\tgrep = adapter.grep,\r\n\toffset = adapter.offset,\r\n\tmap = adapter.map,\r\n\taddEvent = adapter.addEvent,\r\n\tremoveEvent = adapter.removeEvent,\r\n\tfireEvent = adapter.fireEvent,\r\n\twashMouseEvent = adapter.washMouseEvent,\r\n\tanimate = adapter.animate,\r\n\tstop = adapter.stop;\r\n\r\n\r\n\r\n/* ****************************************************************************\r\n * Handle the options *\r\n *****************************************************************************/\r\nvar\r\n\r\ndefaultLabelOptions = {\r\n\tenabled: true,\r\n\t// rotation: 0,\r\n\t// align: 'center',\r\n\tx: 0,\r\n\ty: 15,\r\n\t/*formatter: function () {\r\n\t\treturn this.value;\r\n\t},*/\r\n\tstyle: {\r\n\t\tcolor: '#666',\r\n\t\tcursor: 'default',\r\n\t\tfontSize: '11px',\r\n\t\tlineHeight: '14px'\r\n\t}\r\n};\r\n\r\ndefaultOptions = {\r\n\tcolors: ['#2f7ed8', '#0d233a', '#8bbc21', '#910000', '#1aadce', '#492970',\r\n\t\t'#f28f43', '#77a1e5', '#c42525', '#a6c96a'],\r\n\tsymbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],\r\n\tlang: {\r\n\t\tloading: 'Chargement...',\r\n\t\tmonths: ['Janvier', 'Fevrier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet',\r\n\t\t\t\t'Aout', 'Septembre', 'Octobre', 'Novembre', 'Decembre'],\r\n\t\tshortMonths: ['Jan', 'Fev', 'Mars', 'Avr', 'Mai', 'Juin', 'Juil', 'Aout', 'Sep', 'Oct', 'Nov', 'Dec'],\r\n\t\tweekdays: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'],\r\n\t\tdecimalPoint: '.',\r\n\t\tnumericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'], // SI prefixes used in axis labels\r\n\t\tresetZoom: 'Reset zoom',\r\n\t\tresetZoomTitle: 'Reset zoom level 1:1',\r\n\t\tthousandsSep: ' '\r\n\t},\r\n\tglobal: {\r\n\t\tuseUTC: true,\r\n\t\tcanvasToolsURL: 'http://code.highcharts.com/stock/1.3.7/modules/canvas-tools.js',\r\n\t\tVMLRadialGradientURL: 'http://code.highcharts.com/stock/1.3.7/gfx/vml-radial-gradient.png'\r\n\t},\r\n\tchart: {\r\n\t\t//animation: true,\r\n\t\t//alignTicks: false,\r\n\t\t//reflow: true,\r\n\t\t//className: null,\r\n\t\t//events: { load, selection },\r\n\t\t//margin: [null],\r\n\t\t//marginTop: null,\r\n\t\t//marginRight: null,\r\n\t\t//marginBottom: null,\r\n\t\t//marginLeft: null,\r\n\t\tborderColor: '#4572A7',\r\n\t\t//borderWidth: 0,\r\n\t\tborderRadius: 5,\r\n\t\tdefaultSeriesType: 'line',\r\n\t\tignoreHiddenSeries: true,\r\n\t\t//inverted: false,\r\n\t\t//shadow: false,\r\n\t\tspacing: [10, 10, 15, 10],\r\n\t\t//spacingTop: 10,\r\n\t\t//spacingRight: 10,\r\n\t\t//spacingBottom: 15,\r\n\t\t//spacingLeft: 10,\r\n\t\tstyle: {\r\n\t\t\tfontFamily: '\"Lucida Grande\", \"Lucida Sans Unicode\", Verdana, Arial, Helvetica, sans-serif', // default font\r\n\t\t\tfontSize: '12px'\r\n\t\t},\r\n\t\tbackgroundColor: '#FFFFFF',\r\n\t\t//plotBackgroundColor: null,\r\n\t\tplotBorderColor: '#C0C0C0',\r\n\t\t//plotBorderWidth: 0,\r\n\t\t//plotShadow: false,\r\n\t\t//zoomType: ''\r\n\t\tresetZoomButton: {\r\n\t\t\ttheme: {\r\n\t\t\t\tzIndex: 20\r\n\t\t\t},\r\n\t\t\tposition: {\r\n\t\t\t\talign: 'right',\r\n\t\t\t\tx: -10,\r\n\t\t\t\t//verticalAlign: 'top',\r\n\t\t\t\ty: 10\r\n\t\t\t}\r\n\t\t\t// relativeTo: 'plot'\r\n\t\t}\r\n\t},\r\n\ttitle: {\r\n\t\ttext: 'Chart title',\r\n\t\talign: 'center',\r\n\t\t// floating: false,\r\n\t\tmargin: 15,\r\n\t\t// x: 0,\r\n\t\t// verticalAlign: 'top',\r\n\t\t// y: null,\r\n\t\tstyle: {\r\n\t\t\tcolor: '#274b6d',//#3E576F',\r\n\t\t\tfontSize: '16px'\r\n\t\t}\r\n\r\n\t},\r\n\tsubtitle: {\r\n\t\ttext: '',\r\n\t\talign: 'center',\r\n\t\t// floating: false\r\n\t\t// x: 0,\r\n\t\t// verticalAlign: 'top',\r\n\t\t// y: null,\r\n\t\tstyle: {\r\n\t\t\tcolor: '#4d759e'\r\n\t\t}\r\n\t},\r\n\r\n\tplotOptions: {\r\n\t\tline: { // base series options\r\n\t\t\tallowPointSelect: false,\r\n\t\t\tshowCheckbox: false,\r\n\t\t\tanimation: {\r\n\t\t\t\tduration: 1000\r\n\t\t\t},\r\n\t\t\t//connectNulls: false,\r\n\t\t\t//cursor: 'default',\r\n\t\t\t//clip: true,\r\n\t\t\t//dashStyle: null,\r\n\t\t\t//enableMouseTracking: true,\r\n\t\t\tevents: {},\r\n\t\t\t//legendIndex: 0,\r\n\t\t\t//linecap: 'round',\r\n\t\t\tlineWidth: 2,\r\n\t\t\t//shadow: false,\r\n\t\t\t// stacking: null,\r\n\t\t\tmarker: {\r\n\t\t\t\tenabled: true,\r\n\t\t\t\t//symbol: null,\r\n\t\t\t\tlineWidth: 0,\r\n\t\t\t\tradius: 4,\r\n\t\t\t\tlineColor: '#FFFFFF',\r\n\t\t\t\t//fillColor: null,\r\n\t\t\t\tstates: { // states for a single point\r\n\t\t\t\t\thover: {\r\n\t\t\t\t\t\tenabled: true\r\n\t\t\t\t\t\t//radius: base + 2\r\n\t\t\t\t\t},\r\n\t\t\t\t\tselect: {\r\n\t\t\t\t\t\tfillColor: '#FFFFFF',\r\n\t\t\t\t\t\tlineColor: '#000000',\r\n\t\t\t\t\t\tlineWidth: 2\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tpoint: {\r\n\t\t\t\tevents: {}\r\n\t\t\t},\r\n\t\t\tdataLabels: merge(defaultLabelOptions, {\r\n\t\t\t\talign: 'center',\r\n\t\t\t\tenabled: false,\r\n\t\t\t\tformatter: function () {\r\n\t\t\t\t\treturn this.y === null ? '' : numberFormat(this.y, -1);\r\n\t\t\t\t},\r\n\t\t\t\tverticalAlign: 'bottom', // above singular point\r\n\t\t\t\ty: 0\r\n\t\t\t\t// backgroundColor: undefined,\r\n\t\t\t\t// borderColor: undefined,\r\n\t\t\t\t// borderRadius: undefined,\r\n\t\t\t\t// borderWidth: undefined,\r\n\t\t\t\t// padding: 3,\r\n\t\t\t\t// shadow: false\r\n\t\t\t}),\r\n\t\t\tcropThreshold: 300, // draw points outside the plot area when the number of points is less than this\r\n\t\t\tpointRange: 0,\r\n\t\t\t//pointStart: 0,\r\n\t\t\t//pointInterval: 1,\r\n\t\t\t//showInLegend: null, // auto: true for standalone series, false for linked series\r\n\t\t\tstates: { // states for the entire series\r\n\t\t\t\thover: {\r\n\t\t\t\t\t//enabled: false,\r\n\t\t\t\t\t//lineWidth: base + 1,\r\n\t\t\t\t\tmarker: {\r\n\t\t\t\t\t\t// lineWidth: base + 1,\r\n\t\t\t\t\t\t// radius: base + 1\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tselect: {\r\n\t\t\t\t\tmarker: {}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tstickyTracking: true\r\n\t\t\t//tooltip: {\r\n\t\t\t\t//pointFormat: '<span style=\"color:{series.color}\">{series.name}</span>: <b>{point.y}</b>'\r\n\t\t\t\t//valueDecimals: null,\r\n\t\t\t\t//xDateFormat: '%A, %b %e, %Y',\r\n\t\t\t\t//valuePrefix: '',\r\n\t\t\t\t//ySuffix: ''\t\t\t\t\r\n\t\t\t//}\r\n\t\t\t// turboThreshold: 1000\r\n\t\t\t// zIndex: null\r\n\t\t}\r\n\t},\r\n\tlabels: {\r\n\t\t//items: [],\r\n\t\tstyle: {\r\n\t\t\t//font: defaultFont,\r\n\t\t\tposition: ABSOLUTE,\r\n\t\t\tcolor: '#3E576F'\r\n\t\t}\r\n\t},\r\n\tlegend: {\r\n\t\tenabled: true,\r\n\t\talign: 'center',\r\n\t\t//floating: false,\r\n\t\tlayout: 'horizontal',\r\n\t\tlabelFormatter: function () {\r\n\t\t\treturn this.name;\r\n\t\t},\r\n\t\tborderWidth: 1,\r\n\t\tborderColor: '#909090',\r\n\t\tborderRadius: 5,\r\n\t\tnavigation: {\r\n\t\t\t// animation: true,\r\n\t\t\tactiveColor: '#274b6d',\r\n\t\t\t// arrowSize: 12\r\n\t\t\tinactiveColor: '#CCC'\r\n\t\t\t// style: {} // text styles\r\n\t\t},\r\n\t\t// margin: 10,\r\n\t\t// reversed: false,\r\n\t\tshadow: false,\r\n\t\t// backgroundColor: null,\r\n\t\t/*style: {\r\n\t\t\tpadding: '5px'\r\n\t\t},*/\r\n\t\titemStyle: {\r\n\t\t\tcursor: 'pointer',\r\n\t\t\tcolor: '#274b6d',\r\n\t\t\tfontSize: '12px'\r\n\t\t},\r\n\t\titemHoverStyle: {\r\n\t\t\t//cursor: 'pointer', removed as of #601\r\n\t\t\tcolor: '#000'\r\n\t\t},\r\n\t\titemHiddenStyle: {\r\n\t\t\tcolor: '#CCC'\r\n\t\t},\r\n\t\titemCheckboxStyle: {\r\n\t\t\tposition: ABSOLUTE,\r\n\t\t\twidth: '13px', // for IE precision\r\n\t\t\theight: '13px'\r\n\t\t},\r\n\t\t// itemWidth: undefined,\r\n\t\tsymbolWidth: 16,\r\n\t\tsymbolPadding: 5,\r\n\t\tverticalAlign: 'bottom',\r\n\t\t// width: undefined,\r\n\t\tx: 0,\r\n\t\ty: 0,\r\n\t\ttitle: {\r\n\t\t\t//text: null,\r\n\t\t\tstyle: {\r\n\t\t\t\tfontWeight: 'bold'\r\n\t\t\t}\r\n\t\t}\t\t\t\r\n\t},\r\n\r\n\tloading: {\r\n\t\t// hideDuration: 100,\r\n\t\tlabelStyle: {\r\n\t\t\tfontWeight: 'bold',\r\n\t\t\tposition: RELATIVE,\r\n\t\t\ttop: '1em'\r\n\t\t},\r\n\t\t// showDuration: 0,\r\n\t\tstyle: {\r\n\t\t\tposition: ABSOLUTE,\r\n\t\t\tbackgroundColor: 'white',\r\n\t\t\topacity: 0.5,\r\n\t\t\ttextAlign: 'center'\r\n\t\t}\r\n\t},\r\n\r\n\ttooltip: {\r\n\t\tenabled: true,\r\n\t\tanimation: hasSVG,\r\n\t\t//crosshairs: null,\r\n\t\tbackgroundColor: 'rgba(255, 255, 255, .85)',\r\n\t\tborderWidth: 1,\r\n\t\tborderRadius: 3,\r\n\t\tdateTimeLabelFormats: { \r\n\t\t\tmillisecond: '%A, %b %e, %H:%M:%S.%L',\r\n\t\t\tsecond: '%A, %b %e, %H:%M:%S',\r\n\t\t\tminute: '%A, %b %e, %H:%M',\r\n\t\t\thour: '%A, %b %e, %H:%M',\r\n\t\t\tday: '%A, %b %e, %Y',\r\n\t\t\tweek: 'Week from %A, %b %e, %Y',\r\n\t\t\tmonth: '%B %Y',\r\n\t\t\tyear: '%Y'\r\n\t\t},\r\n\t\t//formatter: defaultFormatter,\r\n\t\theaderFormat: '<span style=\"font-size: 10px\">{point.key}</span><br/>',\r\n\t\tpointFormat: '<span style=\"color:{series.color}\">{series.name}</span>: <b>{point.y}</b><br/>',\r\n\t\tshadow: true,\r\n\t\t//shared: false,\r\n\t\tsnap: isTouchDevice ? 25 : 10,\r\n\t\tstyle: {\r\n\t\t\tcolor: '#333333',\r\n\t\t\tcursor: 'default',\r\n\t\t\tfontSize: '12px',\r\n\t\t\tpadding: '8px',\r\n\t\t\twhiteSpace: 'nowrap'\r\n\t\t}\r\n\t\t//xDateFormat: '%A, %b %e, %Y',\r\n\t\t//valueDecimals: null,\r\n\t\t//valuePrefix: '',\r\n\t\t//valueSuffix: ''\r\n\t},\r\n\r\n\tcredits: {\r\n\t\tenabled: true,\r\n\t\ttext: 'Highcharts.com',\r\n\t\thref: 'http://www.highcharts.com',\r\n\t\tposition: {\r\n\t\t\talign: 'right',\r\n\t\t\tx: -10,\r\n\t\t\tverticalAlign: 'bottom',\r\n\t\t\ty: -5\r\n\t\t},\r\n\t\tstyle: {\r\n\t\t\tcursor: 'pointer',\r\n\t\t\tcolor: '#909090',\r\n\t\t\tfontSize: '9px'\r\n\t\t}\r\n\t}\r\n};\r\n\r\n\r\n\r\n\r\n// Series defaults\r\nvar defaultPlotOptions = defaultOptions.plotOptions,\r\n\tdefaultSeriesOptions = defaultPlotOptions.line;\r\n\r\n// set the default time methods\r\nsetTimeMethods();\r\n\r\n\r\n\r\n/**\r\n * Set the time methods globally based on the useUTC option. Time method can be either\r\n * local time or UTC (default).\r\n */\r\nfunction setTimeMethods() {\r\n\tvar useUTC = defaultOptions.global.useUTC,\r\n\t\tGET = useUTC ? 'getUTC' : 'get',\r\n\t\tSET = useUTC ? 'setUTC' : 'set';\r\n\r\n\tmakeTime = useUTC ? Date.UTC : function (year, month, date, hours, minutes, seconds) {\r\n\t\treturn new Date(\r\n\t\t\tyear,\r\n\t\t\tmonth,\r\n\t\t\tpick(date, 1),\r\n\t\t\tpick(hours, 0),\r\n\t\t\tpick(minutes, 0),\r\n\t\t\tpick(seconds, 0)\r\n\t\t).getTime();\r\n\t};\r\n\tgetMinutes = GET + 'Minutes';\r\n\tgetHours = GET + 'Hours';\r\n\tgetDay = GET + 'Day';\r\n\tgetDate = GET + 'Date';\r\n\tgetMonth = GET + 'Month';\r\n\tgetFullYear = GET + 'FullYear';\r\n\tsetMinutes = SET + 'Minutes';\r\n\tsetHours = SET + 'Hours';\r\n\tsetDate = SET + 'Date';\r\n\tsetMonth = SET + 'Month';\r\n\tsetFullYear = SET + 'FullYear';\r\n\r\n}\r\n\r\n/**\r\n * Merge the default options with custom options and return the new options structure\r\n * @param {Object} options The new custom options\r\n */\r\nfunction setOptions(options) {\r\n\t\r\n\t// Pull out axis options and apply them to the respective default axis options \r\n\t/*defaultXAxisOptions = merge(defaultXAxisOptions, options.xAxis);\r\n\tdefaultYAxisOptions = merge(defaultYAxisOptions, options.yAxis);\r\n\toptions.xAxis = options.yAxis = UNDEFINED;*/\r\n\t\r\n\t// Merge in the default options\r\n\tdefaultOptions = merge(defaultOptions, options);\r\n\t\r\n\t// Apply UTC\r\n\tsetTimeMethods();\r\n\r\n\treturn defaultOptions;\r\n}\r\n\r\n/**\r\n * Get the updated default options. Merely exposing defaultOptions for outside modules\r\n * isn't enough because the setOptions method creates a new object.\r\n */\r\nfunction getOptions() {\r\n\treturn defaultOptions;\r\n}\r\n\r\n\r\n/**\r\n * Handle color operations. The object methods are chainable.\r\n * @param {String} input The input color in either rbga or hex format\r\n */\r\nvar rgbaRegEx = /rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/,\r\n\thexRegEx = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,\r\n\trgbRegEx = /rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/;\r\n\r\nvar Color = function (input) {\r\n\t// declare variables\r\n\tvar rgba = [], result, stops;\r\n\r\n\t/**\r\n\t * Parse the input color to rgba array\r\n\t * @param {String} input\r\n\t */\r\n\tfunction init(input) {\r\n\r\n\t\t// Gradients\r\n\t\tif (input && input.stops) {\r\n\t\t\tstops = map(input.stops, function (stop) {\r\n\t\t\t\treturn Color(stop[1]);\r\n\t\t\t});\r\n\r\n\t\t// Solid colors\r\n\t\t} else {\r\n\t\t\t// rgba\r\n\t\t\tresult = rgbaRegEx.exec(input);\r\n\t\t\tif (result) {\r\n\t\t\t\trgba = [pInt(result[1]), pInt(result[2]), pInt(result[3]), parseFloat(result[4], 10)];\r\n\t\t\t} else { \r\n\t\t\t\t// hex\r\n\t\t\t\tresult = hexRegEx.exec(input);\r\n\t\t\t\tif (result) {\r\n\t\t\t\t\trgba = [pInt(result[1], 16), pInt(result[2], 16), pInt(result[3], 16), 1];\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// rgb\r\n\t\t\t\t\tresult = rgbRegEx.exec(input);\r\n\t\t\t\t\tif (result) {\r\n\t\t\t\t\t\trgba = [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\t\t\r\n\r\n\t}\r\n\t/**\r\n\t * Return the color a specified format\r\n\t * @param {String} format\r\n\t */\r\n\tfunction get(format) {\r\n\t\tvar ret;\r\n\r\n\t\tif (stops) {\r\n\t\t\tret = merge(input);\r\n\t\t\tret.stops = [].concat(ret.stops);\r\n\t\t\teach(stops, function (stop, i) {\r\n\t\t\t\tret.stops[i] = [ret.stops[i][0], stop.get(format)];\r\n\t\t\t});\r\n\r\n\t\t// it's NaN if gradient colors on a column chart\r\n\t\t} else if (rgba && !isNaN(rgba[0])) {\r\n\t\t\tif (format === 'rgb') {\r\n\t\t\t\tret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';\r\n\t\t\t} else if (format === 'a') {\r\n\t\t\t\tret = rgba[3];\r\n\t\t\t} else {\r\n\t\t\t\tret = 'rgba(' + rgba.join(',') + ')';\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tret = input;\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\r\n\t/**\r\n\t * Brighten the color\r\n\t * @param {Number} alpha\r\n\t */\r\n\tfunction brighten(alpha) {\r\n\t\tif (stops) {\r\n\t\t\teach(stops, function (stop) {\r\n\t\t\t\tstop.brighten(alpha);\r\n\t\t\t});\r\n\t\t\r\n\t\t} else if (isNumber(alpha) && alpha !== 0) {\r\n\t\t\tvar i;\r\n\t\t\tfor (i = 0; i < 3; i++) {\r\n\t\t\t\trgba[i] += pInt(alpha * 255);\r\n\r\n\t\t\t\tif (rgba[i] < 0) {\r\n\t\t\t\t\trgba[i] = 0;\r\n\t\t\t\t}\r\n\t\t\t\tif (rgba[i] > 255) {\r\n\t\t\t\t\trgba[i] = 255;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn this;\r\n\t}\r\n\t/**\r\n\t * Set the color's opacity to a given alpha value\r\n\t * @param {Number} alpha\r\n\t */\r\n\tfunction setOpacity(alpha) {\r\n\t\trgba[3] = alpha;\r\n\t\treturn this;\r\n\t}\r\n\r\n\t// initialize: parse the input\r\n\tinit(input);\r\n\r\n\t// public methods\r\n\treturn {\r\n\t\tget: get,\r\n\t\tbrighten: brighten,\r\n\t\trgba: rgba,\r\n\t\tsetOpacity: setOpacity\r\n\t};\r\n};\r\n\r\n\r\n/**\r\n * A wrapper object for SVG elements\r\n */\r\nfunction SVGElement() {}\r\n\r\nSVGElement.prototype = {\r\n\t/**\r\n\t * Initialize the SVG renderer\r\n\t * @param {Object} renderer\r\n\t * @param {String} nodeName\r\n\t */\r\n\tinit: function (renderer, nodeName) {\r\n\t\tvar wrapper = this;\r\n\t\twrapper.element = nodeName === 'span' ?\r\n\t\t\tcreateElement(nodeName) :\r\n\t\t\tdoc.createElementNS(SVG_NS, nodeName);\r\n\t\twrapper.renderer = renderer;\r\n\t\t/**\r\n\t\t * A collection of attribute setters. These methods, if defined, are called right before a certain\r\n\t\t * attribute is set on an element wrapper. Returning false prevents the default attribute\r\n\t\t * setter to run. Returning a value causes the default setter to set that value. Used in\r\n\t\t * Renderer.label.\r\n\t\t */\r\n\t\twrapper.attrSetters = {};\r\n\t},\r\n\t/**\r\n\t * Default base for animation\r\n\t */\r\n\topacity: 1,\r\n\t/**\r\n\t * Animate a given attribute\r\n\t * @param {Object} params\r\n\t * @param {Number} options The same options as in jQuery animation\r\n\t * @param {Function} complete Function to perform at the end of animation\r\n\t */\r\n\tanimate: function (params, options, complete) {\r\n\t\tvar animOptions = pick(options, globalAnimation, true);\r\n\t\tstop(this); // stop regardless of animation actually running, or reverting to .attr (#607)\r\n\t\tif (animOptions) {\r\n\t\t\tanimOptions = merge(animOptions);\r\n\t\t\tif (complete) { // allows using a callback with the global animation without overwriting it\r\n\t\t\t\tanimOptions.complete = complete;\r\n\t\t\t}\r\n\t\t\tanimate(this, params, animOptions);\r\n\t\t} else {\r\n\t\t\tthis.attr(params);\r\n\t\t\tif (complete) {\r\n\t\t\t\tcomplete();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Set or get a given attribute\r\n\t * @param {Object|String} hash\r\n\t * @param {Mixed|Undefined} val\r\n\t */\r\n\tattr: function (hash, val) {\r\n\t\tvar wrapper = this,\r\n\t\t\tkey,\r\n\t\t\tvalue,\r\n\t\t\tresult,\r\n\t\t\ti,\r\n\t\t\tchild,\r\n\t\t\telement = wrapper.element,\r\n\t\t\tnodeName = element.nodeName.toLowerCase(), // Android2 requires lower for \"text\"\r\n\t\t\trenderer = wrapper.renderer,\r\n\t\t\tskipAttr,\r\n\t\t\ttitleNode,\r\n\t\t\tattrSetters = wrapper.attrSetters,\r\n\t\t\tshadows = wrapper.shadows,\r\n\t\t\thasSetSymbolSize,\r\n\t\t\tdoTransform,\r\n\t\t\tret = wrapper;\r\n\r\n\t\t// single key-value pair\r\n\t\tif (isString(hash) && defined(val)) {\r\n\t\t\tkey = hash;\r\n\t\t\thash = {};\r\n\t\t\thash[key] = val;\r\n\t\t}\r\n\r\n\t\t// used as a getter: first argument is a string, second is undefined\r\n\t\tif (isString(hash)) {\r\n\t\t\tkey = hash;\r\n\t\t\tif (nodeName === 'circle') {\r\n\t\t\t\tkey = { x: 'cx', y: 'cy' }[key] || key;\r\n\t\t\t} else if (key === 'strokeWidth') {\r\n\t\t\t\tkey = 'stroke-width';\r\n\t\t\t}\r\n\t\t\tret = attr(element, key) || wrapper[key] || 0;\r\n\t\t\tif (key !== 'd' && key !== 'visibility' && key !== 'fill') { // 'd' is string in animation step\r\n\t\t\t\tret = parseFloat(ret);\r\n\t\t\t}\r\n\r\n\t\t// setter\r\n\t\t} else {\r\n\r\n\t\t\tfor (key in hash) {\r\n\t\t\t\tskipAttr = false; // reset\r\n\t\t\t\tvalue = hash[key];\r\n\r\n\t\t\t\t// check for a specific attribute setter\r\n\t\t\t\tresult = attrSetters[key] && attrSetters[key].call(wrapper, value, key);\r\n\r\n\t\t\t\tif (result !== false) {\r\n\t\t\t\t\tif (result !== UNDEFINED) {\r\n\t\t\t\t\t\tvalue = result; // the attribute setter has returned a new value to set\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\t// paths\r\n\t\t\t\t\tif (key === 'd') {\r\n\t\t\t\t\t\tif (value && value.join) { // join path\r\n\t\t\t\t\t\t\tvalue = value.join(' ');\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (/(NaN| {2}|^$)/.test(value)) {\r\n\t\t\t\t\t\t\tvalue = 'M 0 0';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t//wrapper.d = value; // shortcut for animations\r\n\r\n\t\t\t\t\t// update child tspans x values\r\n\t\t\t\t\t} else if (key === 'x' && nodeName === 'text') {\r\n\t\t\t\t\t\tfor (i = 0; i < element.childNodes.length; i++) {\r\n\t\t\t\t\t\t\tchild = element.childNodes[i];\r\n\t\t\t\t\t\t\t// if the x values are equal, the tspan represents a linebreak\r\n\t\t\t\t\t\t\tif (attr(child, 'x') === attr(element, 'x')) {\r\n\t\t\t\t\t\t\t\t//child.setAttribute('x', value);\r\n\t\t\t\t\t\t\t\tattr(child, 'x', value);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t} else if (wrapper.rotation && (key === 'x' || key === 'y')) {\r\n\t\t\t\t\t\tdoTransform = true;\r\n\r\n\t\t\t\t\t// apply gradients\r\n\t\t\t\t\t} else if (key === 'fill') {\r\n\t\t\t\t\t\tvalue = renderer.color(value, element, key);\r\n\r\n\t\t\t\t\t// circle x and y\r\n\t\t\t\t\t} else if (nodeName === 'circle' && (key === 'x' || key === 'y')) {\r\n\t\t\t\t\t\tkey = { x: 'cx', y: 'cy' }[key] || key;\r\n\r\n\t\t\t\t\t// rectangle border radius\r\n\t\t\t\t\t} else if (nodeName === 'rect' && key === 'r') {\r\n\t\t\t\t\t\tattr(element, {\r\n\t\t\t\t\t\t\trx: value,\r\n\t\t\t\t\t\t\try: value\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tskipAttr = true;\r\n\r\n\t\t\t\t\t// translation and text rotation\r\n\t\t\t\t\t} else if (key === 'translateX' || key === 'translateY' || key === 'rotation' ||\r\n\t\t\t\t\t\t\tkey === 'verticalAlign' || key === 'scaleX' || key === 'scaleY') {\r\n\t\t\t\t\t\tdoTransform = true;\r\n\t\t\t\t\t\tskipAttr = true;\r\n\r\n\t\t\t\t\t// apply opacity as subnode (required by legacy WebKit and Batik)\r\n\t\t\t\t\t} else if (key === 'stroke') {\r\n\t\t\t\t\t\tvalue = renderer.color(value, element, key);\r\n\r\n\t\t\t\t\t// emulate VML's dashstyle implementation\r\n\t\t\t\t\t} else if (key === 'dashstyle') {\r\n\t\t\t\t\t\tkey = 'stroke-dasharray';\r\n\t\t\t\t\t\tvalue = value && value.toLowerCase();\r\n\t\t\t\t\t\tif (value === 'solid') {\r\n\t\t\t\t\t\t\tvalue = NONE;\r\n\t\t\t\t\t\t} else if (value) {\r\n\t\t\t\t\t\t\tvalue = value\r\n\t\t\t\t\t\t\t\t.replace('shortdashdotdot', '3,1,1,1,1,1,')\r\n\t\t\t\t\t\t\t\t.replace('shortdashdot', '3,1,1,1')\r\n\t\t\t\t\t\t\t\t.replace('shortdot', '1,1,')\r\n\t\t\t\t\t\t\t\t.replace('shortdash', '3,1,')\r\n\t\t\t\t\t\t\t\t.replace('longdash', '8,3,')\r\n\t\t\t\t\t\t\t\t.replace(/dot/g, '1,3,')\r\n\t\t\t\t\t\t\t\t.replace('dash', '4,3,')\r\n\t\t\t\t\t\t\t\t.replace(/,$/, '')\r\n\t\t\t\t\t\t\t\t.split(','); // ending comma\r\n\r\n\t\t\t\t\t\t\ti = value.length;\r\n\t\t\t\t\t\t\twhile (i--) {\r\n\t\t\t\t\t\t\t\tvalue[i] = pInt(value[i]) * pick(hash['stroke-width'], wrapper['stroke-width']);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tvalue = value.join(',');\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// IE9/MooTools combo: MooTools returns objects instead of numbers and IE9 Beta 2\r\n\t\t\t\t\t// is unable to cast them. Test again with final IE9.\r\n\t\t\t\t\t} else if (key === 'width') {\r\n\t\t\t\t\t\tvalue = pInt(value);\r\n\r\n\t\t\t\t\t// Text alignment\r\n\t\t\t\t\t} else if (key === 'align') {\r\n\t\t\t\t\t\tkey = 'text-anchor';\r\n\t\t\t\t\t\tvalue = { left: 'start', center: 'middle', right: 'end' }[value];\r\n\r\n\t\t\t\t\t// Title requires a subnode, #431\r\n\t\t\t\t\t} else if (key === 'title') {\r\n\t\t\t\t\t\ttitleNode = element.getElementsByTagName('title')[0];\r\n\t\t\t\t\t\tif (!titleNode) {\r\n\t\t\t\t\t\t\ttitleNode = doc.createElementNS(SVG_NS, 'title');\r\n\t\t\t\t\t\t\telement.appendChild(titleNode);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ttitleNode.textContent = value;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// jQuery animate changes case\r\n\t\t\t\t\tif (key === 'strokeWidth') {\r\n\t\t\t\t\t\tkey = 'stroke-width';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// In Chrome/Win < 6 as well as Batik, the stroke attribute can't be set when the stroke-\r\n\t\t\t\t\t// width is 0. #1369\r\n\t\t\t\t\tif (key === 'stroke-width' || key === 'stroke') {\r\n\t\t\t\t\t\twrapper[key] = value;\r\n\t\t\t\t\t\t// Only apply the stroke attribute if the stroke width is defined and larger than 0\r\n\t\t\t\t\t\tif (wrapper.stroke && wrapper['stroke-width']) {\r\n\t\t\t\t\t\t\tattr(element, 'stroke', wrapper.stroke);\r\n\t\t\t\t\t\t\tattr(element, 'stroke-width', wrapper['stroke-width']);\r\n\t\t\t\t\t\t\twrapper.hasStroke = true;\r\n\t\t\t\t\t\t} else if (key === 'stroke-width' && value === 0 && wrapper.hasStroke) {\r\n\t\t\t\t\t\t\telement.removeAttribute('stroke');\r\n\t\t\t\t\t\t\twrapper.hasStroke = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tskipAttr = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// symbols\r\n\t\t\t\t\tif (wrapper.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(key)) {\r\n\r\n\r\n\t\t\t\t\t\tif (!hasSetSymbolSize) {\r\n\t\t\t\t\t\t\twrapper.symbolAttr(hash);\r\n\t\t\t\t\t\t\thasSetSymbolSize = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tskipAttr = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// let the shadow follow the main element\r\n\t\t\t\t\tif (shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(key)) {\r\n\t\t\t\t\t\ti = shadows.length;\r\n\t\t\t\t\t\twhile (i--) {\r\n\t\t\t\t\t\t\tattr(\r\n\t\t\t\t\t\t\t\tshadows[i],\r\n\t\t\t\t\t\t\t\tkey,\r\n\t\t\t\t\t\t\t\tkey === 'height' ?\r\n\t\t\t\t\t\t\t\t\tmathMax(value - (shadows[i].cutHeight || 0), 0) :\r\n\t\t\t\t\t\t\t\t\tvalue\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// validate heights\r\n\t\t\t\t\tif ((key === 'width' || key === 'height') && nodeName === 'rect' && value < 0) {\r\n\t\t\t\t\t\tvalue = 0;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Record for animation and quick access without polling the DOM\r\n\t\t\t\t\twrapper[key] = value;\r\n\r\n\r\n\t\t\t\t\tif (key === 'text') {\r\n\t\t\t\t\t\t// Delete bBox memo when the text changes\r\n\t\t\t\t\t\tif (value !== wrapper.textStr) {\r\n\t\t\t\t\t\t\tdelete wrapper.bBox;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twrapper.textStr = value;\r\n\t\t\t\t\t\tif (wrapper.added) {\r\n\t\t\t\t\t\t\trenderer.buildText(wrapper);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (!skipAttr) {\r\n\t\t\t\t\t\tattr(element, key, value);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// Update transform. Do this outside the loop to prevent redundant updating for batch setting\r\n\t\t\t// of attributes.\r\n\t\t\tif (doTransform) {\r\n\t\t\t\twrapper.updateTransform();\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Add a class name to an element\r\n\t */\r\n\taddClass: function (className) {\r\n\t\tvar element = this.element,\r\n\t\t\tcurrentClassName = attr(element, 'class') || '';\r\n\r\n\t\tif (currentClassName.indexOf(className) === -1) {\r\n\t\t\tattr(element, 'class', currentClassName + ' ' + className);\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\t/* hasClass and removeClass are not (yet) needed\r\n\thasClass: function (className) {\r\n\t\treturn attr(this.element, 'class').indexOf(className) !== -1;\r\n\t},\r\n\tremoveClass: function (className) {\r\n\t\tattr(this.element, 'class', attr(this.element, 'class').replace(className, ''));\r\n\t\treturn this;\r\n\t},\r\n\t*/\r\n\r\n\t/**\r\n\t * If one of the symbol size affecting parameters are changed,\r\n\t * check all the others only once for each call to an element's\r\n\t * .attr() method\r\n\t * @param {Object} hash\r\n\t */\r\n\tsymbolAttr: function (hash) {\r\n\t\tvar wrapper = this;\r\n\r\n\t\teach(['x', 'y', 'r', 'start', 'end', 'width', 'height', 'innerR', 'anchorX', 'anchorY'], function (key) {\r\n\t\t\twrapper[key] = pick(hash[key], wrapper[key]);\r\n\t\t});\r\n\r\n\t\twrapper.attr({\r\n\t\t\td: wrapper.renderer.symbols[wrapper.symbolName](\r\n\t\t\t\twrapper.x,\r\n\t\t\t\twrapper.y,\r\n\t\t\t\twrapper.width,\r\n\t\t\t\twrapper.height,\r\n\t\t\t\twrapper\r\n\t\t\t)\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Apply a clipping path to this object\r\n\t * @param {String} id\r\n\t */\r\n\tclip: function (clipRect) {\r\n\t\treturn this.attr('clip-path', clipRect ? 'url(' + this.renderer.url + '#' + clipRect.id + ')' : NONE);\r\n\t},\r\n\r\n\t/**\r\n\t * Calculate the coordinates needed for drawing a rectangle crisply and return the\r\n\t * calculated attributes\r\n\t * @param {Number} strokeWidth\r\n\t * @param {Number} x\r\n\t * @param {Number} y\r\n\t * @param {Number} width\r\n\t * @param {Number} height\r\n\t */\r\n\tcrisp: function (strokeWidth, x, y, width, height) {\r\n\r\n\t\tvar wrapper = this,\r\n\t\t\tkey,\r\n\t\t\tattribs = {},\r\n\t\t\tvalues = {},\r\n\t\t\tnormalizer;\r\n\r\n\t\tstrokeWidth = strokeWidth || wrapper.strokeWidth || (wrapper.attr && wrapper.attr('stroke-width')) || 0;\r\n\t\tnormalizer = mathRound(strokeWidth) % 2 / 2; // mathRound because strokeWidth can sometimes have roundoff errors\r\n\r\n\t\t// normalize for crisp edges\r\n\t\tvalues.x = mathFloor(x || wrapper.x || 0) + normalizer;\r\n\t\tvalues.y = mathFloor(y || wrapper.y || 0) + normalizer;\r\n\t\tvalues.width = mathFloor((width || wrapper.width || 0) - 2 * normalizer);\r\n\t\tvalues.height = mathFloor((height || wrapper.height || 0) - 2 * normalizer);\r\n\t\tvalues.strokeWidth = strokeWidth;\r\n\r\n\t\tfor (key in values) {\r\n\t\t\tif (wrapper[key] !== values[key]) { // only set attribute if changed\r\n\t\t\t\twrapper[key] = attribs[key] = values[key];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn attribs;\r\n\t},\r\n\r\n\t/**\r\n\t * Set styles for the element\r\n\t * @param {Object} styles\r\n\t */\r\n\tcss: function (styles) {\r\n\t\t/*jslint unparam: true*//* allow unused param a in the regexp function below */\r\n\t\tvar elemWrapper = this,\r\n\t\t\telem = elemWrapper.element,\r\n\t\t\ttextWidth = elemWrapper.textWidth = styles && styles.width && elem.nodeName.toLowerCase() === 'text' && pInt(styles.width),\r\n\t\t\tn,\r\n\t\t\tserializedCss = '',\r\n\t\t\thyphenate = function (a, b) { return '-' + b.toLowerCase(); };\r\n\t\t/*jslint unparam: false*/\r\n\r\n\t\t// convert legacy\r\n\t\tif (styles && styles.color) {\r\n\t\t\tstyles.fill = styles.color;\r\n\t\t}\r\n\r\n\t\t// Merge the new styles with the old ones\r\n\t\tstyles = extend(\r\n\t\t\telemWrapper.styles,\r\n\t\t\tstyles\r\n\t\t);\r\n\r\n\t\t// store object\r\n\t\telemWrapper.styles = styles;\r\n\r\n\t\tif (textWidth) {\r\n\t\t\tdelete styles.width;\r\n\t\t}\r\n\r\n\t\t// serialize and set style attribute\r\n\t\tif (isIE && !hasSVG) {\r\n\t\t\tcss(elemWrapper.element, styles);\r\n\t\t} else {\r\n\t\t\tfor (n in styles) {\r\n\t\t\t\tserializedCss += n.replace(/([A-Z])/g, hyphenate) + ':' + styles[n] + ';';\r\n\t\t\t}\r\n\t\t\tattr(elem, 'style', serializedCss); // #1881\r\n\t\t}\r\n\r\n\r\n\t\t// re-build text\r\n\t\tif (textWidth && elemWrapper.added) {\r\n\t\t\telemWrapper.renderer.buildText(elemWrapper);\r\n\t\t}\r\n\r\n\t\treturn elemWrapper;\r\n\t},\r\n\r\n\t/**\r\n\t * Add an event listener\r\n\t * @param {String} eventType\r\n\t * @param {Function} handler\r\n\t */\r\n\ton: function (eventType, handler) {\r\n\t\tvar svgElement = this,\r\n\t\t\telement = svgElement.element;\r\n\t\t\r\n\t\t// touch\r\n\t\tif (hasTouch && eventType === 'click') {\r\n\t\t\telement.ontouchstart = function (e) {\t\t\t\r\n\t\t\t\tsvgElement.touchEventFired = Date.now();\t\t\t\t\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\thandler.call(element, e);\r\n\t\t\t};\r\n\t\t\telement.onclick = function (e) {\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\tif (userAgent.indexOf('Android') === -1 || Date.now() - (svgElement.touchEventFired || 0) > 1100) { // #2269\r\n\t\t\t\t\thandler.call(element, e);\r\n\t\t\t\t}\r\n\t\t\t};\t\t\t\r\n\t\t} else {\r\n\t\t\t// simplest possible event model for internal use\r\n\t\t\telement['on' + eventType] = handler;\r\n\t\t}\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * Set the coordinates needed to draw a consistent radial gradient across\r\n\t * pie slices regardless of positioning inside the chart. The format is\r\n\t * [centerX, centerY, diameter] in pixels.\r\n\t */\r\n\tsetRadialReference: function (coordinates) {\r\n\t\tthis.element.radialReference = coordinates;\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * Move an object and its children by x and y values\r\n\t * @param {Number} x\r\n\t * @param {Number} y\r\n\t */\r\n\ttranslate: function (x, y) {\r\n\t\treturn this.attr({\r\n\t\t\ttranslateX: x,\r\n\t\t\ttranslateY: y\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Invert a group, rotate and flip\r\n\t */\r\n\tinvert: function () {\r\n\t\tvar wrapper = this;\r\n\t\twrapper.inverted = true;\r\n\t\twrapper.updateTransform();\r\n\t\treturn wrapper;\r\n\t},\r\n\r\n\t/**\r\n\t * Apply CSS to HTML elements. This is used in text within SVG rendering and\r\n\t * by the VML renderer\r\n\t */\r\n\thtmlCss: function (styles) {\r\n\t\tvar wrapper = this,\r\n\t\t\telement = wrapper.element,\r\n\t\t\ttextWidth = styles && element.tagName === 'SPAN' && styles.width;\r\n\r\n\t\tif (textWidth) {\r\n\t\t\tdelete styles.width;\r\n\t\t\twrapper.textWidth = textWidth;\r\n\t\t\twrapper.updateTransform();\r\n\t\t}\r\n\r\n\t\twrapper.styles = extend(wrapper.styles, styles);\r\n\t\tcss(wrapper.element, styles);\r\n\r\n\t\treturn wrapper;\r\n\t},\r\n\r\n\r\n\r\n\t/**\r\n\t * VML and useHTML method for calculating the bounding box based on offsets\r\n\t * @param {Boolean} refresh Whether to force a fresh value from the DOM or to\r\n\t * use the cached value\r\n\t *\r\n\t * @return {Object} A hash containing values for x, y, width and height\r\n\t */\r\n\r\n\thtmlGetBBox: function () {\r\n\t\tvar wrapper = this,\r\n\t\t\telement = wrapper.element,\r\n\t\t\tbBox = wrapper.bBox;\r\n\r\n\t\t// faking getBBox in exported SVG in legacy IE\r\n\t\tif (!bBox) {\r\n\t\t\t// faking getBBox in exported SVG in legacy IE (is this a duplicate of the fix for #1079?)\r\n\t\t\tif (element.nodeName === 'text') {\r\n\t\t\t\telement.style.position = ABSOLUTE;\r\n\t\t\t}\r\n\r\n\t\t\tbBox = wrapper.bBox = {\r\n\t\t\t\tx: element.offsetLeft,\r\n\t\t\t\ty: element.offsetTop,\r\n\t\t\t\twidth: element.offsetWidth,\r\n\t\t\t\theight: element.offsetHeight\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn bBox;\r\n\t},\r\n\r\n\t/**\r\n\t * VML override private method to update elements based on internal\r\n\t * properties based on SVG transform\r\n\t */\r\n\thtmlUpdateTransform: function () {\r\n\t\t// aligning non added elements is expensive\r\n\t\tif (!this.added) {\r\n\t\t\tthis.alignOnAdd = true;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar wrapper = this,\r\n\t\t\trenderer = wrapper.renderer,\r\n\t\t\telem = wrapper.element,\r\n\t\t\ttranslateX = wrapper.translateX || 0,\r\n\t\t\ttranslateY = wrapper.translateY || 0,\r\n\t\t\tx = wrapper.x || 0,\r\n\t\t\ty = wrapper.y || 0,\r\n\t\t\talign = wrapper.textAlign || 'left',\r\n\t\t\talignCorrection = { left: 0, center: 0.5, right: 1 }[align],\r\n\t\t\tnonLeft = align && align !== 'left',\r\n\t\t\tshadows = wrapper.shadows;\r\n\r\n\t\t// apply translate\r\n\t\tcss(elem, {\r\n\t\t\tmarginLeft: translateX,\r\n\t\t\tmarginTop: translateY\r\n\t\t});\r\n\t\tif (shadows) { // used in labels/tooltip\r\n\t\t\teach(shadows, function (shadow) {\r\n\t\t\t\tcss(shadow, {\r\n\t\t\t\t\tmarginLeft: translateX + 1,\r\n\t\t\t\t\tmarginTop: translateY + 1\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// apply inversion\r\n\t\tif (wrapper.inverted) { // wrapper is a group\r\n\t\t\teach(elem.childNodes, function (child) {\r\n\t\t\t\trenderer.invertChild(child, elem);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (elem.tagName === 'SPAN') {\r\n\r\n\t\t\tvar width, height,\r\n\t\t\t\trotation = wrapper.rotation,\r\n\t\t\t\tbaseline,\r\n\t\t\t\tradians = 0,\r\n\t\t\t\tcostheta = 1,\r\n\t\t\t\tsintheta = 0,\r\n\t\t\t\tquad,\r\n\t\t\t\ttextWidth = pInt(wrapper.textWidth),\r\n\t\t\t\txCorr = wrapper.xCorr || 0,\r\n\t\t\t\tyCorr = wrapper.yCorr || 0,\r\n\t\t\t\tcurrentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth].join(',');\r\n\r\n\t\t\tif (currentTextTransform !== wrapper.cTT) { // do the calculations and DOM access only if properties changed\r\n\r\n\t\t\t\tif (defined(rotation)) {\r\n\r\n\t\t\t\t\tradians = rotation * deg2rad; // deg to rad\r\n\t\t\t\t\tcostheta = mathCos(radians);\r\n\t\t\t\t\tsintheta = mathSin(radians);\r\n\r\n\t\t\t\t\twrapper.setSpanRotation(rotation, sintheta, costheta);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\twidth = pick(wrapper.elemWidth, elem.offsetWidth);\r\n\t\t\t\theight = pick(wrapper.elemHeight, elem.offsetHeight);\r\n\r\n\t\t\t\t// update textWidth\r\n\t\t\t\tif (width > textWidth && /[ \\-]/.test(elem.textContent || elem.innerText)) { // #983, #1254\r\n\t\t\t\t\tcss(elem, {\r\n\t\t\t\t\t\twidth: textWidth + PX,\r\n\t\t\t\t\t\tdisplay: 'block',\r\n\t\t\t\t\t\twhiteSpace: 'normal'\r\n\t\t\t\t\t});\r\n\t\t\t\t\twidth = textWidth;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// correct x and y\r\n\t\t\t\tbaseline = renderer.fontMetrics(elem.style.fontSize).b;\r\n\t\t\t\txCorr = costheta < 0 && -width;\r\n\t\t\t\tyCorr = sintheta < 0 && -height;\r\n\r\n\t\t\t\t// correct for baseline and corners spilling out after rotation\r\n\t\t\t\tquad = costheta * sintheta < 0;\r\n\t\t\t\txCorr += sintheta * baseline * (quad ? 1 - alignCorrection : alignCorrection);\r\n\t\t\t\tyCorr -= costheta * baseline * (rotation ? (quad ? alignCorrection : 1 - alignCorrection) : 1);\r\n\r\n\t\t\t\t// correct for the length/height of the text\r\n\t\t\t\tif (nonLeft) {\r\n\t\t\t\t\txCorr -= width * alignCorrection * (costheta < 0 ? -1 : 1);\r\n\t\t\t\t\tif (rotation) {\r\n\t\t\t\t\t\tyCorr -= height * alignCorrection * (sintheta < 0 ? -1 : 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcss(elem, {\r\n\t\t\t\t\t\ttextAlign: align\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// record correction\r\n\t\t\t\twrapper.xCorr = xCorr;\r\n\t\t\t\twrapper.yCorr = yCorr;\r\n\t\t\t}\r\n\r\n\t\t\t// apply position with correction\r\n\t\t\tcss(elem, {\r\n\t\t\t\tleft: (x + xCorr) + PX,\r\n\t\t\t\ttop: (y + yCorr) + PX\r\n\t\t\t});\r\n\r\n\t\t\t// force reflow in webkit to apply the left and top on useHTML element (#1249)\r\n\t\t\tif (isWebKit) {\r\n\t\t\t\theight = elem.offsetHeight; // assigned to height for JSLint purpose\r\n\t\t\t}\r\n\r\n\t\t\t// record current text transform\r\n\t\t\twrapper.cTT = currentTextTransform;\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Set the rotation of an individual HTML span\r\n\t */\r\n\tsetSpanRotation: function (rotation) {\r\n\t\tvar rotationStyle = {},\r\n\t\t\tcssTransformKey = isIE ? '-ms-transform' : isWebKit ? '-webkit-transform' : isFirefox ? 'MozTransform' : isOpera ? '-o-transform' : '';\r\n\r\n\t\trotationStyle[cssTransformKey] = rotationStyle.transform = 'rotate(' + rotation + 'deg)';\r\n\t\tcss(this.element, rotationStyle);\r\n\t},\r\n\r\n\t/**\r\n\t * Private method to update the transform attribute based on internal\r\n\t * properties\r\n\t */\r\n\tupdateTransform: function () {\r\n\t\tvar wrapper = this,\r\n\t\t\ttranslateX = wrapper.translateX || 0,\r\n\t\t\ttranslateY = wrapper.translateY || 0,\r\n\t\t\tscaleX = wrapper.scaleX,\r\n\t\t\tscaleY = wrapper.scaleY,\r\n\t\t\tinverted = wrapper.inverted,\r\n\t\t\trotation = wrapper.rotation,\r\n\t\t\ttransform;\r\n\r\n\t\t// flipping affects translate as adjustment for flipping around the group's axis\r\n\t\tif (inverted) {\r\n\t\t\ttranslateX += wrapper.attr('width');\r\n\t\t\ttranslateY += wrapper.attr('height');\r\n\t\t}\r\n\r\n\t\t// Apply translate. Nearly all transformed elements have translation, so instead\r\n\t\t// of checking for translate = 0, do it always (#1767, #1846).\r\n\t\ttransform = ['translate(' + translateX + ',' + translateY + ')'];\r\n\r\n\t\t// apply rotation\r\n\t\tif (inverted) {\r\n\t\t\ttransform.push('rotate(90) scale(-1,1)');\r\n\t\t} else if (rotation) { // text rotation\r\n\t\t\ttransform.push('rotate(' + rotation + ' ' + (wrapper.x || 0) + ' ' + (wrapper.y || 0) + ')');\r\n\t\t}\r\n\r\n\t\t// apply scale\r\n\t\tif (defined(scaleX) || defined(scaleY)) {\r\n\t\t\ttransform.push('scale(' + pick(scaleX, 1) + ' ' + pick(scaleY, 1) + ')');\r\n\t\t}\r\n\r\n\t\tif (transform.length) {\r\n\t\t\tattr(wrapper.element, 'transform', transform.join(' '));\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * Bring the element to the front\r\n\t */\r\n\ttoFront: function () {\r\n\t\tvar element = this.element;\r\n\t\telement.parentNode.appendChild(element);\r\n\t\treturn this;\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Break down alignment options like align, verticalAlign, x and y\r\n\t * to x and y relative to the chart.\r\n\t *\r\n\t * @param {Object} alignOptions\r\n\t * @param {Boolean} alignByTranslate\r\n\t * @param {String[Object} box The box to align to, needs a width and height. When the\r\n\t * box is a string, it refers to an object in the Renderer. For example, when\r\n\t * box is 'spacingBox', it refers to Renderer.spacingBox which holds width, height\r\n\t * x and y properties.\r\n\t *\r\n\t */\r\n\talign: function (alignOptions, alignByTranslate, box) {\r\n\t\tvar align,\r\n\t\t\tvAlign,\r\n\t\t\tx,\r\n\t\t\ty,\r\n\t\t\tattribs = {},\r\n\t\t\talignTo,\r\n\t\t\trenderer = this.renderer,\r\n\t\t\talignedObjects = renderer.alignedObjects;\r\n\r\n\t\t// First call on instanciate\r\n\t\tif (alignOptions) {\r\n\t\t\tthis.alignOptions = alignOptions;\r\n\t\t\tthis.alignByTranslate = alignByTranslate;\r\n\t\t\tif (!box || isString(box)) { // boxes other than renderer handle this internally\r\n\t\t\t\tthis.alignTo = alignTo = box || 'renderer';\r\n\t\t\t\terase(alignedObjects, this); // prevent duplicates, like legendGroup after resize\r\n\t\t\t\talignedObjects.push(this);\r\n\t\t\t\tbox = null; // reassign it below\r\n\t\t\t}\r\n\r\n\t\t// When called on resize, no arguments are supplied\r\n\t\t} else {\r\n\t\t\talignOptions = this.alignOptions;\r\n\t\t\talignByTranslate = this.alignByTranslate;\r\n\t\t\talignTo = this.alignTo;\r\n\t\t}\r\n\r\n\t\tbox = pick(box, renderer[alignTo], renderer);\r\n\r\n\t\t// Assign variables\r\n\t\talign = alignOptions.align;\r\n\t\tvAlign = alignOptions.verticalAlign;\r\n\t\tx = (box.x || 0) + (alignOptions.x || 0); // default: left align\r\n\t\ty = (box.y || 0) + (alignOptions.y || 0); // default: top align\r\n\r\n\t\t// Align\r\n\t\tif (align === 'right' || align === 'center') {\r\n\t\t\tx += (box.width - (alignOptions.width || 0)) /\r\n\t\t\t\t\t{ right: 1, center: 2 }[align];\r\n\t\t}\r\n\t\tattribs[alignByTranslate ? 'translateX' : 'x'] = mathRound(x);\r\n\r\n\r\n\t\t// Vertical align\r\n\t\tif (vAlign === 'bottom' || vAlign === 'middle') {\r\n\t\t\ty += (box.height - (alignOptions.height || 0)) /\r\n\t\t\t\t\t({ bottom: 1, middle: 2 }[vAlign] || 1);\r\n\r\n\t\t}\r\n\t\tattribs[alignByTranslate ? 'translateY' : 'y'] = mathRound(y);\r\n\r\n\t\t// Animate only if already placed\r\n\t\tthis[this.placed ? 'animate' : 'attr'](attribs);\r\n\t\tthis.placed = true;\r\n\t\tthis.alignAttr = attribs;\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * Get the bounding box (width, height, x and y) for the element\r\n\t */\r\n\tgetBBox: function () {\r\n\t\tvar wrapper = this,\r\n\t\t\tbBox = wrapper.bBox,\r\n\t\t\trenderer = wrapper.renderer,\r\n\t\t\twidth,\r\n\t\t\theight,\r\n\t\t\trotation = wrapper.rotation,\r\n\t\t\telement = wrapper.element,\r\n\t\t\tstyles = wrapper.styles,\r\n\t\t\trad = rotation * deg2rad;\r\n\r\n\t\tif (!bBox) {\r\n\t\t\t// SVG elements\r\n\t\t\tif (element.namespaceURI === SVG_NS || renderer.forExport) {\r\n\t\t\t\ttry { // Fails in Firefox if the container has display: none.\r\n\r\n\t\t\t\t\tbBox = element.getBBox ?\r\n\t\t\t\t\t\t// SVG: use extend because IE9 is not allowed to change width and height in case\r\n\t\t\t\t\t\t// of rotation (below)\r\n\t\t\t\t\t\textend({}, element.getBBox()) :\r\n\t\t\t\t\t\t// Canvas renderer and legacy IE in export mode\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\twidth: element.offsetWidth,\r\n\t\t\t\t\t\t\theight: element.offsetHeight\r\n\t\t\t\t\t\t};\r\n\t\t\t\t} catch (e) {}\r\n\r\n\t\t\t\t// If the bBox is not set, the try-catch block above failed. The other condition\r\n\t\t\t\t// is for Opera that returns a width of -Infinity on hidden elements.\r\n\t\t\t\tif (!bBox || bBox.width < 0) {\r\n\t\t\t\t\tbBox = { width: 0, height: 0 };\r\n\t\t\t\t}\r\n\r\n\r\n\t\t\t// VML Renderer or useHTML within SVG\r\n\t\t\t} else {\r\n\r\n\t\t\t\tbBox = wrapper.htmlGetBBox();\r\n\r\n\t\t\t}\r\n\r\n\t\t\t// True SVG elements as well as HTML elements in modern browsers using the .useHTML option\r\n\t\t\t// need to compensated for rotation\r\n\t\t\tif (renderer.isSVG) {\r\n\t\t\t\twidth = bBox.width;\r\n\t\t\t\theight = bBox.height;\r\n\r\n\t\t\t\t// Workaround for wrong bounding box in IE9 and IE10 (#1101, #1505, #1669)\r\n\t\t\t\tif (isIE && styles && styles.fontSize === '11px' && height.toPrecision(3) === '22.7') {\r\n\t\t\t\t\tbBox.height = height = 14;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Adjust for rotated text\r\n\t\t\t\tif (rotation) {\r\n\t\t\t\t\tbBox.width = mathAbs(height * mathSin(rad)) + mathAbs(width * mathCos(rad));\r\n\t\t\t\t\tbBox.height = mathAbs(height * mathCos(rad)) + mathAbs(width * mathSin(rad));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\twrapper.bBox = bBox;\r\n\t\t}\r\n\t\treturn bBox;\r\n\t},\r\n\r\n\t/**\r\n\t * Show the element\r\n\t */\r\n\tshow: function () {\r\n\t\treturn this.attr({ visibility: VISIBLE });\r\n\t},\r\n\r\n\t/**\r\n\t * Hide the element\r\n\t */\r\n\thide: function () {\r\n\t\treturn this.attr({ visibility: HIDDEN });\r\n\t},\r\n\r\n\tfadeOut: function (duration) {\r\n\t\tvar elemWrapper = this;\r\n\t\telemWrapper.animate({\r\n\t\t\topacity: 0\r\n\t\t}, {\r\n\t\t\tduration: duration || 150,\r\n\t\t\tcomplete: function () {\r\n\t\t\t\telemWrapper.hide();\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Add the element\r\n\t * @param {Object|Undefined} parent Can be an element, an element wrapper or undefined\r\n\t * to append the element to the renderer.box.\r\n\t */\r\n\tadd: function (parent) {\r\n\r\n\t\tvar renderer = this.renderer,\r\n\t\t\tparentWrapper = parent || renderer,\r\n\t\t\tparentNode = parentWrapper.element || renderer.box,\r\n\t\t\tchildNodes = parentNode.childNodes,\r\n\t\t\telement = this.element,\r\n\t\t\tzIndex = attr(element, 'zIndex'),\r\n\t\t\totherElement,\r\n\t\t\totherZIndex,\r\n\t\t\ti,\r\n\t\t\tinserted;\r\n\r\n\t\tif (parent) {\r\n\t\t\tthis.parentGroup = parent;\r\n\t\t}\r\n\r\n\t\t// mark as inverted\r\n\t\tthis.parentInverted = parent && parent.inverted;\r\n\r\n\t\t// build formatted text\r\n\t\tif (this.textStr !== undefined) {\r\n\t\t\trenderer.buildText(this);\r\n\t\t}\r\n\r\n\t\t// mark the container as having z indexed children\r\n\t\tif (zIndex) {\r\n\t\t\tparentWrapper.handleZ = true;\r\n\t\t\tzIndex = pInt(zIndex);\r\n\t\t}\r\n\r\n\t\t// insert according to this and other elements' zIndex\r\n\t\tif (parentWrapper.handleZ) { // this element or any of its siblings has a z index\r\n\t\t\tfor (i = 0; i < childNodes.length; i++) {\r\n\t\t\t\totherElement = childNodes[i];\r\n\t\t\t\totherZIndex = attr(otherElement, 'zIndex');\r\n\t\t\t\tif (otherElement !== element && (\r\n\t\t\t\t\t\t// insert before the first element with a higher zIndex\r\n\t\t\t\t\t\tpInt(otherZIndex) > zIndex ||\r\n\t\t\t\t\t\t// if no zIndex given, insert before the first element with a zIndex\r\n\t\t\t\t\t\t(!defined(zIndex) && defined(otherZIndex))\r\n\r\n\t\t\t\t\t\t)) {\r\n\t\t\t\t\tparentNode.insertBefore(element, otherElement);\r\n\t\t\t\t\tinserted = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// default: append at the end\r\n\t\tif (!inserted) {\r\n\t\t\tparentNode.appendChild(element);\r\n\t\t}\r\n\r\n\t\t// mark as added\r\n\t\tthis.added = true;\r\n\r\n\t\t// fire an event for internal hooks\r\n\t\tfireEvent(this, 'add');\r\n\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * Removes a child either by removeChild or move to garbageBin.\r\n\t * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.\r\n\t */\r\n\tsafeRemoveChild: function (element) {\r\n\t\tvar parentNode = element.parentNode;\r\n\t\tif (parentNode) {\r\n\t\t\tparentNode.removeChild(element);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Destroy the element and element wrapper\r\n\t */\r\n\tdestroy: function () {\r\n\t\tvar wrapper = this,\r\n\t\t\telement = wrapper.element || {},\r\n\t\t\tshadows = wrapper.shadows,\r\n\t\t\tparentToClean = wrapper.renderer.isSVG && element.nodeName === 'SPAN' && wrapper.parentGroup,\r\n\t\t\tgrandParent,\r\n\t\t\tkey,\r\n\t\t\ti;\r\n\r\n\t\t// remove events\r\n\t\telement.onclick = element.onmouseout = element.onmouseover = element.onmousemove = element.point = null;\r\n\t\tstop(wrapper); // stop running animations\r\n\r\n\t\tif (wrapper.clipPath) {\r\n\t\t\twrapper.clipPath = wrapper.clipPath.destroy();\r\n\t\t}\r\n\r\n\t\t// Destroy stops in case this is a gradient object\r\n\t\tif (wrapper.stops) {\r\n\t\t\tfor (i = 0; i < wrapper.stops.length; i++) {\r\n\t\t\t\twrapper.stops[i] = wrapper.stops[i].destroy();\r\n\t\t\t}\r\n\t\t\twrapper.stops = null;\r\n\t\t}\r\n\r\n\t\t// remove element\r\n\t\twrapper.safeRemoveChild(element);\r\n\r\n\t\t// destroy shadows\r\n\t\tif (shadows) {\r\n\t\t\teach(shadows, function (shadow) {\r\n\t\t\t\twrapper.safeRemoveChild(shadow);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// In case of useHTML, clean up empty containers emulating SVG groups (#1960, #2393).\r\n\t\twhile (parentToClean && parentToClean.div.childNodes.length === 0) {\r\n\t\t\tgrandParent = parentToClean.parentGroup;\r\n\t\t\twrapper.safeRemoveChild(parentToClean.div);\r\n\t\t\tdelete parentToClean.div;\r\n\t\t\tparentToClean = grandParent;\r\n\t\t}\r\n\r\n\t\t// remove from alignObjects\r\n\t\tif (wrapper.alignTo) {\r\n\t\t\terase(wrapper.renderer.alignedObjects, wrapper);\r\n\t\t}\r\n\r\n\t\tfor (key in wrapper) {\r\n\t\t\tdelete wrapper[key];\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t},\r\n\r\n\t/**\r\n\t * Add a shadow to the element. Must be done after the element is added to the DOM\r\n\t * @param {Boolean|Object} shadowOptions\r\n\t */\r\n\tshadow: function (shadowOptions, group, cutOff) {\r\n\t\tvar shadows = [],\r\n\t\t\ti,\r\n\t\t\tshadow,\r\n\t\t\telement = this.element,\r\n\t\t\tstrokeWidth,\r\n\t\t\tshadowWidth,\r\n\t\t\tshadowElementOpacity,\r\n\r\n\t\t\t// compensate for inverted plot area\r\n\t\t\ttransform;\r\n\r\n\r\n\t\tif (shadowOptions) {\r\n\t\t\tshadowWidth = pick(shadowOptions.width, 3);\r\n\t\t\tshadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;\r\n\t\t\ttransform = this.parentInverted ?\r\n\t\t\t\t'(-1,-1)' :\r\n\t\t\t\t'(' + pick(shadowOptions.offsetX, 1) + ', ' + pick(shadowOptions.offsetY, 1) + ')';\r\n\t\t\tfor (i = 1; i <= shadowWidth; i++) {\r\n\t\t\t\tshadow = element.cloneNode(0);\r\n\t\t\t\tstrokeWidth = (shadowWidth * 2) + 1 - (2 * i);\r\n\t\t\t\tattr(shadow, {\r\n\t\t\t\t\t'isShadow': 'true',\r\n\t\t\t\t\t'stroke': shadowOptions.color || 'black',\r\n\t\t\t\t\t'stroke-opacity': shadowElementOpacity * i,\r\n\t\t\t\t\t'stroke-width': strokeWidth,\r\n\t\t\t\t\t'transform': 'translate' + transform,\r\n\t\t\t\t\t'fill': NONE\r\n\t\t\t\t});\r\n\t\t\t\tif (cutOff) {\r\n\t\t\t\t\tattr(shadow, 'height', mathMax(attr(shadow, 'height') - strokeWidth, 0));\r\n\t\t\t\t\tshadow.cutHeight = strokeWidth;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (group) {\r\n\t\t\t\t\tgroup.element.appendChild(shadow);\r\n\t\t\t\t} else {\r\n\t\t\t\t\telement.parentNode.insertBefore(shadow, element);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tshadows.push(shadow);\r\n\t\t\t}\r\n\r\n\t\t\tthis.shadows = shadows;\r\n\t\t}\r\n\t\treturn this;\r\n\r\n\t}\r\n};\r\n\r\n\r\n/**\r\n * The default SVG renderer\r\n */\r\nvar SVGRenderer = function () {\r\n\tthis.init.apply(this, arguments);\r\n};\r\nSVGRenderer.prototype = {\r\n\tElement: SVGElement,\r\n\r\n\t/**\r\n\t * Initialize the SVGRenderer\r\n\t * @param {Object} container\r\n\t * @param {Number} width\r\n\t * @param {Number} height\r\n\t * @param {Boolean} forExport\r\n\t */\r\n\tinit: function (container, width, height, forExport) {\r\n\t\tvar renderer = this,\r\n\t\t\tloc = location,\r\n\t\t\tboxWrapper,\r\n\t\t\telement,\r\n\t\t\tdesc;\r\n\r\n\t\tboxWrapper = renderer.createElement('svg')\r\n\t\t\t.attr({\r\n\t\t\t\tversion: '1.1'\r\n\t\t\t});\r\n\t\telement = boxWrapper.element;\r\n\t\tcontainer.appendChild(element);\r\n\r\n\t\t// For browsers other than IE, add the namespace attribute (#1978)\r\n\t\tif (container.innerHTML.indexOf('xmlns') === -1) {\r\n\t\t\tattr(element, 'xmlns', SVG_NS);\r\n\t\t}\r\n\r\n\t\t// object properties\r\n\t\trenderer.isSVG = true;\r\n\t\trenderer.box = element;\r\n\t\trenderer.boxWrapper = boxWrapper;\r\n\t\trenderer.alignedObjects = [];\r\n\r\n\t\t// Page url used for internal references. #24, #672, #1070\r\n\t\trenderer.url = (isFirefox || isWebKit) && doc.getElementsByTagName('base').length ?\r\n\t\t\tloc.href\r\n\t\t\t\t.replace(/#.*?$/, '') // remove the hash\r\n\t\t\t\t.replace(/([\\('\\)])/g, '\\\\$1') // escape parantheses and quotes\r\n\t\t\t\t.replace(/ /g, '%20') : // replace spaces (needed for Safari only)\r\n\t\t\t'';\r\n\r\n\t\t// Add description\r\n\t\tdesc = this.createElement('desc').add();\r\n\t\tdesc.element.appendChild(doc.createTextNode('Created with ' + PRODUCT + ' ' + VERSION));\r\n\r\n\r\n\t\trenderer.defs = this.createElement('defs').add();\r\n\t\trenderer.forExport = forExport;\r\n\t\trenderer.gradients = {}; // Object where gradient SvgElements are stored\r\n\r\n\t\trenderer.setSize(width, height, false);\r\n\r\n\r\n\r\n\t\t// Issue 110 workaround:\r\n\t\t// In Firefox, if a div is positioned by percentage, its pixel position may land\r\n\t\t// between pixels. The container itself doesn't display this, but an SVG element\r\n\t\t// inside this container will be drawn at subpixel precision. In order to draw\r\n\t\t// sharp lines, this must be compensated for. This doesn't seem to work inside\r\n\t\t// iframes though (like in jsFiddle).\r\n\t\tvar subPixelFix, rect;\r\n\t\tif (isFirefox && container.getBoundingClientRect) {\r\n\t\t\trenderer.subPixelFix = subPixelFix = function () {\r\n\t\t\t\tcss(container, { left: 0, top: 0 });\r\n\t\t\t\trect = container.getBoundingClientRect();\r\n\t\t\t\tcss(container, {\r\n\t\t\t\t\tleft: (mathCeil(rect.left) - rect.left) + PX,\r\n\t\t\t\t\ttop: (mathCeil(rect.top) - rect.top) + PX\r\n\t\t\t\t});\r\n\t\t\t};\r\n\r\n\t\t\t// run the fix now\r\n\t\t\tsubPixelFix();\r\n\r\n\t\t\t// run it on resize\r\n\t\t\taddEvent(win, 'resize', subPixelFix);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Detect whether the renderer is hidden. This happens when one of the parent elements\r\n\t * has display: none. #608.\r\n\t */\r\n\tisHidden: function () {\r\n\t\treturn !this.boxWrapper.getBBox().width;\r\n\t},\r\n\r\n\t/**\r\n\t * Destroys the renderer and its allocated members.\r\n\t */\r\n\tdestroy: function () {\r\n\t\tvar renderer = this,\r\n\t\t\trendererDefs = renderer.defs;\r\n\t\trenderer.box = null;\r\n\t\trenderer.boxWrapper = renderer.boxWrapper.destroy();\r\n\r\n\t\t// Call destroy on all gradient elements\r\n\t\tdestroyObjectProperties(renderer.gradients || {});\r\n\t\trenderer.gradients = null;\r\n\r\n\t\t// Defs are null in VMLRenderer\r\n\t\t// Otherwise, destroy them here.\r\n\t\tif (rendererDefs) {\r\n\t\t\trenderer.defs = rendererDefs.destroy();\r\n\t\t}\r\n\r\n\t\t// Remove sub pixel fix handler\r\n\t\t// We need to check that there is a handler, otherwise all functions that are registered for event 'resize' are removed\r\n\t\t// See issue #982\r\n\t\tif (renderer.subPixelFix) {\r\n\t\t\tremoveEvent(win, 'resize', renderer.subPixelFix);\r\n\t\t}\r\n\r\n\t\trenderer.alignedObjects = null;\r\n\r\n\t\treturn null;\r\n\t},\r\n\r\n\t/**\r\n\t * Create a wrapper for an SVG element\r\n\t * @param {Object} nodeName\r\n\t */\r\n\tcreateElement: function (nodeName) {\r\n\t\tvar wrapper = new this.Element();\r\n\t\twrapper.init(this, nodeName);\r\n\t\treturn wrapper;\r\n\t},\r\n\r\n\t/**\r\n\t * Dummy function for use in canvas renderer\r\n\t */\r\n\tdraw: function () {},\r\n\r\n\t/**\r\n\t * Parse a simple HTML string into SVG tspans\r\n\t *\r\n\t * @param {Object} textNode The parent text SVG node\r\n\t */\r\n\tbuildText: function (wrapper) {\r\n\t\tvar textNode = wrapper.element,\r\n\t\t\trenderer = this,\r\n\t\t\tforExport = renderer.forExport,\r\n\t\t\tlines = pick(wrapper.textStr, '').toString()\r\n\t\t\t\t.replace(/<(b|strong)>/g, '<span style=\"font-weight:bold\">')\r\n\t\t\t\t.replace(/<(i|em)>/g, '<span style=\"font-style:italic\">')\r\n\t\t\t\t.replace(/<a/g, '<span')\r\n\t\t\t\t.replace(/<\\/(b|strong|i|em|a)>/g, '</span>')\r\n\t\t\t\t.split(/<br.*?>/g),\r\n\t\t\tchildNodes = textNode.childNodes,\r\n\t\t\tstyleRegex = /style=\"([^\"]+)\"/,\r\n\t\t\threfRegex = /href=\"(http[^\"]+)\"/,\r\n\t\t\tparentX = attr(textNode, 'x'),\r\n\t\t\ttextStyles = wrapper.styles,\r\n\t\t\twidth = wrapper.textWidth,\r\n\t\t\ttextLineHeight = textStyles && textStyles.lineHeight,\r\n\t\t\ti = childNodes.length;\r\n\r\n\t\t/// remove old text\r\n\t\twhile (i--) {\r\n\t\t\ttextNode.removeChild(childNodes[i]);\r\n\t\t}\r\n\r\n\t\tif (width && !wrapper.added) {\r\n\t\t\tthis.box.appendChild(textNode); // attach it to the DOM to read offset width\r\n\t\t}\r\n\r\n\t\t// remove empty line at end\r\n\t\tif (lines[lines.length - 1] === '') {\r\n\t\t\tlines.pop();\r\n\t\t}\r\n\r\n\t\t// build the lines\r\n\t\teach(lines, function (line, lineNo) {\r\n\t\t\tvar spans, spanNo = 0;\r\n\r\n\t\t\tline = line.replace(/<span/g, '|||<span').replace(/<\\/span>/g, '</span>|||');\r\n\t\t\tspans = line.split('|||');\r\n\r\n\t\t\teach(spans, function (span) {\r\n\t\t\t\tif (span !== '' || spans.length === 1) {\r\n\t\t\t\t\tvar attributes = {},\r\n\t\t\t\t\t\ttspan = doc.createElementNS(SVG_NS, 'tspan'),\r\n\t\t\t\t\t\tspanStyle; // #390\r\n\t\t\t\t\tif (styleRegex.test(span)) {\r\n\t\t\t\t\t\tspanStyle = span.match(styleRegex)[1].replace(/(;| |^)color([ :])/, '$1fill$2');\r\n\t\t\t\t\t\tattr(tspan, 'style', spanStyle);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (hrefRegex.test(span) && !forExport) { // Not for export - #1529\r\n\t\t\t\t\t\tattr(tspan, 'onclick', 'location.href=\\\"' + span.match(hrefRegex)[1] + '\\\"');\r\n\t\t\t\t\t\tcss(tspan, { cursor: 'pointer' });\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tspan = (span.replace(/<(.|\\n)*?>/g, '') || ' ')\r\n\t\t\t\t\t\t.replace(/</g, '<')\r\n\t\t\t\t\t\t.replace(/>/g, '>');\r\n\r\n\t\t\t\t\t// Nested tags aren't supported, and cause crash in Safari (#1596)\r\n\t\t\t\t\tif (span !== ' ') {\r\n\r\n\t\t\t\t\t\t// add the text node\r\n\t\t\t\t\t\ttspan.appendChild(doc.createTextNode(span));\r\n\r\n\t\t\t\t\t\tif (!spanNo) { // first span in a line, align it to the left\r\n\t\t\t\t\t\t\tattributes.x = parentX;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tattributes.dx = 0; // #16\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// add attributes\r\n\t\t\t\t\t\tattr(tspan, attributes);\r\n\r\n\t\t\t\t\t\t// first span on subsequent line, add the line height\r\n\t\t\t\t\t\tif (!spanNo && lineNo) {\r\n\r\n\t\t\t\t\t\t\t// allow getting the right offset height in exporting in IE\r\n\t\t\t\t\t\t\tif (!hasSVG && forExport) {\r\n\t\t\t\t\t\t\t\tcss(tspan, { display: 'block' });\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t// Set the line height based on the font size of either\r\n\t\t\t\t\t\t\t// the text element or the tspan element\r\n\t\t\t\t\t\t\tattr(\r\n\t\t\t\t\t\t\t\ttspan,\r\n\t\t\t\t\t\t\t\t'dy',\r\n\t\t\t\t\t\t\t\ttextLineHeight || renderer.fontMetrics(\r\n\t\t\t\t\t\t\t\t\t/px$/.test(tspan.style.fontSize) ?\r\n\t\t\t\t\t\t\t\t\t\ttspan.style.fontSize :\r\n\t\t\t\t\t\t\t\t\t\ttextStyles.fontSize\r\n\t\t\t\t\t\t\t\t).h,\r\n\t\t\t\t\t\t\t\t// Safari 6.0.2 - too optimized for its own good (#1539)\r\n\t\t\t\t\t\t\t\t// TODO: revisit this with future versions of Safari\r\n\t\t\t\t\t\t\t\tisWebKit && tspan.offsetHeight\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Append it\r\n\t\t\t\t\t\ttextNode.appendChild(tspan);\r\n\r\n\t\t\t\t\t\tspanNo++;\r\n\r\n\t\t\t\t\t\t// check width and apply soft breaks\r\n\t\t\t\t\t\tif (width) {\r\n\t\t\t\t\t\t\tvar words = span.replace(/([^\\^])-/g, '$1- ').split(' '), // #1273\r\n\t\t\t\t\t\t\t\ttooLong,\r\n\t\t\t\t\t\t\t\tactualWidth,\r\n\t\t\t\t\t\t\t\tclipHeight = wrapper._clipHeight,\r\n\t\t\t\t\t\t\t\trest = [],\r\n\t\t\t\t\t\t\t\tdy = pInt(textLineHeight || 16),\r\n\t\t\t\t\t\t\t\tsoftLineNo = 1,\r\n\t\t\t\t\t\t\t\tbBox;\r\n\r\n\t\t\t\t\t\t\twhile (words.length || rest.length) {\r\n\t\t\t\t\t\t\t\tdelete wrapper.bBox; // delete cache\r\n\t\t\t\t\t\t\t\tbBox = wrapper.getBBox();\r\n\t\t\t\t\t\t\t\tactualWidth = bBox.width;\r\n\r\n\t\t\t\t\t\t\t\t// Old IE cannot measure the actualWidth for SVG elements (#2314)\r\n\t\t\t\t\t\t\t\tif (!hasSVG && renderer.forExport) {\r\n\t\t\t\t\t\t\t\t\tactualWidth = renderer.measureSpanWidth(tspan.firstChild.data, wrapper.styles);\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\ttooLong = actualWidth > width;\r\n\t\t\t\t\t\t\t\tif (!tooLong || words.length === 1) { // new line needed\r\n\t\t\t\t\t\t\t\t\twords = rest;\r\n\t\t\t\t\t\t\t\t\trest = [];\r\n\t\t\t\t\t\t\t\t\tif (words.length) {\r\n\t\t\t\t\t\t\t\t\t\tsoftLineNo++;\r\n\r\n\t\t\t\t\t\t\t\t\t\tif (clipHeight && softLineNo * dy > clipHeight) {\r\n\t\t\t\t\t\t\t\t\t\t\twords = ['...'];\r\n\t\t\t\t\t\t\t\t\t\t\twrapper.attr('title', wrapper.textStr);\r\n\t\t\t\t\t\t\t\t\t\t} else {\r\n\r\n\t\t\t\t\t\t\t\t\t\t\ttspan = doc.createElementNS(SVG_NS, 'tspan');\r\n\t\t\t\t\t\t\t\t\t\t\tattr(tspan, {\r\n\t\t\t\t\t\t\t\t\t\t\t\tdy: dy,\r\n\t\t\t\t\t\t\t\t\t\t\t\tx: parentX\r\n\t\t\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\t\t\tif (spanStyle) { // #390\r\n\t\t\t\t\t\t\t\t\t\t\t\tattr(tspan, 'style', spanStyle);\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\ttextNode.appendChild(tspan);\r\n\r\n\t\t\t\t\t\t\t\t\t\t\tif (actualWidth > width) { // a single word is pressing it out\r\n\t\t\t\t\t\t\t\t\t\t\t\twidth = actualWidth;\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t} else { // append to existing line tspan\r\n\t\t\t\t\t\t\t\t\ttspan.removeChild(tspan.firstChild);\r\n\t\t\t\t\t\t\t\t\trest.unshift(words.pop());\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\tif (words.length) {\r\n\t\t\t\t\t\t\t\t\ttspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-')));\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Create a button with preset states\r\n\t * @param {String} text\r\n\t * @param {Number} x\r\n\t * @param {Number} y\r\n\t * @param {Function} callback\r\n\t * @param {Object} normalState\r\n\t * @param {Object} hoverState\r\n\t * @param {Object} pressedState\r\n\t */\r\n\tbutton: function (text, x, y, callback, normalState, hoverState, pressedState, disabledState, shape) {\r\n\t\tvar label = this.label(text, x, y, shape, null, null, null, null, 'button'),\r\n\t\t\tcurState = 0,\r\n\t\t\tstateOptions,\r\n\t\t\tstateStyle,\r\n\t\t\tnormalStyle,\r\n\t\t\thoverStyle,\r\n\t\t\tpressedStyle,\r\n\t\t\tdisabledStyle,\r\n\t\t\tSTYLE = 'style',\r\n\t\t\tverticalGradient = { x1: 0, y1: 0, x2: 0, y2: 1 };\r\n\r\n\t\t// Normal state - prepare the attributes\r\n\t\tnormalState = merge({\r\n\t\t\t'stroke-width': 1,\r\n\t\t\tstroke: '#CCCCCC',\r\n\t\t\tfill: {\r\n\t\t\t\tlinearGradient: verticalGradient,\r\n\t\t\t\tstops: [\r\n\t\t\t\t\t[0, '#FEFEFE'],\r\n\t\t\t\t\t[1, '#F6F6F6']\r\n\t\t\t\t]\r\n\t\t\t},\r\n\t\t\tr: 2,\r\n\t\t\tpadding: 5,\r\n\t\t\tstyle: {\r\n\t\t\t\tcolor: 'black'\r\n\t\t\t}\r\n\t\t}, normalState);\r\n\t\tnormalStyle = normalState[STYLE];\r\n\t\tdelete normalState[STYLE];\r\n\r\n\t\t// Hover state\r\n\t\thoverState = merge(normalState, {\r\n\t\t\tstroke: '#68A',\r\n\t\t\tfill: {\r\n\t\t\t\tlinearGradient: verticalGradient,\r\n\t\t\t\tstops: [\r\n\t\t\t\t\t[0, '#FFF'],\r\n\t\t\t\t\t[1, '#ACF']\r\n\t\t\t\t]\r\n\t\t\t}\r\n\t\t}, hoverState);\r\n\t\thoverStyle = hoverState[STYLE];\r\n\t\tdelete hoverState[STYLE];\r\n\r\n\t\t// Pressed state\r\n\t\tpressedState = merge(normalState, {\r\n\t\t\tstroke: '#68A',\r\n\t\t\tfill: {\r\n\t\t\t\tlinearGradient: verticalGradient,\r\n\t\t\t\tstops: [\r\n\t\t\t\t\t[0, '#9BD'],\r\n\t\t\t\t\t[1, '#CDF']\r\n\t\t\t\t]\r\n\t\t\t}\r\n\t\t}, pressedState);\r\n\t\tpressedStyle = pressedState[STYLE];\r\n\t\tdelete pressedState[STYLE];\r\n\r\n\t\t// Disabled state\r\n\t\tdisabledState = merge(normalState, {\r\n\t\t\tstyle: {\r\n\t\t\t\tcolor: '#CCC'\r\n\t\t\t}\r\n\t\t}, disabledState);\r\n\t\tdisabledStyle = disabledState[STYLE];\r\n\t\tdelete disabledState[STYLE];\r\n\r\n\t\t// Add the events. IE9 and IE10 need mouseover and mouseout to funciton (#667).\r\n\t\taddEvent(label.element, isIE ? 'mouseover' : 'mouseenter', function () {\r\n\t\t\tif (curState !== 3) {\r\n\t\t\t\tlabel.attr(hoverState)\r\n\t\t\t\t\t.css(hoverStyle);\r\n\t\t\t}\r\n\t\t});\r\n\t\taddEvent(label.element, isIE ? 'mouseout' : 'mouseleave', function () {\r\n\t\t\tif (curState !== 3) {\r\n\t\t\t\tstateOptions = [normalState, hoverState, pressedState][curState];\r\n\t\t\t\tstateStyle = [normalStyle, hoverStyle, pressedStyle][curState];\r\n\t\t\t\tlabel.attr(stateOptions)\r\n\t\t\t\t\t.css(stateStyle);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tlabel.setState = function (state) {\r\n\t\t\tlabel.state = curState = state;\r\n\t\t\tif (!state) {\r\n\t\t\t\tlabel.attr(normalState)\r\n\t\t\t\t\t.css(normalStyle);\r\n\t\t\t} else if (state === 2) {\r\n\t\t\t\tlabel.attr(pressedState)\r\n\t\t\t\t\t.css(pressedStyle);\r\n\t\t\t} else if (state === 3) {\r\n\t\t\t\tlabel.attr(disabledState)\r\n\t\t\t\t\t.css(disabledStyle);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treturn label\r\n\t\t\t.on('click', function () {\r\n\t\t\t\tif (curState !== 3) {\r\n\t\t\t\t\tcallback.call(label);\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.attr(normalState)\r\n\t\t\t.css(extend({ cursor: 'default' }, normalStyle));\r\n\t},\r\n\r\n\t/**\r\n\t * Make a straight line crisper by not spilling out to neighbour pixels\r\n\t * @param {Array} points\r\n\t * @param {Number} width\r\n\t */\r\n\tcrispLine: function (points, width) {\r\n\t\t// points format: [M, 0, 0, L, 100, 0]\r\n\t\t// normalize to a crisp line\r\n\t\tif (points[1] === points[4]) {\r\n\t\t\t// Substract due to #1129. Now bottom and left axis gridlines behave the same.\r\n\t\t\tpoints[1] = points[4] = mathRound(points[1]) - (width % 2 / 2);\r\n\t\t}\r\n\t\tif (points[2] === points[5]) {\r\n\t\t\tpoints[2] = points[5] = mathRound(points[2]) + (width % 2 / 2);\r\n\t\t}\r\n\t\treturn points;\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Draw a path\r\n\t * @param {Array} path An SVG path in array form\r\n\t */\r\n\tpath: function (path) {\r\n\t\tvar attr = {\r\n\t\t\tfill: NONE\r\n\t\t};\r\n\t\tif (isArray(path)) {\r\n\t\t\tattr.d = path;\r\n\t\t} else if (isObject(path)) { // attributes\r\n\t\t\textend(attr, path);\r\n\t\t}\r\n\t\treturn this.createElement('path').attr(attr);\r\n\t},\r\n\r\n\t/**\r\n\t * Draw and return an SVG circle\r\n\t * @param {Number} x The x position\r\n\t * @param {Number} y The y position\r\n\t * @param {Number} r The radius\r\n\t */\r\n\tcircle: function (x, y, r) {\r\n\t\tvar attr = isObject(x) ?\r\n\t\t\tx :\r\n\t\t\t{\r\n\t\t\t\tx: x,\r\n\t\t\t\ty: y,\r\n\t\t\t\tr: r\r\n\t\t\t};\r\n\r\n\t\treturn this.createElement('circle').attr(attr);\r\n\t},\r\n\r\n\t/**\r\n\t * Draw and return an arc\r\n\t * @param {Number} x X position\r\n\t * @param {Number} y Y position\r\n\t * @param {Number} r Radius\r\n\t * @param {Number} innerR Inner radius like used in donut charts\r\n\t * @param {Number} start Starting angle\r\n\t * @param {Number} end Ending angle\r\n\t */\r\n\tarc: function (x, y, r, innerR, start, end) {\r\n\t\tvar arc;\r\n\r\n\t\tif (isObject(x)) {\r\n\t\t\ty = x.y;\r\n\t\t\tr = x.r;\r\n\t\t\tinnerR = x.innerR;\r\n\t\t\tstart = x.start;\r\n\t\t\tend = x.end;\r\n\t\t\tx = x.x;\r\n\t\t}\r\n\r\n\t\t// Arcs are defined as symbols for the ability to set\r\n\t\t// attributes in attr and animate\r\n\t\tarc = this.symbol('arc', x || 0, y || 0, r || 0, r || 0, {\r\n\t\t\tinnerR: innerR || 0,\r\n\t\t\tstart: start || 0,\r\n\t\t\tend: end || 0\r\n\t\t});\r\n\t\tarc.r = r; // #959\r\n\t\treturn arc;\r\n\t},\r\n\r\n\t/**\r\n\t * Draw and return a rectangle\r\n\t * @param {Number} x Left position\r\n\t * @param {Number} y Top position\r\n\t * @param {Number} width\r\n\t * @param {Number} height\r\n\t * @param {Number} r Border corner radius\r\n\t * @param {Number} strokeWidth A stroke width can be supplied to allow crisp drawing\r\n\t */\r\n\trect: function (x, y, width, height, r, strokeWidth) {\r\n\r\n\t\tr = isObject(x) ? x.r : r;\r\n\r\n\t\tvar wrapper = this.createElement('rect').attr({\r\n\t\t\t\trx: r,\r\n\t\t\t\try: r,\r\n\t\t\t\tfill: NONE\r\n\t\t\t});\r\n\t\treturn wrapper.attr(\r\n\t\t\t\tisObject(x) ?\r\n\t\t\t\t\tx :\r\n\t\t\t\t\t// do not crispify when an object is passed in (as in column charts)\r\n\t\t\t\t\twrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0))\r\n\t\t\t);\r\n\t},\r\n\r\n\t/**\r\n\t * Resize the box and re-align all aligned elements\r\n\t * @param {Object} width\r\n\t * @param {Object} height\r\n\t * @param {Boolean} animate\r\n\t *\r\n\t */\r\n\tsetSize: function (width, height, animate) {\r\n\t\tvar renderer = this,\r\n\t\t\talignedObjects = renderer.alignedObjects,\r\n\t\t\ti = alignedObjects.length;\r\n\r\n\t\trenderer.width = width;\r\n\t\trenderer.height = height;\r\n\r\n\t\trenderer.boxWrapper[pick(animate, true) ? 'animate' : 'attr']({\r\n\t\t\twidth: width,\r\n\t\t\theight: height\r\n\t\t});\r\n\r\n\t\twhile (i--) {\r\n\t\t\talignedObjects[i].align();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Create a group\r\n\t * @param {String} name The group will be given a class name of 'highcharts-{name}'.\r\n\t * This can be used for styling and scripting.\r\n\t */\r\n\tg: function (name) {\r\n\t\tvar elem = this.createElement('g');\r\n\t\treturn defined(name) ? elem.attr({ 'class': PREFIX + name }) : elem;\r\n\t},\r\n\r\n\t/**\r\n\t * Display an image\r\n\t * @param {String} src\r\n\t * @param {Number} x\r\n\t * @param {Number} y\r\n\t * @param {Number} width\r\n\t * @param {Number} height\r\n\t */\r\n\timage: function (src, x, y, width, height) {\r\n\t\tvar attribs = {\r\n\t\t\t\tpreserveAspectRatio: NONE\r\n\t\t\t},\r\n\t\t\telemWrapper;\r\n\r\n\t\t// optional properties\r\n\t\tif (arguments.length > 1) {\r\n\t\t\textend(attribs, {\r\n\t\t\t\tx: x,\r\n\t\t\t\ty: y,\r\n\t\t\t\twidth: width,\r\n\t\t\t\theight: height\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\telemWrapper = this.createElement('image').attr(attribs);\r\n\r\n\t\t// set the href in the xlink namespace\r\n\t\tif (elemWrapper.element.setAttributeNS) {\r\n\t\t\telemWrapper.element.setAttributeNS('http://www.w3.org/1999/xlink',\r\n\t\t\t\t'href', src);\r\n\t\t} else {\r\n\t\t\t// could be exporting in IE\r\n\t\t\t// using href throws \"not supported\" in ie7 and under, requries regex shim to fix later\r\n\t\t\telemWrapper.element.setAttribute('hc-svg-href', src);\r\n\t}\r\n\r\n\t\treturn elemWrapper;\r\n\t},\r\n\r\n\t/**\r\n\t * Draw a symbol out of pre-defined shape paths from the namespace 'symbol' object.\r\n\t *\r\n\t * @param {Object} symbol\r\n\t * @param {Object} x\r\n\t * @param {Object} y\r\n\t * @param {Object} radius\r\n\t * @param {Object} options\r\n\t */\r\n\tsymbol: function (symbol, x, y, width, height, options) {\r\n\r\n\t\tvar obj,\r\n\r\n\t\t\t// get the symbol definition function\r\n\t\t\tsymbolFn = this.symbols[symbol],\r\n\r\n\t\t\t// check if there's a path defined for this symbol\r\n\t\t\tpath = symbolFn && symbolFn(\r\n\t\t\t\tmathRound(x),\r\n\t\t\t\tmathRound(y),\r\n\t\t\t\twidth,\r\n\t\t\t\theight,\r\n\t\t\t\toptions\r\n\t\t\t),\r\n\r\n\t\t\timageElement,\r\n\t\t\timageRegex = /^url\\((.*?)\\)$/,\r\n\t\t\timageSrc,\r\n\t\t\timageSize,\r\n\t\t\tcenterImage;\r\n\r\n\t\tif (path) {\r\n\r\n\t\t\tobj = this.path(path);\r\n\t\t\t// expando properties for use in animate and attr\r\n\t\t\textend(obj, {\r\n\t\t\t\tsymbolName: symbol,\r\n\t\t\t\tx: x,\r\n\t\t\t\ty: y,\r\n\t\t\t\twidth: width,\r\n\t\t\t\theight: height\r\n\t\t\t});\r\n\t\t\tif (options) {\r\n\t\t\t\textend(obj, options);\r\n\t\t\t}\r\n\r\n\r\n\t\t// image symbols\r\n\t\t} else if (imageRegex.test(symbol)) {\r\n\r\n\t\t\t// On image load, set the size and position\r\n\t\t\tcenterImage = function (img, size) {\r\n\t\t\t\tif (img.element) { // it may be destroyed in the meantime (#1390)\r\n\t\t\t\t\timg.attr({\r\n\t\t\t\t\t\twidth: size[0],\r\n\t\t\t\t\t\theight: size[1]\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\tif (!img.alignByTranslate) { // #185\r\n\t\t\t\t\t\timg.translate(\r\n\t\t\t\t\t\t\tmathRound((width - size[0]) / 2), // #1378\r\n\t\t\t\t\t\t\tmathRound((height - size[1]) / 2)\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\timageSrc = symbol.match(imageRegex)[1];\r\n\t\t\timageSize = symbolSizes[imageSrc];\r\n\r\n\t\t\t// Ireate the image synchronously, add attribs async\r\n\t\t\tobj = this.image(imageSrc)\r\n\t\t\t\t.attr({\r\n\t\t\t\t\tx: x,\r\n\t\t\t\t\ty: y\r\n\t\t\t\t});\r\n\t\t\tobj.isImg = true;\r\n\r\n\t\t\tif (imageSize) {\r\n\t\t\t\tcenterImage(obj, imageSize);\r\n\t\t\t} else {\r\n\t\t\t\t// Initialize image to be 0 size so export will still function if there's no cached sizes.\r\n\t\t\t\t//\r\n\t\t\t\tobj.attr({ width: 0, height: 0 });\r\n\r\n\t\t\t\t// Create a dummy JavaScript image to get the width and height. Due to a bug in IE < 8,\r\n\t\t\t\t// the created element must be assigned to a variable in order to load (#292).\r\n\t\t\t\timageElement = createElement('img', {\r\n\t\t\t\t\tonload: function () {\r\n\t\t\t\t\t\tcenterImage(obj, symbolSizes[imageSrc] = [this.width, this.height]);\r\n\t\t\t\t\t},\r\n\t\t\t\t\tsrc: imageSrc\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn obj;\r\n\t},\r\n\r\n\t/**\r\n\t * An extendable collection of functions for defining symbol paths.\r\n\t */\r\n\tsymbols: {\r\n\t\t'circle': function (x, y, w, h) {\r\n\t\t\tvar cpw = 0.166 * w;\r\n\t\t\treturn [\r\n\t\t\t\tM, x + w / 2, y,\r\n\t\t\t\t'C', x + w + cpw, y, x + w + cpw, y + h, x + w / 2, y + h,\r\n\t\t\t\t'C', x - cpw, y + h, x - cpw, y, x + w / 2, y,\r\n\t\t\t\t'Z'\r\n\t\t\t];\r\n\t\t},\r\n\r\n\t\t'square': function (x, y, w, h) {\r\n\t\t\treturn [\r\n\t\t\t\tM, x, y,\r\n\t\t\t\tL, x + w, y,\r\n\t\t\t\tx + w, y + h,\r\n\t\t\t\tx, y + h,\r\n\t\t\t\t'Z'\r\n\t\t\t];\r\n\t\t},\r\n\r\n\t\t'triangle': function (x, y, w, h) {\r\n\t\t\treturn [\r\n\t\t\t\tM, x + w / 2, y,\r\n\t\t\t\tL, x + w, y + h,\r\n\t\t\t\tx, y + h,\r\n\t\t\t\t'Z'\r\n\t\t\t];\r\n\t\t},\r\n\r\n\t\t'triangle-down': function (x, y, w, h) {\r\n\t\t\treturn [\r\n\t\t\t\tM, x, y,\r\n\t\t\t\tL, x + w, y,\r\n\t\t\t\tx + w / 2, y + h,\r\n\t\t\t\t'Z'\r\n\t\t\t];\r\n\t\t},\r\n\t\t'diamond': function (x, y, w, h) {\r\n\t\t\treturn [\r\n\t\t\t\tM, x + w / 2, y,\r\n\t\t\t\tL, x + w, y + h / 2,\r\n\t\t\t\tx + w / 2, y + h,\r\n\t\t\t\tx, y + h / 2,\r\n\t\t\t\t'Z'\r\n\t\t\t];\r\n\t\t},\r\n\t\t'arc': function (x, y, w, h, options) {\r\n\t\t\tvar start = options.start,\r\n\t\t\t\tradius = options.r || w || h,\r\n\t\t\t\tend = options.end - 0.001, // to prevent cos and sin of start and end from becoming equal on 360 arcs (related: #1561)\r\n\t\t\t\tinnerRadius = options.innerR,\r\n\t\t\t\topen = options.open,\r\n\t\t\t\tcosStart = mathCos(start),\r\n\t\t\t\tsinStart = mathSin(start),\r\n\t\t\t\tcosEnd = mathCos(end),\r\n\t\t\t\tsinEnd = mathSin(end),\r\n\t\t\t\tlongArc = options.end - start < mathPI ? 0 : 1;\r\n\r\n\t\t\treturn [\r\n\t\t\t\tM,\r\n\t\t\t\tx + radius * cosStart,\r\n\t\t\t\ty + radius * sinStart,\r\n\t\t\t\t'A', // arcTo\r\n\t\t\t\tradius, // x radius\r\n\t\t\t\tradius, // y radius\r\n\t\t\t\t0, // slanting\r\n\t\t\t\tlongArc, // long or short arc\r\n\t\t\t\t1, // clockwise\r\n\t\t\t\tx + radius * cosEnd,\r\n\t\t\t\ty + radius * sinEnd,\r\n\t\t\t\topen ? M : L,\r\n\t\t\t\tx + innerRadius * cosEnd,\r\n\t\t\t\ty + innerRadius * sinEnd,\r\n\t\t\t\t'A', // arcTo\r\n\t\t\t\tinnerRadius, // x radius\r\n\t\t\t\tinnerRadius, // y radius\r\n\t\t\t\t0, // slanting\r\n\t\t\t\tlongArc, // long or short arc\r\n\t\t\t\t0, // clockwise\r\n\t\t\t\tx + innerRadius * cosStart,\r\n\t\t\t\ty + innerRadius * sinStart,\r\n\r\n\t\t\t\topen ? '' : 'Z' // close\r\n\t\t\t];\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Define a clipping rectangle\r\n\t * @param {String} id\r\n\t * @param {Number} x\r\n\t * @param {Number} y\r\n\t * @param {Number} width\r\n\t * @param {Number} height\r\n\t */\r\n\tclipRect: function (x, y, width, height) {\r\n\t\tvar wrapper,\r\n\t\t\tid = PREFIX + idCounter++,\r\n\r\n\t\t\tclipPath = this.createElement('clipPath').attr({\r\n\t\t\t\tid: id\r\n\t\t\t}).add(this.defs);\r\n\r\n\t\twrapper = this.rect(x, y, width, height, 0).add(clipPath);\r\n\t\twrapper.id = id;\r\n\t\twrapper.clipPath = clipPath;\r\n\r\n\t\treturn wrapper;\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Take a color and return it if it's a string, make it a gradient if it's a\r\n\t * gradient configuration object. Prior to Highstock, an array was used to define\r\n\t * a linear gradient with pixel positions relative to the SVG. In newer versions\r\n\t * we change the coordinates to apply relative to the shape, using coordinates\r\n\t * 0-1 within the shape. To preserve backwards compatibility, linearGradient\r\n\t * in this definition is an object of x1, y1, x2 and y2.\r\n\t *\r\n\t * @param {Object} color The color or config object\r\n\t */\r\n\tcolor: function (color, elem, prop) {\r\n\t\tvar renderer = this,\r\n\t\t\tcolorObject,\r\n\t\t\tregexRgba = /^rgba/,\r\n\t\t\tgradName,\r\n\t\t\tgradAttr,\r\n\t\t\tgradients,\r\n\t\t\tgradientObject,\r\n\t\t\tstops,\r\n\t\t\tstopColor,\r\n\t\t\tstopOpacity,\r\n\t\t\tradialReference,\r\n\t\t\tn,\r\n\t\t\tid,\r\n\t\t\tkey = [];\r\n\r\n\t\t// Apply linear or radial gradients\r\n\t\tif (color && color.linearGradient) {\r\n\t\t\tgradName = 'linearGradient';\r\n\t\t} else if (color && color.radialGradient) {\r\n\t\t\tgradName = 'radialGradient';\r\n\t\t}\r\n\r\n\t\tif (gradName) {\r\n\t\t\tgradAttr = color[gradName];\r\n\t\t\tgradients = renderer.gradients;\r\n\t\t\tstops = color.stops;\r\n\t\t\tradialReference = elem.radialReference;\r\n\r\n\t\t\t// Keep < 2.2 kompatibility\r\n\t\t\tif (isArray(gradAttr)) {\r\n\t\t\t\tcolor[gradName] = gradAttr = {\r\n\t\t\t\t\tx1: gradAttr[0],\r\n\t\t\t\t\ty1: gradAttr[1],\r\n\t\t\t\t\tx2: gradAttr[2],\r\n\t\t\t\t\ty2: gradAttr[3],\r\n\t\t\t\t\tgradientUnits: 'userSpaceOnUse'\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\t// Correct the radial gradient for the radial reference system\r\n\t\t\tif (gradName === 'radialGradient' && radialReference && !defined(gradAttr.gradientUnits)) {\r\n\t\t\t\tgradAttr = merge(gradAttr, {\r\n\t\t\t\t\tcx: (radialReference[0] - radialReference[2] / 2) + gradAttr.cx * radialReference[2],\r\n\t\t\t\t\tcy: (radialReference[1] - radialReference[2] / 2) + gradAttr.cy * radialReference[2],\r\n\t\t\t\t\tr: gradAttr.r * radialReference[2],\r\n\t\t\t\t\tgradientUnits: 'userSpaceOnUse'\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// Build the unique key to detect whether we need to create a new element (#1282)\r\n\t\t\tfor (n in gradAttr) {\r\n\t\t\t\tif (n !== 'id') {\r\n\t\t\t\t\tkey.push(n, gradAttr[n]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tfor (n in stops) {\r\n\t\t\t\tkey.push(stops[n]);\r\n\t\t\t}\r\n\t\t\tkey = key.join(',');\r\n\r\n\t\t\t// Check if a gradient object with the same config object is created within this renderer\r\n\t\t\tif (gradients[key]) {\r\n\t\t\t\tid = gradients[key].id;\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// Set the id and create the element\r\n\t\t\t\tgradAttr.id = id = PREFIX + idCounter++;\r\n\t\t\t\tgradients[key] = gradientObject = renderer.createElement(gradName)\r\n\t\t\t\t\t.attr(gradAttr)\r\n\t\t\t\t\t.add(renderer.defs);\r\n\r\n\r\n\t\t\t\t// The gradient needs to keep a list of stops to be able to destroy them\r\n\t\t\t\tgradientObject.stops = [];\r\n\t\t\t\teach(stops, function (stop) {\r\n\t\t\t\t\tvar stopObject;\r\n\t\t\t\t\tif (regexRgba.test(stop[1])) {\r\n\t\t\t\t\t\tcolorObject = Color(stop[1]);\r\n\t\t\t\t\t\tstopColor = colorObject.get('rgb');\r\n\t\t\t\t\t\tstopOpacity = colorObject.get('a');\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tstopColor = stop[1];\r\n\t\t\t\t\t\tstopOpacity = 1;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tstopObject = renderer.createElement('stop').attr({\r\n\t\t\t\t\t\toffset: stop[0],\r\n\t\t\t\t\t\t'stop-color': stopColor,\r\n\t\t\t\t\t\t'stop-opacity': stopOpacity\r\n\t\t\t\t\t}).add(gradientObject);\r\n\r\n\t\t\t\t\t// Add the stop element to the gradient\r\n\t\t\t\t\tgradientObject.stops.push(stopObject);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// Return the reference to the gradient object\r\n\t\t\treturn 'url(' + renderer.url + '#' + id + ')';\r\n\r\n\t\t// Webkit and Batik can't show rgba.\r\n\t\t} else if (regexRgba.test(color)) {\r\n\t\t\tcolorObject = Color(color);\r\n\t\t\tattr(elem, prop + '-opacity', colorObject.get('a'));\r\n\r\n\t\t\treturn colorObject.get('rgb');\r\n\r\n\r\n\t\t} else {\r\n\t\t\t// Remove the opacity attribute added above. Does not throw if the attribute is not there.\r\n\t\t\telem.removeAttribute(prop + '-opacity');\r\n\r\n\t\t\treturn color;\r\n\t\t}\r\n\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Add text to the SVG object\r\n\t * @param {String} str\r\n\t * @param {Number} x Left position\r\n\t * @param {Number} y Top position\r\n\t * @param {Boolean} useHTML Use HTML to render the text\r\n\t */\r\n\ttext: function (str, x, y, useHTML) {\r\n\r\n\t\t// declare variables\r\n\t\tvar renderer = this,\r\n\t\t\tdefaultChartStyle = defaultOptions.chart.style,\r\n\t\t\tfakeSVG = useCanVG || (!hasSVG && renderer.forExport),\r\n\t\t\twrapper;\r\n\r\n\t\tif (useHTML && !renderer.forExport) {\r\n\t\t\treturn renderer.html(str, x, y);\r\n\t\t}\r\n\r\n\t\tx = mathRound(pick(x, 0));\r\n\t\ty = mathRound(pick(y, 0));\r\n\r\n\t\twrapper = renderer.createElement('text')\r\n\t\t\t.attr({\r\n\t\t\t\tx: x,\r\n\t\t\t\ty: y,\r\n\t\t\t\ttext: str\r\n\t\t\t})\r\n\t\t\t.css({\r\n\t\t\t\tfontFamily: defaultChartStyle.fontFamily,\r\n\t\t\t\tfontSize: defaultChartStyle.fontSize\r\n\t\t\t});\r\n\r\n\t\t// Prevent wrapping from creating false offsetWidths in export in legacy IE (#1079, #1063)\r\n\t\tif (fakeSVG) {\r\n\t\t\twrapper.css({\r\n\t\t\t\tposition: ABSOLUTE\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\twrapper.x = x;\r\n\t\twrapper.y = y;\r\n\t\treturn wrapper;\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Create HTML text node. This is used by the VML renderer as well as the SVG\r\n\t * renderer through the useHTML option.\r\n\t *\r\n\t * @param {String} str\r\n\t * @param {Number} x\r\n\t * @param {Number} y\r\n\t */\r\n\thtml: function (str, x, y) {\r\n\t\tvar defaultChartStyle = defaultOptions.chart.style,\r\n\t\t\twrapper = this.createElement('span'),\r\n\t\t\tattrSetters = wrapper.attrSetters,\r\n\t\t\telement = wrapper.element,\r\n\t\t\trenderer = wrapper.renderer;\r\n\r\n\t\t// Text setter\r\n\t\tattrSetters.text = function (value) {\r\n\t\t\tif (value !== element.innerHTML) {\r\n\t\t\t\tdelete this.bBox;\r\n\t\t\t}\r\n\t\t\telement.innerHTML = value;\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\t\t// Various setters which rely on update transform\r\n\t\tattrSetters.x = attrSetters.y = attrSetters.align = function (value, key) {\r\n\t\t\tif (key === 'align') {\r\n\t\t\t\tkey = 'textAlign'; // Do not overwrite the SVGElement.align method. Same as VML.\r\n\t\t\t}\r\n\t\t\twrapper[key] = value;\r\n\t\t\twrapper.htmlUpdateTransform();\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\t\t// Set the default attributes\r\n\t\twrapper.attr({\r\n\t\t\t\ttext: str,\r\n\t\t\t\tx: mathRound(x),\r\n\t\t\t\ty: mathRound(y)\r\n\t\t\t})\r\n\t\t\t.css({\r\n\t\t\t\tposition: ABSOLUTE,\r\n\t\t\t\twhiteSpace: 'nowrap',\r\n\t\t\t\tfontFamily: defaultChartStyle.fontFamily,\r\n\t\t\t\tfontSize: defaultChartStyle.fontSize\r\n\t\t\t});\r\n\r\n\t\t// Use the HTML specific .css method\r\n\t\twrapper.css = wrapper.htmlCss;\r\n\r\n\t\t// This is specific for HTML within SVG\r\n\t\tif (renderer.isSVG) {\r\n\t\t\twrapper.add = function (svgGroupWrapper) {\r\n\r\n\t\t\t\tvar htmlGroup,\r\n\t\t\t\t\tcontainer = renderer.box.parentNode,\r\n\t\t\t\t\tparentGroup,\r\n\t\t\t\t\tparents = [];\r\n\r\n\t\t\t\tthis.parentGroup = svgGroupWrapper;\r\n\r\n\t\t\t\t// Create a mock group to hold the HTML elements\r\n\t\t\t\tif (svgGroupWrapper) {\r\n\t\t\t\t\thtmlGroup = svgGroupWrapper.div;\r\n\t\t\t\t\tif (!htmlGroup) {\r\n\r\n\t\t\t\t\t\t// Read the parent chain into an array and read from top down\r\n\t\t\t\t\t\tparentGroup = svgGroupWrapper;\r\n\t\t\t\t\t\twhile (parentGroup) {\r\n\r\n\t\t\t\t\t\t\tparents.push(parentGroup);\r\n\r\n\t\t\t\t\t\t\t// Move up to the next parent group\r\n\t\t\t\t\t\t\tparentGroup = parentGroup.parentGroup;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Ensure dynamically updating position when any parent is translated\r\n\t\t\t\t\t\teach(parents.reverse(), function (parentGroup) {\r\n\t\t\t\t\t\t\tvar htmlGroupStyle;\r\n\r\n\t\t\t\t\t\t\t// Create a HTML div and append it to the parent div to emulate\r\n\t\t\t\t\t\t\t// the SVG group structure\r\n\t\t\t\t\t\t\thtmlGroup = parentGroup.div = parentGroup.div || createElement(DIV, {\r\n\t\t\t\t\t\t\t\tclassName: attr(parentGroup.element, 'class')\r\n\t\t\t\t\t\t\t}, {\r\n\t\t\t\t\t\t\t\tposition: ABSOLUTE,\r\n\t\t\t\t\t\t\t\tleft: (parentGroup.translateX || 0) + PX,\r\n\t\t\t\t\t\t\t\ttop: (parentGroup.translateY || 0) + PX\r\n\t\t\t\t\t\t\t}, htmlGroup || container); // the top group is appended to container\r\n\r\n\t\t\t\t\t\t\t// Shortcut\r\n\t\t\t\t\t\t\thtmlGroupStyle = htmlGroup.style;\r\n\r\n\t\t\t\t\t\t\t// Set listeners to update the HTML div's position whenever the SVG group\r\n\t\t\t\t\t\t\t// position is changed\r\n\t\t\t\t\t\t\textend(parentGroup.attrSetters, {\r\n\t\t\t\t\t\t\t\ttranslateX: function (value) {\r\n\t\t\t\t\t\t\t\t\thtmlGroupStyle.left = value + PX;\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\ttranslateY: function (value) {\r\n\t\t\t\t\t\t\t\t\thtmlGroupStyle.top = value + PX;\r\n\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\tvisibility: function (value, key) {\r\n\t\t\t\t\t\t\t\t\thtmlGroupStyle[key] = value;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t});\r\n\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\thtmlGroup = container;\r\n\t\t\t\t}\r\n\r\n\t\t\t\thtmlGroup.appendChild(element);\r\n\r\n\t\t\t\t// Shared with VML:\r\n\t\t\t\twrapper.added = true;\r\n\t\t\t\tif (wrapper.alignOnAdd) {\r\n\t\t\t\t\twrapper.htmlUpdateTransform();\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn wrapper;\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn wrapper;\r\n\t},\r\n\r\n\t/**\r\n\t * Utility to return the baseline offset and total line height from the font size\r\n\t */\r\n\tfontMetrics: function (fontSize) {\r\n\t\tfontSize = pInt(fontSize || 11);\r\n\r\n\t\t// Empirical values found by comparing font size and bounding box height.\r\n\t\t// Applies to the default font family. http://jsfiddle.net/highcharts/7xvn7/\r\n\t\tvar lineHeight = fontSize < 24 ? fontSize + 4 : mathRound(fontSize * 1.2),\r\n\t\t\tbaseline = mathRound(lineHeight * 0.8);\r\n\r\n\t\treturn {\r\n\t\t\th: lineHeight,\r\n\t\t\tb: baseline\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Add a label, a text item that can hold a colored or gradient background\r\n\t * as well as a border and shadow.\r\n\t * @param {string} str\r\n\t * @param {Number} x\r\n\t * @param {Number} y\r\n\t * @param {String} shape\r\n\t * @param {Number} anchorX In case the shape has a pointer, like a flag, this is the\r\n\t * coordinates it should be pinned to\r\n\t * @param {Number} anchorY\r\n\t * @param {Boolean} baseline Whether to position the label relative to the text baseline,\r\n\t * like renderer.text, or to the upper border of the rectangle.\r\n\t * @param {String} className Class name for the group\r\n\t */\r\n\tlabel: function (str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {\r\n\r\n\t\tvar renderer = this,\r\n\t\t\twrapper = renderer.g(className),\r\n\t\t\ttext = renderer.text('', 0, 0, useHTML)\r\n\t\t\t\t.attr({\r\n\t\t\t\t\tzIndex: 1\r\n\t\t\t\t}),\r\n\t\t\t\t//.add(wrapper),\r\n\t\t\tbox,\r\n\t\t\tbBox,\r\n\t\t\talignFactor = 0,\r\n\t\t\tpadding = 3,\r\n\t\t\tpaddingLeft = 0,\r\n\t\t\twidth,\r\n\t\t\theight,\r\n\t\t\twrapperX,\r\n\t\t\twrapperY,\r\n\t\t\tcrispAdjust = 0,\r\n\t\t\tdeferredAttr = {},\r\n\t\t\tbaselineOffset,\r\n\t\t\tattrSetters = wrapper.attrSetters,\r\n\t\t\tneedsBox;\r\n\r\n\t\t/**\r\n\t\t * This function runs after the label is added to the DOM (when the bounding box is\r\n\t\t * available), and after the text of the label is updated to detect the new bounding\r\n\t\t * box and reflect it in the border box.\r\n\t\t */\r\n\t\tfunction updateBoxSize() {\r\n\t\t\tvar boxX,\r\n\t\t\t\tboxY,\r\n\t\t\t\tstyle = text.element.style;\r\n\r\n\t\t\tbBox = (width === undefined || height === undefined || wrapper.styles.textAlign) &&\r\n\t\t\t\ttext.getBBox();\r\n\t\t\twrapper.width = (width || bBox.width || 0) + 2 * padding + paddingLeft;\r\n\t\t\twrapper.height = (height || bBox.height || 0) + 2 * padding;\r\n\r\n\t\t\t// update the label-scoped y offset\r\n\t\t\tbaselineOffset = padding + renderer.fontMetrics(style && style.fontSize).b;\r\n\r\n\t\t\tif (needsBox) {\r\n\r\n\t\t\t\t// create the border box if it is not already present\r\n\t\t\t\tif (!box) {\r\n\t\t\t\t\tboxX = mathRound(-alignFactor * padding);\r\n\t\t\t\t\tboxY = baseline ? -baselineOffset : 0;\r\n\r\n\t\t\t\t\twrapper.box = box = shape ?\r\n\t\t\t\t\t\trenderer.symbol(shape, boxX, boxY, wrapper.width, wrapper.height, deferredAttr) :\r\n\t\t\t\t\t\trenderer.rect(boxX, boxY, wrapper.width, wrapper.height, 0, deferredAttr[STROKE_WIDTH]);\r\n\t\t\t\t\tbox.add(wrapper);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// apply the box attributes\r\n\t\t\t\tif (!box.isImg) { // #1630\r\n\t\t\t\t\tbox.attr(merge({\r\n\t\t\t\t\t\twidth: wrapper.width,\r\n\t\t\t\t\t\theight: wrapper.height\r\n\t\t\t\t\t}, deferredAttr));\r\n\t\t\t\t}\r\n\t\t\t\tdeferredAttr = null;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * This function runs after setting text or padding, but only if padding is changed\r\n\t\t */\r\n\t\tfunction updateTextPadding() {\r\n\t\t\tvar styles = wrapper.styles,\r\n\t\t\t\ttextAlign = styles && styles.textAlign,\r\n\t\t\t\tx = paddingLeft + padding * (1 - alignFactor),\r\n\t\t\t\ty;\r\n\r\n\t\t\t// determin y based on the baseline\r\n\t\t\ty = baseline ? 0 : baselineOffset;\r\n\r\n\t\t\t// compensate for alignment\r\n\t\t\tif (defined(width) && (textAlign === 'center' || textAlign === 'right')) {\r\n\t\t\t\tx += { center: 0.5, right: 1 }[textAlign] * (width - bBox.width);\r\n\t\t\t}\r\n\r\n\t\t\t// update if anything changed\r\n\t\t\tif (x !== text.x || y !== text.y) {\r\n\t\t\t\ttext.attr({\r\n\t\t\t\t\tx: x,\r\n\t\t\t\t\ty: y\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// record current values\r\n\t\t\ttext.x = x;\r\n\t\t\ttext.y = y;\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * Set a box attribute, or defer it if the box is not yet created\r\n\t\t * @param {Object} key\r\n\t\t * @param {Object} value\r\n\t\t */\r\n\t\tfunction boxAttr(key, value) {\r\n\t\t\tif (box) {\r\n\t\t\t\tbox.attr(key, value);\r\n\t\t\t} else {\r\n\t\t\t\tdeferredAttr[key] = value;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfunction getSizeAfterAdd() {\r\n\t\t\ttext.add(wrapper);\r\n\t\t\twrapper.attr({\r\n\t\t\t\ttext: str, // alignment is available now\r\n\t\t\t\tx: x,\r\n\t\t\t\ty: y\r\n\t\t\t});\r\n\r\n\t\t\tif (box && defined(anchorX)) {\r\n\t\t\t\twrapper.attr({\r\n\t\t\t\t\tanchorX: anchorX,\r\n\t\t\t\t\tanchorY: anchorY\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t/**\r\n\t\t * After the text element is added, get the desired size of the border box\r\n\t\t * and add it before the text in the DOM.\r\n\t\t */\r\n\t\taddEvent(wrapper, 'add', getSizeAfterAdd);\r\n\r\n\t\t/*\r\n\t\t * Add specific attribute setters.\r\n\t\t */\r\n\r\n\t\t// only change local variables\r\n\t\tattrSetters.width = function (value) {\r\n\t\t\twidth = value;\r\n\t\t\treturn false;\r\n\t\t};\r\n\t\tattrSetters.height = function (value) {\r\n\t\t\theight = value;\r\n\t\t\treturn false;\r\n\t\t};\r\n\t\tattrSetters.padding = function (value) {\r\n\t\t\tif (defined(value) && value !== padding) {\r\n\t\t\t\tpadding = value;\r\n\t\t\t\tupdateTextPadding();\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t};\r\n\t\tattrSetters.paddingLeft = function (value) {\r\n\t\t\tif (defined(value) && value !== paddingLeft) {\r\n\t\t\t\tpaddingLeft = value;\r\n\t\t\t\tupdateTextPadding();\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\r\n\t\t// change local variable and set attribue as well\r\n\t\tattrSetters.align = function (value) {\r\n\t\t\talignFactor = { left: 0, center: 0.5, right: 1 }[value];\r\n\t\t\treturn false; // prevent setting text-anchor on the group\r\n\t\t};\r\n\r\n\t\t// apply these to the box and the text alike\r\n\t\tattrSetters.text = function (value, key) {\r\n\t\t\ttext.attr(key, value);\r\n\t\t\tupdateBoxSize();\r\n\t\t\tupdateTextPadding();\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\t\t// apply these to the box but not to the text\r\n\t\tattrSetters[STROKE_WIDTH] = function (value, key) {\r\n\t\t\tneedsBox = true;\r\n\t\t\tcrispAdjust = value % 2 / 2;\r\n\t\t\tboxAttr(key, value);\r\n\t\t\treturn false;\r\n\t\t};\r\n\t\tattrSetters.stroke = attrSetters.fill = attrSetters.r = function (value, key) {\r\n\t\t\tif (key === 'fill') {\r\n\t\t\t\tneedsBox = true;\r\n\t\t\t}\r\n\t\t\tboxAttr(key, value);\r\n\t\t\treturn false;\r\n\t\t};\r\n\t\tattrSetters.anchorX = function (value, key) {\r\n\t\t\tanchorX = value;\r\n\t\t\tboxAttr(key, value + crispAdjust - wrapperX);\r\n\t\t\treturn false;\r\n\t\t};\r\n\t\tattrSetters.anchorY = function (value, key) {\r\n\t\t\tanchorY = value;\r\n\t\t\tboxAttr(key, value - wrapperY);\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\t\t// rename attributes\r\n\t\tattrSetters.x = function (value) {\r\n\t\t\twrapper.x = value; // for animation getter\r\n\t\t\tvalue -= alignFactor * ((width || bBox.width) + padding);\r\n\t\t\twrapperX = mathRound(value);\r\n\r\n\t\t\twrapper.attr('translateX', wrapperX);\r\n\t\t\treturn false;\r\n\t\t};\r\n\t\tattrSetters.y = function (value) {\r\n\t\t\twrapperY = wrapper.y = mathRound(value);\r\n\t\t\twrapper.attr('translateY', wrapperY);\r\n\t\t\treturn false;\r\n\t\t};\r\n\r\n\t\t// Redirect certain methods to either the box or the text\r\n\t\tvar baseCss = wrapper.css;\r\n\t\treturn extend(wrapper, {\r\n\t\t\t/**\r\n\t\t\t * Pick up some properties and apply them to the text instead of the wrapper\r\n\t\t\t */\r\n\t\t\tcss: function (styles) {\r\n\t\t\t\tif (styles) {\r\n\t\t\t\t\tvar textStyles = {};\r\n\t\t\t\t\tstyles = merge(styles); // create a copy to avoid altering the original object (#537)\r\n\t\t\t\t\teach(['fontSize', 'fontWeight', 'fontFamily', 'color', 'lineHeight', 'width', 'textDecoration', 'textShadow'], function (prop) {\r\n\t\t\t\t\t\tif (styles[prop] !== UNDEFINED) {\r\n\t\t\t\t\t\t\ttextStyles[prop] = styles[prop];\r\n\t\t\t\t\t\t\tdelete styles[prop];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\ttext.css(textStyles);\r\n\t\t\t\t}\r\n\t\t\t\treturn baseCss.call(wrapper, styles);\r\n\t\t\t},\r\n\t\t\t/**\r\n\t\t\t * Return the bounding box of the box, not the group\r\n\t\t\t */\r\n\t\t\tgetBBox: function () {\r\n\t\t\t\treturn {\r\n\t\t\t\t\twidth: bBox.width + 2 * padding,\r\n\t\t\t\t\theight: bBox.height + 2 * padding,\r\n\t\t\t\t\tx: bBox.x - padding,\r\n\t\t\t\t\ty: bBox.y - padding\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\t/**\r\n\t\t\t * Apply the shadow to the box\r\n\t\t\t */\r\n\t\t\tshadow: function (b) {\r\n\t\t\t\tif (box) {\r\n\t\t\t\t\tbox.shadow(b);\r\n\t\t\t\t}\r\n\t\t\t\treturn wrapper;\r\n\t\t\t},\r\n\t\t\t/**\r\n\t\t\t * Destroy and release memory.\r\n\t\t\t */\r\n\t\t\tdestroy: function () {\r\n\t\t\t\tremoveEvent(wrapper, 'add', getSizeAfterAdd);\r\n\r\n\t\t\t\t// Added by button implementation\r\n\t\t\t\tremoveEvent(wrapper.element, 'mouseenter');\r\n\t\t\t\tremoveEvent(wrapper.element, 'mouseleave');\r\n\r\n\t\t\t\tif (text) {\r\n\t\t\t\t\ttext = text.destroy();\r\n\t\t\t\t}\r\n\t\t\t\tif (box) {\r\n\t\t\t\t\tbox = box.destroy();\r\n\t\t\t\t}\r\n\t\t\t\t// Call base implementation to destroy the rest\r\n\t\t\t\tSVGElement.prototype.destroy.call(wrapper);\r\n\r\n\t\t\t\t// Release local pointers (#1298)\r\n\t\t\t\twrapper = renderer = updateBoxSize = updateTextPadding = boxAttr = getSizeAfterAdd = null;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}; // end SVGRenderer\r\n\r\n\r\n// general renderer\r\nRenderer = SVGRenderer;\r\n\r\n\r\n/* ****************************************************************************\r\n * *\r\n * START OF INTERNET EXPLORER <= 8 SPECIFIC CODE *\r\n * *\r\n * For applications and websites that don't need IE support, like platform *\r\n * targeted mobile apps and web apps, this code can be removed. *\r\n * *\r\n *****************************************************************************/\r\n\r\n/**\r\n * @constructor\r\n */\r\nvar VMLRenderer, VMLElement;\r\nif (!hasSVG && !useCanVG) {\r\n\r\n/**\r\n * The VML element wrapper.\r\n */\r\nHighcharts.VMLElement = VMLElement = {\r\n\r\n\t/**\r\n\t * Initialize a new VML element wrapper. It builds the markup as a string\r\n\t * to minimize DOM traffic.\r\n\t * @param {Object} renderer\r\n\t * @param {Object} nodeName\r\n\t */\r\n\tinit: function (renderer, nodeName) {\r\n\t\tvar wrapper = this,\r\n\t\t\tmarkup = ['<', nodeName, ' filled=\"f\" stroked=\"f\"'],\r\n\t\t\tstyle = ['position: ', ABSOLUTE, ';'],\r\n\t\t\tisDiv = nodeName === DIV;\r\n\r\n\t\t// divs and shapes need size\r\n\t\tif (nodeName === 'shape' || isDiv) {\r\n\t\t\tstyle.push('left:0;top:0;width:1px;height:1px;');\r\n\t\t}\r\n\t\tstyle.push('visibility: ', isDiv ? HIDDEN : VISIBLE);\r\n\r\n\t\tmarkup.push(' style=\"', style.join(''), '\"/>');\r\n\r\n\t\t// create element with default attributes and style\r\n\t\tif (nodeName) {\r\n\t\t\tmarkup = isDiv || nodeName === 'span' || nodeName === 'img' ?\r\n\t\t\t\tmarkup.join('')\r\n\t\t\t\t: renderer.prepVML(markup);\r\n\t\t\twrapper.element = createElement(markup);\r\n\t\t}\r\n\r\n\t\twrapper.renderer = renderer;\r\n\t\twrapper.attrSetters = {};\r\n\t},\r\n\r\n\t/**\r\n\t * Add the node to the given parent\r\n\t * @param {Object} parent\r\n\t */\r\n\tadd: function (parent) {\r\n\t\tvar wrapper = this,\r\n\t\t\trenderer = wrapper.renderer,\r\n\t\t\telement = wrapper.element,\r\n\t\t\tbox = renderer.box,\r\n\t\t\tinverted = parent && parent.inverted,\r\n\r\n\t\t\t// get the parent node\r\n\t\t\tparentNode = parent ?\r\n\t\t\t\tparent.element || parent :\r\n\t\t\t\tbox;\r\n\r\n\r\n\t\t// if the parent group is inverted, apply inversion on all children\r\n\t\tif (inverted) { // only on groups\r\n\t\t\trenderer.invertChild(element, parentNode);\r\n\t\t}\r\n\r\n\t\t// append it\r\n\t\tparentNode.appendChild(element);\r\n\r\n\t\t// align text after adding to be able to read offset\r\n\t\twrapper.added = true;\r\n\t\tif (wrapper.alignOnAdd && !wrapper.deferUpdateTransform) {\r\n\t\t\twrapper.updateTransform();\r\n\t\t}\r\n\r\n\t\t// fire an event for internal hooks\r\n\t\tfireEvent(wrapper, 'add');\r\n\r\n\t\treturn wrapper;\r\n\t},\r\n\r\n\t/**\r\n\t * VML always uses htmlUpdateTransform\r\n\t */\r\n\tupdateTransform: SVGElement.prototype.htmlUpdateTransform,\r\n\r\n\t/**\r\n\t * Set the rotation of a span with oldIE's filter\r\n\t */\r\n\tsetSpanRotation: function (rotation, sintheta, costheta) {\r\n\t\t// Adjust for alignment and rotation. Rotation of useHTML content is not yet implemented\r\n\t\t// but it can probably be implemented for Firefox 3.5+ on user request. FF3.5+\r\n\t\t// has support for CSS3 transform. The getBBox method also needs to be updated\r\n\t\t// to compensate for the rotation, like it currently does for SVG.\r\n\t\t// Test case: http://highcharts.com/tests/?file=text-rotation\r\n\t\tcss(this.element, {\r\n\t\t\tfilter: rotation ? ['progid:DXImageTransform.Microsoft.Matrix(M11=', costheta,\r\n\t\t\t\t', M12=', -sintheta, ', M21=', sintheta, ', M22=', costheta,\r\n\t\t\t\t', sizingMethod=\\'auto expand\\')'].join('') : NONE\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Converts a subset of an SVG path definition to its VML counterpart. Takes an array\r\n\t * as the parameter and returns a string.\r\n\t */\r\n\tpathToVML: function (value) {\r\n\t\t// convert paths\r\n\t\tvar i = value.length,\r\n\t\t\tpath = [],\r\n\t\t\tclockwise;\r\n\r\n\t\twhile (i--) {\r\n\r\n\t\t\t// Multiply by 10 to allow subpixel precision.\r\n\t\t\t// Substracting half a pixel seems to make the coordinates\r\n\t\t\t// align with SVG, but this hasn't been tested thoroughly\r\n\t\t\tif (isNumber(value[i])) {\r\n\t\t\t\tpath[i] = mathRound(value[i] * 10) - 5;\r\n\t\t\t} else if (value[i] === 'Z') { // close the path\r\n\t\t\t\tpath[i] = 'x';\r\n\t\t\t} else {\r\n\t\t\t\tpath[i] = value[i];\r\n\r\n\t\t\t\t// When the start X and end X coordinates of an arc are too close,\r\n\t\t\t\t// they are rounded to the same value above. In this case, substract 1 from the end X\r\n\t\t\t\t// position. #760, #1371.\r\n\t\t\t\tif (value.isArc && (value[i] === 'wa' || value[i] === 'at')) {\r\n\t\t\t\t\tclockwise = value[i] === 'wa' ? 1 : -1; // #1642\r\n\t\t\t\t\tif (path[i + 5] === path[i + 7]) {\r\n\t\t\t\t\t\tpath[i + 7] -= clockwise;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// Start and end Y (#1410)\r\n\t\t\t\t\tif (path[i + 6] === path[i + 8]) {\r\n\t\t\t\t\t\tpath[i + 8] -= clockwise;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Loop up again to handle path shortcuts (#2132)\r\n\t\t/*while (i++ < path.length) {\r\n\t\t\tif (path[i] === 'H') { // horizontal line to\r\n\t\t\t\tpath[i] = 'L';\r\n\t\t\t\tpath.splice(i + 2, 0, path[i - 1]);\r\n\t\t\t} else if (path[i] === 'V') { // vertical line to\r\n\t\t\t\tpath[i] = 'L';\r\n\t\t\t\tpath.splice(i + 1, 0, path[i - 2]);\r\n\t\t\t}\r\n\t\t}*/\r\n\t\treturn path.join(' ') || 'x';\r\n\t},\r\n\r\n\t/**\r\n\t * Get or set attributes\r\n\t */\r\n\tattr: function (hash, val) {\r\n\t\tvar wrapper = this,\r\n\t\t\tkey,\r\n\t\t\tvalue,\r\n\t\t\ti,\r\n\t\t\tresult,\r\n\t\t\telement = wrapper.element || {},\r\n\t\t\telemStyle = element.style,\r\n\t\t\tnodeName = element.nodeName,\r\n\t\t\trenderer = wrapper.renderer,\r\n\t\t\tsymbolName = wrapper.symbolName,\r\n\t\t\thasSetSymbolSize,\r\n\t\t\tshadows = wrapper.shadows,\r\n\t\t\tskipAttr,\r\n\t\t\tattrSetters = wrapper.attrSetters,\r\n\t\t\tret = wrapper;\r\n\r\n\t\t// single key-value pair\r\n\t\tif (isString(hash) && defined(val)) {\r\n\t\t\tkey = hash;\r\n\t\t\thash = {};\r\n\t\t\thash[key] = val;\r\n\t\t}\r\n\r\n\t\t// used as a getter, val is undefined\r\n\t\tif (isString(hash)) {\r\n\t\t\tkey = hash;\r\n\t\t\tif (key === 'strokeWidth' || key === 'stroke-width') {\r\n\t\t\t\tret = wrapper.strokeweight;\r\n\t\t\t} else {\r\n\t\t\t\tret = wrapper[key];\r\n\t\t\t}\r\n\r\n\t\t// setter\r\n\t\t} else {\r\n\t\t\tfor (key in hash) {\r\n\t\t\t\tvalue = hash[key];\r\n\t\t\t\tskipAttr = false;\r\n\r\n\t\t\t\t// check for a specific attribute setter\r\n\t\t\t\tresult = attrSetters[key] && attrSetters[key].call(wrapper, value, key);\r\n\r\n\t\t\t\tif (result !== false && value !== null) { // #620\r\n\r\n\t\t\t\t\tif (result !== UNDEFINED) {\r\n\t\t\t\t\t\tvalue = result; // the attribute setter has returned a new value to set\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\t// prepare paths\r\n\t\t\t\t\t// symbols\r\n\t\t\t\t\tif (symbolName && /^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(key)) {\r\n\t\t\t\t\t\t// if one of the symbol size affecting parameters are changed,\r\n\t\t\t\t\t\t// check all the others only once for each call to an element's\r\n\t\t\t\t\t\t// .attr() method\r\n\t\t\t\t\t\tif (!hasSetSymbolSize) {\r\n\t\t\t\t\t\t\twrapper.symbolAttr(hash);\r\n\r\n\t\t\t\t\t\t\thasSetSymbolSize = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tskipAttr = true;\r\n\r\n\t\t\t\t\t} else if (key === 'd') {\r\n\t\t\t\t\t\tvalue = value || [];\r\n\t\t\t\t\t\twrapper.d = value.join(' '); // used in getter for animation\r\n\r\n\t\t\t\t\t\telement.path = value = wrapper.pathToVML(value);\r\n\r\n\t\t\t\t\t\t// update shadows\r\n\t\t\t\t\t\tif (shadows) {\r\n\t\t\t\t\t\t\ti = shadows.length;\r\n\t\t\t\t\t\t\twhile (i--) {\r\n\t\t\t\t\t\t\t\tshadows[i].path = shadows[i].cutOff ? this.cutOffPath(value, shadows[i].cutOff) : value;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tskipAttr = true;\r\n\r\n\t\t\t\t\t// handle visibility\r\n\t\t\t\t\t} else if (key === 'visibility') {\r\n\r\n\t\t\t\t\t\t// let the shadow follow the main element\r\n\t\t\t\t\t\tif (shadows) {\r\n\t\t\t\t\t\t\ti = shadows.length;\r\n\t\t\t\t\t\t\twhile (i--) {\r\n\t\t\t\t\t\t\t\tshadows[i].style[key] = value;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// Instead of toggling the visibility CSS property, move the div out of the viewport.\r\n\t\t\t\t\t\t// This works around #61 and #586\r\n\t\t\t\t\t\tif (nodeName === 'DIV') {\r\n\t\t\t\t\t\t\tvalue = value === HIDDEN ? '-999em' : 0;\r\n\r\n\t\t\t\t\t\t\t// In order to redraw, IE7 needs the div to be visible when tucked away\r\n\t\t\t\t\t\t\t// outside the viewport. So the visibility is actually opposite of\r\n\t\t\t\t\t\t\t// the expected value. This applies to the tooltip only.\r\n\t\t\t\t\t\t\tif (!docMode8) {\r\n\t\t\t\t\t\t\t\telemStyle[key] = value ? VISIBLE : HIDDEN;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tkey = 'top';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telemStyle[key] = value;\r\n\t\t\t\t\t\tskipAttr = true;\r\n\r\n\t\t\t\t\t// directly mapped to css\r\n\t\t\t\t\t} else if (key === 'zIndex') {\r\n\r\n\t\t\t\t\t\tif (value) {\r\n\t\t\t\t\t\t\telemStyle[key] = value;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tskipAttr = true;\r\n\r\n\t\t\t\t\t// x, y, width, height\r\n\t\t\t\t\t} else if (inArray(key, ['x', 'y', 'width', 'height']) !== -1) {\r\n\r\n\t\t\t\t\t\twrapper[key] = value; // used in getter\r\n\r\n\t\t\t\t\t\tif (key === 'x' || key === 'y') {\r\n\t\t\t\t\t\t\tkey = { x: 'left', y: 'top' }[key];\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tvalue = mathMax(0, value); // don't set width or height below zero (#311)\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// clipping rectangle special\r\n\t\t\t\t\t\tif (wrapper.updateClipping) {\r\n\t\t\t\t\t\t\twrapper[key] = value; // the key is now 'left' or 'top' for 'x' and 'y'\r\n\t\t\t\t\t\t\twrapper.updateClipping();\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// normal\r\n\t\t\t\t\t\t\telemStyle[key] = value;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tskipAttr = true;\r\n\r\n\t\t\t\t\t// class name\r\n\t\t\t\t\t} else if (key === 'class' && nodeName === 'DIV') {\r\n\t\t\t\t\t\t// IE8 Standards mode has problems retrieving the className\r\n\t\t\t\t\t\telement.className = value;\r\n\r\n\t\t\t\t\t// stroke\r\n\t\t\t\t\t} else if (key === 'stroke') {\r\n\r\n\t\t\t\t\t\tvalue = renderer.color(value, element, key);\r\n\r\n\t\t\t\t\t\tkey = 'strokecolor';\r\n\r\n\t\t\t\t\t// stroke width\r\n\t\t\t\t\t} else if (key === 'stroke-width' || key === 'strokeWidth') {\r\n\t\t\t\t\t\telement.stroked = value ? true : false;\r\n\t\t\t\t\t\tkey = 'strokeweight';\r\n\t\t\t\t\t\twrapper[key] = value; // used in getter, issue #113\r\n\t\t\t\t\t\tif (isNumber(value)) {\r\n\t\t\t\t\t\t\tvalue += PX;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// dashStyle\r\n\t\t\t\t\t} else if (key === 'dashstyle') {\r\n\t\t\t\t\t\tvar strokeElem = element.getElementsByTagName('stroke')[0] ||\r\n\t\t\t\t\t\t\tcreateElement(renderer.prepVML(['<stroke/>']), null, null, element);\r\n\t\t\t\t\t\tstrokeElem[key] = value || 'solid';\r\n\t\t\t\t\t\twrapper.dashstyle = value; /* because changing stroke-width will change the dash length\r\n\t\t\t\t\t\t\tand cause an epileptic effect */\r\n\t\t\t\t\t\tskipAttr = true;\r\n\r\n\t\t\t\t\t// fill\r\n\t\t\t\t\t} else if (key === 'fill') {\r\n\r\n\t\t\t\t\t\tif (nodeName === 'SPAN') { // text color\r\n\t\t\t\t\t\t\telemStyle.color = value;\r\n\t\t\t\t\t\t} else if (nodeName !== 'IMG') { // #1336\r\n\t\t\t\t\t\t\telement.filled = value !== NONE ? true : false;\r\n\r\n\t\t\t\t\t\t\tvalue = renderer.color(value, element, key, wrapper);\r\n\r\n\t\t\t\t\t\t\tkey = 'fillcolor';\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// opacity: don't bother - animation is too slow and filters introduce artifacts\r\n\t\t\t\t\t} else if (key === 'opacity') {\r\n\t\t\t\t\t\t/*css(element, {\r\n\t\t\t\t\t\t\topacity: value\r\n\t\t\t\t\t\t});*/\r\n\t\t\t\t\t\tskipAttr = true;\r\n\r\n\t\t\t\t\t// rotation on VML elements\r\n\t\t\t\t\t} else if (nodeName === 'shape' && key === 'rotation') {\r\n\r\n\t\t\t\t\t\twrapper[key] = element.style[key] = value; // style is for #1873\r\n\r\n\t\t\t\t\t\t// Correction for the 1x1 size of the shape container. Used in gauge needles.\r\n\t\t\t\t\t\telement.style.left = -mathRound(mathSin(value * deg2rad) + 1) + PX;\r\n\t\t\t\t\t\telement.style.top = mathRound(mathCos(value * deg2rad)) + PX;\r\n\r\n\t\t\t\t\t// translation for animation\r\n\t\t\t\t\t} else if (key === 'translateX' || key === 'translateY' || key === 'rotation') {\r\n\t\t\t\t\t\twrapper[key] = value;\r\n\t\t\t\t\t\twrapper.updateTransform();\r\n\r\n\t\t\t\t\t\tskipAttr = true;\r\n\r\n\t\t\t\t\t// text for rotated and non-rotated elements\r\n\t\t\t\t\t} else if (key === 'text') {\r\n\t\t\t\t\t\tthis.bBox = null;\r\n\t\t\t\t\t\telement.innerHTML = value;\r\n\t\t\t\t\t\tskipAttr = true;\r\n\t\t\t\t\t}\r\n\r\n\r\n\t\t\t\t\tif (!skipAttr) {\r\n\t\t\t\t\t\tif (docMode8) { // IE8 setAttribute bug\r\n\t\t\t\t\t\t\telement[key] = value;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tattr(element, key, value);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn ret;\r\n\t},\r\n\r\n\t/**\r\n\t * Set the element's clipping to a predefined rectangle\r\n\t *\r\n\t * @param {String} id The id of the clip rectangle\r\n\t */\r\n\tclip: function (clipRect) {\r\n\t\tvar wrapper = this,\r\n\t\t\tclipMembers,\r\n\t\t\tcssRet;\r\n\r\n\t\tif (clipRect) {\r\n\t\t\tclipMembers = clipRect.members;\r\n\t\t\terase(clipMembers, wrapper); // Ensure unique list of elements (#1258)\r\n\t\t\tclipMembers.push(wrapper);\r\n\t\t\twrapper.destroyClip = function () {\r\n\t\t\t\terase(clipMembers, wrapper);\r\n\t\t\t};\r\n\t\t\tcssRet = clipRect.getCSS(wrapper);\r\n\r\n\t\t} else {\r\n\t\t\tif (wrapper.destroyClip) {\r\n\t\t\t\twrapper.destroyClip();\r\n\t\t\t}\r\n\t\t\tcssRet = { clip: docMode8 ? 'inherit' : 'rect(auto)' }; // #1214\r\n\t\t}\r\n\r\n\t\treturn wrapper.css(cssRet);\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Set styles for the element\r\n\t * @param {Object} styles\r\n\t */\r\n\tcss: SVGElement.prototype.htmlCss,\r\n\r\n\t/**\r\n\t * Removes a child either by removeChild or move to garbageBin.\r\n\t * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.\r\n\t */\r\n\tsafeRemoveChild: function (element) {\r\n\t\t// discardElement will detach the node from its parent before attaching it\r\n\t\t// to the garbage bin. Therefore it is important that the node is attached and have parent.\r\n\t\tif (element.parentNode) {\r\n\t\t\tdiscardElement(element);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Extend element.destroy by removing it from the clip members array\r\n\t */\r\n\tdestroy: function () {\r\n\t\tif (this.destroyClip) {\r\n\t\t\tthis.destroyClip();\r\n\t\t}\r\n\r\n\t\treturn SVGElement.prototype.destroy.apply(this);\r\n\t},\r\n\r\n\t/**\r\n\t * Add an event listener. VML override for normalizing event parameters.\r\n\t * @param {String} eventType\r\n\t * @param {Function} handler\r\n\t */\r\n\ton: function (eventType, handler) {\r\n\t\t// simplest possible event model for internal use\r\n\t\tthis.element['on' + eventType] = function () {\r\n\t\t\tvar evt = win.event;\r\n\t\t\tevt.target = evt.srcElement;\r\n\t\t\thandler(evt);\r\n\t\t};\r\n\t\treturn this;\r\n\t},\r\n\r\n\t/**\r\n\t * In stacked columns, cut off the shadows so that they don't overlap\r\n\t */\r\n\tcutOffPath: function (path, length) {\r\n\r\n\t\tvar len;\r\n\r\n\t\tpath = path.split(/[ ,]/);\r\n\t\tlen = path.length;\r\n\r\n\t\tif (len === 9 || len === 11) {\r\n\t\t\tpath[len - 4] = path[len - 2] = pInt(path[len - 2]) - 10 * length;\r\n\t\t}\r\n\t\treturn path.join(' ');\r\n\t},\r\n\r\n\t/**\r\n\t * Apply a drop shadow by copying elements and giving them different strokes\r\n\t * @param {Boolean|Object} shadowOptions\r\n\t */\r\n\tshadow: function (shadowOptions, group, cutOff) {\r\n\t\tvar shadows = [],\r\n\t\t\ti,\r\n\t\t\telement = this.element,\r\n\t\t\trenderer = this.renderer,\r\n\t\t\tshadow,\r\n\t\t\telemStyle = element.style,\r\n\t\t\tmarkup,\r\n\t\t\tpath = element.path,\r\n\t\t\tstrokeWidth,\r\n\t\t\tmodifiedPath,\r\n\t\t\tshadowWidth,\r\n\t\t\tshadowElementOpacity;\r\n\r\n\t\t// some times empty paths are not strings\r\n\t\tif (path && typeof path.value !== 'string') {\r\n\t\t\tpath = 'x';\r\n\t\t}\r\n\t\tmodifiedPath = path;\r\n\r\n\t\tif (shadowOptions) {\r\n\t\t\tshadowWidth = pick(shadowOptions.width, 3);\r\n\t\t\tshadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;\r\n\t\t\tfor (i = 1; i <= 3; i++) {\r\n\r\n\t\t\t\tstrokeWidth = (shadowWidth * 2) + 1 - (2 * i);\r\n\r\n\t\t\t\t// Cut off shadows for stacked column items\r\n\t\t\t\tif (cutOff) {\r\n\t\t\t\t\tmodifiedPath = this.cutOffPath(path.value, strokeWidth + 0.5);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmarkup = ['<shape isShadow=\"true\" strokeweight=\"', strokeWidth,\r\n\t\t\t\t\t'\" filled=\"false\" path=\"', modifiedPath,\r\n\t\t\t\t\t'\" coordsize=\"10 10\" style=\"', element.style.cssText, '\" />'];\r\n\r\n\t\t\t\tshadow = createElement(renderer.prepVML(markup),\r\n\t\t\t\t\tnull, {\r\n\t\t\t\t\t\tleft: pInt(elemStyle.left) + pick(shadowOptions.offsetX, 1),\r\n\t\t\t\t\t\ttop: pInt(elemStyle.top) + pick(shadowOptions.offsetY, 1)\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t\tif (cutOff) {\r\n\t\t\t\t\tshadow.cutOff = strokeWidth + 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// apply the opacity\r\n\t\t\t\tmarkup = ['<stroke color=\"', shadowOptions.color || 'black', '\" opacity=\"', shadowElementOpacity * i, '\"/>'];\r\n\t\t\t\tcreateElement(renderer.prepVML(markup), null, null, shadow);\r\n\r\n\r\n\t\t\t\t// insert it\r\n\t\t\t\tif (group) {\r\n\t\t\t\t\tgroup.element.appendChild(shadow);\r\n\t\t\t\t} else {\r\n\t\t\t\t\telement.parentNode.insertBefore(shadow, element);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// record it\r\n\t\t\t\tshadows.push(shadow);\r\n\r\n\t\t\t}\r\n\r\n\t\t\tthis.shadows = shadows;\r\n\t\t}\r\n\t\treturn this;\r\n\r\n\t}\r\n};\r\nVMLElement = extendClass(SVGElement, VMLElement);\r\n\r\n/**\r\n * The VML renderer\r\n */\r\nvar VMLRendererExtension = { // inherit SVGRenderer\r\n\r\n\tElement: VMLElement,\r\n\tisIE8: userAgent.indexOf('MSIE 8.0') > -1,\r\n\r\n\r\n\t/**\r\n\t * Initialize the VMLRenderer\r\n\t * @param {Object} container\r\n\t * @param {Number} width\r\n\t * @param {Number} height\r\n\t */\r\n\tinit: function (container, width, height) {\r\n\t\tvar renderer = this,\r\n\t\t\tboxWrapper,\r\n\t\t\tbox,\r\n\t\t\tcss;\r\n\r\n\t\trenderer.alignedObjects = [];\r\n\r\n\t\tboxWrapper = renderer.createElement(DIV);\r\n\t\tbox = boxWrapper.element;\r\n\t\tbox.style.position = RELATIVE; // for freeform drawing using renderer directly\r\n\t\tcontainer.appendChild(boxWrapper.element);\r\n\r\n\r\n\t\t// generate the containing box\r\n\t\trenderer.isVML = true;\r\n\t\trenderer.box = box;\r\n\t\trenderer.boxWrapper = boxWrapper;\r\n\r\n\r\n\t\trenderer.setSize(width, height, false);\r\n\r\n\t\t// The only way to make IE6 and IE7 print is to use a global namespace. However,\r\n\t\t// with IE8 the only way to make the dynamic shapes visible in screen and print mode\r\n\t\t// seems to be to add the xmlns attribute and the behaviour style inline.\r\n\t\tif (!doc.namespaces.hcv) {\r\n\r\n\t\t\tdoc.namespaces.add('hcv', 'urn:schemas-microsoft-com:vml');\r\n\r\n\t\t\t// Setup default CSS (#2153, #2368, #2384)\r\n\t\t\tcss = 'hcv\\\\:fill, hcv\\\\:path, hcv\\\\:shape, hcv\\\\:stroke' +\r\n\t\t\t\t'{ behavior:url(#default#VML); display: inline-block; } ';\r\n\t\t\ttry {\r\n\t\t\t\tdoc.createStyleSheet().cssText = css;\r\n\t\t\t} catch (e) {\r\n\t\t\t\tdoc.styleSheets[0].cssText += css;\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Detect whether the renderer is hidden. This happens when one of the parent elements\r\n\t * has display: none\r\n\t */\r\n\tisHidden: function () {\r\n\t\treturn !this.box.offsetWidth;\r\n\t},\r\n\r\n\t/**\r\n\t * Define a clipping rectangle. In VML it is accomplished by storing the values\r\n\t * for setting the CSS style to all associated members.\r\n\t *\r\n\t * @param {Number} x\r\n\t * @param {Number} y\r\n\t * @param {Number} width\r\n\t * @param {Number} height\r\n\t */\r\n\tclipRect: function (x, y, width, height) {\r\n\r\n\t\t// create a dummy element\r\n\t\tvar clipRect = this.createElement(),\r\n\t\t\tisObj = isObject(x);\r\n\r\n\t\t// mimic a rectangle with its style object for automatic updating in attr\r\n\t\treturn extend(clipRect, {\r\n\t\t\tmembers: [],\r\n\t\t\tleft: (isObj ? x.x : x) + 1,\r\n\t\t\ttop: (isObj ? x.y : y) + 1,\r\n\t\t\twidth: (isObj ? x.width : width) - 1,\r\n\t\t\theight: (isObj ? x.height : height) - 1,\r\n\t\t\tgetCSS: function (wrapper) {\r\n\t\t\t\tvar element = wrapper.element,\r\n\t\t\t\t\tnodeName = element.nodeName,\r\n\t\t\t\t\tisShape = nodeName === 'shape',\r\n\t\t\t\t\tinverted = wrapper.inverted,\r\n\t\t\t\t\trect = this,\r\n\t\t\t\t\ttop = rect.top - (isShape ? element.offsetTop : 0),\r\n\t\t\t\t\tleft = rect.left,\r\n\t\t\t\t\tright = left + rect.width,\r\n\t\t\t\t\tbottom = top + rect.height,\r\n\t\t\t\t\tret = {\r\n\t\t\t\t\t\tclip: 'rect(' +\r\n\t\t\t\t\t\t\tmathRound(inverted ? left : top) + 'px,' +\r\n\t\t\t\t\t\t\tmathRound(inverted ? bottom : right) + 'px,' +\r\n\t\t\t\t\t\t\tmathRound(inverted ? right : bottom) + 'px,' +\r\n\t\t\t\t\t\t\tmathRound(inverted ? top : left) + 'px)'\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t// issue 74 workaround\r\n\t\t\t\tif (!inverted && docMode8 && nodeName === 'DIV') {\r\n\t\t\t\t\textend(ret, {\r\n\t\t\t\t\t\twidth: right + PX,\r\n\t\t\t\t\t\theight: bottom + PX\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\treturn ret;\r\n\t\t\t},\r\n\r\n\t\t\t// used in attr and animation to update the clipping of all members\r\n\t\t\tupdateClipping: function () {\r\n\t\t\t\teach(clipRect.members, function (member) {\r\n\t\t\t\t\tmember.css(clipRect.getCSS(member));\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Take a color and return it if it's a string, make it a gradient if it's a\r\n\t * gradient configuration object, and apply opacity.\r\n\t *\r\n\t * @param {Object} color The color or config object\r\n\t */\r\n\tcolor: function (color, elem, prop, wrapper) {\r\n\t\tvar renderer = this,\r\n\t\t\tcolorObject,\r\n\t\t\tregexRgba = /^rgba/,\r\n\t\t\tmarkup,\r\n\t\t\tfillType,\r\n\t\t\tret = NONE;\r\n\r\n\t\t// Check for linear or radial gradient\r\n\t\tif (color && color.linearGradient) {\r\n\t\t\tfillType = 'gradient';\r\n\t\t} else if (color && color.radialGradient) {\r\n\t\t\tfillType = 'pattern';\r\n\t\t}\r\n\r\n\r\n\t\tif (fillType) {\r\n\r\n\t\t\tvar stopColor,\r\n\t\t\t\tstopOpacity,\r\n\t\t\t\tgradient = color.linearGradient || color.radialGradient,\r\n\t\t\t\tx1,\r\n\t\t\t\ty1,\r\n\t\t\t\tx2,\r\n\t\t\t\ty2,\r\n\t\t\t\topacity1,\r\n\t\t\t\topacity2,\r\n\t\t\t\tcolor1,\r\n\t\t\t\tcolor2,\r\n\t\t\t\tfillAttr = '',\r\n\t\t\t\tstops = color.stops,\r\n\t\t\t\tfirstStop,\r\n\t\t\t\tlastStop,\r\n\t\t\t\tcolors = [],\r\n\t\t\t\taddFillNode = function () {\r\n\t\t\t\t\t// Add the fill subnode. When colors attribute is used, the meanings of opacity and o:opacity2\r\n\t\t\t\t\t// are reversed.\r\n\t\t\t\t\tmarkup = ['<fill colors=\"' + colors.join(',') + '\" opacity=\"', opacity2, '\" o:opacity2=\"', opacity1,\r\n\t\t\t\t\t\t'\" type=\"', fillType, '\" ', fillAttr, 'focus=\"100%\" method=\"any\" />'];\r\n\t\t\t\t\tcreateElement(renderer.prepVML(markup), null, null, elem);\r\n\t\t\t\t};\r\n\r\n\t\t\t// Extend from 0 to 1\r\n\t\t\tfirstStop = stops[0];\r\n\t\t\tlastStop = stops[stops.length - 1];\r\n\t\t\tif (firstStop[0] > 0) {\r\n\t\t\t\tstops.unshift([\r\n\t\t\t\t\t0,\r\n\t\t\t\t\tfirstStop[1]\r\n\t\t\t\t]);\r\n\t\t\t}\r\n\t\t\tif (lastStop[0] < 1) {\r\n\t\t\t\tstops.push([\r\n\t\t\t\t\t1,\r\n\t\t\t\t\tlastStop[1]\r\n\t\t\t\t]);\r\n\t\t\t}\r\n\r\n\t\t\t// Compute the stops\r\n\t\t\teach(stops, function (stop, i) {\r\n\t\t\t\tif (regexRgba.test(stop[1])) {\r\n\t\t\t\t\tcolorObject = Color(stop[1]);\r\n\t\t\t\t\tstopColor = colorObject.get('rgb');\r\n\t\t\t\t\tstopOpacity = colorObject.get('a');\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstopColor = stop[1];\r\n\t\t\t\t\tstopOpacity = 1;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Build the color attribute\r\n\t\t\t\tcolors.push((stop[0] * 100) + '% ' + stopColor);\r\n\r\n\t\t\t\t// Only start and end opacities are allowed, so we use the first and the last\r\n\t\t\t\tif (!i) {\r\n\t\t\t\t\topacity1 = stopOpacity;\r\n\t\t\t\t\tcolor2 = stopColor;\r\n\t\t\t\t} else {\r\n\t\t\t\t\topacity2 = stopOpacity;\r\n\t\t\t\t\tcolor1 = stopColor;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// Apply the gradient to fills only.\r\n\t\t\tif (prop === 'fill') {\r\n\r\n\t\t\t\t// Handle linear gradient angle\r\n\t\t\t\tif (fillType === 'gradient') {\r\n\t\t\t\t\tx1 = gradient.x1 || gradient[0] || 0;\r\n\t\t\t\t\ty1 = gradient.y1 || gradient[1] || 0;\r\n\t\t\t\t\tx2 = gradient.x2 || gradient[2] || 0;\r\n\t\t\t\t\ty2 = gradient.y2 || gradient[3] || 0;\r\n\t\t\t\t\tfillAttr = 'angle=\"' + (90 - math.atan(\r\n\t\t\t\t\t\t(y2 - y1) / // y vector\r\n\t\t\t\t\t\t(x2 - x1) // x vector\r\n\t\t\t\t\t\t) * 180 / mathPI) + '\"';\r\n\r\n\t\t\t\t\taddFillNode();\r\n\r\n\t\t\t\t// Radial (circular) gradient\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tvar r = gradient.r,\r\n\t\t\t\t\t\tsizex = r * 2,\r\n\t\t\t\t\t\tsizey = r * 2,\r\n\t\t\t\t\t\tcx = gradient.cx,\r\n\t\t\t\t\t\tcy = gradient.cy,\r\n\t\t\t\t\t\tradialReference = elem.radialReference,\r\n\t\t\t\t\t\tbBox,\r\n\t\t\t\t\t\tapplyRadialGradient = function () {\r\n\t\t\t\t\t\t\tif (radialReference) {\r\n\t\t\t\t\t\t\t\tbBox = wrapper.getBBox();\r\n\t\t\t\t\t\t\t\tcx += (radialReference[0] - bBox.x) / bBox.width - 0.5;\r\n\t\t\t\t\t\t\t\tcy += (radialReference[1] - bBox.y) / bBox.height - 0.5;\r\n\t\t\t\t\t\t\t\tsizex *= radialReference[2] / bBox.width;\r\n\t\t\t\t\t\t\t\tsizey *= radialReference[2] / bBox.height;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tfillAttr = 'src=\"' + defaultOptions.global.VMLRadialGradientURL + '\" ' +\r\n\t\t\t\t\t\t\t\t'size=\"' + sizex + ',' + sizey + '\" ' +\r\n\t\t\t\t\t\t\t\t'origin=\"0.5,0.5\" ' +\r\n\t\t\t\t\t\t\t\t'position=\"' + cx + ',' + cy + '\" ' +\r\n\t\t\t\t\t\t\t\t'color2=\"' + color2 + '\" ';\r\n\r\n\t\t\t\t\t\t\taddFillNode();\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// Apply radial gradient\r\n\t\t\t\t\tif (wrapper.added) {\r\n\t\t\t\t\t\tapplyRadialGradient();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// We need to know the bounding box to get the size and position right\r\n\t\t\t\t\t\taddEvent(wrapper, 'add', applyRadialGradient);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// The fill element's color attribute is broken in IE8 standards mode, so we\r\n\t\t\t\t\t// need to set the parent shape's fillcolor attribute instead.\r\n\t\t\t\t\tret = color1;\r\n\t\t\t\t}\r\n\r\n\t\t\t// Gradients are not supported for VML stroke, return the first color. #722.\r\n\t\t\t} else {\r\n\t\t\t\tret = stopColor;\r\n\t\t\t}\r\n\r\n\t\t// if the color is an rgba color, split it and add a fill node\r\n\t\t// to hold the opacity component\r\n\t\t} else if (regexRgba.test(color) && elem.tagName !== 'IMG') {\r\n\r\n\t\t\tcolorObject = Color(color);\r\n\r\n\t\t\tmarkup = ['<', prop, ' opacity=\"', colorObject.get('a'), '\"/>'];\r\n\t\t\tcreateElement(this.prepVML(markup), null, null, elem);\r\n\r\n\t\t\tret = colorObject.get('rgb');\r\n\r\n\r\n\t\t} else {\r\n\t\t\tvar propNodes = elem.getElementsByTagName(prop); // 'stroke' or 'fill' node\r\n\t\t\tif (propNodes.length) {\r\n\t\t\t\tpropNodes[0].opacity = 1;\r\n\t\t\t\tpropNodes[0].type = 'solid';\r\n\t\t\t}\r\n\t\t\tret = color;\r\n\t\t}\r\n\r\n\t\treturn ret;\r\n\t},\r\n\r\n\t/**\r\n\t * Take a VML string and prepare it for either IE8 or IE6/IE7.\r\n\t * @param {Array} markup A string array of the VML markup to prepare\r\n\t */\r\n\tprepVML: function (markup) {\r\n\t\tvar vmlStyle = 'display:inline-block;behavior:url(#default#VML);',\r\n\t\t\tisIE8 = this.isIE8;\r\n\r\n\t\tmarkup = markup.join('');\r\n\r\n\t\tif (isIE8) { // add xmlns and style inline\r\n\t\t\tmarkup = markup.replace('/>', ' xmlns=\"urn:schemas-microsoft-com:vml\" />');\r\n\t\t\tif (markup.indexOf('style=\"') === -1) {\r\n\t\t\t\tmarkup = markup.replace('/>', ' style=\"' + vmlStyle + '\" />');\r\n\t\t\t} else {\r\n\t\t\t\tmarkup = markup.replace('style=\"', 'style=\"' + vmlStyle);\r\n\t\t\t}\r\n\r\n\t\t} else { // add namespace\r\n\t\t\tmarkup = markup.replace('<', '<hcv:');\r\n\t\t}\r\n\r\n\t\treturn markup;\r\n\t},\r\n\r\n\t/**\r\n\t * Create rotated and aligned text\r\n\t * @param {String} str\r\n\t * @param {Number} x\r\n\t * @param {Number} y\r\n\t */\r\n\ttext: SVGRenderer.prototype.html,\r\n\r\n\t/**\r\n\t * Create and return a path element\r\n\t * @param {Array} path\r\n\t */\r\n\tpath: function (path) {\r\n\t\tvar attr = {\r\n\t\t\t// subpixel precision down to 0.1 (width and height = 1px)\r\n\t\t\tcoordsize: '10 10'\r\n\t\t};\r\n\t\tif (isArray(path)) {\r\n\t\t\tattr.d = path;\r\n\t\t} else if (isObject(path)) { // attributes\r\n\t\t\textend(attr, path);\r\n\t\t}\r\n\t\t// create the shape\r\n\t\treturn this.createElement('shape').attr(attr);\r\n\t},\r\n\r\n\t/**\r\n\t * Create and return a circle element. In VML circles are implemented as\r\n\t * shapes, which is faster than v:oval\r\n\t * @param {Number} x\r\n\t * @param {Number} y\r\n\t * @param {Number} r\r\n\t */\r\n\tcircle: function (x, y, r) {\r\n\t\tvar circle = this.symbol('circle');\r\n\t\tif (isObject(x)) {\r\n\t\t\tr = x.r;\r\n\t\t\ty = x.y;\r\n\t\t\tx = x.x;\r\n\t\t}\r\n\t\tcircle.isCircle = true; // Causes x and y to mean center (#1682)\r\n\t\tcircle.r = r;\r\n\t\treturn circle.attr({ x: x, y: y });\r\n\t},\r\n\r\n\t/**\r\n\t * Create a group using an outer div and an inner v:group to allow rotating\r\n\t * and flipping. A simple v:group would have problems with positioning\r\n\t * child HTML elements and CSS clip.\r\n\t *\r\n\t * @param {String} name The name of the group\r\n\t */\r\n\tg: function (name) {\r\n\t\tvar wrapper,\r\n\t\t\tattribs;\r\n\r\n\t\t// set the class name\r\n\t\tif (name) {\r\n\t\t\tattribs = { 'className': PREFIX + name, 'class': PREFIX + name };\r\n\t\t}\r\n\r\n\t\t// the div to hold HTML and clipping\r\n\t\twrapper = this.createElement(DIV).attr(attribs);\r\n\r\n\t\treturn wrapper;\r\n\t},\r\n\r\n\t/**\r\n\t * VML override to create a regular HTML image\r\n\t * @param {String} src\r\n\t * @param {Number} x\r\n\t * @param {Number} y\r\n\t * @param {Number} width\r\n\t * @param {Number} height\r\n\t */\r\n\timage: function (src, x, y, width, height) {\r\n\t\tvar obj = this.createElement('img')\r\n\t\t\t.attr({ src: src });\r\n\r\n\t\tif (arguments.length > 1) {\r\n\t\t\tobj.attr({\r\n\t\t\t\tx: x,\r\n\t\t\t\ty: y,\r\n\t\t\t\twidth: width,\r\n\t\t\t\theight: height\r\n\t\t\t});\r\n\t\t}\r\n\t\treturn obj;\r\n\t},\r\n\r\n\t/**\r\n\t * VML uses a shape for rect to overcome bugs and rotation problems\r\n\t */\r\n\trect: function (x, y, width, height, r, strokeWidth) {\r\n\r\n\t\tvar wrapper = this.symbol('rect');\r\n\t\twrapper.r = isObject(x) ? x.r : r;\r\n\r\n\t\t//return wrapper.attr(wrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0)));\r\n\t\treturn wrapper.attr(\r\n\t\t\t\tisObject(x) ?\r\n\t\t\t\t\tx :\r\n\t\t\t\t\t// do not crispify when an object is passed in (as in column charts)\r\n\t\t\t\t\twrapper.crisp(strokeWidth, x, y, mathMax(width, 0), mathMax(height, 0))\r\n\t\t\t);\r\n\t},\r\n\r\n\t/**\r\n\t * In the VML renderer, each child of an inverted div (group) is inverted\r\n\t * @param {Object} element\r\n\t * @param {Object} parentNode\r\n\t */\r\n\tinvertChild: function (element, parentNode) {\r\n\t\tvar parentStyle = parentNode.style;\r\n\t\tcss(element, {\r\n\t\t\tflip: 'x',\r\n\t\t\tleft: pInt(parentStyle.width) - 1,\r\n\t\t\ttop: pInt(parentStyle.height) - 1,\r\n\t\t\trotation: -90\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Symbol definitions that override the parent SVG renderer's symbols\r\n\t *\r\n\t */\r\n\tsymbols: {\r\n\t\t// VML specific arc function\r\n\t\tarc: function (x, y, w, h, options) {\r\n\t\t\tvar start = options.start,\r\n\t\t\t\tend = options.end,\r\n\t\t\t\tradius = options.r || w || h,\r\n\t\t\t\tinnerRadius = options.innerR,\r\n\t\t\t\tcosStart = mathCos(start),\r\n\t\t\t\tsinStart = mathSin(start),\r\n\t\t\t\tcosEnd = mathCos(end),\r\n\t\t\t\tsinEnd = mathSin(end),\r\n\t\t\t\tret;\r\n\r\n\t\t\tif (end - start === 0) { // no angle, don't show it.\r\n\t\t\t\treturn ['x'];\r\n\t\t\t}\r\n\r\n\t\t\tret = [\r\n\t\t\t\t'wa', // clockwise arc to\r\n\t\t\t\tx - radius, // left\r\n\t\t\t\ty - radius, // top\r\n\t\t\t\tx + radius, // right\r\n\t\t\t\ty + radius, // bottom\r\n\t\t\t\tx + radius * cosStart, // start x\r\n\t\t\t\ty + radius * sinStart, // start y\r\n\t\t\t\tx + radius * cosEnd, // end x\r\n\t\t\t\ty + radius * sinEnd // end y\r\n\t\t\t];\r\n\r\n\t\t\tif (options.open && !innerRadius) {\r\n\t\t\t\tret.push(\r\n\t\t\t\t\t'e',\r\n\t\t\t\t\tM,\r\n\t\t\t\t\tx,// - innerRadius,\r\n\t\t\t\t\ty// - innerRadius\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\tret.push(\r\n\t\t\t\t'at', // anti clockwise arc to\r\n\t\t\t\tx - innerRadius, // left\r\n\t\t\t\ty - innerRadius, // top\r\n\t\t\t\tx + innerRadius, // right\r\n\t\t\t\ty + innerRadius, // bottom\r\n\t\t\t\tx + innerRadius * cosEnd, // start x\r\n\t\t\t\ty + innerRadius * sinEnd, // start y\r\n\t\t\t\tx + innerRadius * cosStart, // end x\r\n\t\t\t\ty + innerRadius * sinStart, // end y\r\n\t\t\t\t'x', // finish path\r\n\t\t\t\t'e' // close\r\n\t\t\t);\r\n\r\n\t\t\tret.isArc = true;\r\n\t\t\treturn ret;\r\n\r\n\t\t},\r\n\t\t// Add circle symbol path. This performs significantly faster than v:oval.\r\n\t\tcircle: function (x, y, w, h, wrapper) {\r\n\r\n\t\t\tif (wrapper) {\r\n\t\t\t\tw = h = 2 * wrapper.r;\r\n\t\t\t}\r\n\r\n\t\t\t// Center correction, #1682\r\n\t\t\tif (wrapper && wrapper.isCircle) {\r\n\t\t\t\tx -= w / 2;\r\n\t\t\t\ty -= h / 2;\r\n\t\t\t}\r\n\r\n\t\t\t// Return the path\r\n\t\t\treturn [\r\n\t\t\t\t'wa', // clockwisearcto\r\n\t\t\t\tx, // left\r\n\t\t\t\ty, // top\r\n\t\t\t\tx + w, // right\r\n\t\t\t\ty + h, // bottom\r\n\t\t\t\tx + w, // start x\r\n\t\t\t\ty + h / 2, // start y\r\n\t\t\t\tx + w, // end x\r\n\t\t\t\ty + h / 2, // end y\r\n\t\t\t\t//'x', // finish path\r\n\t\t\t\t'e' // close\r\n\t\t\t];\r\n\t\t},\r\n\t\t/**\r\n\t\t * Add rectangle symbol path which eases rotation and omits arcsize problems\r\n\t\t * compared to the built-in VML roundrect shape\r\n\t\t *\r\n\t\t * @param {Number} left Left position\r\n\t\t * @param {Number} top Top position\r\n\t\t * @param {Number} r Border radius\r\n\t\t * @param {Object} options Width and height\r\n\t\t */\r\n\r\n\t\trect: function (left, top, width, height, options) {\r\n\r\n\t\t\tvar right = left + width,\r\n\t\t\t\tbottom = top + height,\r\n\t\t\t\tret,\r\n\t\t\t\tr;\r\n\r\n\t\t\t// No radius, return the more lightweight square\r\n\t\t\tif (!defined(options) || !options.r) {\r\n\t\t\t\tret = SVGRenderer.prototype.symbols.square.apply(0, arguments);\r\n\r\n\t\t\t// Has radius add arcs for the corners\r\n\t\t\t} else {\r\n\r\n\t\t\t\tr = mathMin(options.r, width, height);\r\n\t\t\t\tret = [\r\n\t\t\t\t\tM,\r\n\t\t\t\t\tleft + r, top,\r\n\r\n\t\t\t\t\tL,\r\n\t\t\t\t\tright - r, top,\r\n\t\t\t\t\t'wa',\r\n\t\t\t\t\tright - 2 * r, top,\r\n\t\t\t\t\tright, top + 2 * r,\r\n\t\t\t\t\tright - r, top,\r\n\t\t\t\t\tright, top + r,\r\n\r\n\t\t\t\t\tL,\r\n\t\t\t\t\tright, bottom - r,\r\n\t\t\t\t\t'wa',\r\n\t\t\t\t\tright - 2 * r, bottom - 2 * r,\r\n\t\t\t\t\tright, bottom,\r\n\t\t\t\t\tright, bottom - r,\r\n\t\t\t\t\tright - r, bottom,\r\n\r\n\t\t\t\t\tL,\r\n\t\t\t\t\tleft + r, bottom,\r\n\t\t\t\t\t'wa',\r\n\t\t\t\t\tleft, bottom - 2 * r,\r\n\t\t\t\t\tleft + 2 * r, bottom,\r\n\t\t\t\t\tleft + r, bottom,\r\n\t\t\t\t\tleft, bottom - r,\r\n\r\n\t\t\t\t\tL,\r\n\t\t\t\t\tleft, top + r,\r\n\t\t\t\t\t'wa',\r\n\t\t\t\t\tleft, top,\r\n\t\t\t\t\tleft + 2 * r, top + 2 * r,\r\n\t\t\t\t\tleft, top + r,\r\n\t\t\t\t\tleft + r, top,\r\n\r\n\r\n\t\t\t\t\t'x',\r\n\t\t\t\t\t'e'\r\n\t\t\t\t];\r\n\t\t\t}\r\n\t\t\treturn ret;\r\n\t\t}\r\n\t}\r\n};\r\nHighcharts.VMLRenderer = VMLRenderer = function () {\r\n\tthis.init.apply(this, arguments);\r\n};\r\nVMLRenderer.prototype = merge(SVGRenderer.prototype, VMLRendererExtension);\r\n\r\n\t// general renderer\r\n\tRenderer = VMLRenderer;\r\n}\r\n\r\n// This method is used with exporting in old IE, when emulating SVG (see #2314)\r\nSVGRenderer.prototype.measureSpanWidth = function (text, styles) {\r\n\tvar measuringSpan = doc.createElement('span'),\r\n\ttextNode = doc.createTextNode(text);\r\n\r\n\tmeasuringSpan.appendChild(textNode);\r\n\tcss(measuringSpan, styles);\r\n\tthis.box.appendChild(measuringSpan);\r\n\treturn measuringSpan.offsetWidth;\r\n};\r\n\r\n\r\n/* ****************************************************************************\r\n * *\r\n * END OF INTERNET EXPLORER <= 8 SPECIFIC CODE *\r\n * *\r\n *****************************************************************************/\r\n/* ****************************************************************************\r\n * *\r\n * START OF ANDROID < 3 SPECIFIC CODE. THIS CAN BE REMOVED IF YOU'RE NOT *\r\n * TARGETING THAT SYSTEM. *\r\n * *\r\n *****************************************************************************/\r\nvar CanVGRenderer,\r\n\tCanVGController;\r\n\r\nif (useCanVG) {\r\n\t/**\r\n\t * The CanVGRenderer is empty from start to keep the source footprint small.\r\n\t * When requested, the CanVGController downloads the rest of the source packaged\r\n\t * together with the canvg library.\r\n\t */\r\n\tHighcharts.CanVGRenderer = CanVGRenderer = function () {\r\n\t\t// Override the global SVG namespace to fake SVG/HTML that accepts CSS\r\n\t\tSVG_NS = 'http://www.w3.org/1999/xhtml';\r\n\t};\r\n\r\n\t/**\r\n\t * Start with an empty symbols object. This is needed when exporting is used (exporting.src.js will add a few symbols), but \r\n\t * the implementation from SvgRenderer will not be merged in until first render.\r\n\t */\r\n\tCanVGRenderer.prototype.symbols = {};\r\n\r\n\t/**\r\n\t * Handles on demand download of canvg rendering support.\r\n\t */\r\n\tCanVGController = (function () {\r\n\t\t// List of renderering calls\r\n\t\tvar deferredRenderCalls = [];\r\n\r\n\t\t/**\r\n\t\t * When downloaded, we are ready to draw deferred charts.\r\n\t\t */\r\n\t\tfunction drawDeferred() {\r\n\t\t\tvar callLength = deferredRenderCalls.length,\r\n\t\t\t\tcallIndex;\r\n\r\n\t\t\t// Draw all pending render calls\r\n\t\t\tfor (callIndex = 0; callIndex < callLength; callIndex++) {\r\n\t\t\t\tdeferredRenderCalls[callIndex]();\r\n\t\t\t}\r\n\t\t\t// Clear the list\r\n\t\t\tdeferredRenderCalls = [];\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tpush: function (func, scriptLocation) {\r\n\t\t\t\t// Only get the script once\r\n\t\t\t\tif (deferredRenderCalls.length === 0) {\r\n\t\t\t\t\tgetScript(scriptLocation, drawDeferred);\r\n\t\t\t\t}\r\n\t\t\t\t// Register render call\r\n\t\t\t\tdeferredRenderCalls.push(func);\r\n\t\t\t}\r\n\t\t};\r\n\t}());\r\n\r\n\tRenderer = CanVGRenderer;\r\n} // end CanVGRenderer\r\n\r\n/* ****************************************************************************\r\n * *\r\n * END OF ANDROID < 3 SPECIFIC CODE *\r\n * *\r\n *****************************************************************************/\r\n\r\n/**\r\n * The Tick class\r\n */\r\nfunction Tick(axis, pos, type, noLabel) {\r\n\tthis.axis = axis;\r\n\tthis.pos = pos;\r\n\tthis.type = type || '';\r\n\tthis.isNew = true;\r\n\r\n\tif (!type && !noLabel) {\r\n\t\tthis.addLabel();\r\n\t}\r\n}\r\n\r\nTick.prototype = {\r\n\t/**\r\n\t * Write the tick label\r\n\t */\r\n\taddLabel: function () {\r\n\t\tvar tick = this,\r\n\t\t\taxis = tick.axis,\r\n\t\t\toptions = axis.options,\r\n\t\t\tchart = axis.chart,\r\n\t\t\thoriz = axis.horiz,\r\n\t\t\tcategories = axis.categories,\r\n\t\t\tnames = axis.names,\r\n\t\t\tpos = tick.pos,\r\n\t\t\tlabelOptions = options.labels,\r\n\t\t\tstr,\r\n\t\t\ttickPositions = axis.tickPositions,\r\n\t\t\twidth = (horiz && categories &&\r\n\t\t\t\t!labelOptions.step && !labelOptions.staggerLines &&\r\n\t\t\t\t!labelOptions.rotation &&\r\n\t\t\t\tchart.plotWidth / tickPositions.length) ||\r\n\t\t\t\t(!horiz && (chart.margin[3] || chart.chartWidth * 0.33)), // #1580, #1931\r\n\t\t\tisFirst = pos === tickPositions[0],\r\n\t\t\tisLast = pos === tickPositions[tickPositions.length - 1],\r\n\t\t\tcss,\r\n\t\t\tattr,\r\n\t\t\tvalue = categories ?\r\n\t\t\t\tpick(categories[pos], names[pos], pos) : \r\n\t\t\t\tpos,\r\n\t\t\tlabel = tick.label,\r\n\t\t\ttickPositionInfo = tickPositions.info,\r\n\t\t\tdateTimeLabelFormat;\r\n\r\n\t\t// Set the datetime label format. If a higher rank is set for this position, use that. If not,\r\n\t\t// use the general format.\r\n\t\tif (axis.isDatetimeAxis && tickPositionInfo) {\r\n\t\t\tdateTimeLabelFormat = options.dateTimeLabelFormats[tickPositionInfo.higherRanks[pos] || tickPositionInfo.unitName];\r\n\t\t}\r\n\r\n\t\t// set properties for access in render method\r\n\t\ttick.isFirst = isFirst;\r\n\t\ttick.isLast = isLast;\r\n\r\n\t\t// get the string\r\n\t\tstr = axis.labelFormatter.call({\r\n\t\t\taxis: axis,\r\n\t\t\tchart: chart,\r\n\t\t\tisFirst: isFirst,\r\n\t\t\tisLast: isLast,\r\n\t\t\tdateTimeLabelFormat: dateTimeLabelFormat,\r\n\t\t\tvalue: axis.isLog ? correctFloat(lin2log(value)) : value\r\n\t\t});\r\n\r\n\t\t// prepare CSS\r\n\t\tcss = width && { width: mathMax(1, mathRound(width - 2 * (labelOptions.padding || 10))) + PX };\r\n\t\tcss = extend(css, labelOptions.style);\r\n\r\n\t\t// first call\r\n\t\tif (!defined(label)) {\r\n\t\t\tattr = {\r\n\t\t\t\talign: axis.labelAlign\r\n\t\t\t};\r\n\t\t\tif (isNumber(labelOptions.rotation)) {\r\n\t\t\t\tattr.rotation = labelOptions.rotation;\r\n\t\t\t}\r\n\t\t\tif (width && labelOptions.ellipsis) {\r\n\t\t\t\tattr._clipHeight = axis.len / tickPositions.length;\r\n\t\t\t}\r\n\r\n\t\t\ttick.label =\r\n\t\t\t\tdefined(str) && labelOptions.enabled ?\r\n\t\t\t\t\tchart.renderer.text(\r\n\t\t\t\t\t\t\tstr,\r\n\t\t\t\t\t\t\t0,\r\n\t\t\t\t\t\t\t0,\r\n\t\t\t\t\t\t\tlabelOptions.useHTML\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t\t.attr(attr)\r\n\t\t\t\t\t\t// without position absolute, IE export sometimes is wrong\r\n\t\t\t\t\t\t.css(css)\r\n\t\t\t\t\t\t.add(axis.labelGroup) :\r\n\t\t\t\t\tnull;\r\n\r\n\t\t// update\r\n\t\t} else if (label) {\r\n\t\t\tlabel.attr({\r\n\t\t\t\t\ttext: str\r\n\t\t\t\t})\r\n\t\t\t\t.css(css);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Get the offset height or width of the label\r\n\t */\r\n\tgetLabelSize: function () {\r\n\t\tvar label = this.label,\r\n\t\t\taxis = this.axis;\r\n\t\treturn label ?\r\n\t\t\t((this.labelBBox = label.getBBox()))[axis.horiz ? 'height' : 'width'] :\r\n\t\t\t0;\r\n\t},\r\n\r\n\t/**\r\n\t * Find how far the labels extend to the right and left of the tick's x position. Used for anti-collision\r\n\t * detection with overflow logic.\r\n\t */\r\n\tgetLabelSides: function () {\r\n\t\tvar bBox = this.labelBBox, // assume getLabelSize has run at this point\r\n\t\t\taxis = this.axis,\r\n\t\t\toptions = axis.options,\r\n\t\t\tlabelOptions = options.labels,\r\n\t\t\twidth = bBox.width,\r\n\t\t\tleftSide = width * { left: 0, center: 0.5, right: 1 }[axis.labelAlign] - labelOptions.x;\r\n\r\n\t\treturn [-leftSide, width - leftSide];\r\n\t},\r\n\r\n\t/**\r\n\t * Handle the label overflow by adjusting the labels to the left and right edge, or\r\n\t * hide them if they collide into the neighbour label.\r\n\t */\r\n\thandleOverflow: function (index, xy) {\r\n\t\tvar show = true,\r\n\t\t\taxis = this.axis,\r\n\t\t\tchart = axis.chart,\r\n\t\t\tisFirst = this.isFirst,\r\n\t\t\tisLast = this.isLast,\r\n\t\t\tx = xy.x,\r\n\t\t\treversed = axis.reversed,\r\n\t\t\ttickPositions = axis.tickPositions;\r\n\r\n\t\tif (isFirst || isLast) {\r\n\r\n\t\t\tvar sides = this.getLabelSides(),\r\n\t\t\t\tleftSide = sides[0],\r\n\t\t\t\trightSide = sides[1],\r\n\t\t\t\tplotLeft = chart.plotLeft,\r\n\t\t\t\tplotRight = plotLeft + axis.len,\r\n\t\t\t\tneighbour = axis.ticks[tickPositions[index + (isFirst ? 1 : -1)]],\r\n\t\t\t\tneighbourEdge = neighbour && neighbour.label.xy && neighbour.label.xy.x + neighbour.getLabelSides()[isFirst ? 0 : 1];\r\n\r\n\t\t\tif ((isFirst && !reversed) || (isLast && reversed)) {\r\n\t\t\t\t// Is the label spilling out to the left of the plot area?\r\n\t\t\t\tif (x + leftSide < plotLeft) {\r\n\r\n\t\t\t\t\t// Align it to plot left\r\n\t\t\t\t\tx = plotLeft - leftSide;\r\n\r\n\t\t\t\t\t// Hide it if it now overlaps the neighbour label\r\n\t\t\t\t\tif (neighbour && x + rightSide > neighbourEdge) {\r\n\t\t\t\t\t\tshow = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// Is the label spilling out to the right of the plot area?\r\n\t\t\t\tif (x + rightSide > plotRight) {\r\n\r\n\t\t\t\t\t// Align it to plot right\r\n\t\t\t\t\tx = plotRight - rightSide;\r\n\r\n\t\t\t\t\t// Hide it if it now overlaps the neighbour label\r\n\t\t\t\t\tif (neighbour && x + leftSide < neighbourEdge) {\r\n\t\t\t\t\t\tshow = false;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Set the modified x position of the label\r\n\t\t\txy.x = x;\r\n\t\t}\r\n\t\treturn show;\r\n\t},\r\n\r\n\t/**\r\n\t * Get the x and y position for ticks and labels\r\n\t */\r\n\tgetPosition: function (horiz, pos, tickmarkOffset, old) {\r\n\t\tvar axis = this.axis,\r\n\t\t\tchart = axis.chart,\r\n\t\t\tcHeight = (old && chart.oldChartHeight) || chart.chartHeight;\r\n\t\t\r\n\t\treturn {\r\n\t\t\tx: horiz ?\r\n\t\t\t\taxis.translate(pos + tickmarkOffset, null, null, old) + axis.transB :\r\n\t\t\t\taxis.left + axis.offset + (axis.opposite ? ((old && chart.oldChartWidth) || chart.chartWidth) - axis.right - axis.left : 0),\r\n\r\n\t\t\ty: horiz ?\r\n\t\t\t\tcHeight - axis.bottom + axis.offset - (axis.opposite ? axis.height : 0) :\r\n\t\t\t\tcHeight - axis.translate(pos + tickmarkOffset, null, null, old) - axis.transB\r\n\t\t};\r\n\t\t\r\n\t},\r\n\t\r\n\t/**\r\n\t * Get the x, y position of the tick label\r\n\t */\r\n\tgetLabelPosition: function (x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {\r\n\t\tvar axis = this.axis,\r\n\t\t\ttransA = axis.transA,\r\n\t\t\treversed = axis.reversed,\r\n\t\t\tstaggerLines = axis.staggerLines,\r\n\t\t\tbaseline = axis.chart.renderer.fontMetrics(labelOptions.style.fontSize).b,\r\n\t\t\trotation = labelOptions.rotation;\r\n\t\t\t\r\n\t\tx = x + labelOptions.x - (tickmarkOffset && horiz ?\r\n\t\t\ttickmarkOffset * transA * (reversed ? -1 : 1) : 0);\r\n\t\ty = y + labelOptions.y - (tickmarkOffset && !horiz ?\r\n\t\t\ttickmarkOffset * transA * (reversed ? 1 : -1) : 0);\r\n\r\n\t\t// Correct for rotation (#1764)\r\n\t\tif (rotation && axis.side === 2) {\r\n\t\t\ty -= baseline - baseline * mathCos(rotation * deg2rad);\r\n\t\t}\r\n\t\t\r\n\t\t// Vertically centered\r\n\t\tif (!defined(labelOptions.y) && !rotation) { // #1951\r\n\t\t\ty += baseline - label.getBBox().height / 2;\r\n\t\t}\r\n\t\t\r\n\t\t// Correct for staggered labels\r\n\t\tif (staggerLines) {\r\n\t\t\ty += (index / (step || 1) % staggerLines) * (axis.labelOffset / staggerLines);\r\n\t\t}\r\n\t\t\r\n\t\treturn {\r\n\t\t\tx: x,\r\n\t\t\ty: y\r\n\t\t};\r\n\t},\r\n\t\r\n\t/**\r\n\t * Extendible method to return the path of the marker\r\n\t */\r\n\tgetMarkPath: function (x, y, tickLength, tickWidth, horiz, renderer) {\r\n\t\treturn renderer.crispLine([\r\n\t\t\t\tM,\r\n\t\t\t\tx,\r\n\t\t\t\ty,\r\n\t\t\t\tL,\r\n\t\t\t\tx + (horiz ? 0 : -tickLength),\r\n\t\t\t\ty + (horiz ? tickLength : 0)\r\n\t\t\t], tickWidth);\r\n\t},\r\n\r\n\t/**\r\n\t * Put everything in place\r\n\t *\r\n\t * @param index {Number}\r\n\t * @param old {Boolean} Use old coordinates to prepare an animation into new position\r\n\t */\r\n\trender: function (index, old, opacity) {\r\n\t\tvar tick = this,\r\n\t\t\taxis = tick.axis,\r\n\t\t\toptions = axis.options,\r\n\t\t\tchart = axis.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\thoriz = axis.horiz,\r\n\t\t\ttype = tick.type,\r\n\t\t\tlabel = tick.label,\r\n\t\t\tpos = tick.pos,\r\n\t\t\tlabelOptions = options.labels,\r\n\t\t\tgridLine = tick.gridLine,\r\n\t\t\tgridPrefix = type ? type + 'Grid' : 'grid',\r\n\t\t\ttickPrefix = type ? type + 'Tick' : 'tick',\r\n\t\t\tgridLineWidth = options[gridPrefix + 'LineWidth'],\r\n\t\t\tgridLineColor = options[gridPrefix + 'LineColor'],\r\n\t\t\tdashStyle = options[gridPrefix + 'LineDashStyle'],\r\n\t\t\ttickLength = options[tickPrefix + 'Length'],\r\n\t\t\ttickWidth = options[tickPrefix + 'Width'] || 0,\r\n\t\t\ttickColor = options[tickPrefix + 'Color'],\r\n\t\t\ttickPosition = options[tickPrefix + 'Position'],\r\n\t\t\tgridLinePath,\r\n\t\t\tmark = tick.mark,\r\n\t\t\tmarkPath,\r\n\t\t\tstep = labelOptions.step,\r\n\t\t\tattribs,\r\n\t\t\tshow = true,\r\n\t\t\ttickmarkOffset = axis.tickmarkOffset,\r\n\t\t\txy = tick.getPosition(horiz, pos, tickmarkOffset, old),\r\n\t\t\tx = xy.x,\r\n\t\t\ty = xy.y,\r\n\t\t\treverseCrisp = ((horiz && x === axis.pos + axis.len) || (!horiz && y === axis.pos)) ? -1 : 1, // #1480, #1687\r\n\t\t\tstaggerLines = axis.staggerLines;\r\n\r\n\t\tthis.isActive = true;\r\n\t\t\r\n\t\t// create the grid line\r\n\t\tif (gridLineWidth) {\r\n\t\t\tgridLinePath = axis.getPlotLinePath(pos + tickmarkOffset, gridLineWidth * reverseCrisp, old, true);\r\n\r\n\t\t\tif (gridLine === UNDEFINED) {\r\n\t\t\t\tattribs = {\r\n\t\t\t\t\tstroke: gridLineColor,\r\n\t\t\t\t\t'stroke-width': gridLineWidth\r\n\t\t\t\t};\r\n\t\t\t\tif (dashStyle) {\r\n\t\t\t\t\tattribs.dashstyle = dashStyle;\r\n\t\t\t\t}\r\n\t\t\t\tif (!type) {\r\n\t\t\t\t\tattribs.zIndex = 1;\r\n\t\t\t\t}\r\n\t\t\t\tif (old) {\r\n\t\t\t\t\tattribs.opacity = 0;\r\n\t\t\t\t}\r\n\t\t\t\ttick.gridLine = gridLine =\r\n\t\t\t\t\tgridLineWidth ?\r\n\t\t\t\t\t\trenderer.path(gridLinePath)\r\n\t\t\t\t\t\t\t.attr(attribs).add(axis.gridGroup) :\r\n\t\t\t\t\t\tnull;\r\n\t\t\t}\r\n\r\n\t\t\t// If the parameter 'old' is set, the current call will be followed\r\n\t\t\t// by another call, therefore do not do any animations this time\r\n\t\t\tif (!old && gridLine && gridLinePath) {\r\n\t\t\t\tgridLine[tick.isNew ? 'attr' : 'animate']({\r\n\t\t\t\t\td: gridLinePath,\r\n\t\t\t\t\topacity: opacity\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// create the tick mark\r\n\t\tif (tickWidth && tickLength) {\r\n\r\n\t\t\t// negate the length\r\n\t\t\tif (tickPosition === 'inside') {\r\n\t\t\t\ttickLength = -tickLength;\r\n\t\t\t}\r\n\t\t\tif (axis.opposite) {\r\n\t\t\t\ttickLength = -tickLength;\r\n\t\t\t}\r\n\r\n\t\t\tmarkPath = tick.getMarkPath(x, y, tickLength, tickWidth * reverseCrisp, horiz, renderer);\r\n\r\n\t\t\tif (mark) { // updating\r\n\t\t\t\tmark.animate({\r\n\t\t\t\t\td: markPath,\r\n\t\t\t\t\topacity: opacity\r\n\t\t\t\t});\r\n\t\t\t} else { // first time\r\n\t\t\t\ttick.mark = renderer.path(\r\n\t\t\t\t\tmarkPath\r\n\t\t\t\t).attr({\r\n\t\t\t\t\tstroke: tickColor,\r\n\t\t\t\t\t'stroke-width': tickWidth,\r\n\t\t\t\t\topacity: opacity\r\n\t\t\t\t}).add(axis.axisGroup);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// the label is created on init - now move it into place\r\n\t\tif (label && !isNaN(x)) {\r\n\t\t\tlabel.xy = xy = tick.getLabelPosition(x, y, label, horiz, labelOptions, tickmarkOffset, index, step);\r\n\r\n\t\t\t// Apply show first and show last. If the tick is both first and last, it is \r\n\t\t\t// a single centered tick, in which case we show the label anyway (#2100).\r\n\t\t\tif ((tick.isFirst && !tick.isLast && !pick(options.showFirstLabel, 1)) ||\r\n\t\t\t\t\t(tick.isLast && !tick.isFirst && !pick(options.showLastLabel, 1))) {\r\n\t\t\t\tshow = false;\r\n\r\n\t\t\t// Handle label overflow and show or hide accordingly\r\n\t\t\t} else if (!staggerLines && horiz && labelOptions.overflow === 'justify' && !tick.handleOverflow(index, xy)) {\r\n\t\t\t\tshow = false;\r\n\t\t\t}\r\n\r\n\t\t\t// apply step\r\n\t\t\tif (step && index % step) {\r\n\t\t\t\t// show those indices dividable by step\r\n\t\t\t\tshow = false;\r\n\t\t\t}\r\n\r\n\t\t\t// Set the new position, and show or hide\r\n\t\t\tif (show && !isNaN(xy.y)) {\r\n\t\t\t\txy.opacity = opacity;\r\n\t\t\t\tlabel[tick.isNew ? 'attr' : 'animate'](xy);\r\n\t\t\t\ttick.isNew = false;\r\n\t\t\t} else {\r\n\t\t\t\tlabel.attr('y', -9999); // #1338\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Destructor for the tick prototype\r\n\t */\r\n\tdestroy: function () {\r\n\t\tdestroyObjectProperties(this, this.axis);\r\n\t}\r\n};\r\n\r\n/**\r\n * The object wrapper for plot lines and plot bands\r\n * @param {Object} options\r\n */\r\nfunction PlotLineOrBand(axis, options) {\r\n\tthis.axis = axis;\r\n\r\n\tif (options) {\r\n\t\tthis.options = options;\r\n\t\tthis.id = options.id;\r\n\t}\r\n}\r\n\r\nPlotLineOrBand.prototype = {\r\n\t\r\n\t/**\r\n\t * Render the plot line or plot band. If it is already existing,\r\n\t * move it.\r\n\t */\r\n\trender: function () {\r\n\t\tvar plotLine = this,\r\n\t\t\taxis = plotLine.axis,\r\n\t\t\thoriz = axis.horiz,\r\n\t\t\thalfPointRange = (axis.pointRange || 0) / 2,\r\n\t\t\toptions = plotLine.options,\r\n\t\t\toptionsLabel = options.label,\r\n\t\t\tlabel = plotLine.label,\r\n\t\t\twidth = options.width,\r\n\t\t\tto = options.to,\r\n\t\t\tfrom = options.from,\r\n\t\t\tisBand = defined(from) && defined(to),\r\n\t\t\tvalue = options.value,\r\n\t\t\tdashStyle = options.dashStyle,\r\n\t\t\tsvgElem = plotLine.svgElem,\r\n\t\t\tpath = [],\r\n\t\t\taddEvent,\r\n\t\t\teventType,\r\n\t\t\txs,\r\n\t\t\tys,\r\n\t\t\tx,\r\n\t\t\ty,\r\n\t\t\tcolor = options.color,\r\n\t\t\tzIndex = options.zIndex,\r\n\t\t\tevents = options.events,\r\n\t\t\tattribs,\r\n\t\t\trenderer = axis.chart.renderer;\r\n\r\n\t\t// logarithmic conversion\r\n\t\tif (axis.isLog) {\r\n\t\t\tfrom = log2lin(from);\r\n\t\t\tto = log2lin(to);\r\n\t\t\tvalue = log2lin(value);\r\n\t\t}\r\n\r\n\t\t// plot line\r\n\t\tif (width) {\r\n\t\t\tpath = axis.getPlotLinePath(value, width);\r\n\t\t\tattribs = {\r\n\t\t\t\tstroke: color,\r\n\t\t\t\t'stroke-width': width\r\n\t\t\t};\r\n\t\t\tif (dashStyle) {\r\n\t\t\t\tattribs.dashstyle = dashStyle;\r\n\t\t\t}\r\n\t\t} else if (isBand) { // plot band\r\n\t\t\t\r\n\t\t\t// keep within plot area\r\n\t\t\tfrom = mathMax(from, axis.min - halfPointRange);\r\n\t\t\tto = mathMin(to, axis.max + halfPointRange);\r\n\t\t\t\r\n\t\t\tpath = axis.getPlotBandPath(from, to, options);\r\n\t\t\tattribs = {\r\n\t\t\t\tfill: color\r\n\t\t\t};\r\n\t\t\tif (options.borderWidth) {\r\n\t\t\t\tattribs.stroke = options.borderColor;\r\n\t\t\t\tattribs['stroke-width'] = options.borderWidth;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// zIndex\r\n\t\tif (defined(zIndex)) {\r\n\t\t\tattribs.zIndex = zIndex;\r\n\t\t}\r\n\r\n\t\t// common for lines and bands\r\n\t\tif (svgElem) {\r\n\t\t\tif (path) {\r\n\t\t\t\tsvgElem.animate({\r\n\t\t\t\t\td: path\r\n\t\t\t\t}, null, svgElem.onGetPath);\r\n\t\t\t} else {\r\n\t\t\t\tsvgElem.hide();\r\n\t\t\t\tsvgElem.onGetPath = function () {\r\n\t\t\t\t\tsvgElem.show();\r\n\t\t\t\t};\r\n\t\t\t\tif (label) {\r\n\t\t\t\t\tplotLine.label = label = label.destroy();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (path && path.length) {\r\n\t\t\tplotLine.svgElem = svgElem = renderer.path(path)\r\n\t\t\t\t.attr(attribs).add();\r\n\r\n\t\t\t// events\r\n\t\t\tif (events) {\r\n\t\t\t\taddEvent = function (eventType) {\r\n\t\t\t\t\tsvgElem.on(eventType, function (e) {\r\n\t\t\t\t\t\tevents[eventType].apply(plotLine, [e]);\r\n\t\t\t\t\t});\r\n\t\t\t\t};\r\n\t\t\t\tfor (eventType in events) {\r\n\t\t\t\t\taddEvent(eventType);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// the plot band/line label\r\n\t\tif (optionsLabel && defined(optionsLabel.text) && path && path.length && axis.width > 0 && axis.height > 0) {\r\n\t\t\t// apply defaults\r\n\t\t\toptionsLabel = merge({\r\n\t\t\t\talign: horiz && isBand && 'center',\r\n\t\t\t\tx: horiz ? !isBand && 4 : 10,\r\n\t\t\t\tverticalAlign : !horiz && isBand && 'middle',\r\n\t\t\t\ty: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,\r\n\t\t\t\trotation: horiz && !isBand && 90\r\n\t\t\t}, optionsLabel);\r\n\r\n\t\t\t// add the SVG element\r\n\t\t\tif (!label) {\r\n\t\t\t\tplotLine.label = label = renderer.text(\r\n\t\t\t\t\t\toptionsLabel.text,\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\toptionsLabel.useHTML\r\n\t\t\t\t\t)\r\n\t\t\t\t\t.attr({\r\n\t\t\t\t\t\talign: optionsLabel.textAlign || optionsLabel.align,\r\n\t\t\t\t\t\trotation: optionsLabel.rotation,\r\n\t\t\t\t\t\tzIndex: zIndex\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.css(optionsLabel.style)\r\n\t\t\t\t\t.add();\r\n\t\t\t}\r\n\r\n\t\t\t// get the bounding box and align the label\r\n\t\t\txs = [path[1], path[4], pick(path[6], path[1])];\r\n\t\t\tys = [path[2], path[5], pick(path[7], path[2])];\r\n\t\t\tx = arrayMin(xs);\r\n\t\t\ty = arrayMin(ys);\r\n\r\n\t\t\tlabel.align(optionsLabel, false, {\r\n\t\t\t\tx: x,\r\n\t\t\t\ty: y,\r\n\t\t\t\twidth: arrayMax(xs) - x,\r\n\t\t\t\theight: arrayMax(ys) - y\r\n\t\t\t});\r\n\t\t\tlabel.show();\r\n\r\n\t\t} else if (label) { // move out of sight\r\n\t\t\tlabel.hide();\r\n\t\t}\r\n\r\n\t\t// chainable\r\n\t\treturn plotLine;\r\n\t},\r\n\r\n\t/**\r\n\t * Remove the plot line or band\r\n\t */\r\n\tdestroy: function () {\r\n\t\t// remove it from the lookup\r\n\t\terase(this.axis.plotLinesAndBands, this);\r\n\t\t\r\n\t\tdelete this.axis;\r\n\t\tdestroyObjectProperties(this);\r\n\t}\r\n};\r\n/**\r\n * The class for stack items\r\n */\r\nfunction StackItem(axis, options, isNegative, x, stackOption, stacking) {\r\n\t\r\n\tvar inverted = axis.chart.inverted;\r\n\r\n\tthis.axis = axis;\r\n\r\n\t// Tells if the stack is negative\r\n\tthis.isNegative = isNegative;\r\n\r\n\t// Save the options to be able to style the label\r\n\tthis.options = options;\r\n\r\n\t// Save the x value to be able to position the label later\r\n\tthis.x = x;\r\n\r\n\t// Initialize total value\r\n\tthis.total = null;\r\n\r\n\t// This will keep each points' extremes stored by series.index\r\n\tthis.points = {};\r\n\r\n\t// Save the stack option on the series configuration object, and whether to treat it as percent\r\n\tthis.stack = stackOption;\r\n\tthis.percent = stacking === 'percent';\r\n\r\n\t// The align options and text align varies on whether the stack is negative and\r\n\t// if the chart is inverted or not.\r\n\t// First test the user supplied value, then use the dynamic.\r\n\tthis.alignOptions = {\r\n\t\talign: options.align || (inverted ? (isNegative ? 'left' : 'right') : 'center'),\r\n\t\tverticalAlign: options.verticalAlign || (inverted ? 'middle' : (isNegative ? 'bottom' : 'top')),\r\n\t\ty: pick(options.y, inverted ? 4 : (isNegative ? 14 : -6)),\r\n\t\tx: pick(options.x, inverted ? (isNegative ? -6 : 6) : 0)\r\n\t};\r\n\r\n\tthis.textAlign = options.textAlign || (inverted ? (isNegative ? 'right' : 'left') : 'center');\r\n}\r\n\r\nStackItem.prototype = {\r\n\tdestroy: function () {\r\n\t\tdestroyObjectProperties(this, this.axis);\r\n\t},\r\n\r\n\t/**\r\n\t * Renders the stack total label and adds it to the stack label group.\r\n\t */\r\n\trender: function (group) {\r\n\t\tvar options = this.options,\r\n\t\t\tformatOption = options.format,\r\n\t\t\tstr = formatOption ?\r\n\t\t\t\tformat(formatOption, this) : \r\n\t\t\t\toptions.formatter.call(this); // format the text in the label\r\n\r\n\t\t// Change the text to reflect the new total and set visibility to hidden in case the serie is hidden\r\n\t\tif (this.label) {\r\n\t\t\tthis.label.attr({text: str, visibility: HIDDEN});\r\n\t\t// Create new label\r\n\t\t} else {\r\n\t\t\tthis.label =\r\n\t\t\t\tthis.axis.chart.renderer.text(str, 0, 0, options.useHTML)\t\t// dummy positions, actual position updated with setOffset method in columnseries\r\n\t\t\t\t\t.css(options.style)\t\t\t\t// apply style\r\n\t\t\t\t\t.attr({\r\n\t\t\t\t\t\talign: this.textAlign,\t\t\t\t// fix the text-anchor\r\n\t\t\t\t\t\trotation: options.rotation,\t// rotation\r\n\t\t\t\t\t\tvisibility: HIDDEN\t\t\t\t\t// hidden until setOffset is called\r\n\t\t\t\t\t})\t\t\t\t\r\n\t\t\t\t\t.add(group);\t\t\t\t\t\t\t// add to the labels-group\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Sets the offset that the stack has from the x value and repositions the label.\r\n\t */\r\n\tsetOffset: function (xOffset, xWidth) {\r\n\t\tvar stackItem = this,\r\n\t\t\taxis = stackItem.axis,\r\n\t\t\tchart = axis.chart,\r\n\t\t\tinverted = chart.inverted,\r\n\t\t\tneg = this.isNegative,\t\t\t\t\t\t\t// special treatment is needed for negative stacks\r\n\t\t\ty = axis.translate(this.percent ? 100 : this.total, 0, 0, 0, 1), // stack value translated mapped to chart coordinates\r\n\t\t\tyZero = axis.translate(0),\t\t\t\t\t\t// stack origin\r\n\t\t\th = mathAbs(y - yZero),\t\t\t\t\t\t\t// stack height\r\n\t\t\tx = chart.xAxis[0].translate(this.x) + xOffset,\t// stack x position\r\n\t\t\tplotHeight = chart.plotHeight,\r\n\t\t\tstackBox = {\t// this is the box for the complete stack\r\n\t\t\t\tx: inverted ? (neg ? y : y - h) : x,\r\n\t\t\t\ty: inverted ? plotHeight - x - xWidth : (neg ? (plotHeight - y - h) : plotHeight - y),\r\n\t\t\t\twidth: inverted ? h : xWidth,\r\n\t\t\t\theight: inverted ? xWidth : h\r\n\t\t\t},\r\n\t\t\tlabel = this.label,\r\n\t\t\talignAttr;\r\n\t\t\r\n\t\tif (label) {\r\n\t\t\tlabel.align(this.alignOptions, null, stackBox);\t// align the label to the box\r\n\t\t\t\t\r\n\t\t\t// Set visibility (#678)\r\n\t\t\talignAttr = label.alignAttr;\r\n\t\t\tlabel.attr({ \r\n\t\t\t\tvisibility: this.options.crop === false || chart.isInsidePlot(alignAttr.x, alignAttr.y) ? \r\n\t\t\t\t\t(hasSVG ? 'inherit' : VISIBLE) : \r\n\t\t\t\t\tHIDDEN\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n};\r\n/**\r\n * Create a new axis object\r\n * @param {Object} chart\r\n * @param {Object} options\r\n */\r\nfunction Axis() {\r\n\tthis.init.apply(this, arguments);\r\n}\r\n\r\nAxis.prototype = {\r\n\t\r\n\t/**\r\n\t * Default options for the X axis - the Y axis has extended defaults \r\n\t */\r\n\tdefaultOptions: {\r\n\t\t// allowDecimals: null,\r\n\t\t// alternateGridColor: null,\r\n\t\t// categories: [],\r\n\t\tdateTimeLabelFormats: {\r\n\t\t\tmillisecond: '%H:%M:%S.%L',\r\n\t\t\tsecond: '%H:%M:%S',\r\n\t\t\tminute: '%H:%M',\r\n\t\t\thour: '%H:%M',\r\n\t\t\tday: '%e. %b',\r\n\t\t\tweek: '%e. %b',\r\n\t\t\tmonth: '%b \\'%y',\r\n\t\t\tyear: '%Y'\r\n\t\t},\r\n\t\tendOnTick: false,\r\n\t\tgridLineColor: '#C0C0C0',\r\n\t\t// gridLineDashStyle: 'solid',\r\n\t\t// gridLineWidth: 0,\r\n\t\t// reversed: false,\r\n\t\r\n\t\tlabels: defaultLabelOptions,\r\n\t\t\t// { step: null },\r\n\t\tlineColor: '#C0D0E0',\r\n\t\tlineWidth: 1,\r\n\t\t//linkedTo: null,\r\n\t\t//max: undefined,\r\n\t\t//min: undefined,\r\n\t\tminPadding: 0.01,\r\n\t\tmaxPadding: 0.01,\r\n\t\t//minRange: null,\r\n\t\tminorGridLineColor: '#E0E0E0',\r\n\t\t// minorGridLineDashStyle: null,\r\n\t\tminorGridLineWidth: 1,\r\n\t\tminorTickColor: '#A0A0A0',\r\n\t\t//minorTickInterval: null,\r\n\t\tminorTickLength: 2,\r\n\t\tminorTickPosition: 'outside', // inside or outside\r\n\t\t//minorTickWidth: 0,\r\n\t\t//opposite: false,\r\n\t\t//offset: 0,\r\n\t\t//plotBands: [{\r\n\t\t//\tevents: {},\r\n\t\t//\tzIndex: 1,\r\n\t\t//\tlabels: { align, x, verticalAlign, y, style, rotation, textAlign }\r\n\t\t//}],\r\n\t\t//plotLines: [{\r\n\t\t//\tevents: {}\r\n\t\t// dashStyle: {}\r\n\t\t//\tzIndex:\r\n\t\t//\tlabels: { align, x, verticalAlign, y, style, rotation, textAlign }\r\n\t\t//}],\r\n\t\t//reversed: false,\r\n\t\t// showFirstLabel: true,\r\n\t\t// showLastLabel: true,\r\n\t\tstartOfWeek: 1,\r\n\t\tstartOnTick: false,\r\n\t\ttickColor: '#C0D0E0',\r\n\t\t//tickInterval: null,\r\n\t\ttickLength: 5,\r\n\t\ttickmarkPlacement: 'between', // on or between\r\n\t\ttickPixelInterval: 100,\r\n\t\ttickPosition: 'outside',\r\n\t\ttickWidth: 1,\r\n\t\ttitle: {\r\n\t\t\t//text: null,\r\n\t\t\talign: 'middle', // low, middle or high\r\n\t\t\t//margin: 0 for horizontal, 10 for vertical axes,\r\n\t\t\t//rotation: 0,\r\n\t\t\t//side: 'outside',\r\n\t\t\tstyle: {\r\n\t\t\t\tcolor: '#4d759e',\r\n\t\t\t\t//font: defaultFont.replace('normal', 'bold')\r\n\t\t\t\tfontWeight: 'bold'\r\n\t\t\t}\r\n\t\t\t//x: 0,\r\n\t\t\t//y: 0\r\n\t\t},\r\n\t\ttype: 'linear' // linear, logarithmic or datetime\r\n\t},\r\n\t\r\n\t/**\r\n\t * This options set extends the defaultOptions for Y axes\r\n\t */\r\n\tdefaultYAxisOptions: {\r\n\t\tendOnTick: true,\r\n\t\tgridLineWidth: 1,\r\n\t\ttickPixelInterval: 72,\r\n\t\tshowLastLabel: true,\r\n\t\tlabels: {\r\n\t\t\tx: -8,\r\n\t\t\ty: 3\r\n\t\t},\r\n\t\tlineWidth: 0,\r\n\t\tmaxPadding: 0.05,\r\n\t\tminPadding: 0.05,\r\n\t\tstartOnTick: true,\r\n\t\ttickWidth: 0,\r\n\t\ttitle: {\r\n\t\t\trotation: 270,\r\n\t\t\ttext: 'Values'\r\n\t\t},\r\n\t\tstackLabels: {\r\n\t\t\tenabled: false,\r\n\t\t\t//align: dynamic,\r\n\t\t\t//y: dynamic,\r\n\t\t\t//x: dynamic,\r\n\t\t\t//verticalAlign: dynamic,\r\n\t\t\t//textAlign: dynamic,\r\n\t\t\t//rotation: 0,\r\n\t\t\tformatter: function () {\r\n\t\t\t\treturn numberFormat(this.total, -1);\r\n\t\t\t},\r\n\t\t\tstyle: defaultLabelOptions.style\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * These options extend the defaultOptions for left axes\r\n\t */\r\n\tdefaultLeftAxisOptions: {\r\n\t\tlabels: {\r\n\t\t\tx: -8,\r\n\t\t\ty: null\r\n\t\t},\r\n\t\ttitle: {\r\n\t\t\trotation: 270\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * These options extend the defaultOptions for right axes\r\n\t */\r\n\tdefaultRightAxisOptions: {\r\n\t\tlabels: {\r\n\t\t\tx: 8,\r\n\t\t\ty: null\r\n\t\t},\r\n\t\ttitle: {\r\n\t\t\trotation: 90\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * These options extend the defaultOptions for bottom axes\r\n\t */\r\n\tdefaultBottomAxisOptions: {\r\n\t\tlabels: {\r\n\t\t\tx: 0,\r\n\t\t\ty: 14\r\n\t\t\t// overflow: undefined,\r\n\t\t\t// staggerLines: null\r\n\t\t},\r\n\t\ttitle: {\r\n\t\t\trotation: 0\r\n\t\t}\r\n\t},\r\n\t/**\r\n\t * These options extend the defaultOptions for left axes\r\n\t */\r\n\tdefaultTopAxisOptions: {\r\n\t\tlabels: {\r\n\t\t\tx: 0,\r\n\t\t\ty: -5\r\n\t\t\t// overflow: undefined\r\n\t\t\t// staggerLines: null\r\n\t\t},\r\n\t\ttitle: {\r\n\t\t\trotation: 0\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * Initialize the axis\r\n\t */\r\n\tinit: function (chart, userOptions) {\r\n\t\t\t\r\n\t\t\r\n\t\tvar isXAxis = userOptions.isX,\r\n\t\t\taxis = this;\r\n\t\r\n\t\t// Flag, is the axis horizontal\r\n\t\taxis.horiz = chart.inverted ? !isXAxis : isXAxis;\r\n\t\t\r\n\t\t// Flag, isXAxis\r\n\t\taxis.isXAxis = isXAxis;\r\n\t\taxis.xOrY = isXAxis ? 'x' : 'y';\r\n\t\r\n\t\r\n\t\taxis.opposite = userOptions.opposite; // needed in setOptions\r\n\t\taxis.side = axis.horiz ?\r\n\t\t\t\t(axis.opposite ? 0 : 2) : // top : bottom\r\n\t\t\t\t(axis.opposite ? 1 : 3); // right : left\r\n\t\r\n\t\taxis.setOptions(userOptions);\r\n\t\t\r\n\t\r\n\t\tvar options = this.options,\r\n\t\t\ttype = options.type,\r\n\t\t\tisDatetimeAxis = type === 'datetime';\r\n\t\r\n\t\taxis.labelFormatter = options.labels.formatter || axis.defaultLabelFormatter; // can be overwritten by dynamic format\r\n\t\r\n\t\r\n\t\t// Flag, stagger lines or not\r\n\t\taxis.userOptions = userOptions;\r\n\t\r\n\t\t//axis.axisTitleMargin = UNDEFINED,// = options.title.margin,\r\n\t\taxis.minPixelPadding = 0;\r\n\t\t//axis.ignoreMinPadding = UNDEFINED; // can be set to true by a column or bar series\r\n\t\t//axis.ignoreMaxPadding = UNDEFINED;\r\n\t\r\n\t\taxis.chart = chart;\r\n\t\taxis.reversed = options.reversed;\r\n\t\taxis.zoomEnabled = options.zoomEnabled !== false;\r\n\t\r\n\t\t// Initial categories\r\n\t\taxis.categories = options.categories || type === 'category';\r\n\t\taxis.names = [];\r\n\t\r\n\t\t// Elements\r\n\t\t//axis.axisGroup = UNDEFINED;\r\n\t\t//axis.gridGroup = UNDEFINED;\r\n\t\t//axis.axisTitle = UNDEFINED;\r\n\t\t//axis.axisLine = UNDEFINED;\r\n\t\r\n\t\t// Shorthand types\r\n\t\taxis.isLog = type === 'logarithmic';\r\n\t\taxis.isDatetimeAxis = isDatetimeAxis;\r\n\t\r\n\t\t// Flag, if axis is linked to another axis\r\n\t\taxis.isLinked = defined(options.linkedTo);\r\n\t\t// Linked axis.\r\n\t\t//axis.linkedParent = UNDEFINED;\t\r\n\t\t\r\n\t\t// Tick positions\r\n\t\t//axis.tickPositions = UNDEFINED; // array containing predefined positions\r\n\t\t// Tick intervals\r\n\t\t//axis.tickInterval = UNDEFINED;\r\n\t\t//axis.minorTickInterval = UNDEFINED;\r\n\t\t\r\n\t\taxis.tickmarkOffset = (axis.categories && options.tickmarkPlacement === 'between') ? 0.5 : 0;\r\n\t\r\n\t\t// Major ticks\r\n\t\taxis.ticks = {};\r\n\t\t// Minor ticks\r\n\t\taxis.minorTicks = {};\r\n\t\t//axis.tickAmount = UNDEFINED;\r\n\t\r\n\t\t// List of plotLines/Bands\r\n\t\taxis.plotLinesAndBands = [];\r\n\t\r\n\t\t// Alternate bands\r\n\t\taxis.alternateBands = {};\r\n\t\r\n\t\t// Axis metrics\r\n\t\t//axis.left = UNDEFINED;\r\n\t\t//axis.top = UNDEFINED;\r\n\t\t//axis.width = UNDEFINED;\r\n\t\t//axis.height = UNDEFINED;\r\n\t\t//axis.bottom = UNDEFINED;\r\n\t\t//axis.right = UNDEFINED;\r\n\t\t//axis.transA = UNDEFINED;\r\n\t\t//axis.transB = UNDEFINED;\r\n\t\t//axis.oldTransA = UNDEFINED;\r\n\t\taxis.len = 0;\r\n\t\t//axis.oldMin = UNDEFINED;\r\n\t\t//axis.oldMax = UNDEFINED;\r\n\t\t//axis.oldUserMin = UNDEFINED;\r\n\t\t//axis.oldUserMax = UNDEFINED;\r\n\t\t//axis.oldAxisLength = UNDEFINED;\r\n\t\taxis.minRange = axis.userMinRange = options.minRange || options.maxZoom;\r\n\t\taxis.range = options.range;\r\n\t\taxis.offset = options.offset || 0;\r\n\t\r\n\t\r\n\t\t// Dictionary for stacks\r\n\t\taxis.stacks = {};\r\n\t\taxis.oldStacks = {};\r\n\r\n\t\t// Dictionary for stacks max values\r\n\t\taxis.stackExtremes = {};\r\n\r\n\t\t// Min and max in the data\r\n\t\t//axis.dataMin = UNDEFINED,\r\n\t\t//axis.dataMax = UNDEFINED,\r\n\t\r\n\t\t// The axis range\r\n\t\taxis.max = null;\r\n\t\taxis.min = null;\r\n\t\r\n\t\t// User set min and max\r\n\t\t//axis.userMin = UNDEFINED,\r\n\t\t//axis.userMax = UNDEFINED,\r\n\r\n\t\t// Run Axis\r\n\t\t\r\n\t\tvar eventType,\r\n\t\t\tevents = axis.options.events;\r\n\r\n\t\t// Register\r\n\t\tif (inArray(axis, chart.axes) === -1) { // don't add it again on Axis.update()\r\n\t\t\tchart.axes.push(axis);\r\n\t\t\tchart[isXAxis ? 'xAxis' : 'yAxis'].push(axis);\r\n\t\t}\r\n\r\n\t\taxis.series = axis.series || []; // populated by Series\r\n\r\n\t\t// inverted charts have reversed xAxes as default\r\n\t\tif (chart.inverted && isXAxis && axis.reversed === UNDEFINED) {\r\n\t\t\taxis.reversed = true;\r\n\t\t}\r\n\r\n\t\taxis.removePlotBand = axis.removePlotBandOrLine;\r\n\t\taxis.removePlotLine = axis.removePlotBandOrLine;\r\n\r\n\r\n\t\t// register event listeners\r\n\t\tfor (eventType in events) {\r\n\t\t\taddEvent(axis, eventType, events[eventType]);\r\n\t\t}\r\n\r\n\t\t// extend logarithmic axis\r\n\t\tif (axis.isLog) {\r\n\t\t\taxis.val2lin = log2lin;\r\n\t\t\taxis.lin2val = lin2log;\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * Merge and set options\r\n\t */\r\n\tsetOptions: function (userOptions) {\r\n\t\tthis.options = merge(\r\n\t\t\tthis.defaultOptions,\r\n\t\t\tthis.isXAxis ? {} : this.defaultYAxisOptions,\r\n\t\t\t[this.defaultTopAxisOptions, this.defaultRightAxisOptions,\r\n\t\t\t\tthis.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side],\r\n\t\t\tmerge(\r\n\t\t\t\tdefaultOptions[this.isXAxis ? 'xAxis' : 'yAxis'], // if set in setOptions (#1053)\r\n\t\t\t\tuserOptions\r\n\t\t\t)\r\n\t\t);\r\n\t},\r\n\r\n\t/**\r\n\t * Update the axis with a new options structure\r\n\t */\r\n\tupdate: function (newOptions, redraw) {\r\n\t\tvar chart = this.chart;\r\n\r\n\t\tnewOptions = chart.options[this.xOrY + 'Axis'][this.options.index] = merge(this.userOptions, newOptions);\r\n\r\n\t\tthis.destroy(true);\r\n\t\tthis._addedPlotLB = this.userMin = this.userMax = UNDEFINED; // #1611, #2306\r\n\r\n\t\tthis.init(chart, extend(newOptions, { events: UNDEFINED }));\r\n\r\n\t\tchart.isDirtyBox = true;\r\n\t\tif (pick(redraw, true)) {\r\n\t\t\tchart.redraw();\r\n\t\t}\r\n\t},\t\r\n\t\r\n\t/**\r\n * Remove the axis from the chart\r\n */\r\n\tremove: function (redraw) {\r\n\t\tvar chart = this.chart,\r\n\t\t\tkey = this.xOrY + 'Axis'; // xAxis or yAxis\r\n\r\n\t\t// Remove associated series\r\n\t\teach(this.series, function (series) {\r\n\t\t\tseries.remove(false);\r\n\t\t});\r\n\r\n\t\t// Remove the axis\r\n\t\terase(chart.axes, this);\r\n\t\terase(chart[key], this);\r\n\t\tchart.options[key].splice(this.options.index, 1);\r\n\t\teach(chart[key], function (axis, i) { // Re-index, #1706\r\n\t\t\taxis.options.index = i;\r\n\t\t});\r\n\t\tthis.destroy();\r\n\t\tchart.isDirtyBox = true;\r\n\r\n\t\tif (pick(redraw, true)) {\r\n\t\t\tchart.redraw();\r\n\t\t}\r\n\t},\r\n\t\r\n\t/** \r\n\t * The default label formatter. The context is a special config object for the label.\r\n\t */\r\n\tdefaultLabelFormatter: function () {\r\n\t\tvar axis = this.axis,\r\n\t\t\tvalue = this.value,\r\n\t\t\tcategories = axis.categories, \r\n\t\t\tdateTimeLabelFormat = this.dateTimeLabelFormat,\r\n\t\t\tnumericSymbols = defaultOptions.lang.numericSymbols,\r\n\t\t\ti = numericSymbols && numericSymbols.length,\r\n\t\t\tmulti,\r\n\t\t\tret,\r\n\t\t\tformatOption = axis.options.labels.format,\r\n\t\t\t\r\n\t\t\t// make sure the same symbol is added for all labels on a linear axis\r\n\t\t\tnumericSymbolDetector = axis.isLog ? value : axis.tickInterval;\r\n\r\n\t\tif (formatOption) {\r\n\t\t\tret = format(formatOption, this);\r\n\t\t\r\n\t\t} else if (categories) {\r\n\t\t\tret = value;\r\n\t\t\r\n\t\t} else if (dateTimeLabelFormat) { // datetime axis\r\n\t\t\tret = dateFormat(dateTimeLabelFormat, value);\r\n\t\t\r\n\t\t} else if (i && numericSymbolDetector >= 1000) {\r\n\t\t\t// Decide whether we should add a numeric symbol like k (thousands) or M (millions).\r\n\t\t\t// If we are to enable this in tooltip or other places as well, we can move this\r\n\t\t\t// logic to the numberFormatter and enable it by a parameter.\r\n\t\t\twhile (i-- && ret === UNDEFINED) {\r\n\t\t\t\tmulti = Math.pow(1000, i + 1);\r\n\t\t\t\tif (numericSymbolDetector >= multi && numericSymbols[i] !== null) {\r\n\t\t\t\t\tret = numberFormat(value / multi, -1) + numericSymbols[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tif (ret === UNDEFINED) {\r\n\t\t\tif (value >= 1000) { // add thousands separators\r\n\t\t\t\tret = numberFormat(value, 0);\r\n\r\n\t\t\t} else { // small numbers\r\n\t\t\t\tret = numberFormat(value, -1);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\treturn ret;\r\n\t},\r\n\r\n\t/**\r\n\t * Get the minimum and maximum for the series of each axis\r\n\t */\r\n\tgetSeriesExtremes: function () {\r\n\t\tvar axis = this,\r\n\t\t\tchart = axis.chart;\r\n\r\n\t\taxis.hasVisibleSeries = false;\r\n\r\n\t\t// reset dataMin and dataMax in case we're redrawing\r\n\t\taxis.dataMin = axis.dataMax = null;\r\n\r\n\t\t// reset cached stacking extremes\r\n\t\taxis.stackExtremes = {};\r\n\r\n\t\taxis.buildStacks();\r\n\r\n\t\t// loop through this axis' series\r\n\t\teach(axis.series, function (series) {\r\n\r\n\t\t\tif (series.visible || !chart.options.chart.ignoreHiddenSeries) {\r\n\r\n\t\t\t\tvar seriesOptions = series.options,\r\n\t\t\t\t\txData,\r\n\t\t\t\t\tthreshold = seriesOptions.threshold,\r\n\t\t\t\t\tseriesDataMin,\r\n\t\t\t\t\tseriesDataMax;\r\n\r\n\t\t\t\taxis.hasVisibleSeries = true;\r\n\r\n\t\t\t\t// Validate threshold in logarithmic axes\r\n\t\t\t\tif (axis.isLog && threshold <= 0) {\r\n\t\t\t\t\tthreshold = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Get dataMin and dataMax for X axes\r\n\t\t\t\tif (axis.isXAxis) {\r\n\t\t\t\t\txData = series.xData;\r\n\t\t\t\t\tif (xData.length) {\r\n\t\t\t\t\t\taxis.dataMin = mathMin(pick(axis.dataMin, xData[0]), arrayMin(xData));\r\n\t\t\t\t\t\taxis.dataMax = mathMax(pick(axis.dataMax, xData[0]), arrayMax(xData));\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t// Get dataMin and dataMax for Y axes, as well as handle stacking and processed data\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\t// Get this particular series extremes\r\n\t\t\t\t\tseries.getExtremes();\r\n\t\t\t\t\tseriesDataMax = series.dataMax;\r\n\t\t\t\t\tseriesDataMin = series.dataMin;\r\n\r\n\t\t\t\t\t// Get the dataMin and dataMax so far. If percentage is used, the min and max are\r\n\t\t\t\t\t// always 0 and 100. If seriesDataMin and seriesDataMax is null, then series\r\n\t\t\t\t\t// doesn't have active y data, we continue with nulls\r\n\t\t\t\t\tif (defined(seriesDataMin) && defined(seriesDataMax)) {\r\n\t\t\t\t\t\taxis.dataMin = mathMin(pick(axis.dataMin, seriesDataMin), seriesDataMin);\r\n\t\t\t\t\t\taxis.dataMax = mathMax(pick(axis.dataMax, seriesDataMax), seriesDataMax);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Adjust to threshold\r\n\t\t\t\t\tif (defined(threshold)) {\r\n\t\t\t\t\t\tif (axis.dataMin >= threshold) {\r\n\t\t\t\t\t\t\taxis.dataMin = threshold;\r\n\t\t\t\t\t\t\taxis.ignoreMinPadding = true;\r\n\t\t\t\t\t\t} else if (axis.dataMax < threshold) {\r\n\t\t\t\t\t\t\taxis.dataMax = threshold;\r\n\t\t\t\t\t\t\taxis.ignoreMaxPadding = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Translate from axis value to pixel position on the chart, or back\r\n\t *\r\n\t */\r\n\ttranslate: function (val, backwards, cvsCoord, old, handleLog, pointPlacement) {\r\n\t\tvar axis = this,\r\n\t\t\taxisLength = axis.len,\r\n\t\t\tsign = 1,\r\n\t\t\tcvsOffset = 0,\r\n\t\t\tlocalA = old ? axis.oldTransA : axis.transA,\r\n\t\t\tlocalMin = old ? axis.oldMin : axis.min,\r\n\t\t\treturnValue,\r\n\t\t\tminPixelPadding = axis.minPixelPadding,\r\n\t\t\tpostTranslate = (axis.options.ordinal || (axis.isLog && handleLog)) && axis.lin2val;\r\n\r\n\t\tif (!localA) {\r\n\t\t\tlocalA = axis.transA;\r\n\t\t}\r\n\r\n\t\t// In vertical axes, the canvas coordinates start from 0 at the top like in \r\n\t\t// SVG. \r\n\t\tif (cvsCoord) {\r\n\t\t\tsign *= -1; // canvas coordinates inverts the value\r\n\t\t\tcvsOffset = axisLength;\r\n\t\t}\r\n\r\n\t\t// Handle reversed axis\r\n\t\tif (axis.reversed) { \r\n\t\t\tsign *= -1;\r\n\t\t\tcvsOffset -= sign * axisLength;\r\n\t\t}\r\n\r\n\t\t// From pixels to value\r\n\t\tif (backwards) { // reverse translation\r\n\t\t\t\r\n\t\t\tval = val * sign + cvsOffset;\r\n\t\t\tval -= minPixelPadding;\r\n\t\t\treturnValue = val / localA + localMin; // from chart pixel to value\r\n\t\t\tif (postTranslate) { // log and ordinal axes\r\n\t\t\t\treturnValue = axis.lin2val(returnValue);\r\n\t\t\t}\r\n\r\n\t\t// From value to pixels\r\n\t\t} else {\r\n\t\t\tif (postTranslate) { // log and ordinal axes\r\n\t\t\t\tval = axis.val2lin(val);\r\n\t\t\t}\r\n\t\t\tif (pointPlacement === 'between') {\r\n\t\t\t\tpointPlacement = 0.5;\r\n\t\t\t}\r\n\t\t\treturnValue = sign * (val - localMin) * localA + cvsOffset + (sign * minPixelPadding) +\r\n\t\t\t\t(isNumber(pointPlacement) ? localA * pointPlacement * axis.pointRange : 0);\r\n\t\t}\r\n\r\n\t\treturn returnValue;\r\n\t},\r\n\r\n\t/**\r\n\t * Utility method to translate an axis value to pixel position. \r\n\t * @param {Number} value A value in terms of axis units\r\n\t * @param {Boolean} paneCoordinates Whether to return the pixel coordinate relative to the chart\r\n\t * or just the axis/pane itself.\r\n\t */\r\n\ttoPixels: function (value, paneCoordinates) {\r\n\t\treturn this.translate(value, false, !this.horiz, null, true) + (paneCoordinates ? 0 : this.pos);\r\n\t},\r\n\r\n\t/*\r\n\t * Utility method to translate a pixel position in to an axis value\r\n\t * @param {Number} pixel The pixel value coordinate\r\n\t * @param {Boolean} paneCoordiantes Whether the input pixel is relative to the chart or just the\r\n\t * axis/pane itself.\r\n\t */\r\n\ttoValue: function (pixel, paneCoordinates) {\r\n\t\treturn this.translate(pixel - (paneCoordinates ? 0 : this.pos), true, !this.horiz, null, true);\r\n\t},\r\n\r\n\t/**\r\n\t * Create the path for a plot line that goes from the given value on\r\n\t * this axis, across the plot to the opposite side\r\n\t * @param {Number} value\r\n\t * @param {Number} lineWidth Used for calculation crisp line\r\n\t * @param {Number] old Use old coordinates (for resizing and rescaling)\r\n\t */\r\n\tgetPlotLinePath: function (value, lineWidth, old, force) {\r\n\t\tvar axis = this,\r\n\t\t\tchart = axis.chart,\r\n\t\t\taxisLeft = axis.left,\r\n\t\t\taxisTop = axis.top,\r\n\t\t\tx1,\r\n\t\t\ty1,\r\n\t\t\tx2,\r\n\t\t\ty2,\r\n\t\t\ttranslatedValue = axis.translate(value, null, null, old),\r\n\t\t\tcHeight = (old && chart.oldChartHeight) || chart.chartHeight,\r\n\t\t\tcWidth = (old && chart.oldChartWidth) || chart.chartWidth,\r\n\t\t\tskip,\r\n\t\t\ttransB = axis.transB;\r\n\r\n\t\tx1 = x2 = mathRound(translatedValue + transB);\r\n\t\ty1 = y2 = mathRound(cHeight - translatedValue - transB);\r\n\r\n\t\tif (isNaN(translatedValue)) { // no min or max\r\n\t\t\tskip = true;\r\n\r\n\t\t} else if (axis.horiz) {\r\n\t\t\ty1 = axisTop;\r\n\t\t\ty2 = cHeight - axis.bottom;\r\n\t\t\tif (x1 < axisLeft || x1 > axisLeft + axis.width) {\r\n\t\t\t\tskip = true;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tx1 = axisLeft;\r\n\t\t\tx2 = cWidth - axis.right;\r\n\r\n\t\t\tif (y1 < axisTop || y1 > axisTop + axis.height) {\r\n\t\t\t\tskip = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn skip && !force ?\r\n\t\t\tnull :\r\n\t\t\tchart.renderer.crispLine([M, x1, y1, L, x2, y2], lineWidth || 0);\r\n\t},\r\n\t\r\n\t/**\r\n\t * Create the path for a plot band\r\n\t */\r\n\tgetPlotBandPath: function (from, to) {\r\n\r\n\t\tvar toPath = this.getPlotLinePath(to),\r\n\t\t\tpath = this.getPlotLinePath(from);\r\n\t\t\t\r\n\t\tif (path && toPath) {\r\n\t\t\tpath.push(\r\n\t\t\t\ttoPath[4],\r\n\t\t\t\ttoPath[5],\r\n\t\t\t\ttoPath[1],\r\n\t\t\t\ttoPath[2]\r\n\t\t\t);\r\n\t\t} else { // outside the axis area\r\n\t\t\tpath = null;\r\n\t\t}\r\n\t\t\r\n\t\treturn path;\r\n\t},\r\n\t\r\n\t/**\r\n\t * Set the tick positions of a linear axis to round values like whole tens or every five.\r\n\t */\r\n\tgetLinearTickPositions: function (tickInterval, min, max) {\r\n\t\tvar pos,\r\n\t\t\tlastPos,\r\n\t\t\troundedMin = correctFloat(mathFloor(min / tickInterval) * tickInterval),\r\n\t\t\troundedMax = correctFloat(mathCeil(max / tickInterval) * tickInterval),\r\n\t\t\ttickPositions = [];\r\n\r\n\t\t// Populate the intermediate values\r\n\t\tpos = roundedMin;\r\n\t\twhile (pos <= roundedMax) {\r\n\r\n\t\t\t// Place the tick on the rounded value\r\n\t\t\ttickPositions.push(pos);\r\n\r\n\t\t\t// Always add the raw tickInterval, not the corrected one.\r\n\t\t\tpos = correctFloat(pos + tickInterval);\r\n\r\n\t\t\t// If the interval is not big enough in the current min - max range to actually increase\r\n\t\t\t// the loop variable, we need to break out to prevent endless loop. Issue #619\r\n\t\t\tif (pos === lastPos) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\t// Record the last value\r\n\t\t\tlastPos = pos;\r\n\t\t}\r\n\t\treturn tickPositions;\r\n\t},\r\n\t\r\n\t/**\r\n\t * Set the tick positions of a logarithmic axis\r\n\t */\r\n\tgetLogTickPositions: function (interval, min, max, minor) {\r\n\t\tvar axis = this,\r\n\t\t\toptions = axis.options,\r\n\t\t\taxisLength = axis.len,\r\n\t\t\t// Since we use this method for both major and minor ticks,\r\n\t\t\t// use a local variable and return the result\r\n\t\t\tpositions = []; \r\n\t\t\r\n\t\t// Reset\r\n\t\tif (!minor) {\r\n\t\t\taxis._minorAutoInterval = null;\r\n\t\t}\r\n\t\t\r\n\t\t// First case: All ticks fall on whole logarithms: 1, 10, 100 etc.\r\n\t\tif (interval >= 0.5) {\r\n\t\t\tinterval = mathRound(interval);\r\n\t\t\tpositions = axis.getLinearTickPositions(interval, min, max);\r\n\t\t\t\r\n\t\t// Second case: We need intermediary ticks. For example \r\n\t\t// 1, 2, 4, 6, 8, 10, 20, 40 etc. \r\n\t\t} else if (interval >= 0.08) {\r\n\t\t\tvar roundedMin = mathFloor(min),\r\n\t\t\t\tintermediate,\r\n\t\t\t\ti,\r\n\t\t\t\tj,\r\n\t\t\t\tlen,\r\n\t\t\t\tpos,\r\n\t\t\t\tlastPos,\r\n\t\t\t\tbreak2;\r\n\t\t\t\t\r\n\t\t\tif (interval > 0.3) {\r\n\t\t\t\tintermediate = [1, 2, 4];\r\n\t\t\t} else if (interval > 0.15) { // 0.2 equals five minor ticks per 1, 10, 100 etc\r\n\t\t\t\tintermediate = [1, 2, 4, 6, 8];\r\n\t\t\t} else { // 0.1 equals ten minor ticks per 1, 10, 100 etc\r\n\t\t\t\tintermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tfor (i = roundedMin; i < max + 1 && !break2; i++) {\r\n\t\t\t\tlen = intermediate.length;\r\n\t\t\t\tfor (j = 0; j < len && !break2; j++) {\r\n\t\t\t\t\tpos = log2lin(lin2log(i) * intermediate[j]);\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (pos > min && (!minor || lastPos <= max)) { // #1670\r\n\t\t\t\t\t\tpositions.push(lastPos);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (lastPos > max) {\r\n\t\t\t\t\t\tbreak2 = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlastPos = pos;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t// Third case: We are so deep in between whole logarithmic values that\r\n\t\t// we might as well handle the tick positions like a linear axis. For\r\n\t\t// example 1.01, 1.02, 1.03, 1.04.\r\n\t\t} else {\r\n\t\t\tvar realMin = lin2log(min),\r\n\t\t\t\trealMax = lin2log(max),\r\n\t\t\t\ttickIntervalOption = options[minor ? 'minorTickInterval' : 'tickInterval'],\r\n\t\t\t\tfilteredTickIntervalOption = tickIntervalOption === 'auto' ? null : tickIntervalOption,\r\n\t\t\t\ttickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1),\r\n\t\t\t\ttotalPixelLength = minor ? axisLength / axis.tickPositions.length : axisLength;\r\n\t\t\t\r\n\t\t\tinterval = pick(\r\n\t\t\t\tfilteredTickIntervalOption,\r\n\t\t\t\taxis._minorAutoInterval,\r\n\t\t\t\t(realMax - realMin) * tickPixelIntervalOption / (totalPixelLength || 1)\r\n\t\t\t);\r\n\t\t\t\r\n\t\t\tinterval = normalizeTickInterval(\r\n\t\t\t\tinterval, \r\n\t\t\t\tnull, \r\n\t\t\t\tgetMagnitude(interval)\r\n\t\t\t);\r\n\t\t\t\r\n\t\t\tpositions = map(axis.getLinearTickPositions(\r\n\t\t\t\tinterval, \r\n\t\t\t\trealMin,\r\n\t\t\t\trealMax\t\r\n\t\t\t), log2lin);\r\n\t\t\t\r\n\t\t\tif (!minor) {\r\n\t\t\t\taxis._minorAutoInterval = interval / 5;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// Set the axis-level tickInterval variable \r\n\t\tif (!minor) {\r\n\t\t\taxis.tickInterval = interval;\r\n\t\t}\r\n\t\treturn positions;\r\n\t},\r\n\r\n\t/**\r\n\t * Return the minor tick positions. For logarithmic axes, reuse the same logic\r\n\t * as for major ticks.\r\n\t */\r\n\tgetMinorTickPositions: function () {\r\n\t\tvar axis = this,\r\n\t\t\toptions = axis.options,\r\n\t\t\ttickPositions = axis.tickPositions,\r\n\t\t\tminorTickInterval = axis.minorTickInterval,\r\n\t\t\tminorTickPositions = [],\r\n\t\t\tpos,\r\n\t\t\ti,\r\n\t\t\tlen;\r\n\t\t\r\n\t\tif (axis.isLog) {\r\n\t\t\tlen = tickPositions.length;\r\n\t\t\tfor (i = 1; i < len; i++) {\r\n\t\t\t\tminorTickPositions = minorTickPositions.concat(\r\n\t\t\t\t\taxis.getLogTickPositions(minorTickInterval, tickPositions[i - 1], tickPositions[i], true)\r\n\t\t\t\t);\t\r\n\t\t\t}\r\n\t\t} else if (axis.isDatetimeAxis && options.minorTickInterval === 'auto') { // #1314\r\n\t\t\tminorTickPositions = minorTickPositions.concat(\r\n\t\t\t\tgetTimeTicks(\r\n\t\t\t\t\tnormalizeTimeTickInterval(minorTickInterval),\r\n\t\t\t\t\taxis.min,\r\n\t\t\t\t\taxis.max,\r\n\t\t\t\t\toptions.startOfWeek\r\n\t\t\t\t)\r\n\t\t\t);\r\n\t\t\tif (minorTickPositions[0] < axis.min) {\r\n\t\t\t\tminorTickPositions.shift();\r\n\t\t\t}\r\n\t\t} else {\t\t\t\r\n\t\t\tfor (pos = axis.min + (tickPositions[0] - axis.min) % minorTickInterval; pos <= axis.max; pos += minorTickInterval) {\r\n\t\t\t\tminorTickPositions.push(pos);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn minorTickPositions;\r\n\t},\r\n\r\n\t/**\r\n\t * Adjust the min and max for the minimum range. Keep in mind that the series data is \r\n\t * not yet processed, so we don't have information on data cropping and grouping, or \r\n\t * updated axis.pointRange or series.pointRange. The data can't be processed until\r\n\t * we have finally established min and max.\r\n\t */\r\n\tadjustForMinRange: function () {\r\n\t\tvar axis = this,\r\n\t\t\toptions = axis.options,\r\n\t\t\tmin = axis.min,\r\n\t\t\tmax = axis.max,\r\n\t\t\tzoomOffset,\r\n\t\t\tspaceAvailable = axis.dataMax - axis.dataMin >= axis.minRange,\r\n\t\t\tclosestDataRange,\r\n\t\t\ti,\r\n\t\t\tdistance,\r\n\t\t\txData,\r\n\t\t\tloopLength,\r\n\t\t\tminArgs,\r\n\t\t\tmaxArgs;\r\n\r\n\t\t// Set the automatic minimum range based on the closest point distance\r\n\t\tif (axis.isXAxis && axis.minRange === UNDEFINED && !axis.isLog) {\r\n\r\n\t\t\tif (defined(options.min) || defined(options.max)) {\r\n\t\t\t\taxis.minRange = null; // don't do this again\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// Find the closest distance between raw data points, as opposed to\r\n\t\t\t\t// closestPointRange that applies to processed points (cropped and grouped)\r\n\t\t\t\teach(axis.series, function (series) {\r\n\t\t\t\t\txData = series.xData;\r\n\t\t\t\t\tloopLength = series.xIncrement ? 1 : xData.length - 1;\r\n\t\t\t\t\tfor (i = loopLength; i > 0; i--) {\r\n\t\t\t\t\t\tdistance = xData[i] - xData[i - 1];\r\n\t\t\t\t\t\tif (closestDataRange === UNDEFINED || distance < closestDataRange) {\r\n\t\t\t\t\t\t\tclosestDataRange = distance;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\taxis.minRange = mathMin(closestDataRange * 5, axis.dataMax - axis.dataMin);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// if minRange is exceeded, adjust\r\n\t\tif (max - min < axis.minRange) {\r\n\t\t\tvar minRange = axis.minRange;\r\n\t\t\tzoomOffset = (minRange - max + min) / 2;\r\n\r\n\t\t\t// if min and max options have been set, don't go beyond it\r\n\t\t\tminArgs = [min - zoomOffset, pick(options.min, min - zoomOffset)];\r\n\t\t\tif (spaceAvailable) { // if space is available, stay within the data range\r\n\t\t\t\tminArgs[2] = axis.dataMin;\r\n\t\t\t}\r\n\t\t\tmin = arrayMax(minArgs);\r\n\r\n\t\t\tmaxArgs = [min + minRange, pick(options.max, min + minRange)];\r\n\t\t\tif (spaceAvailable) { // if space is availabe, stay within the data range\r\n\t\t\t\tmaxArgs[2] = axis.dataMax;\r\n\t\t\t}\r\n\r\n\t\t\tmax = arrayMin(maxArgs);\r\n\r\n\t\t\t// now if the max is adjusted, adjust the min back\r\n\t\t\tif (max - min < minRange) {\r\n\t\t\t\tminArgs[0] = max - minRange;\r\n\t\t\t\tminArgs[1] = pick(options.min, max - minRange);\r\n\t\t\t\tmin = arrayMax(minArgs);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// Record modified extremes\r\n\t\taxis.min = min;\r\n\t\taxis.max = max;\r\n\t},\r\n\r\n\t/**\r\n\t * Update translation information\r\n\t */\r\n\tsetAxisTranslation: function (saveOld) {\r\n\t\tvar axis = this,\r\n\t\t\trange = axis.max - axis.min,\r\n\t\t\tpointRange = 0,\r\n\t\t\tclosestPointRange,\r\n\t\t\tminPointOffset = 0,\r\n\t\t\tpointRangePadding = 0,\r\n\t\t\tlinkedParent = axis.linkedParent,\r\n\t\t\tordinalCorrection,\r\n\t\t\ttransA = axis.transA;\r\n\r\n\t\t// adjust translation for padding\r\n\t\tif (axis.isXAxis) {\r\n\t\t\tif (linkedParent) {\r\n\t\t\t\tminPointOffset = linkedParent.minPointOffset;\r\n\t\t\t\tpointRangePadding = linkedParent.pointRangePadding;\r\n\t\t\t\t\r\n\t\t\t} else {\r\n\t\t\t\teach(axis.series, function (series) {\r\n\t\t\t\t\tvar seriesPointRange = series.pointRange,\r\n\t\t\t\t\t\tpointPlacement = series.options.pointPlacement,\r\n\t\t\t\t\t\tseriesClosestPointRange = series.closestPointRange;\r\n\r\n\t\t\t\t\tif (seriesPointRange > range) { // #1446\r\n\t\t\t\t\t\tseriesPointRange = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tpointRange = mathMax(pointRange, seriesPointRange);\r\n\t\t\t\t\t\r\n\t\t\t\t\t// minPointOffset is the value padding to the left of the axis in order to make\r\n\t\t\t\t\t// room for points with a pointRange, typically columns. When the pointPlacement option\r\n\t\t\t\t\t// is 'between' or 'on', this padding does not apply.\r\n\t\t\t\t\tminPointOffset = mathMax(\r\n\t\t\t\t\t\tminPointOffset, \r\n\t\t\t\t\t\tisString(pointPlacement) ? 0 : seriesPointRange / 2\r\n\t\t\t\t\t);\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Determine the total padding needed to the length of the axis to make room for the \r\n\t\t\t\t\t// pointRange. If the series' pointPlacement is 'on', no padding is added.\r\n\t\t\t\t\tpointRangePadding = mathMax(\r\n\t\t\t\t\t\tpointRangePadding,\r\n\t\t\t\t\t\tpointPlacement === 'on' ? 0 : seriesPointRange\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\t// Set the closestPointRange\r\n\t\t\t\t\tif (!series.noSharedTooltip && defined(seriesClosestPointRange)) {\r\n\t\t\t\t\t\tclosestPointRange = defined(closestPointRange) ?\r\n\t\t\t\t\t\t\tmathMin(closestPointRange, seriesClosestPointRange) :\r\n\t\t\t\t\t\t\tseriesClosestPointRange;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Record minPointOffset and pointRangePadding\r\n\t\t\tordinalCorrection = axis.ordinalSlope && closestPointRange ? axis.ordinalSlope / closestPointRange : 1; // #988, #1853\r\n\t\t\taxis.minPointOffset = minPointOffset = minPointOffset * ordinalCorrection;\r\n\t\t\taxis.pointRangePadding = pointRangePadding = pointRangePadding * ordinalCorrection;\r\n\r\n\t\t\t// pointRange means the width reserved for each point, like in a column chart\r\n\t\t\taxis.pointRange = mathMin(pointRange, range);\r\n\r\n\t\t\t// closestPointRange means the closest distance between points. In columns\r\n\t\t\t// it is mostly equal to pointRange, but in lines pointRange is 0 while closestPointRange\r\n\t\t\t// is some other value\r\n\t\t\taxis.closestPointRange = closestPointRange;\r\n\t\t}\r\n\r\n\t\t// Secondary values\r\n\t\tif (saveOld) {\r\n\t\t\taxis.oldTransA = transA;\r\n\t\t}\r\n\t\taxis.translationSlope = axis.transA = transA = axis.len / ((range + pointRangePadding) || 1);\r\n\t\taxis.transB = axis.horiz ? axis.left : axis.bottom; // translation addend\r\n\t\taxis.minPixelPadding = transA * minPointOffset;\r\n\t},\r\n\r\n\t/**\r\n\t * Set the tick positions to round values and optionally extend the extremes\r\n\t * to the nearest tick\r\n\t */\r\n\tsetTickPositions: function (secondPass) {\r\n\t\tvar axis = this,\r\n\t\t\tchart = axis.chart,\r\n\t\t\toptions = axis.options,\r\n\t\t\tisLog = axis.isLog,\r\n\t\t\tisDatetimeAxis = axis.isDatetimeAxis,\r\n\t\t\tisXAxis = axis.isXAxis,\r\n\t\t\tisLinked = axis.isLinked,\r\n\t\t\ttickPositioner = axis.options.tickPositioner,\r\n\t\t\tmaxPadding = options.maxPadding,\r\n\t\t\tminPadding = options.minPadding,\r\n\t\t\tlength,\r\n\t\t\tlinkedParentExtremes,\r\n\t\t\ttickIntervalOption = options.tickInterval,\r\n\t\t\tminTickIntervalOption = options.minTickInterval,\r\n\t\t\ttickPixelIntervalOption = options.tickPixelInterval,\r\n\t\t\ttickPositions,\r\n\t\t\tkeepTwoTicksOnly,\r\n\t\t\tcategories = axis.categories;\r\n\r\n\t\t// linked axis gets the extremes from the parent axis\r\n\t\tif (isLinked) {\r\n\t\t\taxis.linkedParent = chart[isXAxis ? 'xAxis' : 'yAxis'][options.linkedTo];\r\n\t\t\tlinkedParentExtremes = axis.linkedParent.getExtremes();\r\n\t\t\taxis.min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);\r\n\t\t\taxis.max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);\r\n\t\t\tif (options.type !== axis.linkedParent.options.type) {\r\n\t\t\t\terror(11, 1); // Can't link axes of different type\r\n\t\t\t}\r\n\t\t} else { // initial min and max from the extreme data values\r\n\t\t\taxis.min = pick(axis.userMin, options.min, axis.dataMin);\r\n\t\t\taxis.max = pick(axis.userMax, options.max, axis.dataMax);\r\n\t\t}\r\n\r\n\t\tif (isLog) {\r\n\t\t\tif (!secondPass && mathMin(axis.min, pick(axis.dataMin, axis.min)) <= 0) { // #978\r\n\t\t\t\terror(10, 1); // Can't plot negative values on log axis\r\n\t\t\t}\r\n\t\t\taxis.min = correctFloat(log2lin(axis.min)); // correctFloat cures #934\r\n\t\t\taxis.max = correctFloat(log2lin(axis.max));\r\n\t\t}\r\n\r\n\t\t// handle zoomed range\r\n\t\tif (axis.range) {\r\n\t\t\taxis.userMin = axis.min = mathMax(axis.min, axis.max - axis.range); // #618\r\n\t\t\taxis.userMax = axis.max;\r\n\t\t\tif (secondPass) {\r\n\t\t\t\taxis.range = null; // don't use it when running setExtremes\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// Hook for adjusting this.min and this.max. Used by bubble series.\r\n\t\tif (axis.beforePadding) {\r\n\t\t\taxis.beforePadding();\r\n\t\t}\r\n\r\n\t\t// adjust min and max for the minimum range\r\n\t\taxis.adjustForMinRange();\r\n\t\t\r\n\t\t// Pad the values to get clear of the chart's edges. To avoid tickInterval taking the padding\r\n\t\t// into account, we do this after computing tick interval (#1337).\r\n\t\tif (!categories && !axis.usePercentage && !isLinked && defined(axis.min) && defined(axis.max)) {\r\n\t\t\tlength = axis.max - axis.min;\r\n\t\t\tif (length) {\r\n\t\t\t\tif (!defined(options.min) && !defined(axis.userMin) && minPadding && (axis.dataMin < 0 || !axis.ignoreMinPadding)) {\r\n\t\t\t\t\taxis.min -= length * minPadding;\r\n\t\t\t\t}\r\n\t\t\t\tif (!defined(options.max) && !defined(axis.userMax) && maxPadding && (axis.dataMax > 0 || !axis.ignoreMaxPadding)) {\r\n\t\t\t\t\taxis.max += length * maxPadding;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// get tickInterval\r\n\t\tif (axis.min === axis.max || axis.min === undefined || axis.max === undefined) {\r\n\t\t\taxis.tickInterval = 1;\r\n\t\t} else if (isLinked && !tickIntervalOption &&\r\n\t\t\t\ttickPixelIntervalOption === axis.linkedParent.options.tickPixelInterval) {\r\n\t\t\taxis.tickInterval = axis.linkedParent.tickInterval;\r\n\t\t} else {\r\n\t\t\taxis.tickInterval = pick(\r\n\t\t\t\ttickIntervalOption,\r\n\t\t\t\tcategories ? // for categoried axis, 1 is default, for linear axis use tickPix\r\n\t\t\t\t\t1 :\r\n\t\t\t\t\t// don't let it be more than the data range\r\n\t\t\t\t\t(axis.max - axis.min) * tickPixelIntervalOption / mathMax(axis.len, tickPixelIntervalOption)\r\n\t\t\t);\r\n\t\t\t// For squished axes, set only two ticks\r\n\t\t\tif (!defined(tickIntervalOption) && axis.len < tickPixelIntervalOption && !this.isRadial) {\r\n\t\t\t\tkeepTwoTicksOnly = true;\r\n\t\t\t\taxis.tickInterval /= 4; // tick extremes closer to the real values\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Now we're finished detecting min and max, crop and group series data. This\r\n\t\t// is in turn needed in order to find tick positions in ordinal axes. \r\n\t\tif (isXAxis && !secondPass) {\r\n\t\t\teach(axis.series, function (series) {\r\n\t\t\t\tseries.processData(axis.min !== axis.oldMin || axis.max !== axis.oldMax);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// set the translation factor used in translate function\r\n\t\taxis.setAxisTranslation(true);\r\n\r\n\t\t// hook for ordinal axes and radial axes\r\n\t\tif (axis.beforeSetTickPositions) {\r\n\t\t\taxis.beforeSetTickPositions();\r\n\t\t}\r\n\t\t\r\n\t\t// hook for extensions, used in Highstock ordinal axes\r\n\t\tif (axis.postProcessTickInterval) {\r\n\t\t\taxis.tickInterval = axis.postProcessTickInterval(axis.tickInterval);\r\n\t\t}\r\n\r\n\t\t// In column-like charts, don't cramp in more ticks than there are points (#1943)\r\n\t\tif (axis.pointRange) {\r\n\t\t\taxis.tickInterval = mathMax(axis.pointRange, axis.tickInterval);\r\n\t\t}\r\n\t\t\r\n\t\t// Before normalizing the tick interval, handle minimum tick interval. This applies only if tickInterval is not defined.\r\n\t\tif (!tickIntervalOption && axis.tickInterval < minTickIntervalOption) {\r\n\t\t\taxis.tickInterval = minTickIntervalOption;\r\n\t\t}\r\n\r\n\t\t// for linear axes, get magnitude and normalize the interval\r\n\t\tif (!isDatetimeAxis && !isLog) { // linear\r\n\t\t\tif (!tickIntervalOption) {\r\n\t\t\t\taxis.tickInterval = normalizeTickInterval(axis.tickInterval, null, getMagnitude(axis.tickInterval), options);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// get minorTickInterval\r\n\t\taxis.minorTickInterval = options.minorTickInterval === 'auto' && axis.tickInterval ?\r\n\t\t\t\taxis.tickInterval / 5 : options.minorTickInterval;\r\n\r\n\t\t// find the tick positions\r\n\t\taxis.tickPositions = tickPositions = options.tickPositions ?\r\n\t\t\t[].concat(options.tickPositions) : // Work on a copy (#1565)\r\n\t\t\t(tickPositioner && tickPositioner.apply(axis, [axis.min, axis.max]));\r\n\t\tif (!tickPositions) {\r\n\t\t\t\r\n\t\t\t// Too many ticks\r\n\t\t\tif (!axis.ordinalPositions && (axis.max - axis.min) / axis.tickInterval > mathMax(2 * axis.len, 200)) {\r\n\t\t\t\terror(19, true);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (isDatetimeAxis) {\r\n\t\t\t\ttickPositions = (axis.getNonLinearTimeTicks || getTimeTicks)(\r\n\t\t\t\t\tnormalizeTimeTickInterval(axis.tickInterval, options.units),\r\n\t\t\t\t\taxis.min,\r\n\t\t\t\t\taxis.max,\r\n\t\t\t\t\toptions.startOfWeek,\r\n\t\t\t\t\taxis.ordinalPositions,\r\n\t\t\t\t\taxis.closestPointRange,\r\n\t\t\t\t\ttrue\r\n\t\t\t\t);\r\n\t\t\t} else if (isLog) {\r\n\t\t\t\ttickPositions = axis.getLogTickPositions(axis.tickInterval, axis.min, axis.max);\r\n\t\t\t} else {\r\n\t\t\t\ttickPositions = axis.getLinearTickPositions(axis.tickInterval, axis.min, axis.max);\r\n\t\t\t}\r\n\t\t\tif (keepTwoTicksOnly) {\r\n\t\t\t\ttickPositions.splice(1, tickPositions.length - 2);\r\n\t\t\t}\r\n\r\n\t\t\taxis.tickPositions = tickPositions;\r\n\t\t}\r\n\r\n\t\tif (!isLinked) {\r\n\r\n\t\t\t// reset min/max or remove extremes based on start/end on tick\r\n\t\t\tvar roundedMin = tickPositions[0],\r\n\t\t\t\troundedMax = tickPositions[tickPositions.length - 1],\r\n\t\t\t\tminPointOffset = axis.minPointOffset || 0,\r\n\t\t\t\tsinglePad;\r\n\r\n\t\t\tif (options.startOnTick) {\r\n\t\t\t\taxis.min = roundedMin;\r\n\t\t\t} else if (axis.min - minPointOffset > roundedMin) {\r\n\t\t\t\ttickPositions.shift();\r\n\t\t\t}\r\n\r\n\t\t\tif (options.endOnTick) {\r\n\t\t\t\taxis.max = roundedMax;\r\n\t\t\t} else if (axis.max + minPointOffset < roundedMax) {\r\n\t\t\t\ttickPositions.pop();\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// When there is only one point, or all points have the same value on this axis, then min\r\n\t\t\t// and max are equal and tickPositions.length is 1. In this case, add some padding\r\n\t\t\t// in order to center the point, but leave it with one tick. #1337.\r\n\t\t\tif (tickPositions.length === 1) {\r\n\t\t\t\tsinglePad = 0.001; // The lowest possible number to avoid extra padding on columns\r\n\t\t\t\taxis.min -= singlePad;\r\n\t\t\t\taxis.max += singlePad;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * Set the max ticks of either the x and y axis collection\r\n\t */\r\n\tsetMaxTicks: function () {\r\n\t\t\r\n\t\tvar chart = this.chart,\r\n\t\t\tmaxTicks = chart.maxTicks || {},\r\n\t\t\ttickPositions = this.tickPositions,\r\n\t\t\tkey = this._maxTicksKey = [this.xOrY, this.pos, this.len].join('-');\r\n\t\t\r\n\t\tif (!this.isLinked && !this.isDatetimeAxis && tickPositions && tickPositions.length > (maxTicks[key] || 0) && this.options.alignTicks !== false) {\r\n\t\t\tmaxTicks[key] = tickPositions.length;\r\n\t\t}\r\n\t\tchart.maxTicks = maxTicks;\r\n\t},\r\n\r\n\t/**\r\n\t * When using multiple axes, adjust the number of ticks to match the highest\r\n\t * number of ticks in that group\r\n\t */\r\n\tadjustTickAmount: function () {\r\n\t\tvar axis = this,\r\n\t\t\tchart = axis.chart,\r\n\t\t\tkey = axis._maxTicksKey,\r\n\t\t\ttickPositions = axis.tickPositions,\r\n\t\t\tmaxTicks = chart.maxTicks;\r\n\r\n\t\tif (maxTicks && maxTicks[key] && !axis.isDatetimeAxis && !axis.categories && !axis.isLinked && axis.options.alignTicks !== false) { // only apply to linear scale\r\n\t\t\tvar oldTickAmount = axis.tickAmount,\r\n\t\t\t\tcalculatedTickAmount = tickPositions.length,\r\n\t\t\t\ttickAmount;\r\n\r\n\t\t\t// set the axis-level tickAmount to use below\r\n\t\t\taxis.tickAmount = tickAmount = maxTicks[key];\r\n\r\n\t\t\tif (calculatedTickAmount < tickAmount) {\r\n\t\t\t\twhile (tickPositions.length < tickAmount) {\r\n\t\t\t\t\ttickPositions.push(correctFloat(\r\n\t\t\t\t\t\ttickPositions[tickPositions.length - 1] + axis.tickInterval\r\n\t\t\t\t\t));\r\n\t\t\t\t}\r\n\t\t\t\taxis.transA *= (calculatedTickAmount - 1) / (tickAmount - 1);\r\n\t\t\t\taxis.max = tickPositions[tickPositions.length - 1];\r\n\r\n\t\t\t}\r\n\t\t\tif (defined(oldTickAmount) && tickAmount !== oldTickAmount) {\r\n\t\t\t\taxis.isDirty = true;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Set the scale based on data min and max, user set min and max or options\r\n\t *\r\n\t */\r\n\tsetScale: function () {\r\n\t\tvar axis = this,\r\n\t\t\tstacks = axis.stacks,\r\n\t\t\ttype,\r\n\t\t\ti,\r\n\t\t\tisDirtyData,\r\n\t\t\tisDirtyAxisLength;\r\n\r\n\t\taxis.oldMin = axis.min;\r\n\t\taxis.oldMax = axis.max;\r\n\t\taxis.oldAxisLength = axis.len;\r\n\r\n\t\t// set the new axisLength\r\n\t\taxis.setAxisSize();\r\n\t\t//axisLength = horiz ? axisWidth : axisHeight;\r\n\t\tisDirtyAxisLength = axis.len !== axis.oldAxisLength;\r\n\r\n\t\t// is there new data?\r\n\t\teach(axis.series, function (series) {\r\n\t\t\tif (series.isDirtyData || series.isDirty ||\r\n\t\t\t\t\tseries.xAxis.isDirty) { // when x axis is dirty, we need new data extremes for y as well\r\n\t\t\t\tisDirtyData = true;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// do we really need to go through all this?\r\n\t\tif (isDirtyAxisLength || isDirtyData || axis.isLinked || axis.forceRedraw ||\r\n\t\t\taxis.userMin !== axis.oldUserMin || axis.userMax !== axis.oldUserMax) {\r\n\t\t\t\r\n\t\t\t// reset stacks\r\n\t\t\tif (!axis.isXAxis) {\r\n\t\t\t\tfor (type in stacks) {\r\n\t\t\t\t\tfor (i in stacks[type]) {\r\n\t\t\t\t\t\tstacks[type][i].total = null;\r\n\t\t\t\t\t\tstacks[type][i].cum = 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\taxis.forceRedraw = false;\r\n\r\n\t\t\t// get data extremes if needed\r\n\t\t\taxis.getSeriesExtremes();\r\n\r\n\t\t\t// get fixed positions based on tickInterval\r\n\t\t\taxis.setTickPositions();\r\n\r\n\t\t\t// record old values to decide whether a rescale is necessary later on (#540)\r\n\t\t\taxis.oldUserMin = axis.userMin;\r\n\t\t\taxis.oldUserMax = axis.userMax;\r\n\r\n\t\t\t// Mark as dirty if it is not already set to dirty and extremes have changed. #595.\r\n\t\t\tif (!axis.isDirty) {\r\n\t\t\t\taxis.isDirty = isDirtyAxisLength || axis.min !== axis.oldMin || axis.max !== axis.oldMax;\r\n\t\t\t}\r\n\t\t} else if (!axis.isXAxis) {\r\n\t\t\tif (axis.oldStacks) {\r\n\t\t\t\tstacks = axis.stacks = axis.oldStacks;\r\n\t\t\t}\r\n\r\n\t\t\t// reset stacks\r\n\t\t\tfor (type in stacks) {\r\n\t\t\t\tfor (i in stacks[type]) {\r\n\t\t\t\t\tstacks[type][i].cum = stacks[type][i].total;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// Set the maximum tick amount\r\n\t\taxis.setMaxTicks();\r\n\t},\r\n\r\n\t/**\r\n\t * Set the extremes and optionally redraw\r\n\t * @param {Number} newMin\r\n\t * @param {Number} newMax\r\n\t * @param {Boolean} redraw\r\n\t * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\r\n\t * configuration\r\n\t * @param {Object} eventArguments \r\n\t *\r\n\t */\r\n\tsetExtremes: function (newMin, newMax, redraw, animation, eventArguments) {\r\n\t\tvar axis = this,\r\n\t\t\tchart = axis.chart;\r\n\r\n\t\tredraw = pick(redraw, true); // defaults to true\r\n\r\n\t\t// Extend the arguments with min and max\r\n\t\teventArguments = extend(eventArguments, {\r\n\t\t\tmin: newMin,\r\n\t\t\tmax: newMax\r\n\t\t});\r\n\r\n\t\t// Fire the event\r\n\t\tfireEvent(axis, 'setExtremes', eventArguments, function () { // the default event handler\r\n\r\n\t\t\taxis.userMin = newMin;\r\n\t\t\taxis.userMax = newMax;\r\n\t\t\taxis.eventArgs = eventArguments;\r\n\r\n\t\t\t// Mark for running afterSetExtremes\r\n\t\t\taxis.isDirtyExtremes = true;\r\n\r\n\t\t\t// redraw\r\n\t\t\tif (redraw) {\r\n\t\t\t\tchart.redraw(animation);\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\t\r\n\t/**\r\n\t * Overridable method for zooming chart. Pulled out in a separate method to allow overriding\r\n\t * in stock charts.\r\n\t */\r\n\tzoom: function (newMin, newMax) {\r\n\r\n\t\t// Prevent pinch zooming out of range. Check for defined is for #1946.\r\n\t\tif (!this.allowZoomOutside) {\r\n\t\t\tif (defined(this.dataMin) && newMin <= this.dataMin) {\r\n\t\t\t\tnewMin = UNDEFINED;\r\n\t\t\t}\r\n\t\t\tif (defined(this.dataMax) && newMax >= this.dataMax) {\r\n\t\t\t\tnewMax = UNDEFINED;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// In full view, displaying the reset zoom button is not required\r\n\t\tthis.displayBtn = newMin !== UNDEFINED || newMax !== UNDEFINED;\r\n\t\t\r\n\t\t// Do it\r\n\t\tthis.setExtremes(\r\n\t\t\tnewMin,\r\n\t\t\tnewMax,\r\n\t\t\tfalse, \r\n\t\t\tUNDEFINED, \r\n\t\t\t{ trigger: 'zoom' }\r\n\t\t);\r\n\t\treturn true;\r\n\t},\r\n\t\r\n\t/**\r\n\t * Update the axis metrics\r\n\t */\r\n\tsetAxisSize: function () {\r\n\t\tvar chart = this.chart,\r\n\t\t\toptions = this.options,\r\n\t\t\toffsetLeft = options.offsetLeft || 0,\r\n\t\t\toffsetRight = options.offsetRight || 0,\r\n\t\t\thoriz = this.horiz,\r\n\t\t\twidth,\r\n\t\t\theight,\r\n\t\t\ttop,\r\n\t\t\tleft;\r\n\r\n\t\t// Expose basic values to use in Series object and navigator\r\n\t\tthis.left = left = pick(options.left, chart.plotLeft + offsetLeft);\r\n\t\tthis.top = top = pick(options.top, chart.plotTop);\r\n\t\tthis.width = width = pick(options.width, chart.plotWidth - offsetLeft + offsetRight);\r\n\t\tthis.height = height = pick(options.height, chart.plotHeight);\r\n\t\tthis.bottom = chart.chartHeight - height - top;\r\n\t\tthis.right = chart.chartWidth - width - left;\r\n\r\n\t\t// Direction agnostic properties\r\n\t\tthis.len = mathMax(horiz ? width : height, 0); // mathMax fixes #905\r\n\t\tthis.pos = horiz ? left : top; // distance from SVG origin\r\n\t},\r\n\r\n\t/**\r\n\t * Get the actual axis extremes\r\n\t */\r\n\tgetExtremes: function () {\r\n\t\tvar axis = this,\r\n\t\t\tisLog = axis.isLog;\r\n\r\n\t\treturn {\r\n\t\t\tmin: isLog ? correctFloat(lin2log(axis.min)) : axis.min,\r\n\t\t\tmax: isLog ? correctFloat(lin2log(axis.max)) : axis.max,\r\n\t\t\tdataMin: axis.dataMin,\r\n\t\t\tdataMax: axis.dataMax,\r\n\t\t\tuserMin: axis.userMin,\r\n\t\t\tuserMax: axis.userMax\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Get the zero plane either based on zero or on the min or max value.\r\n\t * Used in bar and area plots\r\n\t */\r\n\tgetThreshold: function (threshold) {\r\n\t\tvar axis = this,\r\n\t\t\tisLog = axis.isLog;\r\n\r\n\t\tvar realMin = isLog ? lin2log(axis.min) : axis.min,\r\n\t\t\trealMax = isLog ? lin2log(axis.max) : axis.max;\r\n\t\t\r\n\t\tif (realMin > threshold || threshold === null) {\r\n\t\t\tthreshold = realMin;\r\n\t\t} else if (realMax < threshold) {\r\n\t\t\tthreshold = realMax;\r\n\t\t}\r\n\r\n\t\treturn axis.translate(threshold, 0, 1, 0, 1);\r\n\t},\r\n\r\n\taddPlotBand: function (options) {\r\n\t\tthis.addPlotBandOrLine(options, 'plotBands');\r\n\t},\r\n\t\r\n\taddPlotLine: function (options) {\r\n\t\tthis.addPlotBandOrLine(options, 'plotLines');\r\n\t},\r\n\r\n\t/**\r\n\t * Add a plot band or plot line after render time\r\n\t *\r\n\t * @param options {Object} The plotBand or plotLine configuration object\r\n\t */\r\n\taddPlotBandOrLine: function (options, coll) {\r\n\t\tvar obj = new PlotLineOrBand(this, options).render(),\r\n\t\t\tuserOptions = this.userOptions;\r\n\r\n\t\tif (obj) { // #2189\r\n\t\t\t// Add it to the user options for exporting and Axis.update\r\n\t\t\tif (coll) {\r\n\t\t\t\tuserOptions[coll] = userOptions[coll] || [];\r\n\t\t\t\tuserOptions[coll].push(options); \r\n\t\t\t}\r\n\t\t\tthis.plotLinesAndBands.push(obj); \r\n\t\t}\r\n\t\t\r\n\t\treturn obj;\r\n\t},\r\n\r\n\t/**\r\n\t * Compute auto alignment for the axis label based on which side the axis is on \r\n\t * and the given rotation for the label\r\n\t */\r\n\tautoLabelAlign: function (rotation) {\r\n\t\tvar ret, \r\n\t\t\tangle = (pick(rotation, 0) - (this.side * 90) + 720) % 360;\r\n\r\n\t\tif (angle > 15 && angle < 165) {\r\n\t\t\tret = 'right';\r\n\t\t} else if (angle > 195 && angle < 345) {\r\n\t\t\tret = 'left';\r\n\t\t} else {\r\n\t\t\tret = 'center';\r\n\t\t}\r\n\t\treturn ret;\r\n\t},\r\n\r\n\t/**\r\n\t * Render the tick labels to a preliminary position to get their sizes\r\n\t */\r\n\tgetOffset: function () {\r\n\t\tvar axis = this,\r\n\t\t\tchart = axis.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\toptions = axis.options,\r\n\t\t\ttickPositions = axis.tickPositions,\r\n\t\t\tticks = axis.ticks,\r\n\t\t\thoriz = axis.horiz,\r\n\t\t\tside = axis.side,\r\n\t\t\tinvertedSide = chart.inverted ? [1, 0, 3, 2][side] : side,\r\n\t\t\thasData,\r\n\t\t\tshowAxis,\r\n\t\t\ttitleOffset = 0,\r\n\t\t\ttitleOffsetOption,\r\n\t\t\ttitleMargin = 0,\r\n\t\t\taxisTitleOptions = options.title,\r\n\t\t\tlabelOptions = options.labels,\r\n\t\t\tlabelOffset = 0, // reset\r\n\t\t\taxisOffset = chart.axisOffset,\r\n\t\t\tclipOffset = chart.clipOffset,\r\n\t\t\tdirectionFactor = [-1, 1, 1, -1][side],\r\n\t\t\tn,\r\n\t\t\ti,\r\n\t\t\tautoStaggerLines = 1,\r\n\t\t\tmaxStaggerLines = pick(labelOptions.maxStaggerLines, 5),\r\n\t\t\tsortedPositions,\r\n\t\t\tlastRight,\r\n\t\t\toverlap,\r\n\t\t\tpos,\r\n\t\t\tbBox,\r\n\t\t\tx,\r\n\t\t\tw,\r\n\t\t\tlineNo;\r\n\t\t\t\r\n\t\t// For reuse in Axis.render\r\n\t\taxis.hasData = hasData = (axis.hasVisibleSeries || (defined(axis.min) && defined(axis.max) && !!tickPositions));\r\n\t\taxis.showAxis = showAxis = hasData || pick(options.showEmpty, true);\r\n\r\n\t\t// Set/reset staggerLines\r\n\t\taxis.staggerLines = axis.horiz && labelOptions.staggerLines;\r\n\t\t\r\n\t\t// Create the axisGroup and gridGroup elements on first iteration\r\n\t\tif (!axis.axisGroup) {\r\n\t\t\taxis.gridGroup = renderer.g('grid')\r\n\t\t\t\t.attr({ zIndex: options.gridZIndex || 1 })\r\n\t\t\t\t.add();\r\n\t\t\taxis.axisGroup = renderer.g('axis')\r\n\t\t\t\t.attr({ zIndex: options.zIndex || 2 })\r\n\t\t\t\t.add();\r\n\t\t\taxis.labelGroup = renderer.g('axis-labels')\r\n\t\t\t\t.attr({ zIndex: labelOptions.zIndex || 7 })\r\n\t\t\t\t.add();\r\n\t\t}\r\n\r\n\t\tif (hasData || axis.isLinked) {\r\n\t\t\t\r\n\t\t\t// Set the explicit or automatic label alignment\r\n\t\t\taxis.labelAlign = pick(labelOptions.align || axis.autoLabelAlign(labelOptions.rotation));\r\n\r\n\t\t\t// Generate ticks\r\n\t\t\teach(tickPositions, function (pos) {\r\n\t\t\t\tif (!ticks[pos]) {\r\n\t\t\t\t\tticks[pos] = new Tick(axis, pos);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tticks[pos].addLabel(); // update labels depending on tick interval\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// Handle automatic stagger lines\r\n\t\t\tif (axis.horiz && !axis.staggerLines && maxStaggerLines && !labelOptions.rotation) {\r\n\t\t\t\tsortedPositions = axis.reversed ? [].concat(tickPositions).reverse() : tickPositions;\r\n\t\t\t\twhile (autoStaggerLines < maxStaggerLines) {\r\n\t\t\t\t\tlastRight = [];\r\n\t\t\t\t\toverlap = false;\r\n\t\t\t\t\t\r\n\t\t\t\t\tfor (i = 0; i < sortedPositions.length; i++) {\r\n\t\t\t\t\t\tpos = sortedPositions[i];\r\n\t\t\t\t\t\tbBox = ticks[pos].label && ticks[pos].label.getBBox();\r\n\t\t\t\t\t\tw = bBox ? bBox.width : 0;\r\n\t\t\t\t\t\tlineNo = i % autoStaggerLines;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif (w) {\r\n\t\t\t\t\t\t\tx = axis.translate(pos); // don't handle log\r\n\t\t\t\t\t\t\tif (lastRight[lineNo] !== UNDEFINED && x < lastRight[lineNo]) {\r\n\t\t\t\t\t\t\t\toverlap = true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tlastRight[lineNo] = x + w;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (overlap) {\r\n\t\t\t\t\t\tautoStaggerLines++;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (autoStaggerLines > 1) {\r\n\t\t\t\t\taxis.staggerLines = autoStaggerLines;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t\teach(tickPositions, function (pos) {\r\n\t\t\t\t// left side must be align: right and right side must have align: left for labels\r\n\t\t\t\tif (side === 0 || side === 2 || { 1: 'left', 3: 'right' }[side] === axis.labelAlign) {\r\n\r\n\t\t\t\t\t// get the highest offset\r\n\t\t\t\t\tlabelOffset = mathMax(\r\n\t\t\t\t\t\tticks[pos].getLabelSize(),\r\n\t\t\t\t\t\tlabelOffset\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t});\r\n\t\t\tif (axis.staggerLines) {\r\n\t\t\t\tlabelOffset *= axis.staggerLines;\r\n\t\t\t\taxis.labelOffset = labelOffset;\r\n\t\t\t}\r\n\t\t\t\r\n\r\n\t\t} else { // doesn't have data\r\n\t\t\tfor (n in ticks) {\r\n\t\t\t\tticks[n].destroy();\r\n\t\t\t\tdelete ticks[n];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (axisTitleOptions && axisTitleOptions.text && axisTitleOptions.enabled !== false) { \r\n\t\t\tif (!axis.axisTitle) {\r\n\t\t\t\taxis.axisTitle = renderer.text(\r\n\t\t\t\t\taxisTitleOptions.text,\r\n\t\t\t\t\t0,\r\n\t\t\t\t\t0,\r\n\t\t\t\t\taxisTitleOptions.useHTML\r\n\t\t\t\t)\r\n\t\t\t\t.attr({\r\n\t\t\t\t\tzIndex: 7,\r\n\t\t\t\t\trotation: axisTitleOptions.rotation || 0,\r\n\t\t\t\t\talign:\r\n\t\t\t\t\t\taxisTitleOptions.textAlign ||\r\n\t\t\t\t\t\t{ low: 'left', middle: 'center', high: 'right' }[axisTitleOptions.align]\r\n\t\t\t\t})\r\n\t\t\t\t.css(axisTitleOptions.style)\r\n\t\t\t\t.add(axis.axisGroup);\r\n\t\t\t\taxis.axisTitle.isNew = true;\r\n\t\t\t}\r\n\r\n\t\t\tif (showAxis) {\r\n\t\t\t\ttitleOffset = axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];\r\n\t\t\t\ttitleMargin = pick(axisTitleOptions.margin, horiz ? 5 : 10);\r\n\t\t\t\ttitleOffsetOption = axisTitleOptions.offset;\r\n\t\t\t}\r\n\r\n\t\t\t// hide or show the title depending on whether showEmpty is set\r\n\t\t\taxis.axisTitle[showAxis ? 'show' : 'hide']();\r\n\t\t}\r\n\t\t\r\n\t\t// handle automatic or user set offset\r\n\t\taxis.offset = directionFactor * pick(options.offset, axisOffset[side]);\r\n\t\t\r\n\t\taxis.axisTitleMargin =\r\n\t\t\tpick(titleOffsetOption,\r\n\t\t\t\tlabelOffset + titleMargin +\r\n\t\t\t\t(side !== 2 && labelOffset && directionFactor * options.labels[horiz ? 'y' : 'x'])\r\n\t\t\t);\r\n\r\n\t\taxisOffset[side] = mathMax(\r\n\t\t\taxisOffset[side],\r\n\t\t\taxis.axisTitleMargin + titleOffset + directionFactor * axis.offset\r\n\t\t);\r\n\t\tclipOffset[invertedSide] = mathMax(clipOffset[invertedSide], mathFloor(options.lineWidth / 2) * 2);\r\n\t},\r\n\t\r\n\t/**\r\n\t * Get the path for the axis line\r\n\t */\r\n\tgetLinePath: function (lineWidth) {\r\n\t\tvar chart = this.chart,\r\n\t\t\topposite = this.opposite,\r\n\t\t\toffset = this.offset,\r\n\t\t\thoriz = this.horiz,\r\n\t\t\tlineLeft = this.left + (opposite ? this.width : 0) + offset,\r\n\t\t\tlineTop = chart.chartHeight - this.bottom - (opposite ? this.height : 0) + offset;\r\n\t\t\t\r\n\t\tif (opposite) {\r\n\t\t\tlineWidth *= -1; // crispify the other way - #1480, #1687\r\n\t\t}\r\n\r\n\t\treturn chart.renderer.crispLine([\r\n\t\t\t\tM,\r\n\t\t\t\thoriz ?\r\n\t\t\t\t\tthis.left :\r\n\t\t\t\t\tlineLeft,\r\n\t\t\t\thoriz ?\r\n\t\t\t\t\tlineTop :\r\n\t\t\t\t\tthis.top,\r\n\t\t\t\tL,\r\n\t\t\t\thoriz ?\r\n\t\t\t\t\tchart.chartWidth - this.right :\r\n\t\t\t\t\tlineLeft,\r\n\t\t\t\thoriz ?\r\n\t\t\t\t\tlineTop :\r\n\t\t\t\t\tchart.chartHeight - this.bottom\r\n\t\t\t], lineWidth);\r\n\t},\r\n\t\r\n\t/**\r\n\t * Position the title\r\n\t */\r\n\tgetTitlePosition: function () {\r\n\t\t// compute anchor points for each of the title align options\r\n\t\tvar horiz = this.horiz,\r\n\t\t\taxisLeft = this.left,\r\n\t\t\taxisTop = this.top,\r\n\t\t\taxisLength = this.len,\r\n\t\t\taxisTitleOptions = this.options.title,\t\t\t\r\n\t\t\tmargin = horiz ? axisLeft : axisTop,\r\n\t\t\topposite = this.opposite,\r\n\t\t\toffset = this.offset,\r\n\t\t\tfontSize = pInt(axisTitleOptions.style.fontSize || 12),\r\n\t\t\t\r\n\t\t\t// the position in the length direction of the axis\r\n\t\t\talongAxis = {\r\n\t\t\t\tlow: margin + (horiz ? 0 : axisLength),\r\n\t\t\t\tmiddle: margin + axisLength / 2,\r\n\t\t\t\thigh: margin + (horiz ? axisLength : 0)\r\n\t\t\t}[axisTitleOptions.align],\r\n\t\r\n\t\t\t// the position in the perpendicular direction of the axis\r\n\t\t\toffAxis = (horiz ? axisTop + this.height : axisLeft) +\r\n\t\t\t\t(horiz ? 1 : -1) * // horizontal axis reverses the margin\r\n\t\t\t\t(opposite ? -1 : 1) * // so does opposite axes\r\n\t\t\t\tthis.axisTitleMargin +\r\n\t\t\t\t(this.side === 2 ? fontSize : 0);\r\n\r\n\t\treturn {\r\n\t\t\tx: horiz ?\r\n\t\t\t\talongAxis :\r\n\t\t\t\toffAxis + (opposite ? this.width : 0) + offset +\r\n\t\t\t\t\t(axisTitleOptions.x || 0), // x\r\n\t\t\ty: horiz ?\r\n\t\t\t\toffAxis - (opposite ? this.height : 0) + offset :\r\n\t\t\t\talongAxis + (axisTitleOptions.y || 0) // y\r\n\t\t};\r\n\t},\r\n\t\r\n\t/**\r\n\t * Render the axis\r\n\t */\r\n\trender: function () {\r\n\t\tvar axis = this,\r\n\t\t\tchart = axis.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\toptions = axis.options,\r\n\t\t\tisLog = axis.isLog,\r\n\t\t\tisLinked = axis.isLinked,\r\n\t\t\ttickPositions = axis.tickPositions,\r\n\t\t\taxisTitle = axis.axisTitle,\r\n\t\t\tstacks = axis.stacks,\r\n\t\t\tticks = axis.ticks,\r\n\t\t\tminorTicks = axis.minorTicks,\r\n\t\t\talternateBands = axis.alternateBands,\r\n\t\t\tstackLabelOptions = options.stackLabels,\r\n\t\t\talternateGridColor = options.alternateGridColor,\r\n\t\t\ttickmarkOffset = axis.tickmarkOffset,\r\n\t\t\tlineWidth = options.lineWidth,\r\n\t\t\tlinePath,\r\n\t\t\thasRendered = chart.hasRendered,\r\n\t\t\tslideInTicks = hasRendered && defined(axis.oldMin) && !isNaN(axis.oldMin),\r\n\t\t\thasData = axis.hasData,\r\n\t\t\tshowAxis = axis.showAxis,\r\n\t\t\tfrom,\r\n\t\t\tto;\r\n\r\n\t\t// Mark all elements inActive before we go over and mark the active ones\r\n\t\teach([ticks, minorTicks, alternateBands], function (coll) {\r\n\t\t\tvar pos;\r\n\t\t\tfor (pos in coll) {\r\n\t\t\t\tcoll[pos].isActive = false;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// If the series has data draw the ticks. Else only the line and title\r\n\t\tif (hasData || isLinked) {\r\n\r\n\t\t\t// minor ticks\r\n\t\t\tif (axis.minorTickInterval && !axis.categories) {\r\n\t\t\t\teach(axis.getMinorTickPositions(), function (pos) {\r\n\t\t\t\t\tif (!minorTicks[pos]) {\r\n\t\t\t\t\t\tminorTicks[pos] = new Tick(axis, pos, 'minor');\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// render new ticks in old position\r\n\t\t\t\t\tif (slideInTicks && minorTicks[pos].isNew) {\r\n\t\t\t\t\t\tminorTicks[pos].render(null, true);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tminorTicks[pos].render(null, false, 1);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// Major ticks. Pull out the first item and render it last so that\r\n\t\t\t// we can get the position of the neighbour label. #808.\r\n\t\t\tif (tickPositions.length) { // #1300\r\n\t\t\t\teach(tickPositions.slice(1).concat([tickPositions[0]]), function (pos, i) {\r\n\t\r\n\t\t\t\t\t// Reorganize the indices\r\n\t\t\t\t\ti = (i === tickPositions.length - 1) ? 0 : i + 1;\r\n\t\r\n\t\t\t\t\t// linked axes need an extra check to find out if\r\n\t\t\t\t\tif (!isLinked || (pos >= axis.min && pos <= axis.max)) {\r\n\t\r\n\t\t\t\t\t\tif (!ticks[pos]) {\r\n\t\t\t\t\t\t\tticks[pos] = new Tick(axis, pos);\r\n\t\t\t\t\t\t}\r\n\t\r\n\t\t\t\t\t\t// render new ticks in old position\r\n\t\t\t\t\t\tif (slideInTicks && ticks[pos].isNew) {\r\n\t\t\t\t\t\t\tticks[pos].render(i, true);\r\n\t\t\t\t\t\t}\r\n\t\r\n\t\t\t\t\t\tticks[pos].render(i, false, 1);\r\n\t\t\t\t\t}\r\n\t\r\n\t\t\t\t});\r\n\t\t\t\t// In a categorized axis, the tick marks are displayed between labels. So\r\n\t\t\t\t// we need to add a tick mark and grid line at the left edge of the X axis.\r\n\t\t\t\tif (tickmarkOffset && axis.min === 0) {\r\n\t\t\t\t\tif (!ticks[-1]) {\r\n\t\t\t\t\t\tticks[-1] = new Tick(axis, -1, null, true);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tticks[-1].render(-1);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t}\r\n\r\n\t\t\t// alternate grid color\r\n\t\t\tif (alternateGridColor) {\r\n\t\t\t\teach(tickPositions, function (pos, i) {\r\n\t\t\t\t\tif (i % 2 === 0 && pos < axis.max) {\r\n\t\t\t\t\t\tif (!alternateBands[pos]) {\r\n\t\t\t\t\t\t\talternateBands[pos] = new PlotLineOrBand(axis);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tfrom = pos + tickmarkOffset; // #949\r\n\t\t\t\t\t\tto = tickPositions[i + 1] !== UNDEFINED ? tickPositions[i + 1] + tickmarkOffset : axis.max;\r\n\t\t\t\t\t\talternateBands[pos].options = {\r\n\t\t\t\t\t\t\tfrom: isLog ? lin2log(from) : from,\r\n\t\t\t\t\t\t\tto: isLog ? lin2log(to) : to,\r\n\t\t\t\t\t\t\tcolor: alternateGridColor\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\talternateBands[pos].render();\r\n\t\t\t\t\t\talternateBands[pos].isActive = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// custom plot lines and bands\r\n\t\t\tif (!axis._addedPlotLB) { // only first time\r\n\t\t\t\teach((options.plotLines || []).concat(options.plotBands || []), function (plotLineOptions) {\r\n\t\t\t\t\taxis.addPlotBandOrLine(plotLineOptions);\r\n\t\t\t\t});\r\n\t\t\t\taxis._addedPlotLB = true;\r\n\t\t\t}\r\n\r\n\t\t} // end if hasData\r\n\r\n\t\t// Remove inactive ticks\r\n\t\teach([ticks, minorTicks, alternateBands], function (coll) {\r\n\t\t\tvar pos, \r\n\t\t\t\ti,\r\n\t\t\t\tforDestruction = [],\r\n\t\t\t\tdelay = globalAnimation ? globalAnimation.duration || 500 : 0,\r\n\t\t\t\tdestroyInactiveItems = function () {\r\n\t\t\t\t\ti = forDestruction.length;\r\n\t\t\t\t\twhile (i--) {\r\n\t\t\t\t\t\t// When resizing rapidly, the same items may be destroyed in different timeouts,\r\n\t\t\t\t\t\t// or the may be reactivated\r\n\t\t\t\t\t\tif (coll[forDestruction[i]] && !coll[forDestruction[i]].isActive) {\r\n\t\t\t\t\t\t\tcoll[forDestruction[i]].destroy();\r\n\t\t\t\t\t\t\tdelete coll[forDestruction[i]];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t};\r\n\r\n\t\t\tfor (pos in coll) {\r\n\r\n\t\t\t\tif (!coll[pos].isActive) {\r\n\t\t\t\t\t// Render to zero opacity\r\n\t\t\t\t\tcoll[pos].render(pos, false, 0);\r\n\t\t\t\t\tcoll[pos].isActive = false;\r\n\t\t\t\t\tforDestruction.push(pos);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// When the objects are finished fading out, destroy them\r\n\t\t\tif (coll === alternateBands || !chart.hasRendered || !delay) {\r\n\t\t\t\tdestroyInactiveItems();\r\n\t\t\t} else if (delay) {\r\n\t\t\t\tsetTimeout(destroyInactiveItems, delay);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Static items. As the axis group is cleared on subsequent calls\r\n\t\t// to render, these items are added outside the group.\r\n\t\t// axis line\r\n\t\tif (lineWidth) {\r\n\t\t\tlinePath = axis.getLinePath(lineWidth);\r\n\t\t\tif (!axis.axisLine) {\r\n\t\t\t\taxis.axisLine = renderer.path(linePath)\r\n\t\t\t\t\t.attr({\r\n\t\t\t\t\t\tstroke: options.lineColor,\r\n\t\t\t\t\t\t'stroke-width': lineWidth,\r\n\t\t\t\t\t\tzIndex: 7\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.add(axis.axisGroup);\r\n\t\t\t} else {\r\n\t\t\t\taxis.axisLine.animate({ d: linePath });\r\n\t\t\t}\r\n\r\n\t\t\t// show or hide the line depending on options.showEmpty\r\n\t\t\taxis.axisLine[showAxis ? 'show' : 'hide']();\r\n\t\t}\r\n\r\n\t\tif (axisTitle && showAxis) {\r\n\t\t\t\r\n\t\t\taxisTitle[axisTitle.isNew ? 'attr' : 'animate'](\r\n\t\t\t\taxis.getTitlePosition()\r\n\t\t\t);\r\n\t\t\taxisTitle.isNew = false;\r\n\t\t}\r\n\r\n\t\t// Stacked totals:\r\n\t\tif (stackLabelOptions && stackLabelOptions.enabled) {\r\n\t\t\tvar stackKey, oneStack, stackCategory,\r\n\t\t\t\tstackTotalGroup = axis.stackTotalGroup;\r\n\r\n\t\t\t// Create a separate group for the stack total labels\r\n\t\t\tif (!stackTotalGroup) {\r\n\t\t\t\taxis.stackTotalGroup = stackTotalGroup =\r\n\t\t\t\t\trenderer.g('stack-labels')\r\n\t\t\t\t\t\t.attr({\r\n\t\t\t\t\t\t\tvisibility: VISIBLE,\r\n\t\t\t\t\t\t\tzIndex: 6\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.add();\r\n\t\t\t}\r\n\r\n\t\t\t// plotLeft/Top will change when y axis gets wider so we need to translate the\r\n\t\t\t// stackTotalGroup at every render call. See bug #506 and #516\r\n\t\t\tstackTotalGroup.translate(chart.plotLeft, chart.plotTop);\r\n\r\n\t\t\t// Render each stack total\r\n\t\t\tfor (stackKey in stacks) {\r\n\t\t\t\toneStack = stacks[stackKey];\r\n\t\t\t\tfor (stackCategory in oneStack) {\r\n\t\t\t\t\toneStack[stackCategory].render(stackTotalGroup);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t// End stacked totals\r\n\r\n\t\taxis.isDirty = false;\r\n\t},\r\n\r\n\t/**\r\n\t * Remove a plot band or plot line from the chart by id\r\n\t * @param {Object} id\r\n\t */\r\n\tremovePlotBandOrLine: function (id) {\r\n\t\tvar plotLinesAndBands = this.plotLinesAndBands,\r\n\t\t\toptions = this.options,\r\n\t\t\tuserOptions = this.userOptions,\r\n\t\t\ti = plotLinesAndBands.length;\r\n\t\twhile (i--) {\r\n\t\t\tif (plotLinesAndBands[i].id === id) {\r\n\t\t\t\tplotLinesAndBands[i].destroy();\r\n\t\t\t}\r\n\t\t}\r\n\t\teach([options.plotLines || [], userOptions.plotLines || [], options.plotBands || [], userOptions.plotBands || []], function (arr) {\r\n\t\t\ti = arr.length;\r\n\t\t\twhile (i--) {\r\n\t\t\t\tif (arr[i].id === id) {\r\n\t\t\t\t\terase(arr, arr[i]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Update the axis title by options\r\n\t */\r\n\tsetTitle: function (newTitleOptions, redraw) {\r\n\t\tthis.update({ title: newTitleOptions }, redraw);\r\n\t},\r\n\r\n\t/**\r\n\t * Redraw the axis to reflect changes in the data or axis extremes\r\n\t */\r\n\tredraw: function () {\r\n\t\tvar axis = this,\r\n\t\t\tchart = axis.chart,\r\n\t\t\tpointer = chart.pointer;\r\n\r\n\t\t// hide tooltip and hover states\r\n\t\tif (pointer.reset) {\r\n\t\t\tpointer.reset(true);\r\n\t\t}\r\n\r\n\t\t// render the axis\r\n\t\taxis.render();\r\n\r\n\t\t// move plot lines and bands\r\n\t\teach(axis.plotLinesAndBands, function (plotLine) {\r\n\t\t\tplotLine.render();\r\n\t\t});\r\n\r\n\t\t// mark associated series as dirty and ready for redraw\r\n\t\teach(axis.series, function (series) {\r\n\t\t\tseries.isDirty = true;\r\n\t\t});\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Build the stacks from top down\r\n\t */\r\n\tbuildStacks: function () {\r\n\t\tvar series = this.series,\r\n\t\t\ti = series.length;\r\n\t\tif (!this.isXAxis) {\r\n\t\t\twhile (i--) {\r\n\t\t\t\tseries[i].setStackedPoints();\r\n\t\t\t}\r\n\t\t\t// Loop up again to compute percent stack\r\n\t\t\tif (this.usePercentage) {\r\n\t\t\t\tfor (i = 0; i < series.length; i++) {\r\n\t\t\t\t\tseries[i].setPercentStacks();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Set new axis categories and optionally redraw\r\n\t * @param {Array} categories\r\n\t * @param {Boolean} redraw\r\n\t */\r\n\tsetCategories: function (categories, redraw) {\r\n\t\tthis.update({ categories: categories }, redraw);\r\n\t},\r\n\r\n\t/**\r\n\t * Destroys an Axis instance.\r\n\t */\r\n\tdestroy: function (keepEvents) {\r\n\t\tvar axis = this,\r\n\t\t\tstacks = axis.stacks,\r\n\t\t\tstackKey,\r\n\t\t\tplotLinesAndBands = axis.plotLinesAndBands,\r\n\t\t\ti;\r\n\r\n\t\t// Remove the events\r\n\t\tif (!keepEvents) {\r\n\t\t\tremoveEvent(axis);\r\n\t\t}\r\n\r\n\t\t// Destroy each stack total\r\n\t\tfor (stackKey in stacks) {\r\n\t\t\tdestroyObjectProperties(stacks[stackKey]);\r\n\r\n\t\t\tstacks[stackKey] = null;\r\n\t\t}\r\n\r\n\t\t// Destroy collections\r\n\t\teach([axis.ticks, axis.minorTicks, axis.alternateBands], function (coll) {\r\n\t\t\tdestroyObjectProperties(coll);\r\n\t\t});\r\n\t\ti = plotLinesAndBands.length;\r\n\t\twhile (i--) { // #1975\r\n\t\t\tplotLinesAndBands[i].destroy();\r\n\t\t}\r\n\r\n\t\t// Destroy local variables\r\n\t\teach(['stackTotalGroup', 'axisLine', 'axisGroup', 'gridGroup', 'labelGroup', 'axisTitle'], function (prop) {\r\n\t\t\tif (axis[prop]) {\r\n\t\t\t\taxis[prop] = axis[prop].destroy();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\t\r\n}; // end Axis\r\n\r\n/**\r\n * The tooltip object\r\n * @param {Object} chart The chart instance\r\n * @param {Object} options Tooltip options\r\n */\r\nfunction Tooltip() {\r\n\tthis.init.apply(this, arguments);\r\n}\r\n\r\nTooltip.prototype = {\r\n\r\n\tinit: function (chart, options) {\r\n\r\n\t\tvar borderWidth = options.borderWidth,\r\n\t\t\tstyle = options.style,\r\n\t\t\tpadding = pInt(style.padding);\r\n\r\n\t\t// Save the chart and options\r\n\t\tthis.chart = chart;\r\n\t\tthis.options = options;\r\n\r\n\t\t// Keep track of the current series\r\n\t\t//this.currentSeries = UNDEFINED;\r\n\r\n\t\t// List of crosshairs\r\n\t\tthis.crosshairs = [];\r\n\r\n\t\t// Current values of x and y when animating\r\n\t\tthis.now = { x: 0, y: 0 };\r\n\r\n\t\t// The tooltip is initially hidden\r\n\t\tthis.isHidden = true;\r\n\r\n\r\n\t\t// create the label\r\n\t\tthis.label = chart.renderer.label('', 0, 0, options.shape, null, null, options.useHTML, null, 'tooltip')\r\n\t\t\t.attr({\r\n\t\t\t\tpadding: padding,\r\n\t\t\t\tfill: options.backgroundColor,\r\n\t\t\t\t'stroke-width': borderWidth,\r\n\t\t\t\tr: options.borderRadius,\r\n\t\t\t\tzIndex: 8\r\n\t\t\t})\r\n\t\t\t.css(style)\r\n\t\t\t.css({ padding: 0 }) // Remove it from VML, the padding is applied as an attribute instead (#1117)\r\n\t\t\t.add()\r\n\t\t\t.attr({ y: -999 }); // #2301\r\n\r\n\t\t// When using canVG the shadow shows up as a gray circle\r\n\t\t// even if the tooltip is hidden.\r\n\t\tif (!useCanVG) {\r\n\t\t\tthis.label.shadow(options.shadow);\r\n\t\t}\r\n\r\n\t\t// Public property for getting the shared state.\r\n\t\tthis.shared = options.shared;\r\n\t},\r\n\r\n\t/**\r\n\t * Destroy the tooltip and its elements.\r\n\t */\r\n\tdestroy: function () {\r\n\t\teach(this.crosshairs, function (crosshair) {\r\n\t\t\tif (crosshair) {\r\n\t\t\t\tcrosshair.destroy();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Destroy and clear local variables\r\n\t\tif (this.label) {\r\n\t\t\tthis.label = this.label.destroy();\r\n\t\t}\r\n\t\tclearTimeout(this.hideTimer);\r\n\t\tclearTimeout(this.tooltipTimeout);\r\n\t},\r\n\r\n\t/**\r\n\t * Provide a soft movement for the tooltip\r\n\t *\r\n\t * @param {Number} x\r\n\t * @param {Number} y\r\n\t * @private\r\n\t */\r\n\tmove: function (x, y, anchorX, anchorY) {\r\n\t\tvar tooltip = this,\r\n\t\t\tnow = tooltip.now,\r\n\t\t\tanimate = tooltip.options.animation !== false && !tooltip.isHidden;\r\n\r\n\t\t// get intermediate values for animation\r\n\t\textend(now, {\r\n\t\t\tx: animate ? (2 * now.x + x) / 3 : x,\r\n\t\t\ty: animate ? (now.y + y) / 2 : y,\r\n\t\t\tanchorX: animate ? (2 * now.anchorX + anchorX) / 3 : anchorX,\r\n\t\t\tanchorY: animate ? (now.anchorY + anchorY) / 2 : anchorY\r\n\t\t});\r\n\r\n\t\t// move to the intermediate value\r\n\t\ttooltip.label.attr(now);\r\n\r\n\t\t\r\n\t\t// run on next tick of the mouse tracker\r\n\t\tif (animate && (mathAbs(x - now.x) > 1 || mathAbs(y - now.y) > 1)) {\r\n\t\t\r\n\t\t\t// never allow two timeouts\r\n\t\t\tclearTimeout(this.tooltipTimeout);\r\n\t\t\t\r\n\t\t\t// set the fixed interval ticking for the smooth tooltip\r\n\t\t\tthis.tooltipTimeout = setTimeout(function () {\r\n\t\t\t\t// The interval function may still be running during destroy, so check that the chart is really there before calling.\r\n\t\t\t\tif (tooltip) {\r\n\t\t\t\t\ttooltip.move(x, y, anchorX, anchorY);\r\n\t\t\t\t}\r\n\t\t\t}, 32);\r\n\t\t\t\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Hide the tooltip\r\n\t */\r\n\thide: function () {\r\n\t\tvar tooltip = this,\r\n\t\t\thoverPoints;\r\n\t\t\r\n\t\tclearTimeout(this.hideTimer); // disallow duplicate timers (#1728, #1766)\r\n\t\tif (!this.isHidden) {\r\n\t\t\thoverPoints = this.chart.hoverPoints;\r\n\r\n\t\t\tthis.hideTimer = setTimeout(function () {\r\n\t\t\t\ttooltip.label.fadeOut();\r\n\t\t\t\ttooltip.isHidden = true;\r\n\t\t\t}, pick(this.options.hideDelay, 500));\r\n\r\n\t\t\t// hide previous hoverPoints and set new\r\n\t\t\tif (hoverPoints) {\r\n\t\t\t\teach(hoverPoints, function (point) {\r\n\t\t\t\t\tpoint.setState();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tthis.chart.hoverPoints = null;\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Hide the crosshairs\r\n\t */\r\n\thideCrosshairs: function () {\r\n\t\teach(this.crosshairs, function (crosshair) {\r\n\t\t\tif (crosshair) {\r\n\t\t\t\tcrosshair.hide();\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\t\r\n\t/** \r\n\t * Extendable method to get the anchor position of the tooltip\r\n\t * from a point or set of points\r\n\t */\r\n\tgetAnchor: function (points, mouseEvent) {\r\n\t\tvar ret,\r\n\t\t\tchart = this.chart,\r\n\t\t\tinverted = chart.inverted,\r\n\t\t\tplotTop = chart.plotTop,\r\n\t\t\tplotX = 0,\r\n\t\t\tplotY = 0,\r\n\t\t\tyAxis;\r\n\t\t\r\n\t\tpoints = splat(points);\r\n\t\t\r\n\t\t// Pie uses a special tooltipPos\r\n\t\tret = points[0].tooltipPos;\r\n\t\t\r\n\t\t// When tooltip follows mouse, relate the position to the mouse\r\n\t\tif (this.followPointer && mouseEvent) {\r\n\t\t\tif (mouseEvent.chartX === UNDEFINED) {\r\n\t\t\t\tmouseEvent = chart.pointer.normalize(mouseEvent);\r\n\t\t\t}\r\n\t\t\tret = [\r\n\t\t\t\tmouseEvent.chartX - chart.plotLeft,\r\n\t\t\t\tmouseEvent.chartY - plotTop\r\n\t\t\t];\r\n\t\t}\r\n\t\t// When shared, use the average position\r\n\t\tif (!ret) {\r\n\t\t\teach(points, function (point) {\r\n\t\t\t\tyAxis = point.series.yAxis;\r\n\t\t\t\tplotX += point.plotX;\r\n\t\t\t\tplotY += (point.plotLow ? (point.plotLow + point.plotHigh) / 2 : point.plotY) +\r\n\t\t\t\t\t(!inverted && yAxis ? yAxis.top - plotTop : 0); // #1151\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\tplotX /= points.length;\r\n\t\t\tplotY /= points.length;\r\n\t\t\t\r\n\t\t\tret = [\r\n\t\t\t\tinverted ? chart.plotWidth - plotY : plotX,\r\n\t\t\t\tthis.shared && !inverted && points.length > 1 && mouseEvent ? \r\n\t\t\t\t\tmouseEvent.chartY - plotTop : // place shared tooltip next to the mouse (#424)\r\n\t\t\t\t\tinverted ? chart.plotHeight - plotX : plotY\r\n\t\t\t];\r\n\t\t}\r\n\r\n\t\treturn map(ret, mathRound);\r\n\t},\r\n\t\r\n\t/**\r\n\t * Place the tooltip in a chart without spilling over\r\n\t * and not covering the point it self.\r\n\t */\r\n\tgetPosition: function (boxWidth, boxHeight, point) {\r\n\t\t\r\n\t\t// Set up the variables\r\n\t\tvar chart = this.chart,\r\n\t\t\tplotLeft = chart.plotLeft,\r\n\t\t\tplotTop = chart.plotTop,\r\n\t\t\tplotWidth = chart.plotWidth,\r\n\t\t\tplotHeight = chart.plotHeight,\r\n\t\t\tdistance = pick(this.options.distance, 12),\r\n\t\t\tpointX = point.plotX,\r\n\t\t\tpointY = point.plotY,\r\n\t\t\tx = pointX + plotLeft + (chart.inverted ? distance : -boxWidth - distance),\r\n\t\t\ty = pointY - boxHeight + plotTop + 15, // 15 means the point is 15 pixels up from the bottom of the tooltip\r\n\t\t\talignedRight;\r\n\t\r\n\t\t// It is too far to the left, adjust it\r\n\t\tif (x < 7) {\r\n\t\t\tx = plotLeft + mathMax(pointX, 0) + distance;\r\n\t\t}\r\n\t\r\n\t\t// Test to see if the tooltip is too far to the right,\r\n\t\t// if it is, move it back to be inside and then up to not cover the point.\r\n\t\tif ((x + boxWidth) > (plotLeft + plotWidth)) {\r\n\t\t\tx -= (x + boxWidth) - (plotLeft + plotWidth);\r\n\t\t\ty = pointY - boxHeight + plotTop - distance;\r\n\t\t\talignedRight = true;\r\n\t\t}\r\n\t\r\n\t\t// If it is now above the plot area, align it to the top of the plot area\r\n\t\tif (y < plotTop + 5) {\r\n\t\t\ty = plotTop + 5;\r\n\t\r\n\t\t\t// If the tooltip is still covering the point, move it below instead\r\n\t\t\tif (alignedRight && pointY >= y && pointY <= (y + boxHeight)) {\r\n\t\t\t\ty = pointY + plotTop + distance; // below\r\n\t\t\t}\r\n\t\t} \r\n\t\r\n\t\t// Now if the tooltip is below the chart, move it up. It's better to cover the\r\n\t\t// point than to disappear outside the chart. #834.\r\n\t\tif (y + boxHeight > plotTop + plotHeight) {\r\n\t\t\ty = mathMax(plotTop, plotTop + plotHeight - boxHeight - distance); // below\r\n\t\t}\r\n\t\r\n\t\treturn {x: x, y: y};\r\n\t},\r\n\r\n\t/**\r\n\t * In case no user defined formatter is given, this will be used. Note that the context\r\n\t * here is an object holding point, series, x, y etc.\r\n\t */\r\n\tdefaultFormatter: function (tooltip) {\r\n\t\tvar items = this.points || splat(this),\r\n\t\t\tseries = items[0].series,\r\n\t\t\ts;\r\n\r\n\t\t// build the header\r\n\t\ts = [series.tooltipHeaderFormatter(items[0])];\r\n\r\n\t\t// build the values\r\n\t\teach(items, function (item) {\r\n\t\t\tseries = item.series;\r\n\t\t\ts.push((series.tooltipFormatter && series.tooltipFormatter(item)) ||\r\n\t\t\t\titem.point.tooltipFormatter(series.tooltipOptions.pointFormat));\r\n\t\t});\r\n\r\n\t\t// footer\r\n\t\ts.push(tooltip.options.footerFormat || '');\r\n\r\n\t\treturn s.join('');\r\n\t},\r\n\r\n\t/**\r\n\t * Refresh the tooltip's text and position.\r\n\t * @param {Object} point\r\n\t */\r\n\trefresh: function (point, mouseEvent) {\r\n\t\tvar tooltip = this,\r\n\t\t\tchart = tooltip.chart,\r\n\t\t\tlabel = tooltip.label,\r\n\t\t\toptions = tooltip.options,\r\n\t\t\tx,\r\n\t\t\ty,\r\n\t\t\tanchor,\r\n\t\t\ttextConfig = {},\r\n\t\t\ttext,\r\n\t\t\tpointConfig = [],\r\n\t\t\tformatter = options.formatter || tooltip.defaultFormatter,\r\n\t\t\thoverPoints = chart.hoverPoints,\r\n\t\t\tborderColor,\r\n\t\t\tcrosshairsOptions = options.crosshairs,\r\n\t\t\tshared = tooltip.shared,\r\n\t\t\tcurrentSeries;\r\n\t\t\t\r\n\t\tclearTimeout(this.hideTimer);\r\n\t\t\r\n\t\t// get the reference point coordinates (pie charts use tooltipPos)\r\n\t\ttooltip.followPointer = splat(point)[0].series.tooltipOptions.followPointer;\r\n\t\tanchor = tooltip.getAnchor(point, mouseEvent);\r\n\t\tx = anchor[0];\r\n\t\ty = anchor[1];\r\n\r\n\t\t// shared tooltip, array is sent over\r\n\t\tif (shared && !(point.series && point.series.noSharedTooltip)) {\r\n\t\t\t\r\n\t\t\t// hide previous hoverPoints and set new\r\n\t\t\t\r\n\t\t\tchart.hoverPoints = point;\r\n\t\t\tif (hoverPoints) {\r\n\t\t\t\teach(hoverPoints, function (point) {\r\n\t\t\t\t\tpoint.setState();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\teach(point, function (item) {\r\n\t\t\t\titem.setState(HOVER_STATE);\r\n\r\n\t\t\t\tpointConfig.push(item.getLabelConfig());\r\n\t\t\t});\r\n\r\n\t\t\ttextConfig = {\r\n\t\t\t\tx: point[0].category,\r\n\t\t\t\ty: point[0].y\r\n\t\t\t};\r\n\t\t\ttextConfig.points = pointConfig;\r\n\t\t\tpoint = point[0];\r\n\r\n\t\t// single point tooltip\r\n\t\t} else {\r\n\t\t\ttextConfig = point.getLabelConfig();\r\n\t\t}\r\n\t\ttext = formatter.call(textConfig, tooltip);\r\n\r\n\t\t// register the current series\r\n\t\tcurrentSeries = point.series;\r\n\r\n\t\t// update the inner HTML\r\n\t\tif (text === false) {\r\n\t\t\tthis.hide();\r\n\t\t} else {\r\n\r\n\t\t\t// show it\r\n\t\t\tif (tooltip.isHidden) {\r\n\t\t\t\tstop(label);\r\n\t\t\t\tlabel.attr('opacity', 1).show();\r\n\t\t\t}\r\n\r\n\t\t\t// update text\r\n\t\t\tlabel.attr({\r\n\t\t\t\ttext: text\r\n\t\t\t});\r\n\r\n\t\t\t// set the stroke color of the box\r\n\t\t\tborderColor = options.borderColor || point.color || currentSeries.color || '#606060';\r\n\t\t\tlabel.attr({\r\n\t\t\t\tstroke: borderColor\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\ttooltip.updatePosition({ plotX: x, plotY: y });\r\n\t\t\r\n\t\t\tthis.isHidden = false;\r\n\t\t}\r\n\r\n\t\t// crosshairs\r\n\t\tif (crosshairsOptions) {\r\n\t\t\tcrosshairsOptions = splat(crosshairsOptions); // [x, y]\r\n\r\n\t\t\tvar path,\r\n\t\t\t\ti = crosshairsOptions.length,\r\n\t\t\t\tattribs,\r\n\t\t\t\taxis,\r\n\t\t\t\tval,\r\n\t\t\t\tseries;\r\n\r\n\t\t\twhile (i--) {\r\n\t\t\t\tseries = point.series;\r\n\t\t\t\taxis = series[i ? 'yAxis' : 'xAxis'];\r\n\t\t\t\tif (crosshairsOptions[i] && axis) {\r\n\t\t\t\t\tval = i ? pick(point.stackY, point.y) : point.x; // #814\r\n\t\t\t\t\tif (axis.isLog) { // #1671\r\n\t\t\t\t\t\tval = log2lin(val);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (i === 1 && series.modifyValue) { // #1205, #2316\r\n\t\t\t\t\t\tval = series.modifyValue(val);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tpath = axis.getPlotLinePath(\r\n\t\t\t\t\t\tval,\r\n\t\t\t\t\t\t1\r\n\t\t\t\t\t);\r\n\r\n\t\t\t\t\tif (tooltip.crosshairs[i]) {\r\n\t\t\t\t\t\ttooltip.crosshairs[i].attr({ d: path, visibility: VISIBLE });\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tattribs = {\r\n\t\t\t\t\t\t\t'stroke-width': crosshairsOptions[i].width || 1,\r\n\t\t\t\t\t\t\tstroke: crosshairsOptions[i].color || '#C0C0C0',\r\n\t\t\t\t\t\t\tzIndex: crosshairsOptions[i].zIndex || 2\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\tif (crosshairsOptions[i].dashStyle) {\r\n\t\t\t\t\t\t\tattribs.dashstyle = crosshairsOptions[i].dashStyle;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ttooltip.crosshairs[i] = chart.renderer.path(path)\r\n\t\t\t\t\t\t\t.attr(attribs)\r\n\t\t\t\t\t\t\t.add();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfireEvent(chart, 'tooltipRefresh', {\r\n\t\t\t\ttext: text,\r\n\t\t\t\tx: x + chart.plotLeft,\r\n\t\t\t\ty: y + chart.plotTop,\r\n\t\t\t\tborderColor: borderColor\r\n\t\t\t});\r\n\t},\r\n\t\r\n\t/**\r\n\t * Find the new position and perform the move\r\n\t */\r\n\tupdatePosition: function (point) {\r\n\t\tvar chart = this.chart,\r\n\t\t\tlabel = this.label, \r\n\t\t\tpos = (this.options.positioner || this.getPosition).call(\r\n\t\t\t\tthis,\r\n\t\t\t\tlabel.width,\r\n\t\t\t\tlabel.height,\r\n\t\t\t\tpoint\r\n\t\t\t);\r\n\r\n\t\t// do the move\r\n\t\tthis.move(\r\n\t\t\tmathRound(pos.x), \r\n\t\t\tmathRound(pos.y), \r\n\t\t\tpoint.plotX + chart.plotLeft, \r\n\t\t\tpoint.plotY + chart.plotTop\r\n\t\t);\r\n\t}\r\n};\r\n/**\r\n * The mouse tracker object. All methods starting with \"on\" are primary DOM event handlers. \r\n * Subsequent methods should be named differently from what they are doing.\r\n * @param {Object} chart The Chart instance\r\n * @param {Object} options The root options object\r\n */\r\nfunction Pointer(chart, options) {\r\n\tthis.init(chart, options);\r\n}\r\n\r\nPointer.prototype = {\r\n\t/**\r\n\t * Initialize Pointer\r\n\t */\r\n\tinit: function (chart, options) {\r\n\t\t\r\n\t\tvar chartOptions = options.chart,\r\n\t\t\tchartEvents = chartOptions.events,\r\n\t\t\tzoomType = useCanVG ? '' : chartOptions.zoomType,\r\n\t\t\tinverted = chart.inverted,\r\n\t\t\tzoomX,\r\n\t\t\tzoomY;\r\n\r\n\t\t// Store references\r\n\t\tthis.options = options;\r\n\t\tthis.chart = chart;\r\n\t\t\r\n\t\t// Zoom status\r\n\t\tthis.zoomX = zoomX = /x/.test(zoomType);\r\n\t\tthis.zoomY = zoomY = /y/.test(zoomType);\r\n\t\tthis.zoomHor = (zoomX && !inverted) || (zoomY && inverted);\r\n\t\tthis.zoomVert = (zoomY && !inverted) || (zoomX && inverted);\r\n\r\n\t\t// Do we need to handle click on a touch device?\r\n\t\tthis.runChartClick = chartEvents && !!chartEvents.click;\r\n\r\n\t\tthis.pinchDown = [];\r\n\t\tthis.lastValidTouch = {};\r\n\r\n\t\tif (options.tooltip.enabled) {\r\n\t\t\tchart.tooltip = new Tooltip(chart, options.tooltip);\r\n\t\t}\r\n\r\n\t\tthis.setDOMEvents();\r\n\t}, \r\n\r\n\t/**\r\n\t * Add crossbrowser support for chartX and chartY\r\n\t * @param {Object} e The event object in standard browsers\r\n\t */\r\n\tnormalize: function (e, chartPosition) {\r\n\t\tvar chartX,\r\n\t\t\tchartY,\r\n\t\t\tePos;\r\n\r\n\t\t// common IE normalizing\r\n\t\te = e || win.event;\r\n\t\tif (!e.target) {\r\n\t\t\te.target = e.srcElement;\r\n\t\t}\r\n\r\n\t\t// Framework specific normalizing (#1165)\r\n\t\te = washMouseEvent(e);\r\n\t\t\r\n\t\t// iOS\r\n\t\tePos = e.touches ? e.touches.item(0) : e;\r\n\r\n\t\t// Get mouse position\r\n\t\tif (!chartPosition) {\r\n\t\t\tthis.chartPosition = chartPosition = offset(this.chart.container);\r\n\t\t}\r\n\r\n\t\t// chartX and chartY\r\n\t\tif (ePos.pageX === UNDEFINED) { // IE < 9. #886.\r\n\t\t\tchartX = mathMax(e.x, e.clientX - chartPosition.left); // #2005, #2129: the second case is \r\n\t\t\t\t// for IE10 quirks mode within framesets\r\n\t\t\tchartY = e.y;\r\n\t\t} else {\r\n\t\t\tchartX = ePos.pageX - chartPosition.left;\r\n\t\t\tchartY = ePos.pageY - chartPosition.top;\r\n\t\t}\r\n\r\n\t\treturn extend(e, {\r\n\t\t\tchartX: mathRound(chartX),\r\n\t\t\tchartY: mathRound(chartY)\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Get the click position in terms of axis values.\r\n\t *\r\n\t * @param {Object} e A pointer event\r\n\t */\r\n\tgetCoordinates: function (e) {\r\n\t\tvar coordinates = {\r\n\t\t\t\txAxis: [],\r\n\t\t\t\tyAxis: []\r\n\t\t\t};\r\n\r\n\t\teach(this.chart.axes, function (axis) {\r\n\t\t\tcoordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({\r\n\t\t\t\taxis: axis,\r\n\t\t\t\tvalue: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])\r\n\t\t\t});\r\n\t\t});\r\n\t\treturn coordinates;\r\n\t},\r\n\t\r\n\t/**\r\n\t * Return the index in the tooltipPoints array, corresponding to pixel position in \r\n\t * the plot area.\r\n\t */\r\n\tgetIndex: function (e) {\r\n\t\tvar chart = this.chart;\r\n\t\treturn chart.inverted ? \r\n\t\t\tchart.plotHeight + chart.plotTop - e.chartY : \r\n\t\t\te.chartX - chart.plotLeft;\r\n\t},\r\n\r\n\t/**\r\n\t * With line type charts with a single tracker, get the point closest to the mouse.\r\n\t * Run Point.onMouseOver and display tooltip for the point or points.\r\n\t */\r\n\trunPointActions: function (e) {\r\n\t\tvar pointer = this,\r\n\t\t\tchart = pointer.chart,\r\n\t\t\tseries = chart.series,\r\n\t\t\ttooltip = chart.tooltip,\r\n\t\t\tpoint,\r\n\t\t\tpoints,\r\n\t\t\thoverPoint = chart.hoverPoint,\r\n\t\t\thoverSeries = chart.hoverSeries,\r\n\t\t\ti,\r\n\t\t\tj,\r\n\t\t\tdistance = chart.chartWidth,\r\n\t\t\tindex = pointer.getIndex(e),\r\n\t\t\tanchor;\r\n\r\n\t\t// shared tooltip\r\n\t\tif (tooltip && pointer.options.tooltip.shared && !(hoverSeries && hoverSeries.noSharedTooltip)) {\r\n\t\t\tpoints = [];\r\n\r\n\t\t\t// loop over all series and find the ones with points closest to the mouse\r\n\t\t\ti = series.length;\r\n\t\t\tfor (j = 0; j < i; j++) {\r\n\t\t\t\tif (series[j].visible &&\r\n\t\t\t\t\t\tseries[j].options.enableMouseTracking !== false &&\r\n\t\t\t\t\t\t!series[j].noSharedTooltip && series[j].tooltipPoints.length) {\r\n\t\t\t\t\tpoint = series[j].tooltipPoints[index];\r\n\t\t\t\t\tif (point && point.series) { // not a dummy point, #1544\r\n\t\t\t\t\t\tpoint._dist = mathAbs(index - point.clientX);\r\n\t\t\t\t\t\tdistance = mathMin(distance, point._dist);\r\n\t\t\t\t\t\tpoints.push(point);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// remove furthest points\r\n\t\t\ti = points.length;\r\n\t\t\twhile (i--) {\r\n\t\t\t\tif (points[i]._dist > distance) {\r\n\t\t\t\t\tpoints.splice(i, 1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// refresh the tooltip if necessary\r\n\t\t\tif (points.length && (points[0].clientX !== pointer.hoverX)) {\r\n\t\t\t\ttooltip.refresh(points, e);\r\n\t\t\t\tpointer.hoverX = points[0].clientX;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// separate tooltip and general mouse events\r\n\t\tif (hoverSeries && hoverSeries.tracker) { // only use for line-type series with common tracker\r\n\r\n\t\t\t// get the point\r\n\t\t\tpoint = hoverSeries.tooltipPoints[index];\r\n\r\n\t\t\t// a new point is hovered, refresh the tooltip\r\n\t\t\tif (point && point !== hoverPoint) {\r\n\r\n\t\t\t\t// trigger the events\r\n\t\t\t\tpoint.onMouseOver(e);\r\n\r\n\t\t\t}\r\n\t\t\t\r\n\t\t} else if (tooltip && tooltip.followPointer && !tooltip.isHidden) {\r\n\t\t\tanchor = tooltip.getAnchor([{}], e);\r\n\t\t\ttooltip.updatePosition({ plotX: anchor[0], plotY: anchor[1] });\r\n\t\t}\r\n\t},\r\n\r\n\r\n\r\n\t/**\r\n\t * Reset the tracking by hiding the tooltip, the hover series state and the hover point\r\n\t * \r\n\t * @param allowMove {Boolean} Instead of destroying the tooltip altogether, allow moving it if possible\r\n\t */\r\n\treset: function (allowMove) {\r\n\t\tvar pointer = this,\r\n\t\t\tchart = pointer.chart,\r\n\t\t\thoverSeries = chart.hoverSeries,\r\n\t\t\thoverPoint = chart.hoverPoint,\r\n\t\t\ttooltip = chart.tooltip,\r\n\t\t\ttooltipPoints = tooltip && tooltip.shared ? chart.hoverPoints : hoverPoint;\r\n\t\t\t\r\n\t\t// Narrow in allowMove\r\n\t\tallowMove = allowMove && tooltip && tooltipPoints;\r\n\t\t\t\r\n\t\t// Check if the points have moved outside the plot area, #1003\r\n\t\tif (allowMove && splat(tooltipPoints)[0].plotX === UNDEFINED) {\r\n\t\t\tallowMove = false;\r\n\t\t}\t\r\n\r\n\t\t// Just move the tooltip, #349\r\n\t\tif (allowMove) {\r\n\t\t\ttooltip.refresh(tooltipPoints);\r\n\r\n\t\t// Full reset\r\n\t\t} else {\r\n\r\n\t\t\tif (hoverPoint) {\r\n\t\t\t\thoverPoint.onMouseOut();\r\n\t\t\t}\r\n\r\n\t\t\tif (hoverSeries) {\r\n\t\t\t\thoverSeries.onMouseOut();\r\n\t\t\t}\r\n\r\n\t\t\tif (tooltip) {\r\n\t\t\t\ttooltip.hide();\r\n\t\t\t\ttooltip.hideCrosshairs();\r\n\t\t\t}\r\n\r\n\t\t\tpointer.hoverX = null;\r\n\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Scale series groups to a certain scale and translation\r\n\t */\r\n\tscaleGroups: function (attribs, clip) {\r\n\r\n\t\tvar chart = this.chart,\r\n\t\t\tseriesAttribs;\r\n\r\n\t\t// Scale each series\r\n\t\teach(chart.series, function (series) {\r\n\t\t\tseriesAttribs = attribs || series.getPlotBox(); // #1701\r\n\t\t\tif (series.xAxis && series.xAxis.zoomEnabled) {\r\n\t\t\t\tseries.group.attr(seriesAttribs);\r\n\t\t\t\tif (series.markerGroup) {\r\n\t\t\t\t\tseries.markerGroup.attr(seriesAttribs);\r\n\t\t\t\t\tseries.markerGroup.clip(clip ? chart.clipRect : null);\r\n\t\t\t\t}\r\n\t\t\t\tif (series.dataLabelsGroup) {\r\n\t\t\t\t\tseries.dataLabelsGroup.attr(seriesAttribs);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\t\t// Clip\r\n\t\tchart.clipRect.attr(clip || chart.clipBox);\r\n\t},\r\n\r\n\t/**\r\n\t * Run translation operations\r\n\t */\r\n\tpinchTranslate: function (zoomHor, zoomVert, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch) {\r\n\t\tif (zoomHor) {\r\n\t\t\tthis.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\r\n\t\t}\r\n\t\tif (zoomVert) {\r\n\t\t\tthis.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Run translation operations for each direction (horizontal and vertical) independently\r\n\t */\r\n\tpinchTranslateDirection: function (horiz, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch, forcedScale) {\r\n\t\tvar chart = this.chart,\r\n\t\t\txy = horiz ? 'x' : 'y',\r\n\t\t\tXY = horiz ? 'X' : 'Y',\r\n\t\t\tsChartXY = 'chart' + XY,\r\n\t\t\twh = horiz ? 'width' : 'height',\r\n\t\t\tplotLeftTop = chart['plot' + (horiz ? 'Left' : 'Top')],\r\n\t\t\tselectionWH,\r\n\t\t\tselectionXY,\r\n\t\t\tclipXY,\r\n\t\t\tscale = forcedScale || 1,\r\n\t\t\tinverted = chart.inverted,\r\n\t\t\tbounds = chart.bounds[horiz ? 'h' : 'v'],\r\n\t\t\tsingleTouch = pinchDown.length === 1,\r\n\t\t\ttouch0Start = pinchDown[0][sChartXY],\r\n\t\t\ttouch0Now = touches[0][sChartXY],\r\n\t\t\ttouch1Start = !singleTouch && pinchDown[1][sChartXY],\r\n\t\t\ttouch1Now = !singleTouch && touches[1][sChartXY],\r\n\t\t\toutOfBounds,\r\n\t\t\ttransformScale,\r\n\t\t\tscaleKey,\r\n\t\t\tsetScale = function () {\r\n\t\t\t\tif (!singleTouch && mathAbs(touch0Start - touch1Start) > 20) { // Don't zoom if fingers are too close on this axis\r\n\t\t\t\t\tscale = forcedScale || mathAbs(touch0Now - touch1Now) / mathAbs(touch0Start - touch1Start);\t\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tclipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;\r\n\t\t\t\tselectionWH = chart['plot' + (horiz ? 'Width' : 'Height')] / scale;\r\n\t\t\t};\r\n\r\n\t\t// Set the scale, first pass\r\n\t\tsetScale();\r\n\r\n\t\tselectionXY = clipXY; // the clip position (x or y) is altered if out of bounds, the selection position is not\r\n\r\n\t\t// Out of bounds\r\n\t\tif (selectionXY < bounds.min) {\r\n\t\t\tselectionXY = bounds.min;\r\n\t\t\toutOfBounds = true;\r\n\t\t} else if (selectionXY + selectionWH > bounds.max) {\r\n\t\t\tselectionXY = bounds.max - selectionWH;\r\n\t\t\toutOfBounds = true;\r\n\t\t}\r\n\t\t\r\n\t\t// Is the chart dragged off its bounds, determined by dataMin and dataMax?\r\n\t\tif (outOfBounds) {\r\n\r\n\t\t\t// Modify the touchNow position in order to create an elastic drag movement. This indicates\r\n\t\t\t// to the user that the chart is responsive but can't be dragged further.\r\n\t\t\ttouch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);\r\n\t\t\tif (!singleTouch) {\r\n\t\t\t\ttouch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);\r\n\t\t\t}\r\n\r\n\t\t\t// Set the scale, second pass to adapt to the modified touchNow positions\r\n\t\t\tsetScale();\r\n\r\n\t\t} else {\r\n\t\t\tlastValidTouch[xy] = [touch0Now, touch1Now];\r\n\t\t}\r\n\r\n\t\t// Set geometry for clipping, selection and transformation\r\n\t\tif (!inverted) { // TODO: implement clipping for inverted charts\r\n\t\t\tclip[xy] = clipXY - plotLeftTop;\r\n\t\t\tclip[wh] = selectionWH;\r\n\t\t}\r\n\t\tscaleKey = inverted ? (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;\r\n\t\ttransformScale = inverted ? 1 / scale : scale;\r\n\r\n\t\tselectionMarker[wh] = selectionWH;\r\n\t\tselectionMarker[xy] = selectionXY;\r\n\t\ttransform[scaleKey] = scale;\r\n\t\ttransform['translate' + XY] = (transformScale * plotLeftTop) + (touch0Now - (transformScale * touch0Start));\r\n\t},\r\n\t\r\n\t/**\r\n\t * Handle touch events with two touches\r\n\t */\r\n\tpinch: function (e) {\r\n\r\n\t\tvar self = this,\r\n\t\t\tchart = self.chart,\r\n\t\t\tpinchDown = self.pinchDown,\r\n\t\t\tfollowTouchMove = chart.tooltip && chart.tooltip.options.followTouchMove,\r\n\t\t\ttouches = e.touches,\r\n\t\t\ttouchesLength = touches.length,\r\n\t\t\tlastValidTouch = self.lastValidTouch,\r\n\t\t\tzoomHor = self.zoomHor || self.pinchHor,\r\n\t\t\tzoomVert = self.zoomVert || self.pinchVert,\r\n\t\t\thasZoom = zoomHor || zoomVert,\r\n\t\t\tselectionMarker = self.selectionMarker,\r\n\t\t\ttransform = {},\r\n\t\t\tfireClickEvent = touchesLength === 1 && ((self.inClass(e.target, PREFIX + 'tracker') && \r\n\t\t\t\tchart.runTrackerClick) || chart.runChartClick),\r\n\t\t\tclip = {};\r\n\r\n\t\t// On touch devices, only proceed to trigger click if a handler is defined\r\n\t\tif ((hasZoom || followTouchMove) && !fireClickEvent) {\r\n\t\t\te.preventDefault();\r\n\t\t}\r\n\t\t\r\n\t\t// Normalize each touch\r\n\t\tmap(touches, function (e) {\r\n\t\t\treturn self.normalize(e);\r\n\t\t});\r\n\t\t\r\n\t\t// Register the touch start position\r\n\t\tif (e.type === 'touchstart') {\r\n\t\t\teach(touches, function (e, i) {\r\n\t\t\t\tpinchDown[i] = { chartX: e.chartX, chartY: e.chartY };\r\n\t\t\t});\r\n\t\t\tlastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] && pinchDown[1].chartX];\r\n\t\t\tlastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] && pinchDown[1].chartY];\r\n\r\n\t\t\t// Identify the data bounds in pixels\r\n\t\t\teach(chart.axes, function (axis) {\r\n\t\t\t\tif (axis.zoomEnabled) {\r\n\t\t\t\t\tvar bounds = chart.bounds[axis.horiz ? 'h' : 'v'],\r\n\t\t\t\t\t\tminPixelPadding = axis.minPixelPadding,\r\n\t\t\t\t\t\tmin = axis.toPixels(axis.dataMin),\r\n\t\t\t\t\t\tmax = axis.toPixels(axis.dataMax),\r\n\t\t\t\t\t\tabsMin = mathMin(min, max),\r\n\t\t\t\t\t\tabsMax = mathMax(min, max);\r\n\r\n\t\t\t\t\t// Store the bounds for use in the touchmove handler\r\n\t\t\t\t\tbounds.min = mathMin(axis.pos, absMin - minPixelPadding);\r\n\t\t\t\t\tbounds.max = mathMax(axis.pos + axis.len, absMax + minPixelPadding);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\r\n\t\t// Event type is touchmove, handle panning and pinching\r\n\t\t} else if (pinchDown.length) { // can be 0 when releasing, if touchend fires first\r\n\t\t\t\r\n\r\n\t\t\t// Set the marker\r\n\t\t\tif (!selectionMarker) {\r\n\t\t\t\tself.selectionMarker = selectionMarker = extend({\r\n\t\t\t\t\tdestroy: noop\r\n\t\t\t\t}, chart.plotBox);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tself.pinchTranslate(zoomHor, zoomVert, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\r\n\r\n\t\t\tself.hasPinched = hasZoom;\r\n\r\n\t\t\t// Scale and translate the groups to provide visual feedback during pinching\r\n\t\t\tself.scaleGroups(transform, clip);\r\n\t\t\t\r\n\t\t\t// Optionally move the tooltip on touchmove\r\n\t\t\tif (!hasZoom && followTouchMove && touchesLength === 1) {\r\n\t\t\t\tthis.runPointActions(self.normalize(e));\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Start a drag operation\r\n\t */\r\n\tdragStart: function (e) {\r\n\t\tvar chart = this.chart;\r\n\r\n\t\t// Record the start position\r\n\t\tchart.mouseIsDown = e.type;\r\n\t\tchart.cancelClick = false;\r\n\t\tchart.mouseDownX = this.mouseDownX = e.chartX;\r\n\t\tchart.mouseDownY = this.mouseDownY = e.chartY;\r\n\t},\r\n\r\n\t/**\r\n\t * Perform a drag operation in response to a mousemove event while the mouse is down\r\n\t */\r\n\tdrag: function (e) {\r\n\r\n\t\tvar chart = this.chart,\r\n\t\t\tchartOptions = chart.options.chart,\r\n\t\t\tchartX = e.chartX,\r\n\t\t\tchartY = e.chartY,\r\n\t\t\tzoomHor = this.zoomHor,\r\n\t\t\tzoomVert = this.zoomVert,\r\n\t\t\tplotLeft = chart.plotLeft,\r\n\t\t\tplotTop = chart.plotTop,\r\n\t\t\tplotWidth = chart.plotWidth,\r\n\t\t\tplotHeight = chart.plotHeight,\r\n\t\t\tclickedInside,\r\n\t\t\tsize,\r\n\t\t\tmouseDownX = this.mouseDownX,\r\n\t\t\tmouseDownY = this.mouseDownY;\r\n\r\n\t\t// If the mouse is outside the plot area, adjust to cooordinates\r\n\t\t// inside to prevent the selection marker from going outside\r\n\t\tif (chartX < plotLeft) {\r\n\t\t\tchartX = plotLeft;\r\n\t\t} else if (chartX > plotLeft + plotWidth) {\r\n\t\t\tchartX = plotLeft + plotWidth;\r\n\t\t}\r\n\r\n\t\tif (chartY < plotTop) {\r\n\t\t\tchartY = plotTop;\r\n\t\t} else if (chartY > plotTop + plotHeight) {\r\n\t\t\tchartY = plotTop + plotHeight;\r\n\t\t}\r\n\t\t\r\n\t\t// determine if the mouse has moved more than 10px\r\n\t\tthis.hasDragged = Math.sqrt(\r\n\t\t\tMath.pow(mouseDownX - chartX, 2) +\r\n\t\t\tMath.pow(mouseDownY - chartY, 2)\r\n\t\t);\r\n\t\tif (this.hasDragged > 10) {\r\n\t\t\tclickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop);\r\n\r\n\t\t\t// make a selection\r\n\t\t\tif (chart.hasCartesianSeries && (this.zoomX || this.zoomY) && clickedInside) {\r\n\t\t\t\tif (!this.selectionMarker) {\r\n\t\t\t\t\tthis.selectionMarker = chart.renderer.rect(\r\n\t\t\t\t\t\tplotLeft,\r\n\t\t\t\t\t\tplotTop,\r\n\t\t\t\t\t\tzoomHor ? 1 : plotWidth,\r\n\t\t\t\t\t\tzoomVert ? 1 : plotHeight,\r\n\t\t\t\t\t\t0\r\n\t\t\t\t\t)\r\n\t\t\t\t\t.attr({\r\n\t\t\t\t\t\tfill: chartOptions.selectionMarkerFill || 'rgba(69,114,167,0.25)',\r\n\t\t\t\t\t\tzIndex: 7\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.add();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// adjust the width of the selection marker\r\n\t\t\tif (this.selectionMarker && zoomHor) {\r\n\t\t\t\tsize = chartX - mouseDownX;\r\n\t\t\t\tthis.selectionMarker.attr({\r\n\t\t\t\t\twidth: mathAbs(size),\r\n\t\t\t\t\tx: (size > 0 ? 0 : size) + mouseDownX\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\t// adjust the height of the selection marker\r\n\t\t\tif (this.selectionMarker && zoomVert) {\r\n\t\t\t\tsize = chartY - mouseDownY;\r\n\t\t\t\tthis.selectionMarker.attr({\r\n\t\t\t\t\theight: mathAbs(size),\r\n\t\t\t\t\ty: (size > 0 ? 0 : size) + mouseDownY\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// panning\r\n\t\t\tif (clickedInside && !this.selectionMarker && chartOptions.panning) {\r\n\t\t\t\tchart.pan(e, chartOptions.panning);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * On mouse up or touch end across the entire document, drop the selection.\r\n\t */\r\n\tdrop: function (e) {\r\n\t\tvar chart = this.chart,\r\n\t\t\thasPinched = this.hasPinched;\r\n\r\n\t\tif (this.selectionMarker) {\r\n\t\t\tvar selectionData = {\r\n\t\t\t\t\txAxis: [],\r\n\t\t\t\t\tyAxis: [],\r\n\t\t\t\t\toriginalEvent: e.originalEvent || e\r\n\t\t\t\t},\r\n\t\t\t\tselectionBox = this.selectionMarker,\r\n\t\t\t\tselectionLeft = selectionBox.x,\r\n\t\t\t\tselectionTop = selectionBox.y,\r\n\t\t\t\trunZoom;\r\n\t\t\t// a selection has been made\r\n\t\t\tif (this.hasDragged || hasPinched) {\r\n\r\n\t\t\t\t// record each axis' min and max\r\n\t\t\t\teach(chart.axes, function (axis) {\r\n\t\t\t\t\tif (axis.zoomEnabled) {\r\n\t\t\t\t\t\tvar horiz = axis.horiz,\r\n\t\t\t\t\t\t\tselectionMin = axis.toValue((horiz ? selectionLeft : selectionTop)),\r\n\t\t\t\t\t\t\tselectionMax = axis.toValue((horiz ? selectionLeft + selectionBox.width : selectionTop + selectionBox.height));\r\n\r\n\t\t\t\t\t\tif (!isNaN(selectionMin) && !isNaN(selectionMax)) { // #859\r\n\t\t\t\t\t\t\tselectionData[axis.xOrY + 'Axis'].push({\r\n\t\t\t\t\t\t\t\taxis: axis,\r\n\t\t\t\t\t\t\t\tmin: mathMin(selectionMin, selectionMax), // for reversed axes,\r\n\t\t\t\t\t\t\t\tmax: mathMax(selectionMin, selectionMax)\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\trunZoom = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\tif (runZoom) {\r\n\t\t\t\t\tfireEvent(chart, 'selection', selectionData, function (args) { \r\n\t\t\t\t\t\tchart.zoom(extend(args, hasPinched ? { animation: false } : null)); \r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t\tthis.selectionMarker = this.selectionMarker.destroy();\r\n\r\n\t\t\t// Reset scaling preview\r\n\t\t\tif (hasPinched) {\r\n\t\t\t\tthis.scaleGroups();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Reset all\r\n\t\tif (chart) { // it may be destroyed on mouse up - #877\r\n\t\t\tcss(chart.container, { cursor: chart._cursor });\r\n\t\t\tchart.cancelClick = this.hasDragged > 10; // #370\r\n\t\t\tchart.mouseIsDown = this.hasDragged = this.hasPinched = false;\r\n\t\t\tthis.pinchDown = [];\r\n\t\t}\r\n\t},\r\n\r\n\tonContainerMouseDown: function (e) {\r\n\r\n\t\te = this.normalize(e);\r\n\r\n\t\t// issue #295, dragging not always working in Firefox\r\n\t\tif (e.preventDefault) {\r\n\t\t\te.preventDefault();\r\n\t\t}\r\n\t\t\r\n\t\tthis.dragStart(e);\r\n\t},\r\n\r\n\t\r\n\r\n\tonDocumentMouseUp: function (e) {\r\n\t\tthis.drop(e);\r\n\t},\r\n\r\n\t/**\r\n\t * Special handler for mouse move that will hide the tooltip when the mouse leaves the plotarea.\r\n\t * Issue #149 workaround. The mouseleave event does not always fire. \r\n\t */\r\n\tonDocumentMouseMove: function (e) {\r\n\t\tvar chart = this.chart,\r\n\t\t\tchartPosition = this.chartPosition,\r\n\t\t\thoverSeries = chart.hoverSeries;\r\n\r\n\t\te = this.normalize(e, chartPosition);\r\n\r\n\t\t// If we're outside, hide the tooltip\r\n\t\tif (chartPosition && hoverSeries && !this.inClass(e.target, 'highcharts-tracker') &&\r\n\t\t\t\t!chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {\r\n\t\t\tthis.reset();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * When mouse leaves the container, hide the tooltip.\r\n\t */\r\n\tonContainerMouseLeave: function () {\r\n\t\tthis.reset();\r\n\t\tthis.chartPosition = null; // also reset the chart position, used in #149 fix\r\n\t},\r\n\r\n\t// The mousemove, touchmove and touchstart event handler\r\n\tonContainerMouseMove: function (e) {\r\n\r\n\t\tvar chart = this.chart;\r\n\r\n\t\t// normalize\r\n\t\te = this.normalize(e);\r\n\r\n\t\t// #295\r\n\t\te.returnValue = false;\r\n\t\t\r\n\t\t\r\n\t\tif (chart.mouseIsDown === 'mousedown') {\r\n\t\t\tthis.drag(e);\r\n\t\t} \r\n\t\t\r\n\t\t// Show the tooltip and run mouse over events (#977)\r\n\t\tif ((this.inClass(e.target, 'highcharts-tracker') || \r\n\t\t\t\tchart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) && !chart.openMenu) {\r\n\t\t\tthis.runPointActions(e);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Utility to detect whether an element has, or has a parent with, a specific\r\n\t * class name. Used on detection of tracker objects and on deciding whether\r\n\t * hovering the tooltip should cause the active series to mouse out.\r\n\t */\r\n\tinClass: function (element, className) {\r\n\t\tvar elemClassName;\r\n\t\twhile (element) {\r\n\t\t\telemClassName = attr(element, 'class');\r\n\t\t\tif (elemClassName) {\r\n\t\t\t\tif (elemClassName.indexOf(className) !== -1) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t} else if (elemClassName.indexOf(PREFIX + 'container') !== -1) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telement = element.parentNode;\r\n\t\t}\t\t\r\n\t},\r\n\r\n\tonTrackerMouseOut: function (e) {\r\n\t\tvar series = this.chart.hoverSeries;\r\n\t\tif (series && !series.options.stickyTracking && !this.inClass(e.toElement || e.relatedTarget, PREFIX + 'tooltip')) {\r\n\t\t\tseries.onMouseOut();\r\n\t\t}\r\n\t},\r\n\r\n\tonContainerClick: function (e) {\r\n\t\tvar chart = this.chart,\r\n\t\t\thoverPoint = chart.hoverPoint, \r\n\t\t\tplotLeft = chart.plotLeft,\r\n\t\t\tplotTop = chart.plotTop,\r\n\t\t\tinverted = chart.inverted,\r\n\t\t\tchartPosition,\r\n\t\t\tplotX,\r\n\t\t\tplotY;\r\n\t\t\r\n\t\te = this.normalize(e);\r\n\t\te.cancelBubble = true; // IE specific\r\n\r\n\t\tif (!chart.cancelClick) {\r\n\t\t\t\r\n\t\t\t// On tracker click, fire the series and point events. #783, #1583\r\n\t\t\tif (hoverPoint && this.inClass(e.target, PREFIX + 'tracker')) {\r\n\t\t\t\tchartPosition = this.chartPosition;\r\n\t\t\t\tplotX = hoverPoint.plotX;\r\n\t\t\t\tplotY = hoverPoint.plotY;\r\n\r\n\t\t\t\t// add page position info\r\n\t\t\t\textend(hoverPoint, {\r\n\t\t\t\t\tpageX: chartPosition.left + plotLeft +\r\n\t\t\t\t\t\t(inverted ? chart.plotWidth - plotY : plotX),\r\n\t\t\t\t\tpageY: chartPosition.top + plotTop +\r\n\t\t\t\t\t\t(inverted ? chart.plotHeight - plotX : plotY)\r\n\t\t\t\t});\r\n\t\t\t\r\n\t\t\t\t// the series click event\r\n\t\t\t\tfireEvent(hoverPoint.series, 'click', extend(e, {\r\n\t\t\t\t\tpoint: hoverPoint\r\n\t\t\t\t}));\r\n\r\n\t\t\t\t// the point click event\r\n\t\t\t\tif (chart.hoverPoint) { // it may be destroyed (#1844)\r\n\t\t\t\t\thoverPoint.firePointEvent('click', e);\r\n\t\t\t\t}\r\n\r\n\t\t\t// When clicking outside a tracker, fire a chart event\r\n\t\t\t} else {\r\n\t\t\t\textend(e, this.getCoordinates(e));\r\n\r\n\t\t\t\t// fire a click event in the chart\r\n\t\t\t\tif (chart.isInsidePlot(e.chartX - plotLeft, e.chartY - plotTop)) {\r\n\t\t\t\t\tfireEvent(chart, 'click', e);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\r\n\t\t}\r\n\t},\r\n\r\n\tonContainerTouchStart: function (e) {\r\n\t\tvar chart = this.chart;\r\n\r\n\t\tif (e.touches.length === 1) {\r\n\r\n\t\t\te = this.normalize(e);\r\n\r\n\t\t\tif (chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {\r\n\r\n\t\t\t\t// Prevent the click pseudo event from firing unless it is set in the options\r\n\t\t\t\t/*if (!chart.runChartClick) {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t}*/\r\n\t\t\t\r\n\t\t\t\t// Run mouse events and display tooltip etc\r\n\t\t\t\tthis.runPointActions(e);\r\n\r\n\t\t\t\tthis.pinch(e);\r\n\r\n\t\t\t} else {\r\n\t\t\t\t// Hide the tooltip on touching outside the plot area (#1203)\r\n\t\t\t\tthis.reset();\r\n\t\t\t}\r\n\r\n\t\t} else if (e.touches.length === 2) {\r\n\t\t\tthis.pinch(e);\r\n\t\t}\t\t\r\n\t},\r\n\r\n\tonContainerTouchMove: function (e) {\r\n\t\tif (e.touches.length === 1 || e.touches.length === 2) {\r\n\t\t\tthis.pinch(e);\r\n\t\t}\r\n\t},\r\n\r\n\tonDocumentTouchEnd: function (e) {\r\n\t\tthis.drop(e);\r\n\t},\r\n\r\n\t/**\r\n\t * Set the JS DOM events on the container and document. This method should contain\r\n\t * a one-to-one assignment between methods and their handlers. Any advanced logic should\r\n\t * be moved to the handler reflecting the event's name.\r\n\t */\r\n\tsetDOMEvents: function () {\r\n\r\n\t\tvar pointer = this,\r\n\t\t\tcontainer = pointer.chart.container,\r\n\t\t\tevents;\r\n\r\n\t\tthis._events = events = [\r\n\t\t\t[container, 'onmousedown', 'onContainerMouseDown'],\r\n\t\t\t[container, 'onmousemove', 'onContainerMouseMove'],\r\n\t\t\t[container, 'onclick', 'onContainerClick'],\r\n\t\t\t[container, 'mouseleave', 'onContainerMouseLeave'],\r\n\t\t\t[doc, 'mousemove', 'onDocumentMouseMove'],\r\n\t\t\t[doc, 'mouseup', 'onDocumentMouseUp']\r\n\t\t];\r\n\r\n\t\tif (hasTouch) {\r\n\t\t\tevents.push(\r\n\t\t\t\t[container, 'ontouchstart', 'onContainerTouchStart'],\r\n\t\t\t\t[container, 'ontouchmove', 'onContainerTouchMove'],\r\n\t\t\t\t[doc, 'touchend', 'onDocumentTouchEnd']\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\teach(events, function (eventConfig) {\r\n\r\n\t\t\t// First, create the callback function that in turn calls the method on Pointer\r\n\t\t\tpointer['_' + eventConfig[2]] = function (e) {\r\n\t\t\t\tpointer[eventConfig[2]](e);\r\n\t\t\t};\r\n\r\n\t\t\t// Now attach the function, either as a direct property or through addEvent\r\n\t\t\tif (eventConfig[1].indexOf('on') === 0) {\r\n\t\t\t\teventConfig[0][eventConfig[1]] = pointer['_' + eventConfig[2]];\r\n\t\t\t} else {\r\n\t\t\t\taddEvent(eventConfig[0], eventConfig[1], pointer['_' + eventConfig[2]]);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t\r\n\t},\r\n\r\n\t/**\r\n\t * Destroys the Pointer object and disconnects DOM events.\r\n\t */\r\n\tdestroy: function () {\r\n\t\tvar pointer = this;\r\n\r\n\t\t// Release all DOM events\r\n\t\teach(pointer._events, function (eventConfig) {\t\r\n\t\t\tif (eventConfig[1].indexOf('on') === 0) {\r\n\t\t\t\teventConfig[0][eventConfig[1]] = null; // delete breaks oldIE\r\n\t\t\t} else {\t\t\r\n\t\t\t\tremoveEvent(eventConfig[0], eventConfig[1], pointer['_' + eventConfig[2]]);\r\n\t\t\t}\r\n\t\t});\r\n\t\tdelete pointer._events;\r\n\r\n\t\t// memory and CPU leak\r\n\t\tclearInterval(pointer.tooltipTimeout);\r\n\t}\r\n};\r\n/**\r\n * The overview of the chart's series\r\n */\r\nfunction Legend(chart, options) {\r\n\tthis.init(chart, options);\r\n}\r\n\r\nLegend.prototype = {\r\n\t\r\n\t/**\r\n\t * Initialize the legend\r\n\t */\r\n\tinit: function (chart, options) {\r\n\t\t\r\n\t\tvar legend = this,\r\n\t\t\titemStyle = options.itemStyle,\r\n\t\t\tpadding = pick(options.padding, 8),\r\n\t\t\titemMarginTop = options.itemMarginTop || 0;\r\n\t\r\n\t\tthis.options = options;\r\n\r\n\t\tif (!options.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\r\n\t\tlegend.baseline = pInt(itemStyle.fontSize) + 3 + itemMarginTop; // used in Series prototype\r\n\t\tlegend.itemStyle = itemStyle;\r\n\t\tlegend.itemHiddenStyle = merge(itemStyle, options.itemHiddenStyle);\r\n\t\tlegend.itemMarginTop = itemMarginTop;\r\n\t\tlegend.padding = padding;\r\n\t\tlegend.initialItemX = padding;\r\n\t\tlegend.initialItemY = padding - 5; // 5 is the number of pixels above the text\r\n\t\tlegend.maxItemWidth = 0;\r\n\t\tlegend.chart = chart;\r\n\t\tlegend.itemHeight = 0;\r\n\t\tlegend.lastLineHeight = 0;\r\n\r\n\t\t// Render it\r\n\t\tlegend.render();\r\n\r\n\t\t// move checkboxes\r\n\t\taddEvent(legend.chart, 'endResize', function () { \r\n\t\t\tlegend.positionCheckboxes();\r\n\t\t});\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Set the colors for the legend item\r\n\t * @param {Object} item A Series or Point instance\r\n\t * @param {Object} visible Dimmed or colored\r\n\t */\r\n\tcolorizeItem: function (item, visible) {\r\n\t\tvar legend = this,\r\n\t\t\toptions = legend.options,\r\n\t\t\tlegendItem = item.legendItem,\r\n\t\t\tlegendLine = item.legendLine,\r\n\t\t\tlegendSymbol = item.legendSymbol,\r\n\t\t\thiddenColor = legend.itemHiddenStyle.color,\r\n\t\t\ttextColor = visible ? options.itemStyle.color : hiddenColor,\r\n\t\t\tsymbolColor = visible ? item.color : hiddenColor,\r\n\t\t\tmarkerOptions = item.options && item.options.marker,\r\n\t\t\tsymbolAttr = {\r\n\t\t\t\tstroke: symbolColor,\r\n\t\t\t\tfill: symbolColor\r\n\t\t\t},\r\n\t\t\tkey,\r\n\t\t\tval;\r\n\t\t\r\n\t\tif (legendItem) {\r\n\t\t\tlegendItem.css({ fill: textColor, color: textColor }); // color for #1553, oldIE\r\n\t\t}\r\n\t\tif (legendLine) {\r\n\t\t\tlegendLine.attr({ stroke: symbolColor });\r\n\t\t}\r\n\t\t\r\n\t\tif (legendSymbol) {\r\n\t\t\t\r\n\t\t\t// Apply marker options\r\n\t\t\tif (markerOptions && legendSymbol.isMarker) { // #585\r\n\t\t\t\tmarkerOptions = item.convertAttribs(markerOptions);\r\n\t\t\t\tfor (key in markerOptions) {\r\n\t\t\t\t\tval = markerOptions[key];\r\n\t\t\t\t\tif (val !== UNDEFINED) {\r\n\t\t\t\t\t\tsymbolAttr[key] = val;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tlegendSymbol.attr(symbolAttr);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Position the legend item\r\n\t * @param {Object} item A Series or Point instance\r\n\t */\r\n\tpositionItem: function (item) {\r\n\t\tvar legend = this,\r\n\t\t\toptions = legend.options,\r\n\t\t\tsymbolPadding = options.symbolPadding,\r\n\t\t\tltr = !options.rtl,\r\n\t\t\tlegendItemPos = item._legendItemPos,\r\n\t\t\titemX = legendItemPos[0],\r\n\t\t\titemY = legendItemPos[1],\r\n\t\t\tcheckbox = item.checkbox;\r\n\r\n\t\tif (item.legendGroup) {\r\n\t\t\titem.legendGroup.translate(\r\n\t\t\t\tltr ? itemX : legend.legendWidth - itemX - 2 * symbolPadding - 4,\r\n\t\t\t\titemY\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tif (checkbox) {\r\n\t\t\tcheckbox.x = itemX;\r\n\t\t\tcheckbox.y = itemY;\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Destroy a single legend item\r\n\t * @param {Object} item The series or point\r\n\t */\r\n\tdestroyItem: function (item) {\r\n\t\tvar checkbox = item.checkbox;\r\n\r\n\t\t// destroy SVG elements\r\n\t\teach(['legendItem', 'legendLine', 'legendSymbol', 'legendGroup'], function (key) {\r\n\t\t\tif (item[key]) {\r\n\t\t\t\titem[key] = item[key].destroy();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (checkbox) {\r\n\t\t\tdiscardElement(item.checkbox);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Destroys the legend.\r\n\t */\r\n\tdestroy: function () {\r\n\t\tvar legend = this,\r\n\t\t\tlegendGroup = legend.group,\r\n\t\t\tbox = legend.box;\r\n\r\n\t\tif (box) {\r\n\t\t\tlegend.box = box.destroy();\r\n\t\t}\r\n\r\n\t\tif (legendGroup) {\r\n\t\t\tlegend.group = legendGroup.destroy();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Position the checkboxes after the width is determined\r\n\t */\r\n\tpositionCheckboxes: function (scrollOffset) {\r\n\t\tvar alignAttr = this.group.alignAttr,\r\n\t\t\ttranslateY,\r\n\t\t\tclipHeight = this.clipHeight || this.legendHeight;\r\n\r\n\t\tif (alignAttr) {\r\n\t\t\ttranslateY = alignAttr.translateY;\r\n\t\t\teach(this.allItems, function (item) {\r\n\t\t\t\tvar checkbox = item.checkbox,\r\n\t\t\t\t\ttop;\r\n\t\t\t\t\r\n\t\t\t\tif (checkbox) {\r\n\t\t\t\t\ttop = (translateY + checkbox.y + (scrollOffset || 0) + 3);\r\n\t\t\t\t\tcss(checkbox, {\r\n\t\t\t\t\t\tleft: (alignAttr.translateX + item.legendItemWidth + checkbox.x - 20) + PX,\r\n\t\t\t\t\t\ttop: top + PX,\r\n\t\t\t\t\t\tdisplay: top > translateY - 6 && top < translateY + clipHeight - 6 ? '' : NONE\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * Render the legend title on top of the legend\r\n\t */\r\n\trenderTitle: function () {\r\n\t\tvar options = this.options,\r\n\t\t\tpadding = this.padding,\r\n\t\t\ttitleOptions = options.title,\r\n\t\t\ttitleHeight = 0,\r\n\t\t\tbBox;\r\n\t\t\r\n\t\tif (titleOptions.text) {\r\n\t\t\tif (!this.title) {\r\n\t\t\t\tthis.title = this.chart.renderer.label(titleOptions.text, padding - 3, padding - 4, null, null, null, null, null, 'legend-title')\r\n\t\t\t\t\t.attr({ zIndex: 1 })\r\n\t\t\t\t\t.css(titleOptions.style)\r\n\t\t\t\t\t.add(this.group);\r\n\t\t\t}\r\n\t\t\tbBox = this.title.getBBox();\r\n\t\t\ttitleHeight = bBox.height;\r\n\t\t\tthis.offsetWidth = bBox.width; // #1717\r\n\t\t\tthis.contentGroup.attr({ translateY: titleHeight });\r\n\t\t}\r\n\t\tthis.titleHeight = titleHeight;\r\n\t},\r\n\r\n\t/**\r\n\t * Render a single specific legend item\r\n\t * @param {Object} item A series or point\r\n\t */\r\n\trenderItem: function (item) {\r\n\t\tvar legend = this,\r\n\t\t\tchart = legend.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\toptions = legend.options,\r\n\t\t\thorizontal = options.layout === 'horizontal',\r\n\t\t\tsymbolWidth = options.symbolWidth,\r\n\t\t\tsymbolPadding = options.symbolPadding,\r\n\t\t\titemStyle = legend.itemStyle,\r\n\t\t\titemHiddenStyle = legend.itemHiddenStyle,\r\n\t\t\tpadding = legend.padding,\r\n\t\t\titemDistance = horizontal ? pick(options.itemDistance, 8) : 0,\r\n\t\t\tltr = !options.rtl,\r\n\t\t\titemHeight,\r\n\t\t\twidthOption = options.width,\r\n\t\t\titemMarginBottom = options.itemMarginBottom || 0,\r\n\t\t\titemMarginTop = legend.itemMarginTop,\r\n\t\t\tinitialItemX = legend.initialItemX,\r\n\t\t\tbBox,\r\n\t\t\titemWidth,\r\n\t\t\tli = item.legendItem,\r\n\t\t\tseries = item.series || item,\r\n\t\t\titemOptions = series.options,\r\n\t\t\tshowCheckbox = itemOptions.showCheckbox,\r\n\t\t\tuseHTML = options.useHTML;\r\n\r\n\t\tif (!li) { // generate it once, later move it\r\n\r\n\t\t\t// Generate the group box\r\n\t\t\t// A group to hold the symbol and text. Text is to be appended in Legend class.\r\n\t\t\titem.legendGroup = renderer.g('legend-item')\r\n\t\t\t\t.attr({ zIndex: 1 })\r\n\t\t\t\t.add(legend.scrollGroup);\r\n\r\n\t\t\t// Draw the legend symbol inside the group box\r\n\t\t\tseries.drawLegendSymbol(legend, item);\r\n\r\n\t\t\t// Generate the list item text and add it to the group\r\n\t\t\titem.legendItem = li = renderer.text(\r\n\t\t\t\t\toptions.labelFormat ? format(options.labelFormat, item) : options.labelFormatter.call(item),\r\n\t\t\t\t\tltr ? symbolWidth + symbolPadding : -symbolPadding,\r\n\t\t\t\t\tlegend.baseline,\r\n\t\t\t\t\tuseHTML\r\n\t\t\t\t)\r\n\t\t\t\t.css(merge(item.visible ? itemStyle : itemHiddenStyle)) // merge to prevent modifying original (#1021)\r\n\t\t\t\t.attr({\r\n\t\t\t\t\talign: ltr ? 'left' : 'right',\r\n\t\t\t\t\tzIndex: 2\r\n\t\t\t\t})\r\n\t\t\t\t.add(item.legendGroup);\r\n\r\n\t\t\t// Set the events on the item group, or in case of useHTML, the item itself (#1249)\r\n\t\t\t(useHTML ? li : item.legendGroup).on('mouseover', function () {\r\n\t\t\t\t\titem.setState(HOVER_STATE);\r\n\t\t\t\t\tli.css(legend.options.itemHoverStyle);\r\n\t\t\t\t})\r\n\t\t\t\t.on('mouseout', function () {\r\n\t\t\t\t\tli.css(item.visible ? itemStyle : itemHiddenStyle);\r\n\t\t\t\t\titem.setState();\r\n\t\t\t\t})\r\n\t\t\t\t.on('click', function (event) {\r\n\t\t\t\t\tvar strLegendItemClick = 'legendItemClick',\r\n\t\t\t\t\t\tfnLegendItemClick = function () {\r\n\t\t\t\t\t\t\titem.setVisible();\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t// Pass over the click/touch event. #4.\r\n\t\t\t\t\tevent = {\r\n\t\t\t\t\t\tbrowserEvent: event\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\t// click the name or symbol\r\n\t\t\t\t\tif (item.firePointEvent) { // point\r\n\t\t\t\t\t\titem.firePointEvent(strLegendItemClick, event, fnLegendItemClick);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tfireEvent(item, strLegendItemClick, event, fnLegendItemClick);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t// Colorize the items\r\n\t\t\tlegend.colorizeItem(item, item.visible);\r\n\r\n\t\t\t// add the HTML checkbox on top\r\n\t\t\tif (itemOptions && showCheckbox) {\r\n\t\t\t\titem.checkbox = createElement('input', {\r\n\t\t\t\t\ttype: 'checkbox',\r\n\t\t\t\t\tchecked: item.selected,\r\n\t\t\t\t\tdefaultChecked: item.selected // required by IE7\r\n\t\t\t\t}, options.itemCheckboxStyle, chart.container);\r\n\r\n\t\t\t\taddEvent(item.checkbox, 'click', function (event) {\r\n\t\t\t\t\tvar target = event.target;\r\n\t\t\t\t\tfireEvent(item, 'checkboxClick', {\r\n\t\t\t\t\t\t\tchecked: target.checked\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tfunction () {\r\n\t\t\t\t\t\t\titem.select();\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// calculate the positions for the next line\r\n\t\tbBox = li.getBBox();\r\n\r\n\t\titemWidth = item.legendItemWidth =\r\n\t\t\toptions.itemWidth || symbolWidth + symbolPadding + bBox.width + itemDistance +\r\n\t\t\t(showCheckbox ? 20 : 0);\r\n\t\tlegend.itemHeight = itemHeight = bBox.height;\r\n\r\n\t\t// if the item exceeds the width, start a new line\r\n\t\tif (horizontal && legend.itemX - initialItemX + itemWidth >\r\n\t\t\t\t(widthOption || (chart.chartWidth - 2 * padding - initialItemX))) {\r\n\t\t\tlegend.itemX = initialItemX;\r\n\t\t\tlegend.itemY += itemMarginTop + legend.lastLineHeight + itemMarginBottom;\r\n\t\t\tlegend.lastLineHeight = 0; // reset for next line\r\n\t\t}\r\n\r\n\t\t// If the item exceeds the height, start a new column\r\n\t\t/*if (!horizontal && legend.itemY + options.y + itemHeight > chart.chartHeight - spacingTop - spacingBottom) {\r\n\t\t\tlegend.itemY = legend.initialItemY;\r\n\t\t\tlegend.itemX += legend.maxItemWidth;\r\n\t\t\tlegend.maxItemWidth = 0;\r\n\t\t}*/\r\n\r\n\t\t// Set the edge positions\r\n\t\tlegend.maxItemWidth = mathMax(legend.maxItemWidth, itemWidth);\r\n\t\tlegend.lastItemY = itemMarginTop + legend.itemY + itemMarginBottom;\r\n\t\tlegend.lastLineHeight = mathMax(itemHeight, legend.lastLineHeight); // #915\r\n\r\n\t\t// cache the position of the newly generated or reordered items\r\n\t\titem._legendItemPos = [legend.itemX, legend.itemY];\r\n\r\n\t\t// advance\r\n\t\tif (horizontal) {\r\n\t\t\tlegend.itemX += itemWidth;\r\n\r\n\t\t} else {\r\n\t\t\tlegend.itemY += itemMarginTop + itemHeight + itemMarginBottom;\r\n\t\t\tlegend.lastLineHeight = itemHeight;\r\n\t\t}\r\n\r\n\t\t// the width of the widest item\r\n\t\tlegend.offsetWidth = widthOption || mathMax(\r\n\t\t\t(horizontal ? legend.itemX - initialItemX - itemDistance : itemWidth) + padding,\r\n\t\t\tlegend.offsetWidth\r\n\t\t);\r\n\t},\r\n\r\n\t/**\r\n\t * Render the legend. This method can be called both before and after\r\n\t * chart.render. If called after, it will only rearrange items instead\r\n\t * of creating new ones.\r\n\t */\r\n\trender: function () {\r\n\t\tvar legend = this,\r\n\t\t\tchart = legend.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\tlegendGroup = legend.group,\r\n\t\t\tallItems,\r\n\t\t\tdisplay,\r\n\t\t\tlegendWidth,\r\n\t\t\tlegendHeight,\r\n\t\t\tbox = legend.box,\r\n\t\t\toptions = legend.options,\r\n\t\t\tpadding = legend.padding,\r\n\t\t\tlegendBorderWidth = options.borderWidth,\r\n\t\t\tlegendBackgroundColor = options.backgroundColor;\r\n\r\n\t\tlegend.itemX = legend.initialItemX;\r\n\t\tlegend.itemY = legend.initialItemY;\r\n\t\tlegend.offsetWidth = 0;\r\n\t\tlegend.lastItemY = 0;\r\n\r\n\t\tif (!legendGroup) {\r\n\t\t\tlegend.group = legendGroup = renderer.g('legend')\r\n\t\t\t\t.attr({ zIndex: 7 }) \r\n\t\t\t\t.add();\r\n\t\t\tlegend.contentGroup = renderer.g()\r\n\t\t\t\t.attr({ zIndex: 1 }) // above background\r\n\t\t\t\t.add(legendGroup);\r\n\t\t\tlegend.scrollGroup = renderer.g()\r\n\t\t\t\t.add(legend.contentGroup);\r\n\t\t}\r\n\t\t\r\n\t\tlegend.renderTitle();\r\n\r\n\t\t// add each series or point\r\n\t\tallItems = [];\r\n\t\teach(chart.series, function (serie) {\r\n\t\t\tvar seriesOptions = serie.options;\r\n\r\n\t\t\t// Handle showInLegend. If the series is linked to another series, defaults to false.\r\n\t\t\tif (!pick(seriesOptions.showInLegend, seriesOptions.linkedTo === UNDEFINED ? UNDEFINED : false, true)) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// use points or series for the legend item depending on legendType\r\n\t\t\tallItems = allItems.concat(\r\n\t\t\t\t\tserie.legendItems ||\r\n\t\t\t\t\t(seriesOptions.legendType === 'point' ?\r\n\t\t\t\t\t\t\tserie.data :\r\n\t\t\t\t\t\t\tserie)\r\n\t\t\t);\r\n\t\t});\r\n\r\n\t\t// sort by legendIndex\r\n\t\tstableSort(allItems, function (a, b) {\r\n\t\t\treturn ((a.options && a.options.legendIndex) || 0) - ((b.options && b.options.legendIndex) || 0);\r\n\t\t});\r\n\r\n\t\t// reversed legend\r\n\t\tif (options.reversed) {\r\n\t\t\tallItems.reverse();\r\n\t\t}\r\n\r\n\t\tlegend.allItems = allItems;\r\n\t\tlegend.display = display = !!allItems.length;\r\n\r\n\t\t// render the items\r\n\t\teach(allItems, function (item) {\r\n\t\t\tlegend.renderItem(item); \r\n\t\t});\r\n\r\n\t\t// Draw the border\r\n\t\tlegendWidth = options.width || legend.offsetWidth;\r\n\t\tlegendHeight = legend.lastItemY + legend.lastLineHeight + legend.titleHeight;\r\n\t\t\r\n\t\t\r\n\t\tlegendHeight = legend.handleOverflow(legendHeight);\r\n\r\n\t\tif (legendBorderWidth || legendBackgroundColor) {\r\n\t\t\tlegendWidth += padding;\r\n\t\t\tlegendHeight += padding;\r\n\r\n\t\t\tif (!box) {\r\n\t\t\t\tlegend.box = box = renderer.rect(\r\n\t\t\t\t\t0,\r\n\t\t\t\t\t0,\r\n\t\t\t\t\tlegendWidth,\r\n\t\t\t\t\tlegendHeight,\r\n\t\t\t\t\toptions.borderRadius,\r\n\t\t\t\t\tlegendBorderWidth || 0\r\n\t\t\t\t).attr({\r\n\t\t\t\t\tstroke: options.borderColor,\r\n\t\t\t\t\t'stroke-width': legendBorderWidth || 0,\r\n\t\t\t\t\tfill: legendBackgroundColor || NONE\r\n\t\t\t\t})\r\n\t\t\t\t.add(legendGroup)\r\n\t\t\t\t.shadow(options.shadow);\r\n\t\t\t\tbox.isNew = true;\r\n\r\n\t\t\t} else if (legendWidth > 0 && legendHeight > 0) {\r\n\t\t\t\tbox[box.isNew ? 'attr' : 'animate'](\r\n\t\t\t\t\tbox.crisp(null, null, null, legendWidth, legendHeight)\r\n\t\t\t\t);\r\n\t\t\t\tbox.isNew = false;\r\n\t\t\t}\r\n\r\n\t\t\t// hide the border if no items\r\n\t\t\tbox[display ? 'show' : 'hide']();\r\n\t\t}\r\n\t\t\r\n\t\tlegend.legendWidth = legendWidth;\r\n\t\tlegend.legendHeight = legendHeight;\r\n\r\n\t\t// Now that the legend width and height are established, put the items in the \r\n\t\t// final position\r\n\t\teach(allItems, function (item) {\r\n\t\t\tlegend.positionItem(item);\r\n\t\t});\r\n\r\n\t\t// 1.x compatibility: positioning based on style\r\n\t\t/*var props = ['left', 'right', 'top', 'bottom'],\r\n\t\t\tprop,\r\n\t\t\ti = 4;\r\n\t\twhile (i--) {\r\n\t\t\tprop = props[i];\r\n\t\t\tif (options.style[prop] && options.style[prop] !== 'auto') {\r\n\t\t\t\toptions[i < 2 ? 'align' : 'verticalAlign'] = prop;\r\n\t\t\t\toptions[i < 2 ? 'x' : 'y'] = pInt(options.style[prop]) * (i % 2 ? -1 : 1);\r\n\t\t\t}\r\n\t\t}*/\r\n\r\n\t\tif (display) {\r\n\t\t\tlegendGroup.align(extend({\r\n\t\t\t\twidth: legendWidth,\r\n\t\t\t\theight: legendHeight\r\n\t\t\t}, options), true, 'spacingBox');\r\n\t\t}\r\n\r\n\t\tif (!chart.isResizing) {\r\n\t\t\tthis.positionCheckboxes();\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * Set up the overflow handling by adding navigation with up and down arrows below the\r\n\t * legend.\r\n\t */\r\n\thandleOverflow: function (legendHeight) {\r\n\t\tvar legend = this,\r\n\t\t\tchart = this.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\tpageCount,\r\n\t\t\toptions = this.options,\r\n\t\t\toptionsY = options.y,\r\n\t\t\talignTop = options.verticalAlign === 'top',\r\n\t\t\tspaceHeight = chart.spacingBox.height + (alignTop ? -optionsY : optionsY) - this.padding,\r\n\t\t\tmaxHeight = options.maxHeight,\r\n\t\t\tclipHeight,\r\n\t\t\tclipRect = this.clipRect,\r\n\t\t\tnavOptions = options.navigation,\r\n\t\t\tanimation = pick(navOptions.animation, true),\r\n\t\t\tarrowSize = navOptions.arrowSize || 12,\r\n\t\t\tnav = this.nav;\r\n\t\t\t\r\n\t\t// Adjust the height\r\n\t\tif (options.layout === 'horizontal') {\r\n\t\t\tspaceHeight /= 2;\r\n\t\t}\r\n\t\tif (maxHeight) {\r\n\t\t\tspaceHeight = mathMin(spaceHeight, maxHeight);\r\n\t\t}\r\n\t\t\r\n\t\t// Reset the legend height and adjust the clipping rectangle\r\n\t\tif (legendHeight > spaceHeight && !options.useHTML) {\r\n\r\n\t\t\tthis.clipHeight = clipHeight = spaceHeight - 20 - this.titleHeight;\r\n\t\t\tthis.pageCount = pageCount = mathCeil(legendHeight / clipHeight);\r\n\t\t\tthis.currentPage = pick(this.currentPage, 1);\r\n\t\t\tthis.fullHeight = legendHeight;\r\n\t\t\t\r\n\t\t\t// Only apply clipping if needed. Clipping causes blurred legend in PDF export (#1787)\r\n\t\t\tif (!clipRect) {\r\n\t\t\t\tclipRect = legend.clipRect = renderer.clipRect(0, 0, 9999, 0);\r\n\t\t\t\tlegend.contentGroup.clip(clipRect);\r\n\t\t\t}\r\n\t\t\tclipRect.attr({\r\n\t\t\t\theight: clipHeight\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\t// Add navigation elements\r\n\t\t\tif (!nav) {\r\n\t\t\t\tthis.nav = nav = renderer.g().attr({ zIndex: 1 }).add(this.group);\r\n\t\t\t\tthis.up = renderer.symbol('triangle', 0, 0, arrowSize, arrowSize)\r\n\t\t\t\t\t.on('click', function () {\r\n\t\t\t\t\t\tlegend.scroll(-1, animation);\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.add(nav);\r\n\t\t\t\tthis.pager = renderer.text('', 15, 10)\r\n\t\t\t\t\t.css(navOptions.style)\r\n\t\t\t\t\t.add(nav);\r\n\t\t\t\tthis.down = renderer.symbol('triangle-down', 0, 0, arrowSize, arrowSize)\r\n\t\t\t\t\t.on('click', function () {\r\n\t\t\t\t\t\tlegend.scroll(1, animation);\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.add(nav);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Set initial position\r\n\t\t\tlegend.scroll(0);\r\n\t\t\t\r\n\t\t\tlegendHeight = spaceHeight;\r\n\t\t\t\r\n\t\t} else if (nav) {\r\n\t\t\tclipRect.attr({\r\n\t\t\t\theight: chart.chartHeight\r\n\t\t\t});\r\n\t\t\tnav.hide();\r\n\t\t\tthis.scrollGroup.attr({\r\n\t\t\t\ttranslateY: 1\r\n\t\t\t});\r\n\t\t\tthis.clipHeight = 0; // #1379\r\n\t\t}\r\n\t\t\r\n\t\treturn legendHeight;\r\n\t},\r\n\t\r\n\t/**\r\n\t * Scroll the legend by a number of pages\r\n\t * @param {Object} scrollBy\r\n\t * @param {Object} animation\r\n\t */\r\n\tscroll: function (scrollBy, animation) {\r\n\t\tvar pageCount = this.pageCount,\r\n\t\t\tcurrentPage = this.currentPage + scrollBy,\r\n\t\t\tclipHeight = this.clipHeight,\r\n\t\t\tnavOptions = this.options.navigation,\r\n\t\t\tactiveColor = navOptions.activeColor,\r\n\t\t\tinactiveColor = navOptions.inactiveColor,\r\n\t\t\tpager = this.pager,\r\n\t\t\tpadding = this.padding,\r\n\t\t\tscrollOffset;\r\n\t\t\r\n\t\t// When resizing while looking at the last page\r\n\t\tif (currentPage > pageCount) {\r\n\t\t\tcurrentPage = pageCount;\r\n\t\t}\r\n\t\t\r\n\t\tif (currentPage > 0) {\r\n\t\t\t\r\n\t\t\tif (animation !== UNDEFINED) {\r\n\t\t\t\tsetAnimation(animation, this.chart);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tthis.nav.attr({\r\n\t\t\t\ttranslateX: padding,\r\n\t\t\t\ttranslateY: clipHeight + 7 + this.titleHeight,\r\n\t\t\t\tvisibility: VISIBLE\r\n\t\t\t});\r\n\t\t\tthis.up.attr({\r\n\t\t\t\t\tfill: currentPage === 1 ? inactiveColor : activeColor\r\n\t\t\t\t})\r\n\t\t\t\t.css({\r\n\t\t\t\t\tcursor: currentPage === 1 ? 'default' : 'pointer'\r\n\t\t\t\t});\r\n\t\t\tpager.attr({\r\n\t\t\t\ttext: currentPage + '/' + this.pageCount\r\n\t\t\t});\r\n\t\t\tthis.down.attr({\r\n\t\t\t\t\tx: 18 + this.pager.getBBox().width, // adjust to text width\r\n\t\t\t\t\tfill: currentPage === pageCount ? inactiveColor : activeColor\r\n\t\t\t\t})\r\n\t\t\t\t.css({\r\n\t\t\t\t\tcursor: currentPage === pageCount ? 'default' : 'pointer'\r\n\t\t\t\t});\r\n\t\t\t\r\n\t\t\tscrollOffset = -mathMin(clipHeight * (currentPage - 1), this.fullHeight - clipHeight + padding) + 1;\r\n\t\t\tthis.scrollGroup.animate({\r\n\t\t\t\ttranslateY: scrollOffset\r\n\t\t\t});\r\n\t\t\tpager.attr({\r\n\t\t\t\ttext: currentPage + '/' + pageCount\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\t\r\n\t\t\tthis.currentPage = currentPage;\r\n\t\t\tthis.positionCheckboxes(scrollOffset);\r\n\t\t}\r\n\t\t\t\r\n\t}\r\n\t\r\n};\r\n\r\n// Workaround for #2030, horizontal legend items not displaying in IE11 Preview.\r\n// TODO: When IE11 is released, check again for this bug, and remove the fix\r\n// or make a better one.\r\nif (/Trident\\/7\\.0/.test(userAgent)) {\r\n\twrap(Legend.prototype, 'positionItem', function (proceed, item) {\r\n\t\tvar legend = this,\r\n\t\t\trunPositionItem = function () {\r\n\t\t\t\tproceed.call(legend, item);\r\n\t\t\t};\r\n\r\n\t\tif (legend.chart.renderer.forExport) {\r\n\t\t\trunPositionItem();\r\n\t\t} else {\r\n\t\t\tsetTimeout(runPositionItem);\r\n\t\t}\r\n\t});\r\n}\r\n\r\n/**\r\n * The chart class\r\n * @param {Object} options\r\n * @param {Function} callback Function to run when the chart has loaded\r\n */\r\nfunction Chart() {\r\n\tthis.init.apply(this, arguments);\r\n}\r\n\r\nChart.prototype = {\r\n\r\n\t/**\r\n\t * Initialize the chart\r\n\t */\r\n\tinit: function (userOptions, callback) {\r\n\r\n\t\t// Handle regular options\r\n\t\tvar options,\r\n\t\t\tseriesOptions = userOptions.series; // skip merging data points to increase performance\r\n\r\n\t\tuserOptions.series = null;\r\n\t\toptions = merge(defaultOptions, userOptions); // do the merge\r\n\t\toptions.series = userOptions.series = seriesOptions; // set back the series data\r\n\r\n\t\tvar optionsChart = options.chart;\r\n\t\t\r\n\t\t// Create margin & spacing array\r\n\t\tthis.margin = this.splashArray('margin', optionsChart);\r\n\t\tthis.spacing = this.splashArray('spacing', optionsChart);\r\n\r\n\t\tvar chartEvents = optionsChart.events;\r\n\r\n\t\t//this.runChartClick = chartEvents && !!chartEvents.click;\r\n\t\tthis.bounds = { h: {}, v: {} }; // Pixel data bounds for touch zoom\r\n\r\n\t\tthis.callback = callback;\r\n\t\tthis.isResizing = 0;\r\n\t\tthis.options = options;\r\n\t\t//chartTitleOptions = UNDEFINED;\r\n\t\t//chartSubtitleOptions = UNDEFINED;\r\n\r\n\t\tthis.axes = [];\r\n\t\tthis.series = [];\r\n\t\tthis.hasCartesianSeries = optionsChart.showAxes;\r\n\t\t//this.axisOffset = UNDEFINED;\r\n\t\t//this.maxTicks = UNDEFINED; // handle the greatest amount of ticks on grouped axes\r\n\t\t//this.inverted = UNDEFINED;\r\n\t\t//this.loadingShown = UNDEFINED;\r\n\t\t//this.container = UNDEFINED;\r\n\t\t//this.chartWidth = UNDEFINED;\r\n\t\t//this.chartHeight = UNDEFINED;\r\n\t\t//this.marginRight = UNDEFINED;\r\n\t\t//this.marginBottom = UNDEFINED;\r\n\t\t//this.containerWidth = UNDEFINED;\r\n\t\t//this.containerHeight = UNDEFINED;\r\n\t\t//this.oldChartWidth = UNDEFINED;\r\n\t\t//this.oldChartHeight = UNDEFINED;\r\n\r\n\t\t//this.renderTo = UNDEFINED;\r\n\t\t//this.renderToClone = UNDEFINED;\r\n\r\n\t\t//this.spacingBox = UNDEFINED\r\n\r\n\t\t//this.legend = UNDEFINED;\r\n\r\n\t\t// Elements\r\n\t\t//this.chartBackground = UNDEFINED;\r\n\t\t//this.plotBackground = UNDEFINED;\r\n\t\t//this.plotBGImage = UNDEFINED;\r\n\t\t//this.plotBorder = UNDEFINED;\r\n\t\t//this.loadingDiv = UNDEFINED;\r\n\t\t//this.loadingSpan = UNDEFINED;\r\n\r\n\t\tvar chart = this,\r\n\t\t\teventType;\r\n\r\n\t\t// Add the chart to the global lookup\r\n\t\tchart.index = charts.length;\r\n\t\tcharts.push(chart);\r\n\r\n\t\t// Set up auto resize\r\n\t\tif (optionsChart.reflow !== false) {\r\n\t\t\taddEvent(chart, 'load', function () {\r\n\t\t\t\tchart.initReflow();\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Chart event handlers\r\n\t\tif (chartEvents) {\r\n\t\t\tfor (eventType in chartEvents) {\r\n\t\t\t\taddEvent(chart, eventType, chartEvents[eventType]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tchart.xAxis = [];\r\n\t\tchart.yAxis = [];\r\n\r\n\t\t// Expose methods and variables\r\n\t\tchart.animation = useCanVG ? false : pick(optionsChart.animation, true);\r\n\t\tchart.pointCount = 0;\r\n\t\tchart.counters = new ChartCounters();\r\n\r\n\t\tchart.firstRender();\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize an individual series, called internally before render time\r\n\t */\r\n\tinitSeries: function (options) {\r\n\t\tvar chart = this,\r\n\t\t\toptionsChart = chart.options.chart,\r\n\t\t\ttype = options.type || optionsChart.type || optionsChart.defaultSeriesType,\r\n\t\t\tseries,\r\n\t\t\tconstr = seriesTypes[type];\r\n\r\n\t\t// No such series type\r\n\t\tif (!constr) {\r\n\t\t\terror(17, true);\r\n\t\t}\r\n\r\n\t\tseries = new constr();\r\n\t\tseries.init(this, options);\r\n\t\treturn series;\r\n\t},\r\n\r\n\t/**\r\n\t * Add a series dynamically after time\r\n\t *\r\n\t * @param {Object} options The config options\r\n\t * @param {Boolean} redraw Whether to redraw the chart after adding. Defaults to true.\r\n\t * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\r\n\t * configuration\r\n\t *\r\n\t * @return {Object} series The newly created series object\r\n\t */\r\n\taddSeries: function (options, redraw, animation) {\r\n\t\tvar series,\r\n\t\t\tchart = this;\r\n\r\n\t\tif (options) {\r\n\t\t\tredraw = pick(redraw, true); // defaults to true\r\n\r\n\t\t\tfireEvent(chart, 'addSeries', { options: options }, function () {\r\n\t\t\t\tseries = chart.initSeries(options);\r\n\t\t\t\t\r\n\t\t\t\tchart.isDirtyLegend = true; // the series array is out of sync with the display\r\n\t\t\t\tchart.linkSeries();\r\n\t\t\t\tif (redraw) {\r\n\t\t\t\t\tchart.redraw(animation);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn series;\r\n\t},\r\n\r\n\t/**\r\n * Add an axis to the chart\r\n * @param {Object} options The axis option\r\n * @param {Boolean} isX Whether it is an X axis or a value axis\r\n */\r\n\taddAxis: function (options, isX, redraw, animation) {\r\n\t\tvar key = isX ? 'xAxis' : 'yAxis',\r\n\t\t\tchartOptions = this.options,\r\n\t\t\taxis;\r\n\r\n\t\t/*jslint unused: false*/\r\n\t\taxis = new Axis(this, merge(options, {\r\n\t\t\tindex: this[key].length,\r\n\t\t\tisX: isX\r\n\t\t}));\r\n\t\t/*jslint unused: true*/\r\n\r\n\t\t// Push the new axis options to the chart options\r\n\t\tchartOptions[key] = splat(chartOptions[key] || {});\r\n\t\tchartOptions[key].push(options);\r\n\r\n\t\tif (pick(redraw, true)) {\r\n\t\t\tthis.redraw(animation);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Check whether a given point is within the plot area\r\n\t *\r\n\t * @param {Number} plotX Pixel x relative to the plot area\r\n\t * @param {Number} plotY Pixel y relative to the plot area\r\n\t * @param {Boolean} inverted Whether the chart is inverted\r\n\t */\r\n\tisInsidePlot: function (plotX, plotY, inverted) {\r\n\t\tvar x = inverted ? plotY : plotX,\r\n\t\t\ty = inverted ? plotX : plotY;\r\n\t\t\t\r\n\t\treturn x >= 0 &&\r\n\t\t\tx <= this.plotWidth &&\r\n\t\t\ty >= 0 &&\r\n\t\t\ty <= this.plotHeight;\r\n\t},\r\n\r\n\t/**\r\n\t * Adjust all axes tick amounts\r\n\t */\r\n\tadjustTickAmounts: function () {\r\n\t\tif (this.options.chart.alignTicks !== false) {\r\n\t\t\teach(this.axes, function (axis) {\r\n\t\t\t\taxis.adjustTickAmount();\r\n\t\t\t});\r\n\t\t}\r\n\t\tthis.maxTicks = null;\r\n\t},\r\n\r\n\t/**\r\n\t * Redraw legend, axes or series based on updated data\r\n\t *\r\n\t * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\r\n\t * configuration\r\n\t */\r\n\tredraw: function (animation) {\r\n\t\tvar chart = this,\r\n\t\t\taxes = chart.axes,\r\n\t\t\tseries = chart.series,\r\n\t\t\tpointer = chart.pointer,\r\n\t\t\tlegend = chart.legend,\r\n\t\t\tredrawLegend = chart.isDirtyLegend,\r\n\t\t\thasStackedSeries,\r\n\t\t\thasDirtyStacks,\r\n\t\t\tisDirtyBox = chart.isDirtyBox, // todo: check if it has actually changed?\r\n\t\t\tseriesLength = series.length,\r\n\t\t\ti = seriesLength,\r\n\t\t\tserie,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\tisHiddenChart = renderer.isHidden(),\r\n\t\t\tafterRedraw = [];\r\n\t\t\t\r\n\t\tsetAnimation(animation, chart);\r\n\t\t\r\n\t\tif (isHiddenChart) {\r\n\t\t\tchart.cloneRenderTo();\r\n\t\t}\r\n\r\n\t\t// Adjust title layout (reflow multiline text)\r\n\t\tchart.layOutTitles();\r\n\r\n\t\t// link stacked series\r\n\t\twhile (i--) {\r\n\t\t\tserie = series[i];\r\n\r\n\t\t\tif (serie.options.stacking) {\r\n\t\t\t\thasStackedSeries = true;\r\n\t\t\t\t\r\n\t\t\t\tif (serie.isDirty) {\r\n\t\t\t\t\thasDirtyStacks = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (hasDirtyStacks) { // mark others as dirty\r\n\t\t\ti = seriesLength;\r\n\t\t\twhile (i--) {\r\n\t\t\t\tserie = series[i];\r\n\t\t\t\tif (serie.options.stacking) {\r\n\t\t\t\t\tserie.isDirty = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// handle updated data in the series\r\n\t\teach(series, function (serie) {\r\n\t\t\tif (serie.isDirty) { // prepare the data so axis can read it\r\n\t\t\t\tif (serie.options.legendType === 'point') {\r\n\t\t\t\t\tredrawLegend = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// handle added or removed series\r\n\t\tif (redrawLegend && legend.options.enabled) { // series or pie points are added or removed\r\n\t\t\t// draw legend graphics\r\n\t\t\tlegend.render();\r\n\r\n\t\t\tchart.isDirtyLegend = false;\r\n\t\t}\r\n\r\n\t\t// reset stacks\r\n\t\tif (hasStackedSeries) {\r\n\t\t\tchart.getStacks();\r\n\t\t}\r\n\r\n\r\n\t\tif (chart.hasCartesianSeries) {\r\n\t\t\tif (!chart.isResizing) {\r\n\r\n\t\t\t\t// reset maxTicks\r\n\t\t\t\tchart.maxTicks = null;\r\n\r\n\t\t\t\t// set axes scales\r\n\t\t\t\teach(axes, function (axis) {\r\n\t\t\t\t\taxis.setScale();\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tchart.adjustTickAmounts();\r\n\t\t\tchart.getMargins();\r\n\r\n\t\t\t// If one axis is dirty, all axes must be redrawn (#792, #2169)\r\n\t\t\teach(axes, function (axis) {\r\n\t\t\t\tif (axis.isDirty) {\r\n\t\t\t\t\tisDirtyBox = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// redraw axes\r\n\t\t\teach(axes, function (axis) {\r\n\t\t\t\t\r\n\t\t\t\t// Fire 'afterSetExtremes' only if extremes are set\r\n\t\t\t\tif (axis.isDirtyExtremes) { // #821\r\n\t\t\t\t\taxis.isDirtyExtremes = false;\r\n\t\t\t\t\tafterRedraw.push(function () { // prevent a recursive call to chart.redraw() (#1119)\r\n\t\t\t\t\t\tfireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751\r\n\t\t\t\t\t\tdelete axis.eventArgs;\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif (isDirtyBox || hasStackedSeries) {\r\n\t\t\t\t\taxis.redraw();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\r\n\t\t}\r\n\t\t// the plot areas size has changed\r\n\t\tif (isDirtyBox) {\r\n\t\t\tchart.drawChartBox();\r\n\t\t}\r\n\r\n\r\n\t\t// redraw affected series\r\n\t\teach(series, function (serie) {\r\n\t\t\tif (serie.isDirty && serie.visible &&\r\n\t\t\t\t\t(!serie.isCartesian || serie.xAxis)) { // issue #153\r\n\t\t\t\tserie.redraw();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// move tooltip or reset\r\n\t\tif (pointer && pointer.reset) {\r\n\t\t\tpointer.reset(true);\r\n\t\t}\r\n\r\n\t\t// redraw if canvas\r\n\t\trenderer.draw();\r\n\r\n\t\t// fire the event\r\n\t\tfireEvent(chart, 'redraw'); // jQuery breaks this when calling it from addEvent. Overwrites chart.redraw\r\n\t\t\r\n\t\tif (isHiddenChart) {\r\n\t\t\tchart.cloneRenderTo(true);\r\n\t\t}\r\n\t\t\r\n\t\t// Fire callbacks that are put on hold until after the redraw\r\n\t\teach(afterRedraw, function (callback) {\r\n\t\t\tcallback.call();\r\n\t\t});\r\n\t},\r\n\r\n\r\n\r\n\t/**\r\n\t * Dim the chart and show a loading text or symbol\r\n\t * @param {String} str An optional text to show in the loading label instead of the default one\r\n\t */\r\n\tshowLoading: function (str) {\r\n\t\tvar chart = this,\r\n\t\t\toptions = chart.options,\r\n\t\t\tloadingDiv = chart.loadingDiv;\r\n\r\n\t\tvar loadingOptions = options.loading;\r\n\r\n\t\t// create the layer at the first call\r\n\t\tif (!loadingDiv) {\r\n\t\t\tchart.loadingDiv = loadingDiv = createElement(DIV, {\r\n\t\t\t\tclassName: PREFIX + 'loading'\r\n\t\t\t}, extend(loadingOptions.style, {\r\n\t\t\t\tzIndex: 10,\r\n\t\t\t\tdisplay: NONE\r\n\t\t\t}), chart.container);\r\n\r\n\t\t\tchart.loadingSpan = createElement(\r\n\t\t\t\t'span',\r\n\t\t\t\tnull,\r\n\t\t\t\tloadingOptions.labelStyle,\r\n\t\t\t\tloadingDiv\r\n\t\t\t);\r\n\r\n\t\t}\r\n\r\n\t\t// update text\r\n\t\tchart.loadingSpan.innerHTML = str || options.lang.loading;\r\n\r\n\t\t// show it\r\n\t\tif (!chart.loadingShown) {\r\n\t\t\tcss(loadingDiv, { \r\n\t\t\t\topacity: 0, \r\n\t\t\t\tdisplay: '',\r\n\t\t\t\tleft: chart.plotLeft + PX,\r\n\t\t\t\ttop: chart.plotTop + PX,\r\n\t\t\t\twidth: chart.plotWidth + PX,\r\n\t\t\t\theight: chart.plotHeight + PX\r\n\t\t\t});\r\n\t\t\tanimate(loadingDiv, {\r\n\t\t\t\topacity: loadingOptions.style.opacity\r\n\t\t\t}, {\r\n\t\t\t\tduration: loadingOptions.showDuration || 0\r\n\t\t\t});\r\n\t\t\tchart.loadingShown = true;\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Hide the loading layer\r\n\t */\r\n\thideLoading: function () {\r\n\t\tvar options = this.options,\r\n\t\t\tloadingDiv = this.loadingDiv;\r\n\r\n\t\tif (loadingDiv) {\r\n\t\t\tanimate(loadingDiv, {\r\n\t\t\t\topacity: 0\r\n\t\t\t}, {\r\n\t\t\t\tduration: options.loading.hideDuration || 100,\r\n\t\t\t\tcomplete: function () {\r\n\t\t\t\t\tcss(loadingDiv, { display: NONE });\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t\tthis.loadingShown = false;\r\n\t},\r\n\r\n\t/**\r\n\t * Get an axis, series or point object by id.\r\n\t * @param id {String} The id as given in the configuration options\r\n\t */\r\n\tget: function (id) {\r\n\t\tvar chart = this,\r\n\t\t\taxes = chart.axes,\r\n\t\t\tseries = chart.series;\r\n\r\n\t\tvar i,\r\n\t\t\tj,\r\n\t\t\tpoints;\r\n\r\n\t\t// search axes\r\n\t\tfor (i = 0; i < axes.length; i++) {\r\n\t\t\tif (axes[i].options.id === id) {\r\n\t\t\t\treturn axes[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// search series\r\n\t\tfor (i = 0; i < series.length; i++) {\r\n\t\t\tif (series[i].options.id === id) {\r\n\t\t\t\treturn series[i];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// search points\r\n\t\tfor (i = 0; i < series.length; i++) {\r\n\t\t\tpoints = series[i].points || [];\r\n\t\t\tfor (j = 0; j < points.length; j++) {\r\n\t\t\t\tif (points[j].id === id) {\r\n\t\t\t\t\treturn points[j];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t},\r\n\r\n\t/**\r\n\t * Create the Axis instances based on the config options\r\n\t */\r\n\tgetAxes: function () {\r\n\t\tvar chart = this,\r\n\t\t\toptions = this.options,\r\n\t\t\txAxisOptions = options.xAxis = splat(options.xAxis || {}),\r\n\t\t\tyAxisOptions = options.yAxis = splat(options.yAxis || {}),\r\n\t\t\toptionsArray,\r\n\t\t\taxis;\r\n\r\n\t\t// make sure the options are arrays and add some members\r\n\t\teach(xAxisOptions, function (axis, i) {\r\n\t\t\taxis.index = i;\r\n\t\t\taxis.isX = true;\r\n\t\t});\r\n\r\n\t\teach(yAxisOptions, function (axis, i) {\r\n\t\t\taxis.index = i;\r\n\t\t});\r\n\r\n\t\t// concatenate all axis options into one array\r\n\t\toptionsArray = xAxisOptions.concat(yAxisOptions);\r\n\r\n\t\teach(optionsArray, function (axisOptions) {\r\n\t\t\taxis = new Axis(chart, axisOptions);\r\n\t\t});\r\n\r\n\t\tchart.adjustTickAmounts();\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Get the currently selected points from all series\r\n\t */\r\n\tgetSelectedPoints: function () {\r\n\t\tvar points = [];\r\n\t\teach(this.series, function (serie) {\r\n\t\t\tpoints = points.concat(grep(serie.points || [], function (point) {\r\n\t\t\t\treturn point.selected;\r\n\t\t\t}));\r\n\t\t});\r\n\t\treturn points;\r\n\t},\r\n\r\n\t/**\r\n\t * Get the currently selected series\r\n\t */\r\n\tgetSelectedSeries: function () {\r\n\t\treturn grep(this.series, function (serie) {\r\n\t\t\treturn serie.selected;\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Generate stacks for each series and calculate stacks total values\r\n\t */\r\n\tgetStacks: function () {\r\n\t\tvar chart = this;\r\n\r\n\t\t// reset stacks for each yAxis\r\n\t\teach(chart.yAxis, function (axis) {\r\n\t\t\tif (axis.stacks && axis.hasVisibleSeries) {\r\n\t\t\t\taxis.oldStacks = axis.stacks;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\teach(chart.series, function (series) {\r\n\t\t\tif (series.options.stacking && (series.visible === true || chart.options.chart.ignoreHiddenSeries === false)) {\r\n\t\t\t\tseries.stackKey = series.type + pick(series.options.stack, '');\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Display the zoom button\r\n\t */\r\n\tshowResetZoom: function () {\r\n\t\tvar chart = this,\r\n\t\t\tlang = defaultOptions.lang,\r\n\t\t\tbtnOptions = chart.options.chart.resetZoomButton,\r\n\t\t\ttheme = btnOptions.theme,\r\n\t\t\tstates = theme.states,\r\n\t\t\talignTo = btnOptions.relativeTo === 'chart' ? null : 'plotBox';\r\n\t\t\t\r\n\t\tthis.resetZoomButton = chart.renderer.button(lang.resetZoom, null, null, function () { chart.zoomOut(); }, theme, states && states.hover)\r\n\t\t\t.attr({\r\n\t\t\t\talign: btnOptions.position.align,\r\n\t\t\t\ttitle: lang.resetZoomTitle\r\n\t\t\t})\r\n\t\t\t.add()\r\n\t\t\t.align(btnOptions.position, false, alignTo);\r\n\t\t\t\r\n\t},\r\n\r\n\t/**\r\n\t * Zoom out to 1:1\r\n\t */\r\n\tzoomOut: function () {\r\n\t\tvar chart = this;\r\n\t\tfireEvent(chart, 'selection', { resetSelection: true }, function () { \r\n\t\t\tchart.zoom();\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Zoom into a given portion of the chart given by axis coordinates\r\n\t * @param {Object} event\r\n\t */\r\n\tzoom: function (event) {\r\n\t\tvar chart = this,\r\n\t\t\thasZoomed,\r\n\t\t\tpointer = chart.pointer,\r\n\t\t\tdisplayButton = false,\r\n\t\t\tresetZoomButton;\r\n\r\n\t\t// If zoom is called with no arguments, reset the axes\r\n\t\tif (!event || event.resetSelection) {\r\n\t\t\teach(chart.axes, function (axis) {\r\n\t\t\t\thasZoomed = axis.zoom();\r\n\t\t\t});\r\n\t\t} else { // else, zoom in on all axes\r\n\t\t\teach(event.xAxis.concat(event.yAxis), function (axisData) {\r\n\t\t\t\tvar axis = axisData.axis,\r\n\t\t\t\t\tisXAxis = axis.isXAxis;\r\n\r\n\t\t\t\t// don't zoom more than minRange\r\n\t\t\t\tif (pointer[isXAxis ? 'zoomX' : 'zoomY'] || pointer[isXAxis ? 'pinchX' : 'pinchY']) {\r\n\t\t\t\t\thasZoomed = axis.zoom(axisData.min, axisData.max);\r\n\t\t\t\t\tif (axis.displayBtn) {\r\n\t\t\t\t\t\tdisplayButton = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t\t\r\n\t\t// Show or hide the Reset zoom button\r\n\t\tresetZoomButton = chart.resetZoomButton;\r\n\t\tif (displayButton && !resetZoomButton) {\r\n\t\t\tchart.showResetZoom();\r\n\t\t} else if (!displayButton && isObject(resetZoomButton)) {\r\n\t\t\tchart.resetZoomButton = resetZoomButton.destroy();\r\n\t\t}\r\n\t\t\r\n\r\n\t\t// Redraw\r\n\t\tif (hasZoomed) {\r\n\t\t\tchart.redraw(\r\n\t\t\t\tpick(chart.options.chart.animation, event && event.animation, chart.pointCount < 100) // animation\r\n\t\t\t);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Pan the chart by dragging the mouse across the pane. This function is called\r\n\t * on mouse move, and the distance to pan is computed from chartX compared to\r\n\t * the first chartX position in the dragging operation.\r\n\t */\r\n\tpan: function (e, panning) {\r\n\r\n\t\tvar chart = this,\r\n\t\t\thoverPoints = chart.hoverPoints,\r\n\t\t\tdoRedraw;\r\n\r\n\t\t// remove active points for shared tooltip\r\n\t\tif (hoverPoints) {\r\n\t\t\teach(hoverPoints, function (point) {\r\n\t\t\t\tpoint.setState();\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\teach(panning === 'xy' ? [1, 0] : [1], function (isX) { // xy is used in maps\r\n\t\t\tvar mousePos = e[isX ? 'chartX' : 'chartY'],\r\n\t\t\t\taxis = chart[isX ? 'xAxis' : 'yAxis'][0],\r\n\t\t\t\tstartPos = chart[isX ? 'mouseDownX' : 'mouseDownY'],\r\n\t\t\t\thalfPointRange = (axis.pointRange || 0) / 2,\r\n\t\t\t\textremes = axis.getExtremes(),\r\n\t\t\t\tnewMin = axis.toValue(startPos - mousePos, true) + halfPointRange,\r\n\t\t\t\tnewMax = axis.toValue(startPos + chart[isX ? 'plotWidth' : 'plotHeight'] - mousePos, true) - halfPointRange;\r\n\r\n\t\t\tif (axis.series.length && newMin > mathMin(extremes.dataMin, extremes.min) && newMax < mathMax(extremes.dataMax, extremes.max)) {\r\n\t\t\t\taxis.setExtremes(newMin, newMax, false, false, { trigger: 'pan' });\r\n\t\t\t\tdoRedraw = true;\r\n\t\t\t}\r\n\r\n\t\t\tchart[isX ? 'mouseDownX' : 'mouseDownY'] = mousePos; // set new reference for next run\r\n\t\t});\r\n\r\n\t\tif (doRedraw) {\r\n\t\t\tchart.redraw(false);\r\n\t\t}\r\n\t\tcss(chart.container, { cursor: 'move' });\r\n\t},\r\n\r\n\t/**\r\n\t * Show the title and subtitle of the chart\r\n\t *\r\n\t * @param titleOptions {Object} New title options\r\n\t * @param subtitleOptions {Object} New subtitle options\r\n\t *\r\n\t */\r\n\tsetTitle: function (titleOptions, subtitleOptions) {\r\n\t\tvar chart = this,\r\n\t\t\toptions = chart.options,\r\n\t\t\tchartTitleOptions,\r\n\t\t\tchartSubtitleOptions;\r\n\r\n\t\tchartTitleOptions = options.title = merge(options.title, titleOptions);\r\n\t\tchartSubtitleOptions = options.subtitle = merge(options.subtitle, subtitleOptions);\r\n\r\n\t\t// add title and subtitle\r\n\t\teach([\r\n\t\t\t['title', titleOptions, chartTitleOptions],\r\n\t\t\t['subtitle', subtitleOptions, chartSubtitleOptions]\r\n\t\t], function (arr) {\r\n\t\t\tvar name = arr[0],\r\n\t\t\t\ttitle = chart[name],\r\n\t\t\t\ttitleOptions = arr[1],\r\n\t\t\t\tchartTitleOptions = arr[2];\r\n\r\n\t\t\tif (title && titleOptions) {\r\n\t\t\t\tchart[name] = title = title.destroy(); // remove old\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (chartTitleOptions && chartTitleOptions.text && !title) {\r\n\t\t\t\tchart[name] = chart.renderer.text(\r\n\t\t\t\t\tchartTitleOptions.text,\r\n\t\t\t\t\t0,\r\n\t\t\t\t\t0,\r\n\t\t\t\t\tchartTitleOptions.useHTML\r\n\t\t\t\t)\r\n\t\t\t\t.attr({\r\n\t\t\t\t\talign: chartTitleOptions.align,\r\n\t\t\t\t\t'class': PREFIX + name,\r\n\t\t\t\t\tzIndex: chartTitleOptions.zIndex || 4\r\n\t\t\t\t})\r\n\t\t\t\t.css(chartTitleOptions.style)\r\n\t\t\t\t.add();\r\n\t\t\t}\t\r\n\t\t});\r\n\t\tchart.layOutTitles();\r\n\t},\r\n\r\n\t/**\r\n\t * Lay out the chart titles and cache the full offset height for use in getMargins\r\n\t */\r\n\tlayOutTitles: function () {\r\n\t\tvar titleOffset = 0,\r\n\t\t\ttitle = this.title,\r\n\t\t\tsubtitle = this.subtitle,\r\n\t\t\toptions = this.options,\r\n\t\t\ttitleOptions = options.title,\r\n\t\t\tsubtitleOptions = options.subtitle,\r\n\t\t\tautoWidth = this.spacingBox.width - 44; // 44 makes room for default context button\r\n\r\n\t\tif (title) {\r\n\t\t\ttitle\r\n\t\t\t\t.css({ width: (titleOptions.width || autoWidth) + PX })\r\n\t\t\t\t.align(extend({ y: 15 }, titleOptions), false, 'spacingBox');\r\n\t\t\t\r\n\t\t\tif (!titleOptions.floating && !titleOptions.verticalAlign) {\r\n\t\t\t\ttitleOffset = title.getBBox().height;\r\n\r\n\t\t\t\t// Adjust for browser consistency + backwards compat after #776 fix\r\n\t\t\t\tif (titleOffset >= 18 && titleOffset <= 25) {\r\n\t\t\t\t\ttitleOffset = 15; \r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (subtitle) {\r\n\t\t\tsubtitle\r\n\t\t\t\t.css({ width: (subtitleOptions.width || autoWidth) + PX })\r\n\t\t\t\t.align(extend({ y: titleOffset + titleOptions.margin }, subtitleOptions), false, 'spacingBox');\r\n\t\t\t\r\n\t\t\tif (!subtitleOptions.floating && !subtitleOptions.verticalAlign) {\r\n\t\t\t\ttitleOffset = mathCeil(titleOffset + subtitle.getBBox().height);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.titleOffset = titleOffset; // used in getMargins\r\n\t},\r\n\r\n\t/**\r\n\t * Get chart width and height according to options and container size\r\n\t */\r\n\tgetChartSize: function () {\r\n\t\tvar chart = this,\r\n\t\t\toptionsChart = chart.options.chart,\r\n\t\t\trenderTo = chart.renderToClone || chart.renderTo;\r\n\r\n\t\t// get inner width and height from jQuery (#824)\r\n\t\tchart.containerWidth = adapterRun(renderTo, 'width');\r\n\t\tchart.containerHeight = adapterRun(renderTo, 'height');\r\n\t\t\r\n\t\tchart.chartWidth = mathMax(0, optionsChart.width || chart.containerWidth || 600); // #1393, 1460\r\n\t\tchart.chartHeight = mathMax(0, pick(optionsChart.height,\r\n\t\t\t// the offsetHeight of an empty container is 0 in standard browsers, but 19 in IE7:\r\n\t\t\tchart.containerHeight > 19 ? chart.containerHeight : 400));\r\n\t},\r\n\r\n\t/**\r\n\t * Create a clone of the chart's renderTo div and place it outside the viewport to allow\r\n\t * size computation on chart.render and chart.redraw\r\n\t */\r\n\tcloneRenderTo: function (revert) {\r\n\t\tvar clone = this.renderToClone,\r\n\t\t\tcontainer = this.container;\r\n\t\t\r\n\t\t// Destroy the clone and bring the container back to the real renderTo div\r\n\t\tif (revert) {\r\n\t\t\tif (clone) {\r\n\t\t\t\tthis.renderTo.appendChild(container);\r\n\t\t\t\tdiscardElement(clone);\r\n\t\t\t\tdelete this.renderToClone;\r\n\t\t\t}\r\n\t\t\r\n\t\t// Set up the clone\r\n\t\t} else {\r\n\t\t\tif (container && container.parentNode === this.renderTo) {\r\n\t\t\t\tthis.renderTo.removeChild(container); // do not clone this\r\n\t\t\t}\r\n\t\t\tthis.renderToClone = clone = this.renderTo.cloneNode(0);\r\n\t\t\tcss(clone, {\r\n\t\t\t\tposition: ABSOLUTE,\r\n\t\t\t\ttop: '-9999px',\r\n\t\t\t\tdisplay: 'block' // #833\r\n\t\t\t});\r\n\t\t\tdoc.body.appendChild(clone);\r\n\t\t\tif (container) {\r\n\t\t\t\tclone.appendChild(container);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Get the containing element, determine the size and create the inner container\r\n\t * div to hold the chart\r\n\t */\r\n\tgetContainer: function () {\r\n\t\tvar chart = this,\r\n\t\t\tcontainer,\r\n\t\t\toptionsChart = chart.options.chart,\r\n\t\t\tchartWidth,\r\n\t\t\tchartHeight,\r\n\t\t\trenderTo,\r\n\t\t\tindexAttrName = 'data-highcharts-chart',\r\n\t\t\toldChartIndex,\r\n\t\t\tcontainerId;\r\n\r\n\t\tchart.renderTo = renderTo = optionsChart.renderTo;\r\n\t\tcontainerId = PREFIX + idCounter++;\r\n\r\n\t\tif (isString(renderTo)) {\r\n\t\t\tchart.renderTo = renderTo = doc.getElementById(renderTo);\r\n\t\t}\r\n\t\t\r\n\t\t// Display an error if the renderTo is wrong\r\n\t\tif (!renderTo) {\r\n\t\t\terror(13, true);\r\n\t\t}\r\n\t\t\r\n\t\t// If the container already holds a chart, destroy it\r\n\t\toldChartIndex = pInt(attr(renderTo, indexAttrName));\r\n\t\tif (!isNaN(oldChartIndex) && charts[oldChartIndex]) {\r\n\t\t\tcharts[oldChartIndex].destroy();\r\n\t\t}\t\t\r\n\t\t\r\n\t\t// Make a reference to the chart from the div\r\n\t\tattr(renderTo, indexAttrName, chart.index);\r\n\r\n\t\t// remove previous chart\r\n\t\trenderTo.innerHTML = '';\r\n\r\n\t\t// If the container doesn't have an offsetWidth, it has or is a child of a node\r\n\t\t// that has display:none. We need to temporarily move it out to a visible\r\n\t\t// state to determine the size, else the legend and tooltips won't render\r\n\t\t// properly\r\n\t\tif (!renderTo.offsetWidth) {\r\n\t\t\tchart.cloneRenderTo();\r\n\t\t}\r\n\r\n\t\t// get the width and height\r\n\t\tchart.getChartSize();\r\n\t\tchartWidth = chart.chartWidth;\r\n\t\tchartHeight = chart.chartHeight;\r\n\r\n\t\t// create the inner container\r\n\t\tchart.container = container = createElement(DIV, {\r\n\t\t\t\tclassName: PREFIX + 'container' +\r\n\t\t\t\t\t(optionsChart.className ? ' ' + optionsChart.className : ''),\r\n\t\t\t\tid: containerId\r\n\t\t\t}, extend({\r\n\t\t\t\tposition: RELATIVE,\r\n\t\t\t\toverflow: HIDDEN, // needed for context menu (avoid scrollbars) and\r\n\t\t\t\t\t// content overflow in IE\r\n\t\t\t\twidth: chartWidth + PX,\r\n\t\t\t\theight: chartHeight + PX,\r\n\t\t\t\ttextAlign: 'left',\r\n\t\t\t\tlineHeight: 'normal', // #427\r\n\t\t\t\tzIndex: 0, // #1072\r\n\t\t\t\t'-webkit-tap-highlight-color': 'rgba(0,0,0,0)'\r\n\t\t\t}, optionsChart.style),\r\n\t\t\tchart.renderToClone || renderTo\r\n\t\t);\r\n\r\n\t\t// cache the cursor (#1650)\r\n\t\tchart._cursor = container.style.cursor;\r\n\r\n\t\tchart.renderer =\r\n\t\t\toptionsChart.forExport ? // force SVG, used for SVG export\r\n\t\t\t\tnew SVGRenderer(container, chartWidth, chartHeight, true) :\r\n\t\t\t\tnew Renderer(container, chartWidth, chartHeight);\r\n\r\n\t\tif (useCanVG) {\r\n\t\t\t// If we need canvg library, extend and configure the renderer\r\n\t\t\t// to get the tracker for translating mouse events\r\n\t\t\tchart.renderer.create(chart, container, chartWidth, chartHeight);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Calculate margins by rendering axis labels in a preliminary position. Title,\r\n\t * subtitle and legend have already been rendered at this stage, but will be\r\n\t * moved into their final positions\r\n\t */\r\n\tgetMargins: function () {\r\n\t\tvar chart = this,\r\n\t\t\tspacing = chart.spacing,\r\n\t\t\taxisOffset,\r\n\t\t\tlegend = chart.legend,\r\n\t\t\tmargin = chart.margin,\r\n\t\t\tlegendOptions = chart.options.legend,\r\n\t\t\tlegendMargin = pick(legendOptions.margin, 10),\r\n\t\t\tlegendX = legendOptions.x,\r\n\t\t\tlegendY = legendOptions.y,\r\n\t\t\talign = legendOptions.align,\r\n\t\t\tverticalAlign = legendOptions.verticalAlign,\r\n\t\t\ttitleOffset = chart.titleOffset;\r\n\r\n\t\tchart.resetMargins();\r\n\t\taxisOffset = chart.axisOffset;\r\n\r\n\t\t// Adjust for title and subtitle\r\n\t\tif (titleOffset && !defined(margin[0])) {\r\n\t\t\tchart.plotTop = mathMax(chart.plotTop, titleOffset + chart.options.title.margin + spacing[0]);\r\n\t\t}\r\n\t\t\r\n\t\t// Adjust for legend\r\n\t\tif (legend.display && !legendOptions.floating) {\r\n\t\t\tif (align === 'right') { // horizontal alignment handled first\r\n\t\t\t\tif (!defined(margin[1])) {\r\n\t\t\t\t\tchart.marginRight = mathMax(\r\n\t\t\t\t\t\tchart.marginRight,\r\n\t\t\t\t\t\tlegend.legendWidth - legendX + legendMargin + spacing[1]\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t} else if (align === 'left') {\r\n\t\t\t\tif (!defined(margin[3])) {\r\n\t\t\t\t\tchart.plotLeft = mathMax(\r\n\t\t\t\t\t\tchart.plotLeft,\r\n\t\t\t\t\t\tlegend.legendWidth + legendX + legendMargin + spacing[3]\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if (verticalAlign === 'top') {\r\n\t\t\t\tif (!defined(margin[0])) {\r\n\t\t\t\t\tchart.plotTop = mathMax(\r\n\t\t\t\t\t\tchart.plotTop,\r\n\t\t\t\t\t\tlegend.legendHeight + legendY + legendMargin + spacing[0]\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if (verticalAlign === 'bottom') {\r\n\t\t\t\tif (!defined(margin[2])) {\r\n\t\t\t\t\tchart.marginBottom = mathMax(\r\n\t\t\t\t\t\tchart.marginBottom,\r\n\t\t\t\t\t\tlegend.legendHeight - legendY + legendMargin + spacing[2]\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// adjust for scroller\r\n\t\tif (chart.extraBottomMargin) {\r\n\t\t\tchart.marginBottom += chart.extraBottomMargin;\r\n\t\t}\r\n\t\tif (chart.extraTopMargin) {\r\n\t\t\tchart.plotTop += chart.extraTopMargin;\r\n\t\t}\r\n\r\n\t\t// pre-render axes to get labels offset width\r\n\t\tif (chart.hasCartesianSeries) {\r\n\t\t\teach(chart.axes, function (axis) {\r\n\t\t\t\taxis.getOffset();\r\n\t\t\t});\r\n\t\t}\r\n\t\t\r\n\t\tif (!defined(margin[3])) {\r\n\t\t\tchart.plotLeft += axisOffset[3];\r\n\t\t}\r\n\t\tif (!defined(margin[0])) {\r\n\t\t\tchart.plotTop += axisOffset[0];\r\n\t\t}\r\n\t\tif (!defined(margin[2])) {\r\n\t\t\tchart.marginBottom += axisOffset[2];\r\n\t\t}\r\n\t\tif (!defined(margin[1])) {\r\n\t\t\tchart.marginRight += axisOffset[1];\r\n\t\t}\r\n\r\n\t\tchart.setChartSize();\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Add the event handlers necessary for auto resizing\r\n\t *\r\n\t */\r\n\tinitReflow: function () {\r\n\t\tvar chart = this,\r\n\t\t\toptionsChart = chart.options.chart,\r\n\t\t\trenderTo = chart.renderTo,\r\n\t\t\treflowTimeout;\r\n\t\t\t\r\n\t\tfunction reflow(e) {\r\n\t\t\tvar width = optionsChart.width || adapterRun(renderTo, 'width'),\r\n\t\t\t\theight = optionsChart.height || adapterRun(renderTo, 'height'),\r\n\t\t\t\ttarget = e ? e.target : win; // #805 - MooTools doesn't supply e\r\n\t\t\t\t\r\n\t\t\t// Width and height checks for display:none. Target is doc in IE8 and Opera,\r\n\t\t\t// win in Firefox, Chrome and IE9.\r\n\t\t\tif (!chart.hasUserSize && width && height && (target === win || target === doc)) {\r\n\t\t\t\t\r\n\t\t\t\tif (width !== chart.containerWidth || height !== chart.containerHeight) {\r\n\t\t\t\t\tclearTimeout(reflowTimeout);\r\n\t\t\t\t\tchart.reflowTimeout = reflowTimeout = setTimeout(function () {\r\n\t\t\t\t\t\tif (chart.container) { // It may have been destroyed in the meantime (#1257)\r\n\t\t\t\t\t\t\tchart.setSize(width, height, false);\r\n\t\t\t\t\t\t\tchart.hasUserSize = null;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, 100);\r\n\t\t\t\t}\r\n\t\t\t\tchart.containerWidth = width;\r\n\t\t\t\tchart.containerHeight = height;\r\n\t\t\t}\r\n\t\t}\r\n\t\tchart.reflow = reflow;\r\n\t\taddEvent(win, 'resize', reflow);\r\n\t\taddEvent(chart, 'destroy', function () {\r\n\t\t\tremoveEvent(win, 'resize', reflow);\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Resize the chart to a given width and height\r\n\t * @param {Number} width\r\n\t * @param {Number} height\r\n\t * @param {Object|Boolean} animation\r\n\t */\r\n\tsetSize: function (width, height, animation) {\r\n\t\tvar chart = this,\r\n\t\t\tchartWidth,\r\n\t\t\tchartHeight,\r\n\t\t\tfireEndResize;\r\n\r\n\t\t// Handle the isResizing counter\r\n\t\tchart.isResizing += 1;\r\n\t\tfireEndResize = function () {\r\n\t\t\tif (chart) {\r\n\t\t\t\tfireEvent(chart, 'endResize', null, function () {\r\n\t\t\t\t\tchart.isResizing -= 1;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// set the animation for the current process\r\n\t\tsetAnimation(animation, chart);\r\n\r\n\t\tchart.oldChartHeight = chart.chartHeight;\r\n\t\tchart.oldChartWidth = chart.chartWidth;\r\n\t\tif (defined(width)) {\r\n\t\t\tchart.chartWidth = chartWidth = mathMax(0, mathRound(width));\r\n\t\t\tchart.hasUserSize = !!chartWidth;\r\n\t\t}\r\n\t\tif (defined(height)) {\r\n\t\t\tchart.chartHeight = chartHeight = mathMax(0, mathRound(height));\r\n\t\t}\r\n\r\n\t\tcss(chart.container, {\r\n\t\t\twidth: chartWidth + PX,\r\n\t\t\theight: chartHeight + PX\r\n\t\t});\r\n\t\tchart.setChartSize(true);\r\n\t\tchart.renderer.setSize(chartWidth, chartHeight, animation);\r\n\r\n\t\t// handle axes\r\n\t\tchart.maxTicks = null;\r\n\t\teach(chart.axes, function (axis) {\r\n\t\t\taxis.isDirty = true;\r\n\t\t\taxis.setScale();\r\n\t\t});\r\n\r\n\t\t// make sure non-cartesian series are also handled\r\n\t\teach(chart.series, function (serie) {\r\n\t\t\tserie.isDirty = true;\r\n\t\t});\r\n\r\n\t\tchart.isDirtyLegend = true; // force legend redraw\r\n\t\tchart.isDirtyBox = true; // force redraw of plot and chart border\r\n\r\n\t\tchart.getMargins();\r\n\r\n\t\tchart.redraw(animation);\r\n\r\n\r\n\t\tchart.oldChartHeight = null;\r\n\t\tfireEvent(chart, 'resize');\r\n\r\n\t\t// fire endResize and set isResizing back\r\n\t\t// If animation is disabled, fire without delay\r\n\t\tif (globalAnimation === false) {\r\n\t\t\tfireEndResize();\r\n\t\t} else { // else set a timeout with the animation duration\r\n\t\t\tsetTimeout(fireEndResize, (globalAnimation && globalAnimation.duration) || 500);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Set the public chart properties. This is done before and after the pre-render\r\n\t * to determine margin sizes\r\n\t */\r\n\tsetChartSize: function (skipAxes) {\r\n\t\tvar chart = this,\r\n\t\t\tinverted = chart.inverted,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\tchartWidth = chart.chartWidth,\r\n\t\t\tchartHeight = chart.chartHeight,\r\n\t\t\toptionsChart = chart.options.chart,\r\n\t\t\tspacing = chart.spacing,\r\n\t\t\tclipOffset = chart.clipOffset,\r\n\t\t\tclipX,\r\n\t\t\tclipY,\r\n\t\t\tplotLeft,\r\n\t\t\tplotTop,\r\n\t\t\tplotWidth,\r\n\t\t\tplotHeight,\r\n\t\t\tplotBorderWidth;\r\n\r\n\t\tchart.plotLeft = plotLeft = mathRound(chart.plotLeft);\r\n\t\tchart.plotTop = plotTop = mathRound(chart.plotTop);\r\n\t\tchart.plotWidth = plotWidth = mathMax(0, mathRound(chartWidth - plotLeft - chart.marginRight));\r\n\t\tchart.plotHeight = plotHeight = mathMax(0, mathRound(chartHeight - plotTop - chart.marginBottom));\r\n\r\n\t\tchart.plotSizeX = inverted ? plotHeight : plotWidth;\r\n\t\tchart.plotSizeY = inverted ? plotWidth : plotHeight;\r\n\t\t\r\n\t\tchart.plotBorderWidth = optionsChart.plotBorderWidth || 0;\r\n\r\n\t\t// Set boxes used for alignment\r\n\t\tchart.spacingBox = renderer.spacingBox = {\r\n\t\t\tx: spacing[3],\r\n\t\t\ty: spacing[0],\r\n\t\t\twidth: chartWidth - spacing[3] - spacing[1],\r\n\t\t\theight: chartHeight - spacing[0] - spacing[2]\r\n\t\t};\r\n\t\tchart.plotBox = renderer.plotBox = {\r\n\t\t\tx: plotLeft,\r\n\t\t\ty: plotTop,\r\n\t\t\twidth: plotWidth,\r\n\t\t\theight: plotHeight\r\n\t\t};\r\n\r\n\t\tplotBorderWidth = 2 * mathFloor(chart.plotBorderWidth / 2);\r\n\t\tclipX = mathCeil(mathMax(plotBorderWidth, clipOffset[3]) / 2);\r\n\t\tclipY = mathCeil(mathMax(plotBorderWidth, clipOffset[0]) / 2);\r\n\t\tchart.clipBox = {\r\n\t\t\tx: clipX, \r\n\t\t\ty: clipY, \r\n\t\t\twidth: mathFloor(chart.plotSizeX - mathMax(plotBorderWidth, clipOffset[1]) / 2 - clipX), \r\n\t\t\theight: mathFloor(chart.plotSizeY - mathMax(plotBorderWidth, clipOffset[2]) / 2 - clipY)\r\n\t\t};\r\n\r\n\t\tif (!skipAxes) {\r\n\t\t\teach(chart.axes, function (axis) {\r\n\t\t\t\taxis.setAxisSize();\r\n\t\t\t\taxis.setAxisTranslation();\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Initial margins before auto size margins are applied\r\n\t */\r\n\tresetMargins: function () {\r\n\t\tvar chart = this,\r\n\t\t\tspacing = chart.spacing,\r\n\t\t\tmargin = chart.margin;\r\n\r\n\t\tchart.plotTop = pick(margin[0], spacing[0]);\r\n\t\tchart.marginRight = pick(margin[1], spacing[1]);\r\n\t\tchart.marginBottom = pick(margin[2], spacing[2]);\r\n\t\tchart.plotLeft = pick(margin[3], spacing[3]);\r\n\t\tchart.axisOffset = [0, 0, 0, 0]; // top, right, bottom, left\r\n\t\tchart.clipOffset = [0, 0, 0, 0];\r\n\t},\r\n\r\n\t/**\r\n\t * Draw the borders and backgrounds for chart and plot area\r\n\t */\r\n\tdrawChartBox: function () {\r\n\t\tvar chart = this,\r\n\t\t\toptionsChart = chart.options.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\tchartWidth = chart.chartWidth,\r\n\t\t\tchartHeight = chart.chartHeight,\r\n\t\t\tchartBackground = chart.chartBackground,\r\n\t\t\tplotBackground = chart.plotBackground,\r\n\t\t\tplotBorder = chart.plotBorder,\r\n\t\t\tplotBGImage = chart.plotBGImage,\r\n\t\t\tchartBorderWidth = optionsChart.borderWidth || 0,\r\n\t\t\tchartBackgroundColor = optionsChart.backgroundColor,\r\n\t\t\tplotBackgroundColor = optionsChart.plotBackgroundColor,\r\n\t\t\tplotBackgroundImage = optionsChart.plotBackgroundImage,\r\n\t\t\tplotBorderWidth = optionsChart.plotBorderWidth || 0,\r\n\t\t\tmgn,\r\n\t\t\tbgAttr,\r\n\t\t\tplotLeft = chart.plotLeft,\r\n\t\t\tplotTop = chart.plotTop,\r\n\t\t\tplotWidth = chart.plotWidth,\r\n\t\t\tplotHeight = chart.plotHeight,\r\n\t\t\tplotBox = chart.plotBox,\r\n\t\t\tclipRect = chart.clipRect,\r\n\t\t\tclipBox = chart.clipBox;\r\n\r\n\t\t// Chart area\r\n\t\tmgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0);\r\n\r\n\t\tif (chartBorderWidth || chartBackgroundColor) {\r\n\t\t\tif (!chartBackground) {\r\n\t\t\t\t\r\n\t\t\t\tbgAttr = {\r\n\t\t\t\t\tfill: chartBackgroundColor || NONE\r\n\t\t\t\t};\r\n\t\t\t\tif (chartBorderWidth) { // #980\r\n\t\t\t\t\tbgAttr.stroke = optionsChart.borderColor;\r\n\t\t\t\t\tbgAttr['stroke-width'] = chartBorderWidth;\r\n\t\t\t\t}\r\n\t\t\t\tchart.chartBackground = renderer.rect(mgn / 2, mgn / 2, chartWidth - mgn, chartHeight - mgn,\r\n\t\t\t\t\t\toptionsChart.borderRadius, chartBorderWidth)\r\n\t\t\t\t\t.attr(bgAttr)\r\n\t\t\t\t\t.add()\r\n\t\t\t\t\t.shadow(optionsChart.shadow);\r\n\r\n\t\t\t} else { // resize\r\n\t\t\t\tchartBackground.animate(\r\n\t\t\t\t\tchartBackground.crisp(null, null, null, chartWidth - mgn, chartHeight - mgn)\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\r\n\t\t// Plot background\r\n\t\tif (plotBackgroundColor) {\r\n\t\t\tif (!plotBackground) {\r\n\t\t\t\tchart.plotBackground = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0)\r\n\t\t\t\t\t.attr({\r\n\t\t\t\t\t\tfill: plotBackgroundColor\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.add()\r\n\t\t\t\t\t.shadow(optionsChart.plotShadow);\r\n\t\t\t} else {\r\n\t\t\t\tplotBackground.animate(plotBox);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (plotBackgroundImage) {\r\n\t\t\tif (!plotBGImage) {\r\n\t\t\t\tchart.plotBGImage = renderer.image(plotBackgroundImage, plotLeft, plotTop, plotWidth, plotHeight)\r\n\t\t\t\t\t.add();\r\n\t\t\t} else {\r\n\t\t\t\tplotBGImage.animate(plotBox);\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// Plot clip\r\n\t\tif (!clipRect) {\r\n\t\t\tchart.clipRect = renderer.clipRect(clipBox);\r\n\t\t} else {\r\n\t\t\tclipRect.animate({\r\n\t\t\t\twidth: clipBox.width,\r\n\t\t\t\theight: clipBox.height\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Plot area border\r\n\t\tif (plotBorderWidth) {\r\n\t\t\tif (!plotBorder) {\r\n\t\t\t\tchart.plotBorder = renderer.rect(plotLeft, plotTop, plotWidth, plotHeight, 0, -plotBorderWidth)\r\n\t\t\t\t\t.attr({\r\n\t\t\t\t\t\tstroke: optionsChart.plotBorderColor,\r\n\t\t\t\t\t\t'stroke-width': plotBorderWidth,\r\n\t\t\t\t\t\tzIndex: 1\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.add();\r\n\t\t\t} else {\r\n\t\t\t\tplotBorder.animate(\r\n\t\t\t\t\tplotBorder.crisp(null, plotLeft, plotTop, plotWidth, plotHeight)\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// reset\r\n\t\tchart.isDirtyBox = false;\r\n\t},\r\n\r\n\t/**\r\n\t * Detect whether a certain chart property is needed based on inspecting its options\r\n\t * and series. This mainly applies to the chart.invert property, and in extensions to \r\n\t * the chart.angular and chart.polar properties.\r\n\t */\r\n\tpropFromSeries: function () {\r\n\t\tvar chart = this,\r\n\t\t\toptionsChart = chart.options.chart,\r\n\t\t\tklass,\r\n\t\t\tseriesOptions = chart.options.series,\r\n\t\t\ti,\r\n\t\t\tvalue;\r\n\t\t\t\r\n\t\t\t\r\n\t\teach(['inverted', 'angular', 'polar'], function (key) {\r\n\t\t\t\r\n\t\t\t// The default series type's class\r\n\t\t\tklass = seriesTypes[optionsChart.type || optionsChart.defaultSeriesType];\r\n\t\t\t\r\n\t\t\t// Get the value from available chart-wide properties\r\n\t\t\tvalue = (\r\n\t\t\t\tchart[key] || // 1. it is set before\r\n\t\t\t\toptionsChart[key] || // 2. it is set in the options\r\n\t\t\t\t(klass && klass.prototype[key]) // 3. it's default series class requires it\r\n\t\t\t);\r\n\t\r\n\t\t\t// 4. Check if any the chart's series require it\r\n\t\t\ti = seriesOptions && seriesOptions.length;\r\n\t\t\twhile (!value && i--) {\r\n\t\t\t\tklass = seriesTypes[seriesOptions[i].type];\r\n\t\t\t\tif (klass && klass.prototype[key]) {\r\n\t\t\t\t\tvalue = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\r\n\t\t\t// Set the chart property\r\n\t\t\tchart[key] = value;\t\r\n\t\t});\r\n\t\t\r\n\t},\r\n\r\n\t/**\r\n\t * Link two or more series together. This is done initially from Chart.render,\r\n\t * and after Chart.addSeries and Series.remove.\r\n\t */\r\n\tlinkSeries: function () {\r\n\t\tvar chart = this,\r\n\t\t\tchartSeries = chart.series;\r\n\r\n\t\t// Reset links\r\n\t\teach(chartSeries, function (series) {\r\n\t\t\tseries.linkedSeries.length = 0;\r\n\t\t});\r\n\r\n\t\t// Apply new links\r\n\t\teach(chartSeries, function (series) {\r\n\t\t\tvar linkedTo = series.options.linkedTo;\r\n\t\t\tif (isString(linkedTo)) {\r\n\t\t\t\tif (linkedTo === ':previous') {\r\n\t\t\t\t\tlinkedTo = chart.series[series.index - 1];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tlinkedTo = chart.get(linkedTo);\r\n\t\t\t\t}\r\n\t\t\t\tif (linkedTo) {\r\n\t\t\t\t\tlinkedTo.linkedSeries.push(series);\r\n\t\t\t\t\tseries.linkedParent = linkedTo;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Render all graphics for the chart\r\n\t */\r\n\trender: function () {\r\n\t\tvar chart = this,\r\n\t\t\taxes = chart.axes,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\toptions = chart.options;\r\n\r\n\t\tvar labels = options.labels,\r\n\t\t\tcredits = options.credits,\r\n\t\t\tcreditsHref;\r\n\r\n\t\t// Title\r\n\t\tchart.setTitle();\r\n\r\n\r\n\t\t// Legend\r\n\t\tchart.legend = new Legend(chart, options.legend);\r\n\r\n\t\tchart.getStacks(); // render stacks\r\n\r\n\t\t// Get margins by pre-rendering axes\r\n\t\t// set axes scales\r\n\t\teach(axes, function (axis) {\r\n\t\t\taxis.setScale();\r\n\t\t});\r\n\r\n\t\tchart.getMargins();\r\n\r\n\t\tchart.maxTicks = null; // reset for second pass\r\n\t\teach(axes, function (axis) {\r\n\t\t\taxis.setTickPositions(true); // update to reflect the new margins\r\n\t\t\taxis.setMaxTicks();\r\n\t\t});\r\n\t\tchart.adjustTickAmounts();\r\n\t\tchart.getMargins(); // second pass to check for new labels\r\n\r\n\r\n\t\t// Draw the borders and backgrounds\r\n\t\tchart.drawChartBox();\t\t\r\n\r\n\r\n\t\t// Axes\r\n\t\tif (chart.hasCartesianSeries) {\r\n\t\t\teach(axes, function (axis) {\r\n\t\t\t\taxis.render();\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// The series\r\n\t\tif (!chart.seriesGroup) {\r\n\t\t\tchart.seriesGroup = renderer.g('series-group')\r\n\t\t\t\t.attr({ zIndex: 3 })\r\n\t\t\t\t.add();\r\n\t\t}\r\n\t\teach(chart.series, function (serie) {\r\n\t\t\tserie.translate();\r\n\t\t\tserie.setTooltipPoints();\r\n\t\t\tserie.render();\r\n\t\t});\r\n\r\n\t\t// Labels\r\n\t\tif (labels.items) {\r\n\t\t\teach(labels.items, function (label) {\r\n\t\t\t\tvar style = extend(labels.style, label.style),\r\n\t\t\t\t\tx = pInt(style.left) + chart.plotLeft,\r\n\t\t\t\t\ty = pInt(style.top) + chart.plotTop + 12;\r\n\r\n\t\t\t\t// delete to prevent rewriting in IE\r\n\t\t\t\tdelete style.left;\r\n\t\t\t\tdelete style.top;\r\n\r\n\t\t\t\trenderer.text(\r\n\t\t\t\t\tlabel.html,\r\n\t\t\t\t\tx,\r\n\t\t\t\t\ty\r\n\t\t\t\t)\r\n\t\t\t\t.attr({ zIndex: 2 })\r\n\t\t\t\t.css(style)\r\n\t\t\t\t.add();\r\n\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Credits\r\n\t\tif (credits.enabled && !chart.credits) {\r\n\t\t\tcreditsHref = credits.href;\r\n\t\t\tchart.credits = renderer.text(\r\n\t\t\t\tcredits.text,\r\n\t\t\t\t0,\r\n\t\t\t\t0\r\n\t\t\t)\r\n\t\t\t.on('click', function () {\r\n\t\t\t\tif (creditsHref) {\r\n\t\t\t\t\tlocation.href = creditsHref;\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.attr({\r\n\t\t\t\talign: credits.position.align,\r\n\t\t\t\tzIndex: 8\r\n\t\t\t})\r\n\t\t\t.css(credits.style)\r\n\t\t\t.add()\r\n\t\t\t.align(credits.position);\r\n\t\t}\r\n\r\n\t\t// Set flag\r\n\t\tchart.hasRendered = true;\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Clean up memory usage\r\n\t */\r\n\tdestroy: function () {\r\n\t\tvar chart = this,\r\n\t\t\taxes = chart.axes,\r\n\t\t\tseries = chart.series,\r\n\t\t\tcontainer = chart.container,\r\n\t\t\ti,\r\n\t\t\tparentNode = container && container.parentNode;\r\n\t\t\t\r\n\t\t// fire the chart.destoy event\r\n\t\tfireEvent(chart, 'destroy');\r\n\t\t\r\n\t\t// Delete the chart from charts lookup array\r\n\t\tcharts[chart.index] = UNDEFINED;\r\n\t\tchart.renderTo.removeAttribute('data-highcharts-chart');\r\n\r\n\t\t// remove events\r\n\t\tremoveEvent(chart);\r\n\r\n\t\t// ==== Destroy collections:\r\n\t\t// Destroy axes\r\n\t\ti = axes.length;\r\n\t\twhile (i--) {\r\n\t\t\taxes[i] = axes[i].destroy();\r\n\t\t}\r\n\r\n\t\t// Destroy each series\r\n\t\ti = series.length;\r\n\t\twhile (i--) {\r\n\t\t\tseries[i] = series[i].destroy();\r\n\t\t}\r\n\r\n\t\t// ==== Destroy chart properties:\r\n\t\teach(['title', 'subtitle', 'chartBackground', 'plotBackground', 'plotBGImage', \r\n\t\t\t\t'plotBorder', 'seriesGroup', 'clipRect', 'credits', 'pointer', 'scroller', \r\n\t\t\t\t'rangeSelector', 'legend', 'resetZoomButton', 'tooltip', 'renderer'], function (name) {\r\n\t\t\tvar prop = chart[name];\r\n\r\n\t\t\tif (prop && prop.destroy) {\r\n\t\t\t\tchart[name] = prop.destroy();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// remove container and all SVG\r\n\t\tif (container) { // can break in IE when destroyed before finished loading\r\n\t\t\tcontainer.innerHTML = '';\r\n\t\t\tremoveEvent(container);\r\n\t\t\tif (parentNode) {\r\n\t\t\t\tdiscardElement(container);\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\t// clean it all up\r\n\t\tfor (i in chart) {\r\n\t\t\tdelete chart[i];\r\n\t\t}\r\n\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * VML namespaces can't be added until after complete. Listening\r\n\t * for Perini's doScroll hack is not enough.\r\n\t */\r\n\tisReadyToRender: function () {\r\n\t\tvar chart = this;\r\n\r\n\t\t// Note: in spite of JSLint's complaints, win == win.top is required\r\n\t\t/*jslint eqeq: true*/\r\n\t\tif ((!hasSVG && (win == win.top && doc.readyState !== 'complete')) || (useCanVG && !win.canvg)) {\r\n\t\t/*jslint eqeq: false*/\r\n\t\t\tif (useCanVG) {\r\n\t\t\t\t// Delay rendering until canvg library is downloaded and ready\r\n\t\t\t\tCanVGController.push(function () { chart.firstRender(); }, chart.options.global.canvasToolsURL);\r\n\t\t\t} else {\r\n\t\t\t\tdoc.attachEvent('onreadystatechange', function () {\r\n\t\t\t\t\tdoc.detachEvent('onreadystatechange', chart.firstRender);\r\n\t\t\t\t\tif (doc.readyState === 'complete') {\r\n\t\t\t\t\t\tchart.firstRender();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n\r\n\t/**\r\n\t * Prepare for first rendering after all data are loaded\r\n\t */\r\n\tfirstRender: function () {\r\n\t\tvar chart = this,\r\n\t\t\toptions = chart.options,\r\n\t\t\tcallback = chart.callback;\r\n\r\n\t\t// Check whether the chart is ready to render\r\n\t\tif (!chart.isReadyToRender()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Create the container\r\n\t\tchart.getContainer();\r\n\r\n\t\t// Run an early event after the container and renderer are established\r\n\t\tfireEvent(chart, 'init');\r\n\r\n\t\t\r\n\t\tchart.resetMargins();\r\n\t\tchart.setChartSize();\r\n\r\n\t\t// Set the common chart properties (mainly invert) from the given series\r\n\t\tchart.propFromSeries();\r\n\r\n\t\t// get axes\r\n\t\tchart.getAxes();\r\n\r\n\t\t// Initialize the series\r\n\t\teach(options.series || [], function (serieOptions) {\r\n\t\t\tchart.initSeries(serieOptions);\r\n\t\t});\r\n\r\n\t\tchart.linkSeries();\r\n\r\n\t\t// Run an event after axes and series are initialized, but before render. At this stage,\r\n\t\t// the series data is indexed and cached in the xData and yData arrays, so we can access\r\n\t\t// those before rendering. Used in Highstock. \r\n\t\tfireEvent(chart, 'beforeRender'); \r\n\r\n\t\t// depends on inverted and on margins being set\r\n\t\tchart.pointer = new Pointer(chart, options);\r\n\r\n\t\tchart.render();\r\n\r\n\t\t// add canvas\r\n\t\tchart.renderer.draw();\r\n\t\t// run callbacks\r\n\t\tif (callback) {\r\n\t\t\tcallback.apply(chart, [chart]);\r\n\t\t}\r\n\t\teach(chart.callbacks, function (fn) {\r\n\t\t\tfn.apply(chart, [chart]);\r\n\t\t});\r\n\t\t\r\n\t\t\r\n\t\t// If the chart was rendered outside the top container, put it back in\r\n\t\tchart.cloneRenderTo(true);\r\n\r\n\t\tfireEvent(chart, 'load');\r\n\r\n\t},\r\n\r\n\t/**\r\n\t* Creates arrays for spacing and margin from given options.\r\n\t*/\r\n\tsplashArray: function (target, options) {\r\n\t\tvar oVar = options[target],\r\n\t\t\ttArray = isObject(oVar) ? oVar : [oVar, oVar, oVar, oVar];\r\n\r\n\t\treturn [pick(options[target + 'Top'], tArray[0]),\r\n\t\t\t\tpick(options[target + 'Right'], tArray[1]),\r\n\t\t\t\tpick(options[target + 'Bottom'], tArray[2]),\r\n\t\t\t\tpick(options[target + 'Left'], tArray[3])];\r\n\t}\r\n}; // end Chart\r\n\r\n// Hook for exporting module\r\nChart.prototype.callbacks = [];\r\n/**\r\n * The Point object and prototype. Inheritable and used as base for PiePoint\r\n */\r\nvar Point = function () {};\r\nPoint.prototype = {\r\n\r\n\t/**\r\n\t * Initialize the point\r\n\t * @param {Object} series The series object containing this point\r\n\t * @param {Object} options The data in either number, array or object format\r\n\t */\r\n\tinit: function (series, options, x) {\r\n\r\n\t\tvar point = this,\r\n\t\t\tcolors;\r\n\t\tpoint.series = series;\r\n\t\tpoint.applyOptions(options, x);\r\n\t\tpoint.pointAttr = {};\r\n\r\n\t\tif (series.options.colorByPoint) {\r\n\t\t\tcolors = series.options.colors || series.chart.options.colors;\r\n\t\t\tpoint.color = point.color || colors[series.colorCounter++];\r\n\t\t\t// loop back to zero\r\n\t\t\tif (series.colorCounter === colors.length) {\r\n\t\t\t\tseries.colorCounter = 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tseries.chart.pointCount++;\r\n\t\treturn point;\r\n\t},\r\n\t/**\r\n\t * Apply the options containing the x and y data and possible some extra properties.\r\n\t * This is called on point init or from point.update.\r\n\t *\r\n\t * @param {Object} options\r\n\t */\r\n\tapplyOptions: function (options, x) {\r\n\t\tvar point = this,\r\n\t\t\tseries = point.series,\r\n\t\t\tpointValKey = series.pointValKey;\r\n\r\n\t\toptions = Point.prototype.optionsToObject.call(this, options);\r\n\r\n\t\t// copy options directly to point\r\n\t\textend(point, options);\r\n\t\tpoint.options = point.options ? extend(point.options, options) : options;\r\n\t\t\t\r\n\t\t// For higher dimension series types. For instance, for ranges, point.y is mapped to point.low.\r\n\t\tif (pointValKey) {\r\n\t\t\tpoint.y = point[pointValKey];\r\n\t\t}\r\n\t\t\r\n\t\t// If no x is set by now, get auto incremented value. All points must have an\r\n\t\t// x value, however the y value can be null to create a gap in the series\r\n\t\tif (point.x === UNDEFINED && series) {\r\n\t\t\tpoint.x = x === UNDEFINED ? series.autoIncrement() : x;\r\n\t\t}\r\n\t\t\r\n\t\treturn point;\r\n\t},\r\n\r\n\t/**\r\n\t * Transform number or array configs into objects\r\n\t */\r\n\toptionsToObject: function (options) {\r\n\t\tvar ret = {},\r\n\t\t\tseries = this.series,\r\n\t\t\tpointArrayMap = series.pointArrayMap || ['y'],\r\n\t\t\tvalueCount = pointArrayMap.length,\r\n\t\t\tfirstItemType,\r\n\t\t\ti = 0,\r\n\t\t\tj = 0;\r\n\r\n\t\tif (typeof options === 'number' || options === null) {\r\n\t\t\tret[pointArrayMap[0]] = options;\r\n\r\n\t\t} else if (isArray(options)) {\r\n\t\t\t// with leading x value\r\n\t\t\tif (options.length > valueCount) {\r\n\t\t\t\tfirstItemType = typeof options[0];\r\n\t\t\t\tif (firstItemType === 'string') {\r\n\t\t\t\t\tret.name = options[0];\r\n\t\t\t\t} else if (firstItemType === 'number') {\r\n\t\t\t\t\tret.x = options[0];\r\n\t\t\t\t}\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t\twhile (j < valueCount) {\r\n\t\t\t\tret[pointArrayMap[j++]] = options[i++];\r\n\t\t\t}\t\t\t\r\n\t\t} else if (typeof options === 'object') {\r\n\t\t\tret = options;\r\n\r\n\t\t\t// This is the fastest way to detect if there are individual point dataLabels that need \r\n\t\t\t// to be considered in drawDataLabels. These can only occur in object configs.\r\n\t\t\tif (options.dataLabels) {\r\n\t\t\t\tseries._hasPointLabels = true;\r\n\t\t\t}\r\n\r\n\t\t\t// Same approach as above for markers\r\n\t\t\tif (options.marker) {\r\n\t\t\t\tseries._hasPointMarkers = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn ret;\r\n\t},\r\n\r\n\t/**\r\n\t * Destroy a point to clear memory. Its reference still stays in series.data.\r\n\t */\r\n\tdestroy: function () {\r\n\t\tvar point = this,\r\n\t\t\tseries = point.series,\r\n\t\t\tchart = series.chart,\r\n\t\t\thoverPoints = chart.hoverPoints,\r\n\t\t\tprop;\r\n\r\n\t\tchart.pointCount--;\r\n\r\n\t\tif (hoverPoints) {\r\n\t\t\tpoint.setState();\r\n\t\t\terase(hoverPoints, point);\r\n\t\t\tif (!hoverPoints.length) {\r\n\t\t\t\tchart.hoverPoints = null;\r\n\t\t\t}\r\n\r\n\t\t}\r\n\t\tif (point === chart.hoverPoint) {\r\n\t\t\tpoint.onMouseOut();\r\n\t\t}\r\n\t\t\r\n\t\t// remove all events\r\n\t\tif (point.graphic || point.dataLabel) { // removeEvent and destroyElements are performance expensive\r\n\t\t\tremoveEvent(point);\r\n\t\t\tpoint.destroyElements();\r\n\t\t}\r\n\r\n\t\tif (point.legendItem) { // pies have legend items\r\n\t\t\tchart.legend.destroyItem(point);\r\n\t\t}\r\n\r\n\t\tfor (prop in point) {\r\n\t\t\tpoint[prop] = null;\r\n\t\t}\r\n\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Destroy SVG elements associated with the point\r\n\t */\r\n\tdestroyElements: function () {\r\n\t\tvar point = this,\r\n\t\t\tprops = ['graphic', 'dataLabel', 'dataLabelUpper', 'group', 'connector', 'shadowGroup'],\r\n\t\t\tprop,\r\n\t\t\ti = 6;\r\n\t\twhile (i--) {\r\n\t\t\tprop = props[i];\r\n\t\t\tif (point[prop]) {\r\n\t\t\t\tpoint[prop] = point[prop].destroy();\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Return the configuration hash needed for the data label and tooltip formatters\r\n\t */\r\n\tgetLabelConfig: function () {\r\n\t\tvar point = this;\r\n\t\treturn {\r\n\t\t\tx: point.category,\r\n\t\t\ty: point.y,\r\n\t\t\tkey: point.name || point.category,\r\n\t\t\tseries: point.series,\r\n\t\t\tpoint: point,\r\n\t\t\tpercentage: point.percentage,\r\n\t\t\ttotal: point.total || point.stackTotal\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Toggle the selection status of a point\r\n\t * @param {Boolean} selected Whether to select or unselect the point.\r\n\t * @param {Boolean} accumulate Whether to add to the previous selection. By default,\r\n\t * this happens if the control key (Cmd on Mac) was pressed during clicking.\r\n\t */\r\n\tselect: function (selected, accumulate) {\r\n\t\tvar point = this,\r\n\t\t\tseries = point.series,\r\n\t\t\tchart = series.chart;\r\n\r\n\t\tselected = pick(selected, !point.selected);\r\n\r\n\t\t// fire the event with the defalut handler\r\n\t\tpoint.firePointEvent(selected ? 'select' : 'unselect', { accumulate: accumulate }, function () {\r\n\t\t\tpoint.selected = point.options.selected = selected;\r\n\t\t\tseries.options.data[inArray(point, series.data)] = point.options;\r\n\t\t\t\r\n\t\t\tpoint.setState(selected && SELECT_STATE);\r\n\r\n\t\t\t// unselect all other points unless Ctrl or Cmd + click\r\n\t\t\tif (!accumulate) {\r\n\t\t\t\teach(chart.getSelectedPoints(), function (loopPoint) {\r\n\t\t\t\t\tif (loopPoint.selected && loopPoint !== point) {\r\n\t\t\t\t\t\tloopPoint.selected = loopPoint.options.selected = false;\r\n\t\t\t\t\t\tseries.options.data[inArray(loopPoint, series.data)] = loopPoint.options;\r\n\t\t\t\t\t\tloopPoint.setState(NORMAL_STATE);\r\n\t\t\t\t\t\tloopPoint.firePointEvent('unselect');\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Runs on mouse over the point\r\n\t */\r\n\tonMouseOver: function (e) {\r\n\t\tvar point = this,\r\n\t\t\tseries = point.series,\r\n\t\t\tchart = series.chart,\r\n\t\t\ttooltip = chart.tooltip,\r\n\t\t\thoverPoint = chart.hoverPoint;\r\n\r\n\t\t// set normal state to previous series\r\n\t\tif (hoverPoint && hoverPoint !== point) {\r\n\t\t\thoverPoint.onMouseOut();\r\n\t\t}\r\n\r\n\t\t// trigger the event\r\n\t\tpoint.firePointEvent('mouseOver');\r\n\r\n\t\t// update the tooltip\r\n\t\tif (tooltip && (!tooltip.shared || series.noSharedTooltip)) {\r\n\t\t\ttooltip.refresh(point, e);\r\n\t\t}\r\n\r\n\t\t// hover this\r\n\t\tpoint.setState(HOVER_STATE);\r\n\t\tchart.hoverPoint = point;\r\n\t},\r\n\t\r\n\t/**\r\n\t * Runs on mouse out from the point\r\n\t */\r\n\tonMouseOut: function () {\r\n\t\tvar chart = this.series.chart,\r\n\t\t\thoverPoints = chart.hoverPoints;\r\n\t\t\r\n\t\tif (!hoverPoints || inArray(this, hoverPoints) === -1) { // #887\r\n\t\t\tthis.firePointEvent('mouseOut');\r\n\t\r\n\t\t\tthis.setState();\r\n\t\t\tchart.hoverPoint = null;\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Extendable method for formatting each point's tooltip line\r\n\t *\r\n\t * @return {String} A string to be concatenated in to the common tooltip text\r\n\t */\r\n\ttooltipFormatter: function (pointFormat) {\r\n\t\t\r\n\t\t// Insert options for valueDecimals, valuePrefix, and valueSuffix\r\n\t\tvar series = this.series,\r\n\t\t\tseriesTooltipOptions = series.tooltipOptions,\r\n\t\t\tvalueDecimals = pick(seriesTooltipOptions.valueDecimals, ''),\r\n\t\t\tvaluePrefix = seriesTooltipOptions.valuePrefix || '',\r\n\t\t\tvalueSuffix = seriesTooltipOptions.valueSuffix || '';\r\n\t\t\t\r\n\t\t// Loop over the point array map and replace unformatted values with sprintf formatting markup\r\n\t\teach(series.pointArrayMap || ['y'], function (key) {\r\n\t\t\tkey = '{point.' + key; // without the closing bracket\r\n\t\t\tif (valuePrefix || valueSuffix) {\r\n\t\t\t\tpointFormat = pointFormat.replace(key + '}', valuePrefix + key + '}' + valueSuffix);\r\n\t\t\t}\r\n\t\t\tpointFormat = pointFormat.replace(key + '}', key + ':,.' + valueDecimals + 'f}');\r\n\t\t});\r\n\t\t\r\n\t\treturn format(pointFormat, {\r\n\t\t\tpoint: this,\r\n\t\t\tseries: this.series\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Update the point with new options (typically x/y data) and optionally redraw the series.\r\n\t *\r\n\t * @param {Object} options Point options as defined in the series.data array\r\n\t * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call\r\n\t * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\r\n\t * configuration\r\n\t *\r\n\t */\r\n\tupdate: function (options, redraw, animation) {\r\n\t\tvar point = this,\r\n\t\t\tseries = point.series,\r\n\t\t\tgraphic = point.graphic,\r\n\t\t\ti,\r\n\t\t\tdata = series.data,\r\n\t\t\tchart = series.chart,\r\n\t\t\tseriesOptions = series.options;\r\n\r\n\t\tredraw = pick(redraw, true);\r\n\r\n\t\t// fire the event with a default handler of doing the update\r\n\t\tpoint.firePointEvent('update', { options: options }, function () {\r\n\r\n\t\t\tpoint.applyOptions(options);\r\n\r\n\t\t\t// update visuals\r\n\t\t\tif (isObject(options)) {\r\n\t\t\t\tseries.getAttribs();\r\n\t\t\t\tif (graphic) {\r\n\t\t\t\t\tif (options && options.marker && options.marker.symbol) {\r\n\t\t\t\t\t\tpoint.graphic = graphic.destroy();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tgraphic.attr(point.pointAttr[point.state || '']);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// record changes in the parallel arrays\r\n\t\t\ti = inArray(point, data);\r\n\t\t\tseries.xData[i] = point.x;\r\n\t\t\tseries.yData[i] = series.toYData ? series.toYData(point) : point.y;\r\n\t\t\tseries.zData[i] = point.z;\r\n\t\t\tseriesOptions.data[i] = point.options;\r\n\r\n\t\t\t// redraw\r\n\t\t\tseries.isDirty = series.isDirtyData = true;\r\n\t\t\tif (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320\r\n\t\t\t\tchart.isDirtyBox = true;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (seriesOptions.legendType === 'point') { // #1831, #1885\r\n\t\t\t\tchart.legend.destroyItem(point);\r\n\t\t\t}\r\n\t\t\tif (redraw) {\r\n\t\t\t\tchart.redraw(animation);\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Remove a point and optionally redraw the series and if necessary the axes\r\n\t * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call\r\n\t * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\r\n\t * configuration\r\n\t */\r\n\tremove: function (redraw, animation) {\r\n\t\tvar point = this,\r\n\t\t\tseries = point.series,\r\n\t\t\tpoints = series.points,\r\n\t\t\tchart = series.chart,\r\n\t\t\ti,\r\n\t\t\tdata = series.data;\r\n\r\n\t\tsetAnimation(animation, chart);\r\n\t\tredraw = pick(redraw, true);\r\n\r\n\t\t// fire the event with a default handler of removing the point\r\n\t\tpoint.firePointEvent('remove', null, function () {\r\n\r\n\t\t\t// splice all the parallel arrays\r\n\t\t\ti = inArray(point, data);\r\n\t\t\tif (data.length === points.length) {\r\n\t\t\t\tpoints.splice(i, 1);\t\t\t\r\n\t\t\t}\r\n\t\t\tdata.splice(i, 1);\r\n\t\t\tseries.options.data.splice(i, 1);\r\n\t\t\tseries.xData.splice(i, 1);\r\n\t\t\tseries.yData.splice(i, 1);\r\n\t\t\tseries.zData.splice(i, 1);\r\n\r\n\t\t\tpoint.destroy();\r\n\r\n\r\n\t\t\t// redraw\r\n\t\t\tseries.isDirty = true;\r\n\t\t\tseries.isDirtyData = true;\r\n\t\t\tif (redraw) {\r\n\t\t\t\tchart.redraw();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Fire an event on the Point object. Must not be renamed to fireEvent, as this\r\n\t * causes a name clash in MooTools\r\n\t * @param {String} eventType\r\n\t * @param {Object} eventArgs Additional event arguments\r\n\t * @param {Function} defaultFunction Default event handler\r\n\t */\r\n\tfirePointEvent: function (eventType, eventArgs, defaultFunction) {\r\n\t\tvar point = this,\r\n\t\t\tseries = this.series,\r\n\t\t\tseriesOptions = series.options;\r\n\r\n\t\t// load event handlers on demand to save time on mouseover/out\r\n\t\tif (seriesOptions.point.events[eventType] || (point.options && point.options.events && point.options.events[eventType])) {\r\n\t\t\tthis.importEvents();\r\n\t\t}\r\n\r\n\t\t// add default handler if in selection mode\r\n\t\tif (eventType === 'click' && seriesOptions.allowPointSelect) {\r\n\t\t\tdefaultFunction = function (event) {\r\n\t\t\t\t// Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera\r\n\t\t\t\tpoint.select(null, event.ctrlKey || event.metaKey || event.shiftKey);\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tfireEvent(this, eventType, eventArgs, defaultFunction);\r\n\t},\r\n\t/**\r\n\t * Import events from the series' and point's options. Only do it on\r\n\t * demand, to save processing time on hovering.\r\n\t */\r\n\timportEvents: function () {\r\n\t\tif (!this.hasImportedEvents) {\r\n\t\t\tvar point = this,\r\n\t\t\t\toptions = merge(point.series.options.point, point.options),\r\n\t\t\t\tevents = options.events,\r\n\t\t\t\teventType;\r\n\r\n\t\t\tpoint.events = events;\r\n\r\n\t\t\tfor (eventType in events) {\r\n\t\t\t\taddEvent(point, eventType, events[eventType]);\r\n\t\t\t}\r\n\t\t\tthis.hasImportedEvents = true;\r\n\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Set the point's state\r\n\t * @param {String} state\r\n\t */\r\n\tsetState: function (state) {\r\n\t\tvar point = this,\r\n\t\t\tplotX = point.plotX,\r\n\t\t\tplotY = point.plotY,\r\n\t\t\tseries = point.series,\r\n\t\t\tstateOptions = series.options.states,\r\n\t\t\tmarkerOptions = defaultPlotOptions[series.type].marker && series.options.marker,\r\n\t\t\tnormalDisabled = markerOptions && !markerOptions.enabled,\r\n\t\t\tmarkerStateOptions = markerOptions && markerOptions.states[state],\r\n\t\t\tstateDisabled = markerStateOptions && markerStateOptions.enabled === false,\r\n\t\t\tstateMarkerGraphic = series.stateMarkerGraphic,\r\n\t\t\tpointMarker = point.marker || {},\r\n\t\t\tchart = series.chart,\r\n\t\t\tradius,\r\n\t\t\tnewSymbol,\r\n\t\t\tpointAttr = point.pointAttr;\r\n\r\n\t\tstate = state || NORMAL_STATE; // empty string\r\n\r\n\t\tif (\r\n\t\t\t\t// already has this state\r\n\t\t\t\tstate === point.state ||\r\n\t\t\t\t// selected points don't respond to hover\r\n\t\t\t\t(point.selected && state !== SELECT_STATE) ||\r\n\t\t\t\t// series' state options is disabled\r\n\t\t\t\t(stateOptions[state] && stateOptions[state].enabled === false) ||\r\n\t\t\t\t// general point marker's state options is disabled\r\n\t\t\t\t(state && (stateDisabled || (normalDisabled && !markerStateOptions.enabled))) ||\r\n\t\t\t\t// individual point marker's state options is disabled\r\n\t\t\t\t(state && pointMarker.states && pointMarker.states[state] && pointMarker.states[state].enabled === false) // #1610\r\n\r\n\t\t\t) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\r\n\t\t// apply hover styles to the existing point\r\n\t\tif (point.graphic) {\r\n\t\t\tradius = markerOptions && point.graphic.symbolName && pointAttr[state].r;\r\n\t\t\tpoint.graphic.attr(merge(\r\n\t\t\t\tpointAttr[state],\r\n\t\t\t\tradius ? { // new symbol attributes (#507, #612)\r\n\t\t\t\t\tx: plotX - radius,\r\n\t\t\t\t\ty: plotY - radius,\r\n\t\t\t\t\twidth: 2 * radius,\r\n\t\t\t\t\theight: 2 * radius\r\n\t\t\t\t} : {}\r\n\t\t\t));\r\n\t\t} else {\r\n\t\t\t// if a graphic is not applied to each point in the normal state, create a shared\r\n\t\t\t// graphic for the hover state\r\n\t\t\tif (state && markerStateOptions) {\r\n\t\t\t\tradius = markerStateOptions.radius;\r\n\t\t\t\tnewSymbol = pointMarker.symbol || series.symbol;\r\n\r\n\t\t\t\t// If the point has another symbol than the previous one, throw away the \r\n\t\t\t\t// state marker graphic and force a new one (#1459)\r\n\t\t\t\tif (stateMarkerGraphic && stateMarkerGraphic.currentSymbol !== newSymbol) {\t\t\t\t\r\n\t\t\t\t\tstateMarkerGraphic = stateMarkerGraphic.destroy();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Add a new state marker graphic\r\n\t\t\t\tif (!stateMarkerGraphic) {\r\n\t\t\t\t\tseries.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.symbol(\r\n\t\t\t\t\t\tnewSymbol,\r\n\t\t\t\t\t\tplotX - radius,\r\n\t\t\t\t\t\tplotY - radius,\r\n\t\t\t\t\t\t2 * radius,\r\n\t\t\t\t\t\t2 * radius\r\n\t\t\t\t\t)\r\n\t\t\t\t\t.attr(pointAttr[state])\r\n\t\t\t\t\t.add(series.markerGroup);\r\n\t\t\t\t\tstateMarkerGraphic.currentSymbol = newSymbol;\r\n\t\t\t\t\r\n\t\t\t\t// Move the existing graphic\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstateMarkerGraphic.attr({ // #1054\r\n\t\t\t\t\t\tx: plotX - radius,\r\n\t\t\t\t\t\ty: plotY - radius\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (stateMarkerGraphic) {\r\n\t\t\t\tstateMarkerGraphic[state && chart.isInsidePlot(plotX, plotY) ? 'show' : 'hide']();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpoint.state = state;\r\n\t}\r\n};\r\n\r\n/**\r\n * @classDescription The base function which all other series types inherit from. The data in the series is stored\r\n * in various arrays.\r\n *\r\n * - First, series.options.data contains all the original config options for\r\n * each point whether added by options or methods like series.addPoint.\r\n * - Next, series.data contains those values converted to points, but in case the series data length\r\n * exceeds the cropThreshold, or if the data is grouped, series.data doesn't contain all the points. It\r\n * only contains the points that have been created on demand.\r\n * - Then there's series.points that contains all currently visible point objects. In case of cropping,\r\n * the cropped-away points are not part of this array. The series.points array starts at series.cropStart\r\n * compared to series.data and series.options.data. If however the series data is grouped, these can't\r\n * be correlated one to one.\r\n * - series.xData and series.processedXData contain clean x values, equivalent to series.data and series.points.\r\n * - series.yData and series.processedYData contain clean x values, equivalent to series.data and series.points.\r\n *\r\n * @param {Object} chart\r\n * @param {Object} options\r\n */\r\nvar Series = function () {};\r\n\r\nSeries.prototype = {\r\n\r\n\tisCartesian: true,\r\n\ttype: 'line',\r\n\tpointClass: Point,\r\n\tsorted: true, // requires the data to be sorted\r\n\trequireSorting: true,\r\n\tpointAttrToOptions: { // mapping between SVG attributes and the corresponding options\r\n\t\tstroke: 'lineColor',\r\n\t\t'stroke-width': 'lineWidth',\r\n\t\tfill: 'fillColor',\r\n\t\tr: 'radius'\r\n\t},\r\n\tcolorCounter: 0,\r\n\tinit: function (chart, options) {\r\n\t\tvar series = this,\r\n\t\t\teventType,\r\n\t\t\tevents,\r\n\t\t\tchartSeries = chart.series;\r\n\r\n\t\tseries.chart = chart;\r\n\t\tseries.options = options = series.setOptions(options); // merge with plotOptions\r\n\t\tseries.linkedSeries = [];\r\n\r\n\t\t// bind the axes\r\n\t\tseries.bindAxes();\r\n\r\n\t\t// set some variables\r\n\t\textend(series, {\r\n\t\t\tname: options.name,\r\n\t\t\tstate: NORMAL_STATE,\r\n\t\t\tpointAttr: {},\r\n\t\t\tvisible: options.visible !== false, // true by default\r\n\t\t\tselected: options.selected === true // false by default\r\n\t\t});\r\n\t\t\r\n\t\t// special\r\n\t\tif (useCanVG) {\r\n\t\t\toptions.animation = false;\r\n\t\t}\r\n\r\n\t\t// register event listeners\r\n\t\tevents = options.events;\r\n\t\tfor (eventType in events) {\r\n\t\t\taddEvent(series, eventType, events[eventType]);\r\n\t\t}\r\n\t\tif (\r\n\t\t\t(events && events.click) ||\r\n\t\t\t(options.point && options.point.events && options.point.events.click) ||\r\n\t\t\toptions.allowPointSelect\r\n\t\t) {\r\n\t\t\tchart.runTrackerClick = true;\r\n\t\t}\r\n\r\n\t\tseries.getColor();\r\n\t\tseries.getSymbol();\r\n\r\n\t\t// set the data\r\n\t\tseries.setData(options.data, false);\r\n\t\t\r\n\t\t// Mark cartesian\r\n\t\tif (series.isCartesian) {\r\n\t\t\tchart.hasCartesianSeries = true;\r\n\t\t}\r\n\r\n\t\t// Register it in the chart\r\n\t\tchartSeries.push(series);\r\n\t\tseries._i = chartSeries.length - 1;\r\n\t\t\r\n\t\t// Sort series according to index option (#248, #1123)\r\n\t\tstableSort(chartSeries, function (a, b) {\r\n\t\t\treturn pick(a.options.index, a._i) - pick(b.options.index, a._i);\r\n\t\t});\r\n\t\teach(chartSeries, function (series, i) {\r\n\t\t\tseries.index = i;\r\n\t\t\tseries.name = series.name || 'Series ' + (i + 1);\r\n\t\t});\r\n\r\n\t},\r\n\t\r\n\t/**\r\n\t * Set the xAxis and yAxis properties of cartesian series, and register the series\r\n\t * in the axis.series array\r\n\t */\r\n\tbindAxes: function () {\r\n\t\tvar series = this,\r\n\t\t\tseriesOptions = series.options,\r\n\t\t\tchart = series.chart,\r\n\t\t\taxisOptions;\r\n\t\t\t\r\n\t\tif (series.isCartesian) {\r\n\t\t\t\r\n\t\t\teach(['xAxis', 'yAxis'], function (AXIS) { // repeat for xAxis and yAxis\r\n\t\t\t\t\r\n\t\t\t\teach(chart[AXIS], function (axis) { // loop through the chart's axis objects\r\n\t\t\t\t\t\r\n\t\t\t\t\taxisOptions = axis.options;\r\n\t\t\t\t\t\r\n\t\t\t\t\t// apply if the series xAxis or yAxis option mathches the number of the \r\n\t\t\t\t\t// axis, or if undefined, use the first axis\r\n\t\t\t\t\tif ((seriesOptions[AXIS] === axisOptions.index) ||\r\n\t\t\t\t\t\t\t(seriesOptions[AXIS] !== UNDEFINED && seriesOptions[AXIS] === axisOptions.id) ||\r\n\t\t\t\t\t\t\t(seriesOptions[AXIS] === UNDEFINED && axisOptions.index === 0)) {\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// register this series in the axis.series lookup\r\n\t\t\t\t\t\taxis.series.push(series);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// set this series.xAxis or series.yAxis reference\r\n\t\t\t\t\t\tseries[AXIS] = axis;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// mark dirty for redraw\r\n\t\t\t\t\t\taxis.isDirty = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\t// The series needs an X and an Y axis\r\n\t\t\t\tif (!series[AXIS]) {\r\n\t\t\t\t\terror(18, true);\r\n\t\t\t\t}\r\n\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Return an auto incremented x value based on the pointStart and pointInterval options.\r\n\t * This is only used if an x value is not given for the point that calls autoIncrement.\r\n\t */\r\n\tautoIncrement: function () {\r\n\t\tvar series = this,\r\n\t\t\toptions = series.options,\r\n\t\t\txIncrement = series.xIncrement;\r\n\r\n\t\txIncrement = pick(xIncrement, options.pointStart, 0);\r\n\r\n\t\tseries.pointInterval = pick(series.pointInterval, options.pointInterval, 1);\r\n\r\n\t\tseries.xIncrement = xIncrement + series.pointInterval;\r\n\t\treturn xIncrement;\r\n\t},\r\n\r\n\t/**\r\n\t * Divide the series data into segments divided by null values.\r\n\t */\r\n\tgetSegments: function () {\r\n\t\tvar series = this,\r\n\t\t\tlastNull = -1,\r\n\t\t\tsegments = [],\r\n\t\t\ti,\r\n\t\t\tpoints = series.points,\r\n\t\t\tpointsLength = points.length;\r\n\r\n\t\tif (pointsLength) { // no action required for []\r\n\t\t\t\r\n\t\t\t// if connect nulls, just remove null points\r\n\t\t\tif (series.options.connectNulls) {\r\n\t\t\t\ti = pointsLength;\r\n\t\t\t\twhile (i--) {\r\n\t\t\t\t\tif (points[i].y === null) {\r\n\t\t\t\t\t\tpoints.splice(i, 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (points.length) {\r\n\t\t\t\t\tsegments = [points];\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t// else, split on null points\r\n\t\t\t} else {\r\n\t\t\t\teach(points, function (point, i) {\r\n\t\t\t\t\tif (point.y === null) {\r\n\t\t\t\t\t\tif (i > lastNull + 1) {\r\n\t\t\t\t\t\t\tsegments.push(points.slice(lastNull + 1, i));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tlastNull = i;\r\n\t\t\t\t\t} else if (i === pointsLength - 1) { // last value\r\n\t\t\t\t\t\tsegments.push(points.slice(lastNull + 1, i + 1));\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// register it\r\n\t\tseries.segments = segments;\r\n\t},\r\n\t\r\n\t/**\r\n\t * Set the series options by merging from the options tree\r\n\t * @param {Object} itemOptions\r\n\t */\r\n\tsetOptions: function (itemOptions) {\r\n\t\tvar chart = this.chart,\r\n\t\t\tchartOptions = chart.options,\r\n\t\t\tplotOptions = chartOptions.plotOptions,\r\n\t\t\ttypeOptions = plotOptions[this.type],\r\n\t\t\toptions;\r\n\r\n\t\tthis.userOptions = itemOptions;\r\n\r\n\t\toptions = merge(\r\n\t\t\ttypeOptions,\r\n\t\t\tplotOptions.series,\r\n\t\t\titemOptions\r\n\t\t);\r\n\t\t\r\n\t\t// the tooltip options are merged between global and series specific options\r\n\t\tthis.tooltipOptions = merge(chartOptions.tooltip, options.tooltip);\r\n\t\t\r\n\t\t// Delte marker object if not allowed (#1125)\r\n\t\tif (typeOptions.marker === null) {\r\n\t\t\tdelete options.marker;\r\n\t\t}\r\n\t\t\r\n\t\treturn options;\r\n\r\n\t},\r\n\t/**\r\n\t * Get the series' color\r\n\t */\r\n\tgetColor: function () {\r\n\t\tvar options = this.options,\r\n\t\t\tuserOptions = this.userOptions,\r\n\t\t\tdefaultColors = this.chart.options.colors,\r\n\t\t\tcounters = this.chart.counters,\r\n\t\t\tcolor,\r\n\t\t\tcolorIndex;\r\n\r\n\t\tcolor = options.color || defaultPlotOptions[this.type].color;\r\n\r\n\t\tif (!color && !options.colorByPoint) {\r\n\t\t\tif (defined(userOptions._colorIndex)) { // after Series.update()\r\n\t\t\t\tcolorIndex = userOptions._colorIndex;\r\n\t\t\t} else {\r\n\t\t\t\tuserOptions._colorIndex = counters.color;\r\n\t\t\t\tcolorIndex = counters.color++;\r\n\t\t\t}\r\n\t\t\tcolor = defaultColors[colorIndex];\r\n\t\t}\r\n\t\t\r\n\t\tthis.color = color;\r\n\t\tcounters.wrapColor(defaultColors.length);\r\n\t},\r\n\t/**\r\n\t * Get the series' symbol\r\n\t */\r\n\tgetSymbol: function () {\r\n\t\tvar series = this,\r\n\t\t\tuserOptions = series.userOptions,\r\n\t\t\tseriesMarkerOption = series.options.marker,\r\n\t\t\tchart = series.chart,\r\n\t\t\tdefaultSymbols = chart.options.symbols,\r\n\t\t\tcounters = chart.counters,\r\n\t\t\tsymbolIndex;\r\n\r\n\t\tseries.symbol = seriesMarkerOption.symbol;\r\n\t\tif (!series.symbol) {\r\n\t\t\tif (defined(userOptions._symbolIndex)) { // after Series.update()\r\n\t\t\t\tsymbolIndex = userOptions._symbolIndex;\r\n\t\t\t} else {\r\n\t\t\t\tuserOptions._symbolIndex = counters.symbol;\r\n\t\t\t\tsymbolIndex = counters.symbol++;\r\n\t\t\t}\r\n\t\t\tseries.symbol = defaultSymbols[symbolIndex];\r\n\t\t}\r\n\r\n\t\t// don't substract radius in image symbols (#604)\r\n\t\tif (/^url/.test(series.symbol)) {\r\n\t\t\tseriesMarkerOption.radius = 0;\r\n\t\t}\r\n\t\tcounters.wrapSymbol(defaultSymbols.length);\r\n\t},\r\n\r\n\t/**\r\n\t * Get the series' symbol in the legend. This method should be overridable to create custom \r\n\t * symbols through Highcharts.seriesTypes[type].prototype.drawLegendSymbols.\r\n\t * \r\n\t * @param {Object} legend The legend object\r\n\t */\r\n\tdrawLegendSymbol: function (legend) {\r\n\t\t\r\n\t\tvar options = this.options,\r\n\t\t\tmarkerOptions = options.marker,\r\n\t\t\tradius,\r\n\t\t\tlegendOptions = legend.options,\r\n\t\t\tlegendSymbol,\r\n\t\t\tsymbolWidth = legendOptions.symbolWidth,\r\n\t\t\trenderer = this.chart.renderer,\r\n\t\t\tlegendItemGroup = this.legendGroup,\r\n\t\t\tverticalCenter = legend.baseline - mathRound(renderer.fontMetrics(legendOptions.itemStyle.fontSize).b * 0.3),\r\n\t\t\tattr;\r\n\t\t\t\r\n\t\t// Draw the line\r\n\t\tif (options.lineWidth) {\r\n\t\t\tattr = {\r\n\t\t\t\t'stroke-width': options.lineWidth\r\n\t\t\t};\r\n\t\t\tif (options.dashStyle) {\r\n\t\t\t\tattr.dashstyle = options.dashStyle;\r\n\t\t\t}\r\n\t\t\tthis.legendLine = renderer.path([\r\n\t\t\t\tM,\r\n\t\t\t\t0,\r\n\t\t\t\tverticalCenter,\r\n\t\t\t\tL,\r\n\t\t\t\tsymbolWidth,\r\n\t\t\t\tverticalCenter\r\n\t\t\t])\r\n\t\t\t.attr(attr)\r\n\t\t\t.add(legendItemGroup);\r\n\t\t}\r\n\t\t\r\n\t\t// Draw the marker\r\n\t\tif (markerOptions && markerOptions.enabled) {\r\n\t\t\tradius = markerOptions.radius;\r\n\t\t\tthis.legendSymbol = legendSymbol = renderer.symbol(\r\n\t\t\t\tthis.symbol,\r\n\t\t\t\t(symbolWidth / 2) - radius,\r\n\t\t\t\tverticalCenter - radius,\r\n\t\t\t\t2 * radius,\r\n\t\t\t\t2 * radius\r\n\t\t\t)\r\n\t\t\t.add(legendItemGroup);\r\n\t\t\tlegendSymbol.isMarker = true;\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Add a point dynamically after chart load time\r\n\t * @param {Object} options Point options as given in series.data\r\n\t * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call\r\n\t * @param {Boolean} shift If shift is true, a point is shifted off the start\r\n\t * of the series as one is appended to the end.\r\n\t * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\r\n\t * configuration\r\n\t */\r\n\taddPoint: function (options, redraw, shift, animation) {\r\n\t\tvar series = this,\r\n\t\t\tseriesOptions = series.options,\r\n\t\t\tdata = series.data,\r\n\t\t\tgraph = series.graph,\r\n\t\t\tarea = series.area,\r\n\t\t\tchart = series.chart,\r\n\t\t\txData = series.xData,\r\n\t\t\tyData = series.yData,\r\n\t\t\tzData = series.zData,\r\n\t\t\tnames = series.xAxis && series.xAxis.names,\r\n\t\t\tcurrentShift = (graph && graph.shift) || 0,\r\n\t\t\tdataOptions = seriesOptions.data,\r\n\t\t\tpoint,\r\n\t\t\tisInTheMiddle,\r\n\t\t\tx,\r\n\t\t\ti;\r\n\r\n\t\tsetAnimation(animation, chart);\r\n\r\n\t\t// Make graph animate sideways\r\n\t\tif (shift) {\r\n\t\t\teach([graph, area, series.graphNeg, series.areaNeg], function (shape) {\r\n\t\t\t\tif (shape) {\r\n\t\t\t\t\tshape.shift = currentShift + 1;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t\tif (area) {\r\n\t\t\tarea.isArea = true; // needed in animation, both with and without shift\r\n\t\t}\r\n\t\t\r\n\t\t// Optional redraw, defaults to true\r\n\t\tredraw = pick(redraw, true);\r\n\r\n\t\t// Get options and push the point to xData, yData and series.options. In series.generatePoints\r\n\t\t// the Point instance will be created on demand and pushed to the series.data array.\r\n\t\tpoint = { series: series };\r\n\t\tseries.pointClass.prototype.applyOptions.apply(point, [options]);\r\n\t\tx = point.x;\r\n\r\n\t\t// Get the insertion point\r\n\t\ti = xData.length;\r\n\t\tif (series.requireSorting && x < xData[i - 1]) {\r\n\t\t\tisInTheMiddle = true;\r\n\t\t\twhile (i && xData[i - 1] > x) {\r\n\t\t\t\ti--;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\txData.splice(i, 0, x);\r\n\t\tyData.splice(i, 0, series.toYData ? series.toYData(point) : point.y);\r\n\t\tzData.splice(i, 0, point.z);\r\n\t\tif (names) {\r\n\t\t\tnames[x] = point.name;\r\n\t\t}\r\n\t\tdataOptions.splice(i, 0, options);\r\n\r\n\t\tif (isInTheMiddle) {\r\n\t\t\tseries.data.splice(i, 0, null);\r\n\t\t\tseries.processData();\r\n\t\t}\r\n\t\t\r\n\t\t// Generate points to be added to the legend (#1329) \r\n\t\tif (seriesOptions.legendType === 'point') {\r\n\t\t\tseries.generatePoints();\r\n\t\t}\r\n\r\n\t\t// Shift the first point off the parallel arrays\r\n\t\t// todo: consider series.removePoint(i) method\r\n\t\tif (shift) {\r\n\t\t\tif (data[0] && data[0].remove) {\r\n\t\t\t\tdata[0].remove(false);\r\n\t\t\t} else {\r\n\t\t\t\tdata.shift();\r\n\t\t\t\txData.shift();\r\n\t\t\t\tyData.shift();\r\n\t\t\t\tzData.shift();\r\n\t\t\t\tdataOptions.shift();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// redraw\r\n\t\tseries.isDirty = true;\r\n\t\tseries.isDirtyData = true;\r\n\t\tif (redraw) {\r\n\t\t\tseries.getAttribs(); // #1937\r\n\t\t\tchart.redraw();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Replace the series data with a new set of data\r\n\t * @param {Object} data\r\n\t * @param {Object} redraw\r\n\t */\r\n\tsetData: function (data, redraw) {\r\n\t\tvar series = this,\r\n\t\t\toldData = series.points,\r\n\t\t\toptions = series.options,\r\n\t\t\tchart = series.chart,\r\n\t\t\tfirstPoint = null,\r\n\t\t\txAxis = series.xAxis,\r\n\t\t\tnames = xAxis && xAxis.names,\r\n\t\t\ti;\r\n\r\n\t\t// reset properties\r\n\t\tseries.xIncrement = null;\r\n\t\tseries.pointRange = xAxis && xAxis.categories ? 1 : options.pointRange;\r\n\r\n\t\tseries.colorCounter = 0; // for series with colorByPoint (#1547)\r\n\t\t\r\n\t\t// parallel arrays\r\n\t\tvar xData = [],\r\n\t\t\tyData = [],\r\n\t\t\tzData = [],\r\n\t\t\tdataLength = data ? data.length : [],\r\n\t\t\tturboThreshold = pick(options.turboThreshold, 1000),\r\n\t\t\tpt,\r\n\t\t\tpointArrayMap = series.pointArrayMap,\r\n\t\t\tvalueCount = pointArrayMap && pointArrayMap.length,\r\n\t\t\thasToYData = !!series.toYData;\r\n\r\n\t\t// In turbo mode, only one- or twodimensional arrays of numbers are allowed. The\r\n\t\t// first value is tested, and we assume that all the rest are defined the same\r\n\t\t// way. Although the 'for' loops are similar, they are repeated inside each\r\n\t\t// if-else conditional for max performance.\r\n\t\tif (turboThreshold && dataLength > turboThreshold) { \r\n\t\t\t\r\n\t\t\t// find the first non-null point\r\n\t\t\ti = 0;\r\n\t\t\twhile (firstPoint === null && i < dataLength) {\r\n\t\t\t\tfirstPoint = data[i];\r\n\t\t\t\ti++;\r\n\t\t\t}\r\n\t\t\r\n\t\t\r\n\t\t\tif (isNumber(firstPoint)) { // assume all points are numbers\r\n\t\t\t\tvar x = pick(options.pointStart, 0),\r\n\t\t\t\t\tpointInterval = pick(options.pointInterval, 1);\r\n\r\n\t\t\t\tfor (i = 0; i < dataLength; i++) {\r\n\t\t\t\t\txData[i] = x;\r\n\t\t\t\t\tyData[i] = data[i];\r\n\t\t\t\t\tx += pointInterval;\r\n\t\t\t\t}\r\n\t\t\t\tseries.xIncrement = x;\r\n\t\t\t} else if (isArray(firstPoint)) { // assume all points are arrays\r\n\t\t\t\tif (valueCount) { // [x, low, high] or [x, o, h, l, c]\r\n\t\t\t\t\tfor (i = 0; i < dataLength; i++) {\r\n\t\t\t\t\t\tpt = data[i];\r\n\t\t\t\t\t\txData[i] = pt[0];\r\n\t\t\t\t\t\tyData[i] = pt.slice(1, valueCount + 1);\r\n\t\t\t\t\t}\r\n\t\t\t\t} else { // [x, y]\r\n\t\t\t\t\tfor (i = 0; i < dataLength; i++) {\r\n\t\t\t\t\t\tpt = data[i];\r\n\t\t\t\t\t\txData[i] = pt[0];\r\n\t\t\t\t\t\tyData[i] = pt[1];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\terror(12); // Highcharts expects configs to be numbers or arrays in turbo mode\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tfor (i = 0; i < dataLength; i++) {\r\n\t\t\t\tif (data[i] !== UNDEFINED) { // stray commas in oldIE\r\n\t\t\t\t\tpt = { series: series };\r\n\t\t\t\t\tseries.pointClass.prototype.applyOptions.apply(pt, [data[i]]);\r\n\t\t\t\t\txData[i] = pt.x;\r\n\t\t\t\t\tyData[i] = hasToYData ? series.toYData(pt) : pt.y;\r\n\t\t\t\t\tzData[i] = pt.z;\r\n\t\t\t\t\tif (names && pt.name) {\r\n\t\t\t\t\t\tnames[pt.x] = pt.name; // #2046\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// Forgetting to cast strings to numbers is a common caveat when handling CSV or JSON\t\t\r\n\t\tif (isString(yData[0])) {\r\n\t\t\terror(14, true);\r\n\t\t} \r\n\r\n\t\tseries.data = [];\r\n\t\tseries.options.data = data;\r\n\t\tseries.xData = xData;\r\n\t\tseries.yData = yData;\r\n\t\tseries.zData = zData;\r\n\r\n\t\t// destroy old points\r\n\t\ti = (oldData && oldData.length) || 0;\r\n\t\twhile (i--) {\r\n\t\t\tif (oldData[i] && oldData[i].destroy) {\r\n\t\t\t\toldData[i].destroy();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// reset minRange (#878)\r\n\t\tif (xAxis) {\r\n\t\t\txAxis.minRange = xAxis.userMinRange;\r\n\t\t}\r\n\r\n\t\t// redraw\r\n\t\tseries.isDirty = series.isDirtyData = chart.isDirtyBox = true;\r\n\t\tif (pick(redraw, true)) {\r\n\t\t\tchart.redraw(false);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Remove a series and optionally redraw the chart\r\n\t *\r\n\t * @param {Boolean} redraw Whether to redraw the chart or wait for an explicit call\r\n\t * @param {Boolean|Object} animation Whether to apply animation, and optionally animation\r\n\t * configuration\r\n\t */\r\n\r\n\tremove: function (redraw, animation) {\r\n\t\tvar series = this,\r\n\t\t\tchart = series.chart;\r\n\t\tredraw = pick(redraw, true);\r\n\r\n\t\tif (!series.isRemoving) { /* prevent triggering native event in jQuery\r\n\t\t\t\t(calling the remove function from the remove event) */\r\n\t\t\tseries.isRemoving = true;\r\n\r\n\t\t\t// fire the event with a default handler of removing the point\r\n\t\t\tfireEvent(series, 'remove', null, function () {\r\n\r\n\r\n\t\t\t\t// destroy elements\r\n\t\t\t\tseries.destroy();\r\n\r\n\r\n\t\t\t\t// redraw\r\n\t\t\t\tchart.isDirtyLegend = chart.isDirtyBox = true;\r\n\t\t\t\tchart.linkSeries();\r\n\t\t\t\t\r\n\t\t\t\tif (redraw) {\r\n\t\t\t\t\tchart.redraw(animation);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t}\r\n\t\tseries.isRemoving = false;\r\n\t},\r\n\r\n\t/**\r\n\t * Process the data by cropping away unused data points if the series is longer\r\n\t * than the crop threshold. This saves computing time for lage series.\r\n\t */\r\n\tprocessData: function (force) {\r\n\t\tvar series = this,\r\n\t\t\tprocessedXData = series.xData, // copied during slice operation below\r\n\t\t\tprocessedYData = series.yData,\r\n\t\t\tdataLength = processedXData.length,\r\n\t\t\tcroppedData,\r\n\t\t\tcropStart = 0,\r\n\t\t\tcropped,\r\n\t\t\tdistance,\r\n\t\t\tclosestPointRange,\r\n\t\t\txAxis = series.xAxis,\r\n\t\t\ti, // loop variable\r\n\t\t\toptions = series.options,\r\n\t\t\tcropThreshold = options.cropThreshold,\r\n\t\t\tisCartesian = series.isCartesian;\r\n\r\n\t\t// If the series data or axes haven't changed, don't go through this. Return false to pass\r\n\t\t// the message on to override methods like in data grouping. \r\n\t\tif (isCartesian && !series.isDirty && !xAxis.isDirty && !series.yAxis.isDirty && !force) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\t\r\n\r\n\t\t// optionally filter out points outside the plot area\r\n\t\tif (isCartesian && series.sorted && (!cropThreshold || dataLength > cropThreshold || series.forceCrop)) {\r\n\t\t\tvar min = xAxis.min,\r\n\t\t\t\tmax = xAxis.max;\r\n\r\n\t\t\t// it's outside current extremes\r\n\t\t\tif (processedXData[dataLength - 1] < min || processedXData[0] > max) {\r\n\t\t\t\tprocessedXData = [];\r\n\t\t\t\tprocessedYData = [];\r\n\t\t\t\r\n\t\t\t// only crop if it's actually spilling out\r\n\t\t\t} else if (processedXData[0] < min || processedXData[dataLength - 1] > max) {\r\n\t\t\t\tcroppedData = this.cropData(series.xData, series.yData, min, max);\r\n\t\t\t\tprocessedXData = croppedData.xData;\r\n\t\t\t\tprocessedYData = croppedData.yData;\r\n\t\t\t\tcropStart = croppedData.start;\r\n\t\t\t\tcropped = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\t\t// Find the closest distance between processed points\r\n\t\tfor (i = processedXData.length - 1; i >= 0; i--) {\r\n\t\t\tdistance = processedXData[i] - processedXData[i - 1];\r\n\t\t\tif (distance > 0 && (closestPointRange === UNDEFINED || distance < closestPointRange)) {\r\n\t\t\t\tclosestPointRange = distance;\r\n\r\n\t\t\t// Unsorted data is not supported by the line tooltip, as well as data grouping and \r\n\t\t\t// navigation in Stock charts (#725) and width calculation of columns (#1900)\r\n\t\t\t} else if (distance < 0 && series.requireSorting) {\r\n\t\t\t\terror(15);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Record the properties\r\n\t\tseries.cropped = cropped; // undefined or true\r\n\t\tseries.cropStart = cropStart;\r\n\t\tseries.processedXData = processedXData;\r\n\t\tseries.processedYData = processedYData;\r\n\r\n\t\tif (options.pointRange === null) { // null means auto, as for columns, candlesticks and OHLC\r\n\t\t\tseries.pointRange = closestPointRange || 1;\r\n\t\t}\r\n\t\tseries.closestPointRange = closestPointRange;\r\n\t\t\r\n\t},\r\n\r\n\t/**\r\n\t * Iterate over xData and crop values between min and max. Returns object containing crop start/end\r\n\t * cropped xData with corresponding part of yData, dataMin and dataMax within the cropped range\r\n\t */\r\n\tcropData: function (xData, yData, min, max) {\r\n\t\tvar dataLength = xData.length,\r\n\t\t\tcropStart = 0,\r\n\t\t\tcropEnd = dataLength,\r\n\t\t\tcropShoulder = pick(this.cropShoulder, 1), // line-type series need one point outside\r\n\t\t\ti;\r\n\r\n\t\t// iterate up to find slice start\r\n\t\tfor (i = 0; i < dataLength; i++) {\r\n\t\t\tif (xData[i] >= min) {\r\n\t\t\t\tcropStart = mathMax(0, i - cropShoulder);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// proceed to find slice end\r\n\t\tfor (; i < dataLength; i++) {\r\n\t\t\tif (xData[i] > max) {\r\n\t\t\t\tcropEnd = i + cropShoulder;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\txData: xData.slice(cropStart, cropEnd),\r\n\t\t\tyData: yData.slice(cropStart, cropEnd),\r\n\t\t\tstart: cropStart,\r\n\t\t\tend: cropEnd\r\n\t\t};\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Generate the data point after the data has been processed by cropping away\r\n\t * unused points and optionally grouped in Highcharts Stock.\r\n\t */\r\n\tgeneratePoints: function () {\r\n\t\tvar series = this,\r\n\t\t\toptions = series.options,\r\n\t\t\tdataOptions = options.data,\r\n\t\t\tdata = series.data,\r\n\t\t\tdataLength,\r\n\t\t\tprocessedXData = series.processedXData,\r\n\t\t\tprocessedYData = series.processedYData,\r\n\t\t\tpointClass = series.pointClass,\r\n\t\t\tprocessedDataLength = processedXData.length,\r\n\t\t\tcropStart = series.cropStart || 0,\r\n\t\t\tcursor,\r\n\t\t\thasGroupedData = series.hasGroupedData,\r\n\t\t\tpoint,\r\n\t\t\tpoints = [],\r\n\t\t\ti;\r\n\r\n\t\tif (!data && !hasGroupedData) {\r\n\t\t\tvar arr = [];\r\n\t\t\tarr.length = dataOptions.length;\r\n\t\t\tdata = series.data = arr;\r\n\t\t}\r\n\r\n\t\tfor (i = 0; i < processedDataLength; i++) {\r\n\t\t\tcursor = cropStart + i;\r\n\t\t\tif (!hasGroupedData) {\r\n\t\t\t\tif (data[cursor]) {\r\n\t\t\t\t\tpoint = data[cursor];\r\n\t\t\t\t} else if (dataOptions[cursor] !== UNDEFINED) { // #970\r\n\t\t\t\t\tdata[cursor] = point = (new pointClass()).init(series, dataOptions[cursor], processedXData[i]);\r\n\t\t\t\t}\r\n\t\t\t\tpoints[i] = point;\r\n\t\t\t} else {\r\n\t\t\t\t// splat the y data in case of ohlc data array\r\n\t\t\t\tpoints[i] = (new pointClass()).init(series, [processedXData[i]].concat(splat(processedYData[i])));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Hide cropped-away points - this only runs when the number of points is above cropThreshold, or when\r\n\t\t// swithching view from non-grouped data to grouped data (#637)\t\r\n\t\tif (data && (processedDataLength !== (dataLength = data.length) || hasGroupedData)) {\r\n\t\t\tfor (i = 0; i < dataLength; i++) {\r\n\t\t\t\tif (i === cropStart && !hasGroupedData) { // when has grouped data, clear all points\r\n\t\t\t\t\ti += processedDataLength;\r\n\t\t\t\t}\r\n\t\t\t\tif (data[i]) {\r\n\t\t\t\t\tdata[i].destroyElements();\r\n\t\t\t\t\tdata[i].plotX = UNDEFINED; // #1003\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tseries.data = data;\r\n\t\tseries.points = points;\r\n\t},\r\n\r\n\t/**\r\n\t * Adds series' points value to corresponding stack\r\n\t */\r\n\tsetStackedPoints: function () {\r\n\t\tif (!this.options.stacking || (this.visible !== true && this.chart.options.chart.ignoreHiddenSeries !== false)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar series = this,\r\n\t\t\txData = series.processedXData,\r\n\t\t\tyData = series.processedYData,\r\n\t\t\tstackedYData = [],\r\n\t\t\tyDataLength = yData.length,\r\n\t\t\tseriesOptions = series.options,\r\n\t\t\tthreshold = seriesOptions.threshold,\r\n\t\t\tstackOption = seriesOptions.stack,\r\n\t\t\tstacking = seriesOptions.stacking,\r\n\t\t\tstackKey = series.stackKey,\r\n\t\t\tnegKey = '-' + stackKey,\r\n\t\t\tnegStacks = series.negStacks,\r\n\t\t\tyAxis = series.yAxis,\r\n\t\t\tstacks = yAxis.stacks,\r\n\t\t\toldStacks = yAxis.oldStacks,\r\n\t\t\tisNegative,\r\n\t\t\tstack,\r\n\t\t\tother,\r\n\t\t\tkey,\r\n\t\t\ti,\r\n\t\t\tx,\r\n\t\t\ty;\r\n\r\n\t\t// loop over the non-null y values and read them into a local array\r\n\t\tfor (i = 0; i < yDataLength; i++) {\r\n\t\t\tx = xData[i];\r\n\t\t\ty = yData[i];\r\n\r\n\t\t\t// Read stacked values into a stack based on the x value,\r\n\t\t\t// the sign of y and the stack key. Stacking is also handled for null values (#739)\r\n\t\t\tisNegative = negStacks && y < threshold;\r\n\t\t\tkey = isNegative ? negKey : stackKey;\r\n\r\n\t\t\t// Create empty object for this stack if it doesn't exist yet\r\n\t\t\tif (!stacks[key]) {\r\n\t\t\t\tstacks[key] = {};\r\n\t\t\t}\r\n\r\n\t\t\t// Initialize StackItem for this x\r\n\t\t\tif (!stacks[key][x]) {\r\n\t\t\t\tif (oldStacks[key] && oldStacks[key][x]) {\r\n\t\t\t\t\tstacks[key][x] = oldStacks[key][x];\r\n\t\t\t\t\tstacks[key][x].total = null;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstacks[key][x] = new StackItem(yAxis, yAxis.options.stackLabels, isNegative, x, stackOption, stacking);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// If the StackItem doesn't exist, create it first\r\n\t\t\tstack = stacks[key][x];\r\n\t\t\tstack.points[series.index] = [stack.cum || 0];\r\n\r\n\t\t\t// Add value to the stack total\r\n\t\t\tif (stacking === 'percent') {\r\n\t\t\t\t\r\n\t\t\t\t// Percent stacked column, totals are the same for the positive and negative stacks\r\n\t\t\t\tother = isNegative ? stackKey : negKey;\r\n\t\t\t\tif (negStacks && stacks[other] && stacks[other][x]) {\r\n\t\t\t\t\tother = stacks[other][x];\r\n\t\t\t\t\tstack.total = other.total = mathMax(other.total, stack.total) + mathAbs(y) || 0;\r\n\r\n\t\t\t\t// Percent stacked areas\t\t\t\t\t\r\n\t\t\t\t} else {\r\n\t\t\t\t\tstack.total += mathAbs(y) || 0;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tstack.total += y || 0;\r\n\t\t\t}\r\n\r\n\t\t\tstack.cum = (stack.cum || 0) + (y || 0);\r\n\r\n\t\t\tstack.points[series.index].push(stack.cum);\r\n\t\t\tstackedYData[i] = stack.cum;\r\n\r\n\t\t}\r\n\r\n\t\tif (stacking === 'percent') {\r\n\t\t\tyAxis.usePercentage = true;\r\n\t\t}\r\n\r\n\t\tthis.stackedYData = stackedYData; // To be used in getExtremes\r\n\t\t\r\n\t\t// Reset old stacks\r\n\t\tyAxis.oldStacks = {};\r\n\t},\r\n\r\n\t/**\r\n\t * Iterate over all stacks and compute the absolute values to percent\r\n\t */\r\n\tsetPercentStacks: function () {\r\n\t\tvar series = this,\r\n\t\t\tstackKey = series.stackKey,\r\n\t\t\tstacks = series.yAxis.stacks;\r\n\t\t\r\n\t\teach([stackKey, '-' + stackKey], function (key) {\r\n\t\t\tvar i = series.xData.length,\r\n\t\t\t\tx,\r\n\t\t\t\tstack,\r\n\t\t\t\tpointExtremes,\r\n\t\t\t\ttotalFactor;\r\n\r\n\t\t\twhile (i--) {\r\n\t\t\t\tx = series.xData[i];\r\n\t\t\t\tstack = stacks[key] && stacks[key][x];\r\n\t\t\t\tpointExtremes = stack && stack.points[series.index];\r\n\t\t\t\tif (pointExtremes) {\r\n\t\t\t\t\ttotalFactor = stack.total ? 100 / stack.total : 0;\r\n\t\t\t\t\tpointExtremes[0] = correctFloat(pointExtremes[0] * totalFactor); // Y bottom value\r\n\t\t\t\t\tpointExtremes[1] = correctFloat(pointExtremes[1] * totalFactor); // Y value\r\n\t\t\t\t\tseries.stackedYData[i] = pointExtremes[1];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Calculate Y extremes for visible data\r\n\t */\r\n\tgetExtremes: function () {\r\n\t\tvar xAxis = this.xAxis,\r\n\t\t\tyAxis = this.yAxis,\r\n\t\t\txData = this.processedXData,\r\n\t\t\tyData = this.stackedYData || this.processedYData,\r\n\t\t\tyDataLength = yData.length,\r\n\t\t\tactiveYData = [],\r\n\t\t\tactiveCounter = 0,\r\n\t\t\txExtremes = xAxis.getExtremes(), // #2117, need to compensate for log X axis\r\n\t\t\txMin = xExtremes.min,\r\n\t\t\txMax = xExtremes.max,\r\n\t\t\tvalidValue,\r\n\t\t\twithinRange,\r\n\t\t\tdataMin,\r\n\t\t\tdataMax,\r\n\t\t\tx,\r\n\t\t\ty,\r\n\t\t\ti,\r\n\t\t\tj;\r\n\r\n\t\tfor (i = 0; i < yDataLength; i++) {\r\n\t\t\t\r\n\t\t\tx = xData[i];\r\n\t\t\ty = yData[i];\r\n\r\n\t\t\t// For points within the visible range, including the first point outside the\r\n\t\t\t// visible range, consider y extremes\r\n\t\t\tvalidValue = y !== null && y !== UNDEFINED && (!yAxis.isLog || (y.length || y > 0));\r\n\t\t\twithinRange = this.getExtremesFromAll || this.cropped || ((xData[i + 1] || x) >= xMin && \r\n\t\t\t\t(xData[i - 1] || x) <= xMax);\r\n\r\n\t\t\tif (validValue && withinRange) {\r\n\r\n\t\t\t\tj = y.length;\r\n\t\t\t\tif (j) { // array, like ohlc or range data\r\n\t\t\t\t\twhile (j--) {\r\n\t\t\t\t\t\tif (y[j] !== null) {\r\n\t\t\t\t\t\t\tactiveYData[activeCounter++] = y[j];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tactiveYData[activeCounter++] = y;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.dataMin = pick(dataMin, arrayMin(activeYData));\r\n\t\tthis.dataMax = pick(dataMax, arrayMax(activeYData));\r\n\t},\r\n\r\n\t/**\r\n\t * Translate data points from raw data values to chart specific positioning data\r\n\t * needed later in drawPoints, drawGraph and drawTracker.\r\n\t */\r\n\ttranslate: function () {\r\n\t\tif (!this.processedXData) { // hidden series\r\n\t\t\tthis.processData();\r\n\t\t}\r\n\t\tthis.generatePoints();\r\n\t\tvar series = this,\r\n\t\t\toptions = series.options,\r\n\t\t\tstacking = options.stacking,\r\n\t\t\txAxis = series.xAxis,\r\n\t\t\tcategories = xAxis.categories,\r\n\t\t\tyAxis = series.yAxis,\r\n\t\t\tpoints = series.points,\r\n\t\t\tdataLength = points.length,\r\n\t\t\thasModifyValue = !!series.modifyValue,\r\n\t\t\ti,\r\n\t\t\tpointPlacement = options.pointPlacement,\r\n\t\t\tdynamicallyPlaced = pointPlacement === 'between' || isNumber(pointPlacement),\r\n\t\t\tthreshold = options.threshold;\r\n\r\n\t\t\r\n\t\t// Translate each point\r\n\t\tfor (i = 0; i < dataLength; i++) {\r\n\t\t\tvar point = points[i],\r\n\t\t\t\txValue = point.x,\r\n\t\t\t\tyValue = point.y,\r\n\t\t\t\tyBottom = point.low,\r\n\t\t\t\tstack = yAxis.stacks[(series.negStacks && yValue < threshold ? '-' : '') + series.stackKey],\r\n\t\t\t\tpointStack,\r\n\t\t\t\tstackValues;\r\n\r\n\t\t\t// Discard disallowed y values for log axes\r\n\t\t\tif (yAxis.isLog && yValue <= 0) {\r\n\t\t\t\tpoint.y = yValue = null;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// Get the plotX translation\r\n\t\t\tpoint.plotX = xAxis.translate(xValue, 0, 0, 0, 1, pointPlacement, this.type === 'flags'); // Math.round fixes #591\r\n\t\t\t\r\n\r\n\t\t\t// Calculate the bottom y value for stacked series\r\n\t\t\tif (stacking && series.visible && stack && stack[xValue]) {\r\n\r\n\t\t\t\tpointStack = stack[xValue];\r\n\t\t\t\tstackValues = pointStack.points[series.index];\r\n\t\t\t\tyBottom = stackValues[0];\r\n\t\t\t\tyValue = stackValues[1];\r\n\r\n\t\t\t\tif (yBottom === 0) {\r\n\t\t\t\t\tyBottom = pick(threshold, yAxis.min);\r\n\t\t\t\t}\r\n\t\t\t\tif (yAxis.isLog && yBottom <= 0) { // #1200, #1232\r\n\t\t\t\t\tyBottom = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tpoint.total = point.stackTotal = pointStack.total;\r\n\t\t\t\tpoint.percentage = stacking === 'percent' && (point.y / pointStack.total * 100);\r\n\t\t\t\tpoint.stackY = yValue;\r\n\r\n\t\t\t\t// Place the stack label\r\n\t\t\t\tpointStack.setOffset(series.pointXOffset || 0, series.barW || 0);\r\n\t\t\t\t\r\n\t\t\t}\r\n\r\n\t\t\t// Set translated yBottom or remove it\r\n\t\t\tpoint.yBottom = defined(yBottom) ? \r\n\t\t\t\tyAxis.translate(yBottom, 0, 1, 0, 1) :\r\n\t\t\t\tnull;\r\n\t\t\t\t\r\n\t\t\t// general hook, used for Highstock compare mode\r\n\t\t\tif (hasModifyValue) {\r\n\t\t\t\tyValue = series.modifyValue(yValue, point);\r\n\t\t\t}\r\n\r\n\t\t\t// Set the the plotY value, reset it for redraws\r\n\t\t\tpoint.plotY = (typeof yValue === 'number' && yValue !== Infinity) ? \r\n\t\t\t\t//mathRound(yAxis.translate(yValue, 0, 1, 0, 1) * 10) / 10 : // Math.round fixes #591\r\n\t\t\t\tyAxis.translate(yValue, 0, 1, 0, 1) : \r\n\t\t\t\tUNDEFINED;\r\n\t\t\t\r\n\t\t\t// Set client related positions for mouse tracking\r\n\t\t\tpoint.clientX = dynamicallyPlaced ? xAxis.translate(xValue, 0, 0, 0, 1) : point.plotX; // #1514\r\n\t\t\t\t\r\n\t\t\tpoint.negative = point.y < (threshold || 0);\r\n\r\n\t\t\t// some API data\r\n\t\t\tpoint.category = categories && categories[point.x] !== UNDEFINED ?\r\n\t\t\t\tcategories[point.x] : point.x;\r\n\r\n\r\n\t\t}\r\n\r\n\t\t// now that we have the cropped data, build the segments\r\n\t\tseries.getSegments();\r\n\t},\r\n\t/**\r\n\t * Memoize tooltip texts and positions\r\n\t */\r\n\tsetTooltipPoints: function (renew) {\r\n\t\tvar series = this,\r\n\t\t\tpoints = [],\r\n\t\t\tpointsLength,\r\n\t\t\tlow,\r\n\t\t\thigh,\r\n\t\t\txAxis = series.xAxis,\r\n\t\t\txExtremes = xAxis && xAxis.getExtremes(),\r\n\t\t\taxisLength = xAxis ? (xAxis.tooltipLen || xAxis.len) : series.chart.plotSizeX, // tooltipLen and tooltipPosName used in polar\r\n\t\t\tpoint,\r\n\t\t\tpointX,\r\n\t\t\tnextPoint,\r\n\t\t\ti,\r\n\t\t\ttooltipPoints = []; // a lookup array for each pixel in the x dimension\r\n\r\n\t\t// don't waste resources if tracker is disabled\r\n\t\tif (series.options.enableMouseTracking === false) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// renew\r\n\t\tif (renew) {\r\n\t\t\tseries.tooltipPoints = null;\r\n\t\t}\r\n\r\n\t\t// concat segments to overcome null values\r\n\t\teach(series.segments || series.points, function (segment) {\r\n\t\t\tpoints = points.concat(segment);\r\n\t\t});\r\n\r\n\t\t// Reverse the points in case the X axis is reversed\r\n\t\tif (xAxis && xAxis.reversed) {\r\n\t\t\tpoints = points.reverse();\r\n\t\t}\r\n\r\n\t\t// Polar needs additional shaping\r\n\t\tif (series.orderTooltipPoints) {\r\n\t\t\tseries.orderTooltipPoints(points);\r\n\t\t}\r\n\r\n\t\t// Assign each pixel position to the nearest point\r\n\t\tpointsLength = points.length;\r\n\t\tfor (i = 0; i < pointsLength; i++) {\r\n\t\t\tpoint = points[i];\r\n\t\t\tpointX = point.x;\r\n\t\t\tif (pointX >= xExtremes.min && pointX <= xExtremes.max) { // #1149\r\n\t\t\t\tnextPoint = points[i + 1];\r\n\t\t\t\t\r\n\t\t\t\t// Set this range's low to the last range's high plus one\r\n\t\t\t\tlow = high === UNDEFINED ? 0 : high + 1;\r\n\t\t\t\t// Now find the new high\r\n\t\t\t\thigh = points[i + 1] ?\r\n\t\t\t\t\tmathMin(mathMax(0, mathFloor( // #2070\r\n\t\t\t\t\t\t(point.clientX + (nextPoint ? (nextPoint.wrappedClientX || nextPoint.clientX) : axisLength)) / 2\r\n\t\t\t\t\t)), axisLength) :\r\n\t\t\t\t\taxisLength;\r\n\r\n\t\t\t\twhile (low >= 0 && low <= high) {\r\n\t\t\t\t\ttooltipPoints[low++] = point;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tseries.tooltipPoints = tooltipPoints;\r\n\t},\r\n\r\n\t/**\r\n\t * Format the header of the tooltip\r\n\t */\r\n\ttooltipHeaderFormatter: function (point) {\r\n\t\tvar series = this,\r\n\t\t\ttooltipOptions = series.tooltipOptions,\r\n\t\t\txDateFormat = tooltipOptions.xDateFormat,\r\n\t\t\tdateTimeLabelFormats = tooltipOptions.dateTimeLabelFormats,\r\n\t\t\txAxis = series.xAxis,\r\n\t\t\tisDateTime = xAxis && xAxis.options.type === 'datetime',\r\n\t\t\theaderFormat = tooltipOptions.headerFormat,\r\n\t\t\tclosestPointRange = xAxis && xAxis.closestPointRange,\r\n\t\t\tn;\r\n\t\t\t\r\n\t\t// Guess the best date format based on the closest point distance (#568)\r\n\t\tif (isDateTime && !xDateFormat) {\r\n\t\t\tif (closestPointRange) {\r\n\t\t\t\tfor (n in timeUnits) {\r\n\t\t\t\t\tif (timeUnits[n] >= closestPointRange) {\r\n\t\t\t\t\t\txDateFormat = dateTimeLabelFormats[n];\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\txDateFormat = dateTimeLabelFormats.day;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// Insert the header date format if any\r\n\t\tif (isDateTime && xDateFormat && isNumber(point.key)) {\r\n\t\t\theaderFormat = headerFormat.replace('{point.key}', '{point.key:' + xDateFormat + '}');\r\n\t\t}\r\n\t\t\r\n\t\treturn format(headerFormat, {\r\n\t\t\tpoint: point,\r\n\t\t\tseries: series\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Series mouse over handler\r\n\t */\r\n\tonMouseOver: function () {\r\n\t\tvar series = this,\r\n\t\t\tchart = series.chart,\r\n\t\t\thoverSeries = chart.hoverSeries;\r\n\r\n\t\t// set normal state to previous series\r\n\t\tif (hoverSeries && hoverSeries !== series) {\r\n\t\t\thoverSeries.onMouseOut();\r\n\t\t}\r\n\r\n\t\t// trigger the event, but to save processing time,\r\n\t\t// only if defined\r\n\t\tif (series.options.events.mouseOver) {\r\n\t\t\tfireEvent(series, 'mouseOver');\r\n\t\t}\r\n\r\n\t\t// hover this\r\n\t\tseries.setState(HOVER_STATE);\r\n\t\tchart.hoverSeries = series;\r\n\t},\r\n\r\n\t/**\r\n\t * Series mouse out handler\r\n\t */\r\n\tonMouseOut: function () {\r\n\t\t// trigger the event only if listeners exist\r\n\t\tvar series = this,\r\n\t\t\toptions = series.options,\r\n\t\t\tchart = series.chart,\r\n\t\t\ttooltip = chart.tooltip,\r\n\t\t\thoverPoint = chart.hoverPoint;\r\n\r\n\t\t// trigger mouse out on the point, which must be in this series\r\n\t\tif (hoverPoint) {\r\n\t\t\thoverPoint.onMouseOut();\r\n\t\t}\r\n\r\n\t\t// fire the mouse out event\r\n\t\tif (series && options.events.mouseOut) {\r\n\t\t\tfireEvent(series, 'mouseOut');\r\n\t\t}\r\n\r\n\r\n\t\t// hide the tooltip\r\n\t\tif (tooltip && !options.stickyTracking && (!tooltip.shared || series.noSharedTooltip)) {\r\n\t\t\ttooltip.hide();\r\n\t\t}\r\n\r\n\t\t// set normal state\r\n\t\tseries.setState();\r\n\t\tchart.hoverSeries = null;\r\n\t},\r\n\r\n\t/**\r\n\t * Animate in the series\r\n\t */\r\n\tanimate: function (init) {\r\n\t\tvar series = this,\r\n\t\t\tchart = series.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\tclipRect,\r\n\t\t\tmarkerClipRect,\r\n\t\t\tanimation = series.options.animation,\r\n\t\t\tclipBox = chart.clipBox,\r\n\t\t\tinverted = chart.inverted,\r\n\t\t\tsharedClipKey;\r\n\r\n\t\t// Animation option is set to true\r\n\t\tif (animation && !isObject(animation)) {\r\n\t\t\tanimation = defaultPlotOptions[series.type].animation;\r\n\t\t}\r\n\t\tsharedClipKey = '_sharedClip' + animation.duration + animation.easing;\r\n\r\n\t\t// Initialize the animation. Set up the clipping rectangle.\r\n\t\tif (init) { \r\n\t\t\t\r\n\t\t\t// If a clipping rectangle with the same properties is currently present in the chart, use that. \r\n\t\t\tclipRect = chart[sharedClipKey];\r\n\t\t\tmarkerClipRect = chart[sharedClipKey + 'm'];\r\n\t\t\tif (!clipRect) {\r\n\t\t\t\tchart[sharedClipKey] = clipRect = renderer.clipRect(\r\n\t\t\t\t\textend(clipBox, { width: 0 })\r\n\t\t\t\t);\r\n\t\t\t\t\r\n\t\t\t\tchart[sharedClipKey + 'm'] = markerClipRect = renderer.clipRect(\r\n\t\t\t\t\t-99, // include the width of the first marker\r\n\t\t\t\t\tinverted ? -chart.plotLeft : -chart.plotTop, \r\n\t\t\t\t\t99,\r\n\t\t\t\t\tinverted ? chart.chartWidth : chart.chartHeight\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tseries.group.clip(clipRect);\r\n\t\t\tseries.markerGroup.clip(markerClipRect);\r\n\t\t\tseries.sharedClipKey = sharedClipKey;\r\n\r\n\t\t// Run the animation\r\n\t\t} else { \r\n\t\t\tclipRect = chart[sharedClipKey];\r\n\t\t\tif (clipRect) {\r\n\t\t\t\tclipRect.animate({\r\n\t\t\t\t\twidth: chart.plotSizeX\r\n\t\t\t\t}, animation);\r\n\t\t\t\tchart[sharedClipKey + 'm'].animate({\r\n\t\t\t\t\twidth: chart.plotSizeX + 99\r\n\t\t\t\t}, animation);\r\n\t\t\t}\r\n\r\n\t\t\t// Delete this function to allow it only once\r\n\t\t\tseries.animate = null;\r\n\t\t\t\r\n\t\t\t// Call the afterAnimate function on animation complete (but don't overwrite the animation.complete option\r\n\t\t\t// which should be available to the user).\r\n\t\t\tseries.animationTimeout = setTimeout(function () {\r\n\t\t\t\tseries.afterAnimate();\r\n\t\t\t}, animation.duration);\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * This runs after animation to land on the final plot clipping\r\n\t */\r\n\tafterAnimate: function () {\r\n\t\tvar chart = this.chart,\r\n\t\t\tsharedClipKey = this.sharedClipKey,\r\n\t\t\tgroup = this.group;\r\n\t\t\t\r\n\t\tif (group && this.options.clip !== false) {\r\n\t\t\tgroup.clip(chart.clipRect);\r\n\t\t\tthis.markerGroup.clip(); // no clip\r\n\t\t}\r\n\t\t\r\n\t\t// Remove the shared clipping rectancgle when all series are shown\t\t\r\n\t\tsetTimeout(function () {\r\n\t\t\tif (sharedClipKey && chart[sharedClipKey]) {\r\n\t\t\t\tchart[sharedClipKey] = chart[sharedClipKey].destroy();\r\n\t\t\t\tchart[sharedClipKey + 'm'] = chart[sharedClipKey + 'm'].destroy();\r\n\t\t\t}\r\n\t\t}, 100);\r\n\t},\r\n\r\n\t/**\r\n\t * Draw the markers\r\n\t */\r\n\tdrawPoints: function () {\r\n\t\tvar series = this,\r\n\t\t\tpointAttr,\r\n\t\t\tpoints = series.points,\r\n\t\t\tchart = series.chart,\r\n\t\t\tplotX,\r\n\t\t\tplotY,\r\n\t\t\ti,\r\n\t\t\tpoint,\r\n\t\t\tradius,\r\n\t\t\tsymbol,\r\n\t\t\tisImage,\r\n\t\t\tgraphic,\r\n\t\t\toptions = series.options,\r\n\t\t\tseriesMarkerOptions = options.marker,\r\n\t\t\tpointMarkerOptions,\r\n\t\t\tenabled,\r\n\t\t\tisInside,\r\n\t\t\tmarkerGroup = series.markerGroup;\r\n\r\n\t\tif (seriesMarkerOptions.enabled || series._hasPointMarkers) {\r\n\t\t\t\r\n\t\t\ti = points.length;\r\n\t\t\twhile (i--) {\r\n\t\t\t\tpoint = points[i];\r\n\t\t\t\tplotX = mathFloor(point.plotX); // #1843\r\n\t\t\t\tplotY = point.plotY;\r\n\t\t\t\tgraphic = point.graphic;\r\n\t\t\t\tpointMarkerOptions = point.marker || {};\r\n\t\t\t\tenabled = (seriesMarkerOptions.enabled && pointMarkerOptions.enabled === UNDEFINED) || pointMarkerOptions.enabled;\r\n\t\t\t\tisInside = chart.isInsidePlot(mathRound(plotX), plotY, chart.inverted); // #1858\r\n\t\t\t\t\r\n\t\t\t\t// only draw the point if y is defined\r\n\t\t\t\tif (enabled && plotY !== UNDEFINED && !isNaN(plotY) && point.y !== null) {\r\n\r\n\t\t\t\t\t// shortcuts\r\n\t\t\t\t\tpointAttr = point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE];\r\n\t\t\t\t\tradius = pointAttr.r;\r\n\t\t\t\t\tsymbol = pick(pointMarkerOptions.symbol, series.symbol);\r\n\t\t\t\t\tisImage = symbol.indexOf('url') === 0;\r\n\r\n\t\t\t\t\tif (graphic) { // update\r\n\t\t\t\t\t\tgraphic\r\n\t\t\t\t\t\t\t.attr({ // Since the marker group isn't clipped, each individual marker must be toggled\r\n\t\t\t\t\t\t\t\tvisibility: isInside ? (hasSVG ? 'inherit' : VISIBLE) : HIDDEN\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t.animate(extend({\r\n\t\t\t\t\t\t\t\tx: plotX - radius,\r\n\t\t\t\t\t\t\t\ty: plotY - radius\r\n\t\t\t\t\t\t\t}, graphic.symbolName ? { // don't apply to image symbols #507\r\n\t\t\t\t\t\t\t\twidth: 2 * radius,\r\n\t\t\t\t\t\t\t\theight: 2 * radius\r\n\t\t\t\t\t\t\t} : {}));\r\n\t\t\t\t\t} else if (isInside && (radius > 0 || isImage)) {\r\n\t\t\t\t\t\tpoint.graphic = graphic = chart.renderer.symbol(\r\n\t\t\t\t\t\t\tsymbol,\r\n\t\t\t\t\t\t\tplotX - radius,\r\n\t\t\t\t\t\t\tplotY - radius,\r\n\t\t\t\t\t\t\t2 * radius,\r\n\t\t\t\t\t\t\t2 * radius\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t\t.attr(pointAttr)\r\n\t\t\t\t\t\t.add(markerGroup);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t} else if (graphic) {\r\n\t\t\t\t\tpoint.graphic = graphic.destroy(); // #1269\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Convert state properties from API naming conventions to SVG attributes\r\n\t *\r\n\t * @param {Object} options API options object\r\n\t * @param {Object} base1 SVG attribute object to inherit from\r\n\t * @param {Object} base2 Second level SVG attribute object to inherit from\r\n\t */\r\n\tconvertAttribs: function (options, base1, base2, base3) {\r\n\t\tvar conversion = this.pointAttrToOptions,\r\n\t\t\tattr,\r\n\t\t\toption,\r\n\t\t\tobj = {};\r\n\r\n\t\toptions = options || {};\r\n\t\tbase1 = base1 || {};\r\n\t\tbase2 = base2 || {};\r\n\t\tbase3 = base3 || {};\r\n\r\n\t\tfor (attr in conversion) {\r\n\t\t\toption = conversion[attr];\r\n\t\t\tobj[attr] = pick(options[option], base1[attr], base2[attr], base3[attr]);\r\n\t\t}\r\n\t\treturn obj;\r\n\t},\r\n\r\n\t/**\r\n\t * Get the state attributes. Each series type has its own set of attributes\r\n\t * that are allowed to change on a point's state change. Series wide attributes are stored for\r\n\t * all series, and additionally point specific attributes are stored for all\r\n\t * points with individual marker options. If such options are not defined for the point,\r\n\t * a reference to the series wide attributes is stored in point.pointAttr.\r\n\t */\r\n\tgetAttribs: function () {\r\n\t\tvar series = this,\r\n\t\t\tseriesOptions = series.options,\r\n\t\t\tnormalOptions = defaultPlotOptions[series.type].marker ? seriesOptions.marker : seriesOptions,\r\n\t\t\tstateOptions = normalOptions.states,\r\n\t\t\tstateOptionsHover = stateOptions[HOVER_STATE],\r\n\t\t\tpointStateOptionsHover,\r\n\t\t\tseriesColor = series.color,\r\n\t\t\tnormalDefaults = {\r\n\t\t\t\tstroke: seriesColor,\r\n\t\t\t\tfill: seriesColor\r\n\t\t\t},\r\n\t\t\tpoints = series.points || [], // #927\r\n\t\t\ti,\r\n\t\t\tpoint,\r\n\t\t\tseriesPointAttr = [],\r\n\t\t\tpointAttr,\r\n\t\t\tpointAttrToOptions = series.pointAttrToOptions,\r\n\t\t\thasPointSpecificOptions,\r\n\t\t\tnegativeColor = seriesOptions.negativeColor,\r\n\t\t\tdefaultLineColor = normalOptions.lineColor,\r\n\t\t\tkey;\r\n\r\n\t\t// series type specific modifications\r\n\t\tif (seriesOptions.marker) { // line, spline, area, areaspline, scatter\r\n\r\n\t\t\t// if no hover radius is given, default to normal radius + 2\r\n\t\t\tstateOptionsHover.radius = stateOptionsHover.radius || normalOptions.radius + 2;\r\n\t\t\tstateOptionsHover.lineWidth = stateOptionsHover.lineWidth || normalOptions.lineWidth + 1;\r\n\t\t\t\r\n\t\t} else { // column, bar, pie\r\n\r\n\t\t\t// if no hover color is given, brighten the normal color\r\n\t\t\tstateOptionsHover.color = stateOptionsHover.color ||\r\n\t\t\t\tColor(stateOptionsHover.color || seriesColor)\r\n\t\t\t\t\t.brighten(stateOptionsHover.brightness).get();\r\n\t\t}\r\n\r\n\t\t// general point attributes for the series normal state\r\n\t\tseriesPointAttr[NORMAL_STATE] = series.convertAttribs(normalOptions, normalDefaults);\r\n\r\n\t\t// HOVER_STATE and SELECT_STATE states inherit from normal state except the default radius\r\n\t\teach([HOVER_STATE, SELECT_STATE], function (state) {\r\n\t\t\tseriesPointAttr[state] =\r\n\t\t\t\t\tseries.convertAttribs(stateOptions[state], seriesPointAttr[NORMAL_STATE]);\r\n\t\t});\r\n\r\n\t\t// set it\r\n\t\tseries.pointAttr = seriesPointAttr;\r\n\r\n\r\n\t\t// Generate the point-specific attribute collections if specific point\r\n\t\t// options are given. If not, create a referance to the series wide point\r\n\t\t// attributes\r\n\t\ti = points.length;\r\n\t\twhile (i--) {\r\n\t\t\tpoint = points[i];\r\n\t\t\tnormalOptions = (point.options && point.options.marker) || point.options;\r\n\t\t\tif (normalOptions && normalOptions.enabled === false) {\r\n\t\t\t\tnormalOptions.radius = 0;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (point.negative && negativeColor) {\r\n\t\t\t\tpoint.color = point.fillColor = negativeColor;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\thasPointSpecificOptions = seriesOptions.colorByPoint || point.color; // #868\r\n\r\n\t\t\t// check if the point has specific visual options\r\n\t\t\tif (point.options) {\r\n\t\t\t\tfor (key in pointAttrToOptions) {\r\n\t\t\t\t\tif (defined(normalOptions[pointAttrToOptions[key]])) {\r\n\t\t\t\t\t\thasPointSpecificOptions = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// a specific marker config object is defined for the individual point:\r\n\t\t\t// create it's own attribute collection\r\n\t\t\tif (hasPointSpecificOptions) {\r\n\t\t\t\tnormalOptions = normalOptions || {};\r\n\t\t\t\tpointAttr = [];\r\n\t\t\t\tstateOptions = normalOptions.states || {}; // reassign for individual point\r\n\t\t\t\tpointStateOptionsHover = stateOptions[HOVER_STATE] = stateOptions[HOVER_STATE] || {};\r\n\r\n\t\t\t\t// Handle colors for column and pies\r\n\t\t\t\tif (!seriesOptions.marker) { // column, bar, point\r\n\t\t\t\t\t// if no hover color is given, brighten the normal color\r\n\t\t\t\t\tpointStateOptionsHover.color =\r\n\t\t\t\t\t\tColor(pointStateOptionsHover.color || point.color)\r\n\t\t\t\t\t\t\t.brighten(pointStateOptionsHover.brightness ||\r\n\t\t\t\t\t\t\t\tstateOptionsHover.brightness).get();\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// normal point state inherits series wide normal state\r\n\t\t\t\tpointAttr[NORMAL_STATE] = series.convertAttribs(extend({\r\n\t\t\t\t\tcolor: point.color, // #868\r\n\t\t\t\t\tfillColor: point.color, // Individual point color or negative color markers (#2219)\r\n\t\t\t\t\tlineColor: defaultLineColor === null ? point.color : UNDEFINED // Bubbles take point color, line markers use white\r\n\t\t\t\t}, normalOptions), seriesPointAttr[NORMAL_STATE]);\r\n\r\n\t\t\t\t// inherit from point normal and series hover\r\n\t\t\t\tpointAttr[HOVER_STATE] = series.convertAttribs(\r\n\t\t\t\t\tstateOptions[HOVER_STATE],\r\n\t\t\t\t\tseriesPointAttr[HOVER_STATE],\r\n\t\t\t\t\tpointAttr[NORMAL_STATE]\r\n\t\t\t\t);\r\n\t\t\t\t\r\n\t\t\t\t// inherit from point normal and series hover\r\n\t\t\t\tpointAttr[SELECT_STATE] = series.convertAttribs(\r\n\t\t\t\t\tstateOptions[SELECT_STATE],\r\n\t\t\t\t\tseriesPointAttr[SELECT_STATE],\r\n\t\t\t\t\tpointAttr[NORMAL_STATE]\r\n\t\t\t\t);\r\n\r\n\r\n\t\t\t// no marker config object is created: copy a reference to the series-wide\r\n\t\t\t// attribute collection\r\n\t\t\t} else {\r\n\t\t\t\tpointAttr = seriesPointAttr;\r\n\t\t\t}\r\n\r\n\t\t\tpoint.pointAttr = pointAttr;\r\n\r\n\t\t}\r\n\r\n\t},\r\n\t/**\r\n\t * Update the series with a new set of options\r\n\t */\r\n\tupdate: function (newOptions, redraw) {\r\n\t\tvar chart = this.chart,\r\n\t\t\t// must use user options when changing type because this.options is merged\r\n\t\t\t// in with type specific plotOptions\r\n\t\t\toldOptions = this.userOptions,\r\n\t\t\toldType = this.type,\r\n\t\t\tproto = seriesTypes[oldType].prototype,\r\n\t\t\tn;\r\n\r\n\t\t// Do the merge, with some forced options\r\n\t\tnewOptions = merge(oldOptions, {\r\n\t\t\tanimation: false,\r\n\t\t\tindex: this.index,\r\n\t\t\tpointStart: this.xData[0] // when updating after addPoint\r\n\t\t}, { data: this.options.data }, newOptions);\r\n\r\n\t\t// Destroy the series and reinsert methods from the type prototype\r\n\t\tthis.remove(false);\r\n\t\tfor (n in proto) { // Overwrite series-type specific methods (#2270)\r\n\t\t\tif (proto.hasOwnProperty(n)) {\r\n\t\t\t\tthis[n] = UNDEFINED;\r\n\t\t\t}\r\n\t\t}\r\n\t\textend(this, seriesTypes[newOptions.type || oldType].prototype);\r\n\t\t\r\n\r\n\t\tthis.init(chart, newOptions);\r\n\t\tif (pick(redraw, true)) {\r\n\t\t\tchart.redraw(false);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Clear DOM objects and free up memory\r\n\t */\r\n\tdestroy: function () {\r\n\t\tvar series = this,\r\n\t\t\tchart = series.chart,\r\n\t\t\tissue134 = /AppleWebKit\\/533/.test(userAgent),\r\n\t\t\tdestroy,\r\n\t\t\ti,\r\n\t\t\tdata = series.data || [],\r\n\t\t\tpoint,\r\n\t\t\tprop,\r\n\t\t\taxis;\r\n\r\n\t\t// add event hook\r\n\t\tfireEvent(series, 'destroy');\r\n\r\n\t\t// remove all events\r\n\t\tremoveEvent(series);\r\n\t\t\r\n\t\t// erase from axes\r\n\t\teach(['xAxis', 'yAxis'], function (AXIS) {\r\n\t\t\taxis = series[AXIS];\r\n\t\t\tif (axis) {\r\n\t\t\t\terase(axis.series, series);\r\n\t\t\t\taxis.isDirty = axis.forceRedraw = true;\r\n\t\t\t\taxis.stacks = {}; // Rebuild stacks when updating (#2229)\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// remove legend items\r\n\t\tif (series.legendItem) {\r\n\t\t\tseries.chart.legend.destroyItem(series);\r\n\t\t}\r\n\r\n\t\t// destroy all points with their elements\r\n\t\ti = data.length;\r\n\t\twhile (i--) {\r\n\t\t\tpoint = data[i];\r\n\t\t\tif (point && point.destroy) {\r\n\t\t\t\tpoint.destroy();\r\n\t\t\t}\r\n\t\t}\r\n\t\tseries.points = null;\r\n\r\n\t\t// Clear the animation timeout if we are destroying the series during initial animation\r\n\t\tclearTimeout(series.animationTimeout);\r\n\r\n\t\t// destroy all SVGElements associated to the series\r\n\t\teach(['area', 'graph', 'dataLabelsGroup', 'group', 'markerGroup', 'tracker',\r\n\t\t\t\t'graphNeg', 'areaNeg', 'posClip', 'negClip'], function (prop) {\r\n\t\t\tif (series[prop]) {\r\n\r\n\t\t\t\t// issue 134 workaround\r\n\t\t\t\tdestroy = issue134 && prop === 'group' ?\r\n\t\t\t\t\t'hide' :\r\n\t\t\t\t\t'destroy';\r\n\r\n\t\t\t\tseries[prop][destroy]();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// remove from hoverSeries\r\n\t\tif (chart.hoverSeries === series) {\r\n\t\t\tchart.hoverSeries = null;\r\n\t\t}\r\n\t\terase(chart.series, series);\r\n\r\n\t\t// clear all members\r\n\t\tfor (prop in series) {\r\n\t\t\tdelete series[prop];\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Draw the data labels\r\n\t */\r\n\tdrawDataLabels: function () {\r\n\t\t\r\n\t\tvar series = this,\r\n\t\t\tseriesOptions = series.options,\r\n\t\t\tcursor = seriesOptions.cursor,\r\n\t\t\toptions = seriesOptions.dataLabels,\r\n\t\t\tpoints = series.points,\r\n\t\t\tpointOptions,\r\n\t\t\tgeneralOptions,\r\n\t\t\tstr,\r\n\t\t\tdataLabelsGroup;\r\n\t\t\r\n\t\tif (options.enabled || series._hasPointLabels) {\r\n\t\t\t\t\t\t\r\n\t\t\t// Process default alignment of data labels for columns\r\n\t\t\tif (series.dlProcessOptions) {\r\n\t\t\t\tseries.dlProcessOptions(options);\r\n\t\t\t}\r\n\r\n\t\t\t// Create a separate group for the data labels to avoid rotation\r\n\t\t\tdataLabelsGroup = series.plotGroup(\r\n\t\t\t\t'dataLabelsGroup', \r\n\t\t\t\t'data-labels', \r\n\t\t\t\tseries.visible ? VISIBLE : HIDDEN, \r\n\t\t\t\toptions.zIndex || 6\r\n\t\t\t);\r\n\t\t\t\r\n\t\t\t// Make the labels for each point\r\n\t\t\tgeneralOptions = options;\r\n\t\t\teach(points, function (point) {\r\n\t\t\t\t\r\n\t\t\t\tvar enabled,\r\n\t\t\t\t\tdataLabel = point.dataLabel,\r\n\t\t\t\t\tlabelConfig,\r\n\t\t\t\t\tattr,\r\n\t\t\t\t\tname,\r\n\t\t\t\t\trotation,\r\n\t\t\t\t\tconnector = point.connector,\r\n\t\t\t\t\tisNew = true;\r\n\t\t\t\t\r\n\t\t\t\t// Determine if each data label is enabled\r\n\t\t\t\tpointOptions = point.options && point.options.dataLabels;\r\n\t\t\t\tenabled = pick(pointOptions && pointOptions.enabled, generalOptions.enabled); // #2282\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t// If the point is outside the plot area, destroy it. #678, #820\r\n\t\t\t\tif (dataLabel && !enabled) {\r\n\t\t\t\t\tpoint.dataLabel = dataLabel.destroy();\r\n\t\t\t\t\r\n\t\t\t\t// Individual labels are disabled if the are explicitly disabled \r\n\t\t\t\t// in the point options, or if they fall outside the plot area.\r\n\t\t\t\t} else if (enabled) {\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Create individual options structure that can be extended without \r\n\t\t\t\t\t// affecting others\r\n\t\t\t\t\toptions = merge(generalOptions, pointOptions);\r\n\r\n\t\t\t\t\trotation = options.rotation;\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Get the string\r\n\t\t\t\t\tlabelConfig = point.getLabelConfig();\r\n\t\t\t\t\tstr = options.format ?\r\n\t\t\t\t\t\tformat(options.format, labelConfig) : \r\n\t\t\t\t\t\toptions.formatter.call(labelConfig, options);\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Determine the color\r\n\t\t\t\t\toptions.style.color = pick(options.color, options.style.color, series.color, 'black');\r\n\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t// update existing label\r\n\t\t\t\t\tif (dataLabel) {\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif (defined(str)) {\r\n\t\t\t\t\t\t\tdataLabel\r\n\t\t\t\t\t\t\t\t.attr({\r\n\t\t\t\t\t\t\t\t\ttext: str\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\tisNew = false;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t} else { // #1437 - the label is shown conditionally\r\n\t\t\t\t\t\t\tpoint.dataLabel = dataLabel = dataLabel.destroy();\r\n\t\t\t\t\t\t\tif (connector) {\r\n\t\t\t\t\t\t\t\tpoint.connector = connector.destroy();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t// create new label\r\n\t\t\t\t\t} else if (defined(str)) {\r\n\t\t\t\t\t\tattr = {\r\n\t\t\t\t\t\t\t//align: align,\r\n\t\t\t\t\t\t\tfill: options.backgroundColor,\r\n\t\t\t\t\t\t\tstroke: options.borderColor,\r\n\t\t\t\t\t\t\t'stroke-width': options.borderWidth,\r\n\t\t\t\t\t\t\tr: options.borderRadius || 0,\r\n\t\t\t\t\t\t\trotation: rotation,\r\n\t\t\t\t\t\t\tpadding: options.padding,\r\n\t\t\t\t\t\t\tzIndex: 1\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\t// Remove unused attributes (#947)\r\n\t\t\t\t\t\tfor (name in attr) {\r\n\t\t\t\t\t\t\tif (attr[name] === UNDEFINED) {\r\n\t\t\t\t\t\t\t\tdelete attr[name];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tdataLabel = point.dataLabel = series.chart.renderer[rotation ? 'text' : 'label']( // labels don't support rotation\r\n\t\t\t\t\t\t\tstr,\r\n\t\t\t\t\t\t\t0,\r\n\t\t\t\t\t\t\t-999,\r\n\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\toptions.useHTML\r\n\t\t\t\t\t\t)\r\n\t\t\t\t\t\t.attr(attr)\r\n\t\t\t\t\t\t.css(extend(options.style, cursor && { cursor: cursor }))\r\n\t\t\t\t\t\t.add(dataLabelsGroup)\r\n\t\t\t\t\t\t.shadow(options.shadow);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (dataLabel) {\r\n\t\t\t\t\t\t// Now the data label is created and placed at 0,0, so we need to align it\r\n\t\t\t\t\t\tseries.alignDataLabel(point, dataLabel, options, null, isNew);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * Align each individual data label\r\n\t */\r\n\talignDataLabel: function (point, dataLabel, options, alignTo, isNew) {\r\n\t\tvar chart = this.chart,\r\n\t\t\tinverted = chart.inverted,\r\n\t\t\tplotX = pick(point.plotX, -999),\r\n\t\t\tplotY = pick(point.plotY, -999),\r\n\t\t\tbBox = dataLabel.getBBox(),\r\n\t\t\tvisible = this.visible && chart.isInsidePlot(point.plotX, point.plotY, inverted),\r\n\t\t\talignAttr; // the final position;\r\n\t\t\t\t\r\n\t\tif (visible) {\r\n\r\n\t\t\t// The alignment box is a singular point\r\n\t\t\talignTo = extend({\r\n\t\t\t\tx: inverted ? chart.plotWidth - plotY : plotX,\r\n\t\t\t\ty: mathRound(inverted ? chart.plotHeight - plotX : plotY),\r\n\t\t\t\twidth: 0,\r\n\t\t\t\theight: 0\r\n\t\t\t}, alignTo);\r\n\t\t\t\r\n\t\t\t// Add the text size for alignment calculation\r\n\t\t\textend(options, {\r\n\t\t\t\twidth: bBox.width,\r\n\t\t\t\theight: bBox.height\r\n\t\t\t});\r\n\r\n\t\t\t// Allow a hook for changing alignment in the last moment, then do the alignment\r\n\t\t\tif (options.rotation) { // Fancy box alignment isn't supported for rotated text\r\n\t\t\t\talignAttr = {\r\n\t\t\t\t\talign: options.align,\r\n\t\t\t\t\tx: alignTo.x + options.x + alignTo.width / 2,\r\n\t\t\t\t\ty: alignTo.y + options.y + alignTo.height / 2\r\n\t\t\t\t};\r\n\t\t\t\tdataLabel[isNew ? 'attr' : 'animate'](alignAttr);\r\n\t\t\t} else {\r\n\t\t\t\tdataLabel.align(options, null, alignTo);\r\n\t\t\t\talignAttr = dataLabel.alignAttr;\r\n\r\n\t\t\t\t// Handle justify or crop\r\n\t\t\t\tif (pick(options.overflow, 'justify') === 'justify') {\r\n\t\t\t\t\tthis.justifyDataLabel(dataLabel, options, alignAttr, bBox, alignTo, isNew);\r\n\t\t\t\t\r\n\t\t\t\t} else if (pick(options.crop, true)) {\r\n\t\t\t\t\t// Now check that the data label is within the plot area\r\n\t\t\t\t\tvisible = chart.isInsidePlot(alignAttr.x, alignAttr.y) && chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height);\r\n\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t}\t\t\r\n\t\t}\r\n\r\n\t\t// Show or hide based on the final aligned position\r\n\t\tif (!visible) {\r\n\t\t\tdataLabel.attr({ y: -999 });\r\n\t\t}\r\n\t\t\t\t\r\n\t},\r\n\t\r\n\t/**\r\n\t * If data labels fall partly outside the plot area, align them back in, in a way that\r\n\t * doesn't hide the point.\r\n\t */\r\n\tjustifyDataLabel: function (dataLabel, options, alignAttr, bBox, alignTo, isNew) {\r\n\t\tvar chart = this.chart,\r\n\t\t\talign = options.align,\r\n\t\t\tverticalAlign = options.verticalAlign,\r\n\t\t\toff,\r\n\t\t\tjustified;\r\n\r\n\t\t// Off left\r\n\t\toff = alignAttr.x;\r\n\t\tif (off < 0) {\r\n\t\t\tif (align === 'right') {\r\n\t\t\t\toptions.align = 'left';\r\n\t\t\t} else {\r\n\t\t\t\toptions.x = -off;\r\n\t\t\t}\r\n\t\t\tjustified = true;\r\n\t\t}\r\n\r\n\t\t// Off right\r\n\t\toff = alignAttr.x + bBox.width;\r\n\t\tif (off > chart.plotWidth) {\r\n\t\t\tif (align === 'left') {\r\n\t\t\t\toptions.align = 'right';\r\n\t\t\t} else {\r\n\t\t\t\toptions.x = chart.plotWidth - off;\r\n\t\t\t}\r\n\t\t\tjustified = true;\r\n\t\t}\r\n\r\n\t\t// Off top\r\n\t\toff = alignAttr.y;\r\n\t\tif (off < 0) {\r\n\t\t\tif (verticalAlign === 'bottom') {\r\n\t\t\t\toptions.verticalAlign = 'top';\r\n\t\t\t} else {\r\n\t\t\t\toptions.y = -off;\r\n\t\t\t}\r\n\t\t\tjustified = true;\r\n\t\t}\r\n\r\n\t\t// Off bottom\r\n\t\toff = alignAttr.y + bBox.height;\r\n\t\tif (off > chart.plotHeight) {\r\n\t\t\tif (verticalAlign === 'top') {\r\n\t\t\t\toptions.verticalAlign = 'bottom';\r\n\t\t\t} else {\r\n\t\t\t\toptions.y = chart.plotHeight - off;\r\n\t\t\t}\r\n\t\t\tjustified = true;\r\n\t\t}\r\n\t\t\r\n\t\tif (justified) {\r\n\t\t\tdataLabel.placed = !isNew;\r\n\t\t\tdataLabel.align(options, null, alignTo);\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * Return the graph path of a segment\r\n\t */\r\n\tgetSegmentPath: function (segment) {\t\t\r\n\t\tvar series = this,\r\n\t\t\tsegmentPath = [],\r\n\t\t\tstep = series.options.step;\r\n\t\t\t\r\n\t\t// build the segment line\r\n\t\teach(segment, function (point, i) {\r\n\t\t\t\r\n\t\t\tvar plotX = point.plotX,\r\n\t\t\t\tplotY = point.plotY,\r\n\t\t\t\tlastPoint;\r\n\r\n\t\t\tif (series.getPointSpline) { // generate the spline as defined in the SplineSeries object\r\n\t\t\t\tsegmentPath.push.apply(segmentPath, series.getPointSpline(segment, point, i));\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\t// moveTo or lineTo\r\n\t\t\t\tsegmentPath.push(i ? L : M);\r\n\r\n\t\t\t\t// step line?\r\n\t\t\t\tif (step && i) {\r\n\t\t\t\t\tlastPoint = segment[i - 1];\r\n\t\t\t\t\tif (step === 'right') {\r\n\t\t\t\t\t\tsegmentPath.push(\r\n\t\t\t\t\t\t\tlastPoint.plotX,\r\n\t\t\t\t\t\t\tplotY\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t} else if (step === 'center') {\r\n\t\t\t\t\t\tsegmentPath.push(\r\n\t\t\t\t\t\t\t(lastPoint.plotX + plotX) / 2,\r\n\t\t\t\t\t\t\tlastPoint.plotY,\r\n\t\t\t\t\t\t\t(lastPoint.plotX + plotX) / 2,\r\n\t\t\t\t\t\t\tplotY\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsegmentPath.push(\r\n\t\t\t\t\t\t\tplotX,\r\n\t\t\t\t\t\t\tlastPoint.plotY\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// normal line to next point\r\n\t\t\t\tsegmentPath.push(\r\n\t\t\t\t\tpoint.plotX,\r\n\t\t\t\t\tpoint.plotY\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\t\treturn segmentPath;\r\n\t},\r\n\r\n\t/**\r\n\t * Get the graph path\r\n\t */\r\n\tgetGraphPath: function () {\r\n\t\tvar series = this,\r\n\t\t\tgraphPath = [],\r\n\t\t\tsegmentPath,\r\n\t\t\tsinglePoints = []; // used in drawTracker\r\n\r\n\t\t// Divide into segments and build graph and area paths\r\n\t\teach(series.segments, function (segment) {\r\n\t\t\t\r\n\t\t\tsegmentPath = series.getSegmentPath(segment);\r\n\t\t\t\r\n\t\t\t// add the segment to the graph, or a single point for tracking\r\n\t\t\tif (segment.length > 1) {\r\n\t\t\t\tgraphPath = graphPath.concat(segmentPath);\r\n\t\t\t} else {\r\n\t\t\t\tsinglePoints.push(segment[0]);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Record it for use in drawGraph and drawTracker, and return graphPath\r\n\t\tseries.singlePoints = singlePoints;\r\n\t\tseries.graphPath = graphPath;\r\n\t\t\r\n\t\treturn graphPath;\r\n\t\t\r\n\t},\r\n\t\r\n\t/**\r\n\t * Draw the actual graph\r\n\t */\r\n\tdrawGraph: function () {\r\n\t\tvar series = this,\r\n\t\t\toptions = this.options,\r\n\t\t\tprops = [['graph', options.lineColor || this.color]],\r\n\t\t\tlineWidth = options.lineWidth,\r\n\t\t\tdashStyle = options.dashStyle,\r\n\t\t\troundCap = options.linecap !== 'square',\r\n\t\t\tgraphPath = this.getGraphPath(),\r\n\t\t\tnegativeColor = options.negativeColor;\r\n\t\t\t\r\n\t\tif (negativeColor) {\r\n\t\t\tprops.push(['graphNeg', negativeColor]);\r\n\t\t}\r\n\t\t\r\n\t\t// draw the graph\r\n\t\teach(props, function (prop, i) {\r\n\t\t\tvar graphKey = prop[0],\r\n\t\t\t\tgraph = series[graphKey],\r\n\t\t\t\tattribs;\r\n\t\t\t\r\n\t\t\tif (graph) {\r\n\t\t\t\tstop(graph); // cancel running animations, #459\r\n\t\t\t\tgraph.animate({ d: graphPath });\r\n\t\r\n\t\t\t} else if (lineWidth && graphPath.length) { // #1487\r\n\t\t\t\tattribs = {\r\n\t\t\t\t\tstroke: prop[1],\r\n\t\t\t\t\t'stroke-width': lineWidth,\r\n\t\t\t\t\tzIndex: 1 // #1069\r\n\t\t\t\t};\r\n\t\t\t\tif (dashStyle) {\r\n\t\t\t\t\tattribs.dashstyle = dashStyle;\r\n\t\t\t\t} else if (roundCap) {\r\n\t\t\t\t\tattribs['stroke-linecap'] = attribs['stroke-linejoin'] = 'round';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tseries[graphKey] = series.chart.renderer.path(graphPath)\r\n\t\t\t\t\t.attr(attribs)\r\n\t\t\t\t\t.add(series.group)\r\n\t\t\t\t\t.shadow(!i && options.shadow);\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\t\r\n\t/**\r\n\t * Clip the graphs into the positive and negative coloured graphs\r\n\t */\r\n\tclipNeg: function () {\r\n\t\tvar options = this.options,\r\n\t\t\tchart = this.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\tnegativeColor = options.negativeColor || options.negativeFillColor,\r\n\t\t\ttranslatedThreshold,\r\n\t\t\tposAttr,\r\n\t\t\tnegAttr,\r\n\t\t\tgraph = this.graph,\r\n\t\t\tarea = this.area,\r\n\t\t\tposClip = this.posClip,\r\n\t\t\tnegClip = this.negClip,\r\n\t\t\tchartWidth = chart.chartWidth,\r\n\t\t\tchartHeight = chart.chartHeight,\r\n\t\t\tchartSizeMax = mathMax(chartWidth, chartHeight),\r\n\t\t\tyAxis = this.yAxis,\r\n\t\t\tabove,\r\n\t\t\tbelow;\r\n\t\t\r\n\t\tif (negativeColor && (graph || area)) {\r\n\t\t\ttranslatedThreshold = mathRound(yAxis.toPixels(options.threshold || 0, true));\r\n\t\t\tabove = {\r\n\t\t\t\tx: 0,\r\n\t\t\t\ty: 0,\r\n\t\t\t\twidth: chartSizeMax,\r\n\t\t\t\theight: translatedThreshold\r\n\t\t\t};\r\n\t\t\tbelow = {\r\n\t\t\t\tx: 0,\r\n\t\t\t\ty: translatedThreshold,\r\n\t\t\t\twidth: chartSizeMax,\r\n\t\t\t\theight: chartSizeMax\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\tif (chart.inverted) {\r\n\r\n\t\t\t\tabove.height = below.y = chart.plotWidth - translatedThreshold;\r\n\t\t\t\tif (renderer.isVML) {\r\n\t\t\t\t\tabove = {\r\n\t\t\t\t\t\tx: chart.plotWidth - translatedThreshold - chart.plotLeft,\r\n\t\t\t\t\t\ty: 0,\r\n\t\t\t\t\t\twidth: chartWidth,\r\n\t\t\t\t\t\theight: chartHeight\r\n\t\t\t\t\t};\r\n\t\t\t\t\tbelow = {\r\n\t\t\t\t\t\tx: translatedThreshold + chart.plotLeft - chartWidth,\r\n\t\t\t\t\t\ty: 0,\r\n\t\t\t\t\t\twidth: chart.plotLeft + translatedThreshold,\r\n\t\t\t\t\t\theight: chartWidth\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tif (yAxis.reversed) {\r\n\t\t\t\tposAttr = below;\r\n\t\t\t\tnegAttr = above;\r\n\t\t\t} else {\r\n\t\t\t\tposAttr = above;\r\n\t\t\t\tnegAttr = below;\r\n\t\t\t}\r\n\t\t\r\n\t\t\tif (posClip) { // update\r\n\t\t\t\tposClip.animate(posAttr);\r\n\t\t\t\tnegClip.animate(negAttr);\r\n\t\t\t} else {\r\n\t\t\t\t\r\n\t\t\t\tthis.posClip = posClip = renderer.clipRect(posAttr);\r\n\t\t\t\tthis.negClip = negClip = renderer.clipRect(negAttr);\r\n\t\t\t\t\r\n\t\t\t\tif (graph && this.graphNeg) {\r\n\t\t\t\t\tgraph.clip(posClip);\r\n\t\t\t\t\tthis.graphNeg.clip(negClip);\t\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tif (area) {\r\n\t\t\t\t\tarea.clip(posClip);\r\n\t\t\t\t\tthis.areaNeg.clip(negClip);\r\n\t\t\t\t} \r\n\t\t\t} \r\n\t\t}\t\r\n\t},\r\n\r\n\t/**\r\n\t * Initialize and perform group inversion on series.group and series.markerGroup\r\n\t */\r\n\tinvertGroups: function () {\r\n\t\tvar series = this,\r\n\t\t\tchart = series.chart;\r\n\r\n\t\t// Pie, go away (#1736)\r\n\t\tif (!series.xAxis) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t\r\n\t\t// A fixed size is needed for inversion to work\r\n\t\tfunction setInvert() {\t\t\t\r\n\t\t\tvar size = {\r\n\t\t\t\twidth: series.yAxis.len,\r\n\t\t\t\theight: series.xAxis.len\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\teach(['group', 'markerGroup'], function (groupName) {\r\n\t\t\t\tif (series[groupName]) {\r\n\t\t\t\t\tseries[groupName].attr(size).invert();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\taddEvent(chart, 'resize', setInvert); // do it on resize\r\n\t\taddEvent(series, 'destroy', function () {\r\n\t\t\tremoveEvent(chart, 'resize', setInvert);\r\n\t\t});\r\n\r\n\t\t// Do it now\r\n\t\tsetInvert(); // do it now\r\n\t\t\r\n\t\t// On subsequent render and redraw, just do setInvert without setting up events again\r\n\t\tseries.invertGroups = setInvert;\r\n\t},\r\n\t\r\n\t/**\r\n\t * General abstraction for creating plot groups like series.group, series.dataLabelsGroup and \r\n\t * series.markerGroup. On subsequent calls, the group will only be adjusted to the updated plot size.\r\n\t */\r\n\tplotGroup: function (prop, name, visibility, zIndex, parent) {\r\n\t\tvar group = this[prop],\r\n\t\t\tisNew = !group;\r\n\t\t\r\n\t\t// Generate it on first call\r\n\t\tif (isNew) {\t\r\n\t\t\tthis[prop] = group = this.chart.renderer.g(name)\r\n\t\t\t\t.attr({\r\n\t\t\t\t\tvisibility: visibility,\r\n\t\t\t\t\tzIndex: zIndex || 0.1 // IE8 needs this\r\n\t\t\t\t})\r\n\t\t\t\t.add(parent);\r\n\t\t}\r\n\t\t// Place it on first and subsequent (redraw) calls\r\n\t\tgroup[isNew ? 'attr' : 'animate'](this.getPlotBox());\r\n\t\treturn group;\t\t\r\n\t},\r\n\r\n\t/**\r\n\t * Get the translation and scale for the plot area of this series\r\n\t */\r\n\tgetPlotBox: function () {\r\n\t\treturn {\r\n\t\t\ttranslateX: this.xAxis ? this.xAxis.left : this.chart.plotLeft, \r\n\t\t\ttranslateY: this.yAxis ? this.yAxis.top : this.chart.plotTop,\r\n\t\t\tscaleX: 1, // #1623\r\n\t\t\tscaleY: 1\r\n\t\t};\r\n\t},\r\n\t\r\n\t/**\r\n\t * Render the graph and markers\r\n\t */\r\n\trender: function () {\r\n\t\tvar series = this,\r\n\t\t\tchart = series.chart,\r\n\t\t\tgroup,\r\n\t\t\toptions = series.options,\r\n\t\t\tanimation = options.animation,\r\n\t\t\tdoAnimation = animation && !!series.animate && \r\n\t\t\t\tchart.renderer.isSVG, // this animation doesn't work in IE8 quirks when the group div is hidden,\r\n\t\t\t\t// and looks bad in other oldIE\r\n\t\t\tvisibility = series.visible ? VISIBLE : HIDDEN,\r\n\t\t\tzIndex = options.zIndex,\r\n\t\t\thasRendered = series.hasRendered,\r\n\t\t\tchartSeriesGroup = chart.seriesGroup;\r\n\t\t\r\n\t\t// the group\r\n\t\tgroup = series.plotGroup(\r\n\t\t\t'group', \r\n\t\t\t'series', \r\n\t\t\tvisibility, \r\n\t\t\tzIndex, \r\n\t\t\tchartSeriesGroup\r\n\t\t);\r\n\t\t\r\n\t\tseries.markerGroup = series.plotGroup(\r\n\t\t\t'markerGroup', \r\n\t\t\t'markers', \r\n\t\t\tvisibility, \r\n\t\t\tzIndex, \r\n\t\t\tchartSeriesGroup\r\n\t\t);\r\n\t\t\r\n\t\t// initiate the animation\r\n\t\tif (doAnimation) {\r\n\t\t\tseries.animate(true);\r\n\t\t}\r\n\r\n\t\t// cache attributes for shapes\r\n\t\tseries.getAttribs();\r\n\r\n\t\t// SVGRenderer needs to know this before drawing elements (#1089, #1795)\r\n\t\tgroup.inverted = series.isCartesian ? chart.inverted : false;\r\n\t\t\r\n\t\t// draw the graph if any\r\n\t\tif (series.drawGraph) {\r\n\t\t\tseries.drawGraph();\r\n\t\t\tseries.clipNeg();\r\n\t\t}\r\n\r\n\t\t// draw the data labels (inn pies they go before the points)\r\n\t\tseries.drawDataLabels();\r\n\t\t\r\n\t\t// draw the points\r\n\t\tseries.drawPoints();\r\n\r\n\r\n\t\t// draw the mouse tracking area\r\n\t\tif (series.options.enableMouseTracking !== false) {\r\n\t\t\tseries.drawTracker();\r\n\t\t}\r\n\t\t\r\n\t\t// Handle inverted series and tracker groups\r\n\t\tif (chart.inverted) {\r\n\t\t\tseries.invertGroups();\r\n\t\t}\r\n\t\t\r\n\t\t// Initial clipping, must be defined after inverting groups for VML\r\n\t\tif (options.clip !== false && !series.sharedClipKey && !hasRendered) {\r\n\t\t\tgroup.clip(chart.clipRect);\r\n\t\t}\r\n\r\n\t\t// Run the animation\r\n\t\tif (doAnimation) {\r\n\t\t\tseries.animate();\r\n\t\t} else if (!hasRendered) {\r\n\t\t\tseries.afterAnimate();\r\n\t\t}\r\n\r\n\t\tseries.isDirty = series.isDirtyData = false; // means data is in accordance with what you see\r\n\t\t// (See #322) series.isDirty = series.isDirtyData = false; // means data is in accordance with what you see\r\n\t\tseries.hasRendered = true;\r\n\t},\r\n\t\r\n\t/**\r\n\t * Redraw the series after an update in the axes.\r\n\t */\r\n\tredraw: function () {\r\n\t\tvar series = this,\r\n\t\t\tchart = series.chart,\r\n\t\t\twasDirtyData = series.isDirtyData, // cache it here as it is set to false in render, but used after\r\n\t\t\tgroup = series.group,\r\n\t\t\txAxis = series.xAxis,\r\n\t\t\tyAxis = series.yAxis;\r\n\r\n\t\t// reposition on resize\r\n\t\tif (group) {\r\n\t\t\tif (chart.inverted) {\r\n\t\t\t\tgroup.attr({\r\n\t\t\t\t\twidth: chart.plotWidth,\r\n\t\t\t\t\theight: chart.plotHeight\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tgroup.animate({\r\n\t\t\t\ttranslateX: pick(xAxis && xAxis.left, chart.plotLeft),\r\n\t\t\t\ttranslateY: pick(yAxis && yAxis.top, chart.plotTop)\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tseries.translate();\r\n\t\tseries.setTooltipPoints(true);\r\n\r\n\t\tseries.render();\r\n\t\tif (wasDirtyData) {\r\n\t\t\tfireEvent(series, 'updatedData');\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Set the state of the graph\r\n\t */\r\n\tsetState: function (state) {\r\n\t\tvar series = this,\r\n\t\t\toptions = series.options,\r\n\t\t\tgraph = series.graph,\r\n\t\t\tgraphNeg = series.graphNeg,\r\n\t\t\tstateOptions = options.states,\r\n\t\t\tlineWidth = options.lineWidth,\r\n\t\t\tattribs;\r\n\r\n\t\tstate = state || NORMAL_STATE;\r\n\r\n\t\tif (series.state !== state) {\r\n\t\t\tseries.state = state;\r\n\r\n\t\t\tif (stateOptions[state] && stateOptions[state].enabled === false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (state) {\r\n\t\t\t\tlineWidth = stateOptions[state].lineWidth || lineWidth + 1;\r\n\t\t\t}\r\n\r\n\t\t\tif (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML\r\n\t\t\t\tattribs = {\r\n\t\t\t\t\t'stroke-width': lineWidth\r\n\t\t\t\t};\r\n\t\t\t\t// use attr because animate will cause any other animation on the graph to stop\r\n\t\t\t\tgraph.attr(attribs);\r\n\t\t\t\tif (graphNeg) {\r\n\t\t\t\t\tgraphNeg.attr(attribs);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Set the visibility of the graph\r\n\t *\r\n\t * @param vis {Boolean} True to show the series, false to hide. If UNDEFINED,\r\n\t * the visibility is toggled.\r\n\t */\r\n\tsetVisible: function (vis, redraw) {\r\n\t\tvar series = this,\r\n\t\t\tchart = series.chart,\r\n\t\t\tlegendItem = series.legendItem,\r\n\t\t\tshowOrHide,\r\n\t\t\tignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries,\r\n\t\t\toldVisibility = series.visible;\r\n\r\n\t\t// if called without an argument, toggle visibility\r\n\t\tseries.visible = vis = series.userOptions.visible = vis === UNDEFINED ? !oldVisibility : vis;\r\n\t\tshowOrHide = vis ? 'show' : 'hide';\r\n\r\n\t\t// show or hide elements\r\n\t\teach(['group', 'dataLabelsGroup', 'markerGroup', 'tracker'], function (key) {\r\n\t\t\tif (series[key]) {\r\n\t\t\t\tseries[key][showOrHide]();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t\r\n\t\t// hide tooltip (#1361)\r\n\t\tif (chart.hoverSeries === series) {\r\n\t\t\tseries.onMouseOut();\r\n\t\t}\r\n\r\n\r\n\t\tif (legendItem) {\r\n\t\t\tchart.legend.colorizeItem(series, vis);\r\n\t\t}\r\n\r\n\r\n\t\t// rescale or adapt to resized chart\r\n\t\tseries.isDirty = true;\r\n\t\t// in a stack, all other series are affected\r\n\t\tif (series.options.stacking) {\r\n\t\t\teach(chart.series, function (otherSeries) {\r\n\t\t\t\tif (otherSeries.options.stacking && otherSeries.visible) {\r\n\t\t\t\t\totherSeries.isDirty = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// show or hide linked series\r\n\t\teach(series.linkedSeries, function (otherSeries) {\r\n\t\t\totherSeries.setVisible(vis, false);\r\n\t\t});\r\n\r\n\t\tif (ignoreHiddenSeries) {\r\n\t\t\tchart.isDirtyBox = true;\r\n\t\t}\r\n\t\tif (redraw !== false) {\r\n\t\t\tchart.redraw();\r\n\t\t}\r\n\r\n\t\tfireEvent(series, showOrHide);\r\n\t},\r\n\r\n\t/**\r\n\t * Show the graph\r\n\t */\r\n\tshow: function () {\r\n\t\tthis.setVisible(true);\r\n\t},\r\n\r\n\t/**\r\n\t * Hide the graph\r\n\t */\r\n\thide: function () {\r\n\t\tthis.setVisible(false);\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Set the selected state of the graph\r\n\t *\r\n\t * @param selected {Boolean} True to select the series, false to unselect. If\r\n\t * UNDEFINED, the selection state is toggled.\r\n\t */\r\n\tselect: function (selected) {\r\n\t\tvar series = this;\r\n\t\t// if called without an argument, toggle\r\n\t\tseries.selected = selected = (selected === UNDEFINED) ? !series.selected : selected;\r\n\r\n\t\tif (series.checkbox) {\r\n\t\t\tseries.checkbox.checked = selected;\r\n\t\t}\r\n\r\n\t\tfireEvent(series, selected ? 'select' : 'unselect');\r\n\t},\r\n\r\n\t/**\r\n\t * Draw the tracker object that sits above all data labels and markers to\r\n\t * track mouse events on the graph or points. For the line type charts\r\n\t * the tracker uses the same graphPath, but with a greater stroke width\r\n\t * for better control.\r\n\t */\r\n\tdrawTracker: function () {\r\n\t\tvar series = this,\r\n\t\t\toptions = series.options,\r\n\t\t\ttrackByArea = options.trackByArea,\r\n\t\t\ttrackerPath = [].concat(trackByArea ? series.areaPath : series.graphPath),\r\n\t\t\ttrackerPathLength = trackerPath.length,\r\n\t\t\tchart = series.chart,\r\n\t\t\tpointer = chart.pointer,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\tsnap = chart.options.tooltip.snap,\r\n\t\t\ttracker = series.tracker,\r\n\t\t\tcursor = options.cursor,\r\n\t\t\tcss = cursor && { cursor: cursor },\r\n\t\t\tsinglePoints = series.singlePoints,\r\n\t\t\tsinglePoint,\r\n\t\t\ti,\r\n\t\t\tonMouseOver = function () {\r\n\t\t\t\tif (chart.hoverSeries !== series) {\r\n\t\t\t\t\tseries.onMouseOver();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t// Extend end points. A better way would be to use round linecaps,\r\n\t\t// but those are not clickable in VML.\r\n\t\tif (trackerPathLength && !trackByArea) {\r\n\t\t\ti = trackerPathLength + 1;\r\n\t\t\twhile (i--) {\r\n\t\t\t\tif (trackerPath[i] === M) { // extend left side\r\n\t\t\t\t\ttrackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], L);\r\n\t\t\t\t}\r\n\t\t\t\tif ((i && trackerPath[i] === M) || i === trackerPathLength) { // extend right side\r\n\t\t\t\t\ttrackerPath.splice(i, 0, L, trackerPath[i - 2] + snap, trackerPath[i - 1]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// handle single points\r\n\t\tfor (i = 0; i < singlePoints.length; i++) {\r\n\t\t\tsinglePoint = singlePoints[i];\r\n\t\t\ttrackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY,\r\n\t\t\t\tL, singlePoint.plotX + snap, singlePoint.plotY);\r\n\t\t}\r\n\t\t\r\n\t\t\r\n\r\n\t\t// draw the tracker\r\n\t\tif (tracker) {\r\n\t\t\ttracker.attr({ d: trackerPath });\r\n\r\n\t\t} else { // create\r\n\t\t\t\t\r\n\t\t\tseries.tracker = renderer.path(trackerPath)\r\n\t\t\t\t.attr({\r\n\t\t\t\t\t'stroke-linejoin': 'round', // #1225\r\n\t\t\t\t\tvisibility: series.visible ? VISIBLE : HIDDEN,\r\n\t\t\t\t\tstroke: TRACKER_FILL,\r\n\t\t\t\t\tfill: trackByArea ? TRACKER_FILL : NONE,\r\n\t\t\t\t\t'stroke-width' : options.lineWidth + (trackByArea ? 0 : 2 * snap),\r\n\t\t\t\t\tzIndex: 2\r\n\t\t\t\t})\r\n\t\t\t\t.add(series.group);\r\n\t\t\t\t\r\n\t\t\t// The tracker is added to the series group, which is clipped, but is covered \r\n\t\t\t// by the marker group. So the marker group also needs to capture events.\r\n\t\t\teach([series.tracker, series.markerGroup], function (tracker) {\r\n\t\t\t\ttracker.addClass(PREFIX + 'tracker')\r\n\t\t\t\t\t.on('mouseover', onMouseOver)\r\n\t\t\t\t\t.on('mouseout', function (e) { pointer.onTrackerMouseOut(e); })\r\n\t\t\t\t\t.css(css);\r\n\r\n\t\t\t\tif (hasTouch) {\r\n\t\t\t\t\ttracker.on('touchstart', onMouseOver);\r\n\t\t\t\t} \r\n\t\t\t});\r\n\t\t}\r\n\r\n\t}\r\n\r\n}; // end Series prototype\r\n\r\n\r\n/**\r\n * LineSeries object\r\n */\r\nvar LineSeries = extendClass(Series);\r\nseriesTypes.line = LineSeries;\r\n\r\n/**\r\n * Set the default options for area\r\n */\r\ndefaultPlotOptions.area = merge(defaultSeriesOptions, {\r\n\tthreshold: 0\r\n\t// trackByArea: false,\r\n\t// lineColor: null, // overrides color, but lets fillColor be unaltered\r\n\t// fillOpacity: 0.75,\r\n\t// fillColor: null\r\n});\r\n\r\n/**\r\n * AreaSeries object\r\n */\r\nvar AreaSeries = extendClass(Series, {\r\n\ttype: 'area',\r\n\t\r\n\t/**\r\n\t * For stacks, don't split segments on null values. Instead, draw null values with \r\n\t * no marker. Also insert dummy points for any X position that exists in other series\r\n\t * in the stack.\r\n\t */ \r\n\tgetSegments: function () {\r\n\t\tvar segments = [],\r\n\t\t\tsegment = [],\r\n\t\t\tkeys = [],\r\n\t\t\txAxis = this.xAxis,\r\n\t\t\tyAxis = this.yAxis,\r\n\t\t\tstack = yAxis.stacks[this.stackKey],\r\n\t\t\tpointMap = {},\r\n\t\t\tplotX,\r\n\t\t\tplotY,\r\n\t\t\tpoints = this.points,\r\n\t\t\tconnectNulls = this.options.connectNulls,\r\n\t\t\tval,\r\n\t\t\ti,\r\n\t\t\tx;\r\n\r\n\t\tif (this.options.stacking && !this.cropped) { // cropped causes artefacts in Stock, and perf issue\r\n\t\t\t// Create a map where we can quickly look up the points by their X value.\r\n\t\t\tfor (i = 0; i < points.length; i++) {\r\n\t\t\t\tpointMap[points[i].x] = points[i];\r\n\t\t\t}\r\n\r\n\t\t\t// Sort the keys (#1651)\r\n\t\t\tfor (x in stack) {\r\n\t\t\t\tif (stack[x].total !== null) { // nulled after switching between grouping and not (#1651, #2336)\r\n\t\t\t\t\tkeys.push(+x);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tkeys.sort(function (a, b) {\r\n\t\t\t\treturn a - b;\r\n\t\t\t});\r\n\r\n\t\t\teach(keys, function (x) {\r\n\t\t\t\tif (connectNulls && (!pointMap[x] || pointMap[x].y === null)) { // #1836\r\n\t\t\t\t\treturn;\r\n\r\n\t\t\t\t// The point exists, push it to the segment\r\n\t\t\t\t} else if (pointMap[x]) {\r\n\t\t\t\t\tsegment.push(pointMap[x]);\r\n\r\n\t\t\t\t// There is no point for this X value in this series, so we \r\n\t\t\t\t// insert a dummy point in order for the areas to be drawn\r\n\t\t\t\t// correctly.\r\n\t\t\t\t} else {\r\n\t\t\t\t\tplotX = xAxis.translate(x);\r\n\t\t\t\t\tval = stack[x].percent ? (stack[x].total ? stack[x].cum * 100 / stack[x].total : 0) : stack[x].cum; // #1991\r\n\t\t\t\t\tplotY = yAxis.toPixels(val, true);\r\n\t\t\t\t\tsegment.push({ \r\n\t\t\t\t\t\ty: null, \r\n\t\t\t\t\t\tplotX: plotX,\r\n\t\t\t\t\t\tclientX: plotX, \r\n\t\t\t\t\t\tplotY: plotY, \r\n\t\t\t\t\t\tyBottom: plotY,\r\n\t\t\t\t\t\tonMouseOver: noop\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tif (segment.length) {\r\n\t\t\t\tsegments.push(segment);\r\n\t\t\t}\r\n\r\n\t\t} else {\r\n\t\t\tSeries.prototype.getSegments.call(this);\r\n\t\t\tsegments = this.segments;\r\n\t\t}\r\n\r\n\t\tthis.segments = segments;\r\n\t},\r\n\t\r\n\t/**\r\n\t * Extend the base Series getSegmentPath method by adding the path for the area.\r\n\t * This path is pushed to the series.areaPath property.\r\n\t */\r\n\tgetSegmentPath: function (segment) {\r\n\t\t\r\n\t\tvar segmentPath = Series.prototype.getSegmentPath.call(this, segment), // call base method\r\n\t\t\tareaSegmentPath = [].concat(segmentPath), // work on a copy for the area path\r\n\t\t\ti,\r\n\t\t\toptions = this.options,\r\n\t\t\tsegLength = segmentPath.length,\r\n\t\t\ttranslatedThreshold = this.yAxis.getThreshold(options.threshold), // #2181\r\n\t\t\tyBottom;\r\n\t\t\r\n\t\tif (segLength === 3) { // for animation from 1 to two points\r\n\t\t\tareaSegmentPath.push(L, segmentPath[1], segmentPath[2]);\r\n\t\t}\r\n\t\tif (options.stacking && !this.closedStacks) {\r\n\t\t\t\r\n\t\t\t// Follow stack back. Todo: implement areaspline. A general solution could be to \r\n\t\t\t// reverse the entire graphPath of the previous series, though may be hard with\r\n\t\t\t// splines and with series with different extremes\r\n\t\t\tfor (i = segment.length - 1; i >= 0; i--) {\r\n\r\n\t\t\t\tyBottom = pick(segment[i].yBottom, translatedThreshold);\r\n\t\t\t\r\n\t\t\t\t// step line?\r\n\t\t\t\tif (i < segment.length - 1 && options.step) {\r\n\t\t\t\t\tareaSegmentPath.push(segment[i + 1].plotX, yBottom);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tareaSegmentPath.push(segment[i].plotX, yBottom);\r\n\t\t\t}\r\n\r\n\t\t} else { // follow zero line back\r\n\t\t\tthis.closeSegment(areaSegmentPath, segment, translatedThreshold);\r\n\t\t}\r\n\t\tthis.areaPath = this.areaPath.concat(areaSegmentPath);\r\n\t\treturn segmentPath;\r\n\t},\r\n\t\r\n\t/**\r\n\t * Extendable method to close the segment path of an area. This is overridden in polar \r\n\t * charts.\r\n\t */\r\n\tcloseSegment: function (path, segment, translatedThreshold) {\r\n\t\tpath.push(\r\n\t\t\tL,\r\n\t\t\tsegment[segment.length - 1].plotX,\r\n\t\t\ttranslatedThreshold,\r\n\t\t\tL,\r\n\t\t\tsegment[0].plotX,\r\n\t\t\ttranslatedThreshold\r\n\t\t);\r\n\t},\r\n\t\r\n\t/**\r\n\t * Draw the graph and the underlying area. This method calls the Series base\r\n\t * function and adds the area. The areaPath is calculated in the getSegmentPath\r\n\t * method called from Series.prototype.drawGraph.\r\n\t */\r\n\tdrawGraph: function () {\r\n\t\t\r\n\t\t// Define or reset areaPath\r\n\t\tthis.areaPath = [];\r\n\t\t\r\n\t\t// Call the base method\r\n\t\tSeries.prototype.drawGraph.apply(this);\r\n\t\t\r\n\t\t// Define local variables\r\n\t\tvar series = this,\r\n\t\t\tareaPath = this.areaPath,\r\n\t\t\toptions = this.options,\r\n\t\t\tnegativeColor = options.negativeColor,\r\n\t\t\tnegativeFillColor = options.negativeFillColor,\r\n\t\t\tprops = [['area', this.color, options.fillColor]]; // area name, main color, fill color\r\n\t\t\r\n\t\tif (negativeColor || negativeFillColor) {\r\n\t\t\tprops.push(['areaNeg', negativeColor, negativeFillColor]);\r\n\t\t}\r\n\t\t\r\n\t\teach(props, function (prop) {\r\n\t\t\tvar areaKey = prop[0],\r\n\t\t\t\tarea = series[areaKey];\r\n\t\t\t\t\r\n\t\t\t// Create or update the area\r\n\t\t\tif (area) { // update\r\n\t\t\t\tarea.animate({ d: areaPath });\r\n\t\r\n\t\t\t} else { // create\r\n\t\t\t\tseries[areaKey] = series.chart.renderer.path(areaPath)\r\n\t\t\t\t\t.attr({\r\n\t\t\t\t\t\tfill: pick(\r\n\t\t\t\t\t\t\tprop[2],\r\n\t\t\t\t\t\t\tColor(prop[1]).setOpacity(pick(options.fillOpacity, 0.75)).get()\r\n\t\t\t\t\t\t),\r\n\t\t\t\t\t\tzIndex: 0 // #1069\r\n\t\t\t\t\t}).add(series.group);\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\t\r\n\t/**\r\n\t * Get the series' symbol in the legend\r\n\t * \r\n\t * @param {Object} legend The legend object\r\n\t * @param {Object} item The series (this) or point\r\n\t */\r\n\tdrawLegendSymbol: function (legend, item) {\r\n\t\t\r\n\t\titem.legendSymbol = this.chart.renderer.rect(\r\n\t\t\t0,\r\n\t\t\tlegend.baseline - 11,\r\n\t\t\tlegend.options.symbolWidth,\r\n\t\t\t12,\r\n\t\t\t2\r\n\t\t).attr({\r\n\t\t\tzIndex: 3\r\n\t\t}).add(item.legendGroup);\t\t\r\n\t\t\r\n\t}\r\n});\r\n\r\nseriesTypes.area = AreaSeries;/**\r\n * Set the default options for spline\r\n */\r\ndefaultPlotOptions.spline = merge(defaultSeriesOptions);\r\n\r\n/**\r\n * SplineSeries object\r\n */\r\nvar SplineSeries = extendClass(Series, {\r\n\ttype: 'spline',\r\n\r\n\t/**\r\n\t * Get the spline segment from a given point's previous neighbour to the given point\r\n\t */\r\n\tgetPointSpline: function (segment, point, i) {\r\n\t\tvar smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc\r\n\t\t\tdenom = smoothing + 1,\r\n\t\t\tplotX = point.plotX,\r\n\t\t\tplotY = point.plotY,\r\n\t\t\tlastPoint = segment[i - 1],\r\n\t\t\tnextPoint = segment[i + 1],\r\n\t\t\tleftContX,\r\n\t\t\tleftContY,\r\n\t\t\trightContX,\r\n\t\t\trightContY,\r\n\t\t\tret;\r\n\r\n\t\t// find control points\r\n\t\tif (lastPoint && nextPoint) {\r\n\t\t\r\n\t\t\tvar lastX = lastPoint.plotX,\r\n\t\t\t\tlastY = lastPoint.plotY,\r\n\t\t\t\tnextX = nextPoint.plotX,\r\n\t\t\t\tnextY = nextPoint.plotY,\r\n\t\t\t\tcorrection;\r\n\r\n\t\t\tleftContX = (smoothing * plotX + lastX) / denom;\r\n\t\t\tleftContY = (smoothing * plotY + lastY) / denom;\r\n\t\t\trightContX = (smoothing * plotX + nextX) / denom;\r\n\t\t\trightContY = (smoothing * plotY + nextY) / denom;\r\n\r\n\t\t\t// have the two control points make a straight line through main point\r\n\t\t\tcorrection = ((rightContY - leftContY) * (rightContX - plotX)) /\r\n\t\t\t\t(rightContX - leftContX) + plotY - rightContY;\r\n\r\n\t\t\tleftContY += correction;\r\n\t\t\trightContY += correction;\r\n\r\n\t\t\t// to prevent false extremes, check that control points are between\r\n\t\t\t// neighbouring points' y values\r\n\t\t\tif (leftContY > lastY && leftContY > plotY) {\r\n\t\t\t\tleftContY = mathMax(lastY, plotY);\r\n\t\t\t\trightContY = 2 * plotY - leftContY; // mirror of left control point\r\n\t\t\t} else if (leftContY < lastY && leftContY < plotY) {\r\n\t\t\t\tleftContY = mathMin(lastY, plotY);\r\n\t\t\t\trightContY = 2 * plotY - leftContY;\r\n\t\t\t}\r\n\t\t\tif (rightContY > nextY && rightContY > plotY) {\r\n\t\t\t\trightContY = mathMax(nextY, plotY);\r\n\t\t\t\tleftContY = 2 * plotY - rightContY;\r\n\t\t\t} else if (rightContY < nextY && rightContY < plotY) {\r\n\t\t\t\trightContY = mathMin(nextY, plotY);\r\n\t\t\t\tleftContY = 2 * plotY - rightContY;\r\n\t\t\t}\r\n\r\n\t\t\t// record for drawing in next point\r\n\t\t\tpoint.rightContX = rightContX;\r\n\t\t\tpoint.rightContY = rightContY;\r\n\r\n\t\t}\r\n\t\t\r\n\t\t// Visualize control points for debugging\r\n\t\t/*\r\n\t\tif (leftContX) {\r\n\t\t\tthis.chart.renderer.circle(leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop, 2)\r\n\t\t\t\t.attr({\r\n\t\t\t\t\tstroke: 'red',\r\n\t\t\t\t\t'stroke-width': 1,\r\n\t\t\t\t\tfill: 'none'\r\n\t\t\t\t})\r\n\t\t\t\t.add();\r\n\t\t\tthis.chart.renderer.path(['M', leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop,\r\n\t\t\t\t'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\r\n\t\t\t\t.attr({\r\n\t\t\t\t\tstroke: 'red',\r\n\t\t\t\t\t'stroke-width': 1\r\n\t\t\t\t})\r\n\t\t\t\t.add();\r\n\t\t\tthis.chart.renderer.circle(rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop, 2)\r\n\t\t\t\t.attr({\r\n\t\t\t\t\tstroke: 'green',\r\n\t\t\t\t\t'stroke-width': 1,\r\n\t\t\t\t\tfill: 'none'\r\n\t\t\t\t})\r\n\t\t\t\t.add();\r\n\t\t\tthis.chart.renderer.path(['M', rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop,\r\n\t\t\t\t'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\r\n\t\t\t\t.attr({\r\n\t\t\t\t\tstroke: 'green',\r\n\t\t\t\t\t'stroke-width': 1\r\n\t\t\t\t})\r\n\t\t\t\t.add();\r\n\t\t}\r\n\t\t*/\r\n\r\n\t\t// moveTo or lineTo\r\n\t\tif (!i) {\r\n\t\t\tret = [M, plotX, plotY];\r\n\t\t} else { // curve from last point to this\r\n\t\t\tret = [\r\n\t\t\t\t'C',\r\n\t\t\t\tlastPoint.rightContX || lastPoint.plotX,\r\n\t\t\t\tlastPoint.rightContY || lastPoint.plotY,\r\n\t\t\t\tleftContX || plotX,\r\n\t\t\t\tleftContY || plotY,\r\n\t\t\t\tplotX,\r\n\t\t\t\tplotY\r\n\t\t\t];\r\n\t\t\tlastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n});\r\nseriesTypes.spline = SplineSeries;\r\n\r\n/**\r\n * Set the default options for areaspline\r\n */\r\ndefaultPlotOptions.areaspline = merge(defaultPlotOptions.area);\r\n\r\n/**\r\n * AreaSplineSeries object\r\n */\r\nvar areaProto = AreaSeries.prototype,\r\n\tAreaSplineSeries = extendClass(SplineSeries, {\r\n\t\ttype: 'areaspline',\r\n\t\tclosedStacks: true, // instead of following the previous graph back, follow the threshold back\r\n\t\t\r\n\t\t// Mix in methods from the area series\r\n\t\tgetSegmentPath: areaProto.getSegmentPath,\r\n\t\tcloseSegment: areaProto.closeSegment,\r\n\t\tdrawGraph: areaProto.drawGraph,\r\n\t\tdrawLegendSymbol: areaProto.drawLegendSymbol\r\n\t});\r\nseriesTypes.areaspline = AreaSplineSeries;\r\n\r\n/**\r\n * Set the default options for column\r\n */\r\ndefaultPlotOptions.column = merge(defaultSeriesOptions, {\r\n\tborderColor: '#FFFFFF',\r\n\tborderWidth: 1,\r\n\tborderRadius: 0,\r\n\t//colorByPoint: undefined,\r\n\tgroupPadding: 0.2,\r\n\t//grouping: true,\r\n\tmarker: null, // point options are specified in the base options\r\n\tpointPadding: 0.1,\r\n\t//pointWidth: null,\r\n\tminPointLength: 0,\r\n\tcropThreshold: 50, // when there are more points, they will not animate out of the chart on xAxis.setExtremes\r\n\tpointRange: null, // null means auto, meaning 1 in a categorized axis and least distance between points if not categories\r\n\tstates: {\r\n\t\thover: {\r\n\t\t\tbrightness: 0.1,\r\n\t\t\tshadow: false\r\n\t\t},\r\n\t\tselect: {\r\n\t\t\tcolor: '#C0C0C0',\r\n\t\t\tborderColor: '#000000',\r\n\t\t\tshadow: false\r\n\t\t}\r\n\t},\r\n\tdataLabels: {\r\n\t\talign: null, // auto\r\n\t\tverticalAlign: null, // auto\r\n\t\ty: null\r\n\t},\r\n\tstickyTracking: false,\r\n\tthreshold: 0\r\n});\r\n\r\n/**\r\n * ColumnSeries object\r\n */\r\nvar ColumnSeries = extendClass(Series, {\r\n\ttype: 'column',\r\n\tpointAttrToOptions: { // mapping between SVG attributes and the corresponding options\r\n\t\tstroke: 'borderColor',\r\n\t\t'stroke-width': 'borderWidth',\r\n\t\tfill: 'color',\r\n\t\tr: 'borderRadius'\r\n\t},\r\n\tcropShoulder: 0,\r\n\ttrackerGroups: ['group', 'dataLabelsGroup'],\r\n\tnegStacks: true, // use separate negative stacks, unlike area stacks where a negative \r\n\t\t// point is substracted from previous (#1910)\r\n\t\r\n\t/**\r\n\t * Initialize the series\r\n\t */\r\n\tinit: function () {\r\n\t\tSeries.prototype.init.apply(this, arguments);\r\n\r\n\t\tvar series = this,\r\n\t\t\tchart = series.chart;\r\n\r\n\t\t// if the series is added dynamically, force redraw of other\r\n\t\t// series affected by a new column\r\n\t\tif (chart.hasRendered) {\r\n\t\t\teach(chart.series, function (otherSeries) {\r\n\t\t\t\tif (otherSeries.type === series.type) {\r\n\t\t\t\t\totherSeries.isDirty = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Return the width and x offset of the columns adjusted for grouping, groupPadding, pointPadding,\r\n\t * pointWidth etc. \r\n\t */\r\n\tgetColumnMetrics: function () {\r\n\r\n\t\tvar series = this,\r\n\t\t\toptions = series.options,\r\n\t\t\txAxis = series.xAxis,\r\n\t\t\tyAxis = series.yAxis,\r\n\t\t\treversedXAxis = xAxis.reversed,\r\n\t\t\tstackKey,\r\n\t\t\tstackGroups = {},\r\n\t\t\tcolumnIndex,\r\n\t\t\tcolumnCount = 0;\r\n\r\n\t\t// Get the total number of column type series.\r\n\t\t// This is called on every series. Consider moving this logic to a\r\n\t\t// chart.orderStacks() function and call it on init, addSeries and removeSeries\r\n\t\tif (options.grouping === false) {\r\n\t\t\tcolumnCount = 1;\r\n\t\t} else {\r\n\t\t\teach(series.chart.series, function (otherSeries) {\r\n\t\t\t\tvar otherOptions = otherSeries.options,\r\n\t\t\t\t\totherYAxis = otherSeries.yAxis;\r\n\t\t\t\tif (otherSeries.type === series.type && otherSeries.visible &&\r\n\t\t\t\t\t\tyAxis.len === otherYAxis.len && yAxis.pos === otherYAxis.pos) { // #642, #2086\r\n\t\t\t\t\tif (otherOptions.stacking) {\r\n\t\t\t\t\t\tstackKey = otherSeries.stackKey;\r\n\t\t\t\t\t\tif (stackGroups[stackKey] === UNDEFINED) {\r\n\t\t\t\t\t\t\tstackGroups[stackKey] = columnCount++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcolumnIndex = stackGroups[stackKey];\r\n\t\t\t\t\t} else if (otherOptions.grouping !== false) { // #1162\r\n\t\t\t\t\t\tcolumnIndex = columnCount++;\r\n\t\t\t\t\t}\r\n\t\t\t\t\totherSeries.columnIndex = columnIndex;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tvar categoryWidth = mathMin(\r\n\t\t\t\tmathAbs(xAxis.transA) * (xAxis.ordinalSlope || options.pointRange || xAxis.closestPointRange || 1), \r\n\t\t\t\txAxis.len // #1535\r\n\t\t\t),\r\n\t\t\tgroupPadding = categoryWidth * options.groupPadding,\r\n\t\t\tgroupWidth = categoryWidth - 2 * groupPadding,\r\n\t\t\tpointOffsetWidth = groupWidth / columnCount,\r\n\t\t\toptionPointWidth = options.pointWidth,\r\n\t\t\tpointPadding = defined(optionPointWidth) ? (pointOffsetWidth - optionPointWidth) / 2 :\r\n\t\t\t\tpointOffsetWidth * options.pointPadding,\r\n\t\t\tpointWidth = pick(optionPointWidth, pointOffsetWidth - 2 * pointPadding), // exact point width, used in polar charts\r\n\t\t\tcolIndex = (reversedXAxis ? \r\n\t\t\t\tcolumnCount - (series.columnIndex || 0) : // #1251\r\n\t\t\t\tseries.columnIndex) || 0,\r\n\t\t\tpointXOffset = pointPadding + (groupPadding + colIndex *\r\n\t\t\t\tpointOffsetWidth - (categoryWidth / 2)) *\r\n\t\t\t\t(reversedXAxis ? -1 : 1);\r\n\r\n\t\t// Save it for reading in linked series (Error bars particularly)\r\n\t\treturn (series.columnMetrics = { \r\n\t\t\twidth: pointWidth, \r\n\t\t\toffset: pointXOffset \r\n\t\t});\r\n\t\t\t\r\n\t},\r\n\r\n\t/**\r\n\t * Translate each point to the plot area coordinate system and find shape positions\r\n\t */\r\n\ttranslate: function () {\r\n\t\tvar series = this,\r\n\t\t\tchart = series.chart,\r\n\t\t\toptions = series.options,\r\n\t\t\tborderWidth = options.borderWidth,\r\n\t\t\tyAxis = series.yAxis,\r\n\t\t\tthreshold = options.threshold,\r\n\t\t\ttranslatedThreshold = series.translatedThreshold = yAxis.getThreshold(threshold),\r\n\t\t\tminPointLength = pick(options.minPointLength, 5),\r\n\t\t\tmetrics = series.getColumnMetrics(),\r\n\t\t\tpointWidth = metrics.width,\r\n\t\t\tseriesBarW = series.barW = mathCeil(mathMax(pointWidth, 1 + 2 * borderWidth)), // rounded and postprocessed for border width\r\n\t\t\tpointXOffset = series.pointXOffset = metrics.offset,\r\n\t\t\txCrisp = -(borderWidth % 2 ? 0.5 : 0),\r\n\t\t\tyCrisp = borderWidth % 2 ? 0.5 : 1;\r\n\r\n\t\tif (chart.renderer.isVML && chart.inverted) {\r\n\t\t\tyCrisp += 1;\r\n\t\t}\r\n\r\n\t\tSeries.prototype.translate.apply(series);\r\n\r\n\t\t// record the new values\r\n\t\teach(series.points, function (point) {\r\n\t\t\tvar yBottom = pick(point.yBottom, translatedThreshold),\r\n\t\t\t\tplotY = mathMin(mathMax(-999 - yBottom, point.plotY), yAxis.len + 999 + yBottom), // Don't draw too far outside plot area (#1303, #2241)\r\n\t\t\t\tbarX = point.plotX + pointXOffset,\r\n\t\t\t\tbarW = seriesBarW,\r\n\t\t\t\tbarY = mathMin(plotY, yBottom),\r\n\t\t\t\tright,\r\n\t\t\t\tbottom,\r\n\t\t\t\tfromTop,\r\n\t\t\t\tfromLeft,\r\n\t\t\t\tbarH = mathMax(plotY, yBottom) - barY;\r\n\r\n\t\t\t// Handle options.minPointLength\r\n\t\t\tif (mathAbs(barH) < minPointLength) {\r\n\t\t\t\tif (minPointLength) {\r\n\t\t\t\t\tbarH = minPointLength;\r\n\t\t\t\t\tbarY =\r\n\t\t\t\t\t\tmathRound(mathAbs(barY - translatedThreshold) > minPointLength ? // stacked\r\n\t\t\t\t\t\t\tyBottom - minPointLength : // keep position\r\n\t\t\t\t\t\t\ttranslatedThreshold - (yAxis.translate(point.y, 0, 1, 0, 1) <= translatedThreshold ? minPointLength : 0)); // use exact yAxis.translation (#1485)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// Cache for access in polar\r\n\t\t\tpoint.barX = barX;\r\n\t\t\tpoint.pointWidth = pointWidth;\r\n\r\n\r\n\t\t\t// Round off to obtain crisp edges\r\n\t\t\tfromLeft = mathAbs(barX) < 0.5;\r\n\t\t\tright = mathRound(barX + barW) + xCrisp;\r\n\t\t\tbarX = mathRound(barX) + xCrisp;\r\n\t\t\tbarW = right - barX;\r\n\r\n\t\t\tfromTop = mathAbs(barY) < 0.5;\r\n\t\t\tbottom = mathRound(barY + barH) + yCrisp;\r\n\t\t\tbarY = mathRound(barY) + yCrisp;\r\n\t\t\tbarH = bottom - barY;\r\n\r\n\t\t\t// Top and left edges are exceptions\r\n\t\t\tif (fromLeft) {\r\n\t\t\t\tbarX += 1;\r\n\t\t\t\tbarW -= 1;\r\n\t\t\t}\r\n\t\t\tif (fromTop) {\r\n\t\t\t\tbarY -= 1;\r\n\t\t\t\tbarH += 1;\r\n\t\t\t}\r\n\r\n\t\t\t// Register shape type and arguments to be used in drawPoints\r\n\t\t\tpoint.shapeType = 'rect';\r\n\t\t\tpoint.shapeArgs = {\r\n\t\t\t\tx: barX,\r\n\t\t\t\ty: barY,\r\n\t\t\t\twidth: barW,\r\n\t\t\t\theight: barH\r\n\t\t\t};\r\n\t\t});\r\n\r\n\t},\r\n\r\n\tgetSymbol: noop,\r\n\t\r\n\t/**\r\n\t * Use a solid rectangle like the area series types\r\n\t */\r\n\tdrawLegendSymbol: AreaSeries.prototype.drawLegendSymbol,\r\n\t\r\n\t\r\n\t/**\r\n\t * Columns have no graph\r\n\t */\r\n\tdrawGraph: noop,\r\n\r\n\t/**\r\n\t * Draw the columns. For bars, the series.group is rotated, so the same coordinates\r\n\t * apply for columns and bars. This method is inherited by scatter series.\r\n\t *\r\n\t */\r\n\tdrawPoints: function () {\r\n\t\tvar series = this,\r\n\t\t\toptions = series.options,\r\n\t\t\trenderer = series.chart.renderer,\r\n\t\t\tshapeArgs;\r\n\r\n\r\n\t\t// draw the columns\r\n\t\teach(series.points, function (point) {\r\n\t\t\tvar plotY = point.plotY,\r\n\t\t\t\tgraphic = point.graphic;\r\n\r\n\t\t\tif (plotY !== UNDEFINED && !isNaN(plotY) && point.y !== null) {\r\n\t\t\t\tshapeArgs = point.shapeArgs;\r\n\t\t\t\t\r\n\t\t\t\tif (graphic) { // update\r\n\t\t\t\t\tstop(graphic);\r\n\t\t\t\t\tgraphic.animate(merge(shapeArgs));\r\n\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpoint.graphic = graphic = renderer[point.shapeType](shapeArgs)\r\n\t\t\t\t\t\t.attr(point.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE])\r\n\t\t\t\t\t\t.add(series.group)\r\n\t\t\t\t\t\t.shadow(options.shadow, null, options.stacking && !options.borderRadius);\r\n\t\t\t\t}\r\n\r\n\t\t\t} else if (graphic) {\r\n\t\t\t\tpoint.graphic = graphic.destroy(); // #1269\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Add tracking event listener to the series group, so the point graphics\r\n\t * themselves act as trackers\r\n\t */\r\n\tdrawTracker: function () {\r\n\t\tvar series = this,\r\n\t\t\tchart = series.chart,\r\n\t\t\tpointer = chart.pointer,\r\n\t\t\tcursor = series.options.cursor,\r\n\t\t\tcss = cursor && { cursor: cursor },\r\n\t\t\tonMouseOver = function (e) {\r\n\t\t\t\tvar target = e.target,\r\n\t\t\t\t\tpoint;\r\n\r\n\t\t\t\tif (chart.hoverSeries !== series) {\r\n\t\t\t\t\tseries.onMouseOver();\r\n\t\t\t\t}\r\n\t\t\t\twhile (target && !point) {\r\n\t\t\t\t\tpoint = target.point;\r\n\t\t\t\t\ttarget = target.parentNode;\r\n\t\t\t\t}\r\n\t\t\t\tif (point !== UNDEFINED && point !== chart.hoverPoint) { // undefined on graph in scatterchart\r\n\t\t\t\t\tpoint.onMouseOver(e);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t// Add reference to the point\r\n\t\teach(series.points, function (point) {\r\n\t\t\tif (point.graphic) {\r\n\t\t\t\tpoint.graphic.element.point = point;\r\n\t\t\t}\r\n\t\t\tif (point.dataLabel) {\r\n\t\t\t\tpoint.dataLabel.element.point = point;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Add the event listeners, we need to do this only once\r\n\t\tif (!series._hasTracking) {\r\n\t\t\teach(series.trackerGroups, function (key) {\r\n\t\t\t\tif (series[key]) { // we don't always have dataLabelsGroup\r\n\t\t\t\t\tseries[key]\r\n\t\t\t\t\t\t.addClass(PREFIX + 'tracker')\r\n\t\t\t\t\t\t.on('mouseover', onMouseOver)\r\n\t\t\t\t\t\t.on('mouseout', function (e) { pointer.onTrackerMouseOut(e); })\r\n\t\t\t\t\t\t.css(css);\r\n\t\t\t\t\tif (hasTouch) {\r\n\t\t\t\t\t\tseries[key].on('touchstart', onMouseOver);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tseries._hasTracking = true;\r\n\t\t}\r\n\t},\r\n\t\r\n\t/** \r\n\t * Override the basic data label alignment by adjusting for the position of the column\r\n\t */\r\n\talignDataLabel: function (point, dataLabel, options, alignTo, isNew) {\r\n\t\tvar chart = this.chart,\r\n\t\t\tinverted = chart.inverted,\r\n\t\t\tdlBox = point.dlBox || point.shapeArgs, // data label box for alignment\r\n\t\t\tbelow = point.below || (point.plotY > pick(this.translatedThreshold, chart.plotSizeY)),\r\n\t\t\tinside = pick(options.inside, !!this.options.stacking); // draw it inside the box?\r\n\t\t\r\n\t\t// Align to the column itself, or the top of it\r\n\t\tif (dlBox) { // Area range uses this method but not alignTo\r\n\t\t\talignTo = merge(dlBox);\r\n\t\t\tif (inverted) {\r\n\t\t\t\talignTo = {\r\n\t\t\t\t\tx: chart.plotWidth - alignTo.y - alignTo.height,\r\n\t\t\t\t\ty: chart.plotHeight - alignTo.x - alignTo.width,\r\n\t\t\t\t\twidth: alignTo.height,\r\n\t\t\t\t\theight: alignTo.width\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t\t\t\r\n\t\t\t// Compute the alignment box\r\n\t\t\tif (!inside) {\r\n\t\t\t\tif (inverted) {\r\n\t\t\t\t\talignTo.x += below ? 0 : alignTo.width;\r\n\t\t\t\t\talignTo.width = 0;\r\n\t\t\t\t} else {\r\n\t\t\t\t\talignTo.y += below ? alignTo.height : 0;\r\n\t\t\t\t\talignTo.height = 0;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// When alignment is undefined (typically columns and bars), display the individual \r\n\t\t// point below or above the point depending on the threshold\r\n\t\toptions.align = pick(\r\n\t\t\toptions.align, \r\n\t\t\t!inverted || inside ? 'center' : below ? 'right' : 'left'\r\n\t\t);\r\n\t\toptions.verticalAlign = pick(\r\n\t\t\toptions.verticalAlign, \r\n\t\t\tinverted || inside ? 'middle' : below ? 'top' : 'bottom'\r\n\t\t);\r\n\t\t\r\n\t\t// Call the parent method\r\n\t\tSeries.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);\r\n\t},\r\n\r\n\r\n\t/**\r\n\t * Animate the column heights one by one from zero\r\n\t * @param {Boolean} init Whether to initialize the animation or run it\r\n\t */\r\n\tanimate: function (init) {\r\n\t\tvar series = this,\r\n\t\t\tyAxis = this.yAxis,\r\n\t\t\toptions = series.options,\r\n\t\t\tinverted = this.chart.inverted,\r\n\t\t\tattr = {},\r\n\t\t\ttranslatedThreshold;\r\n\r\n\t\tif (hasSVG) { // VML is too slow anyway\r\n\t\t\tif (init) {\r\n\t\t\t\tattr.scaleY = 0.001;\r\n\t\t\t\ttranslatedThreshold = mathMin(yAxis.pos + yAxis.len, mathMax(yAxis.pos, yAxis.toPixels(options.threshold)));\r\n\t\t\t\tif (inverted) {\r\n\t\t\t\t\tattr.translateX = translatedThreshold - yAxis.len;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tattr.translateY = translatedThreshold;\r\n\t\t\t\t}\r\n\t\t\t\tseries.group.attr(attr);\r\n\r\n\t\t\t} else { // run the animation\r\n\t\t\t\t\r\n\t\t\t\tattr.scaleY = 1;\r\n\t\t\t\tattr[inverted ? 'translateX' : 'translateY'] = yAxis.pos;\r\n\t\t\t\tseries.group.animate(attr, series.options.animation);\r\n\r\n\t\t\t\t// delete this function to allow it only once\r\n\t\t\t\tseries.animate = null;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * Remove this series from the chart\r\n\t */\r\n\tremove: function () {\r\n\t\tvar series = this,\r\n\t\t\tchart = series.chart;\r\n\r\n\t\t// column and bar series affects other series of the same type\r\n\t\t// as they are either stacked or grouped\r\n\t\tif (chart.hasRendered) {\r\n\t\t\teach(chart.series, function (otherSeries) {\r\n\t\t\t\tif (otherSeries.type === series.type) {\r\n\t\t\t\t\totherSeries.isDirty = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tSeries.prototype.remove.apply(series, arguments);\r\n\t}\r\n});\r\nseriesTypes.column = ColumnSeries;\r\n/**\r\n * Set the default options for bar\r\n */\r\ndefaultPlotOptions.bar = merge(defaultPlotOptions.column);\r\n/**\r\n * The Bar series class\r\n */\r\nvar BarSeries = extendClass(ColumnSeries, {\r\n\ttype: 'bar',\r\n\tinverted: true\r\n});\r\nseriesTypes.bar = BarSeries;\r\n\r\n/**\r\n * Set the default options for scatter\r\n */\r\ndefaultPlotOptions.scatter = merge(defaultSeriesOptions, {\r\n\tlineWidth: 0,\r\n\ttooltip: {\r\n\t\theaderFormat: '<span style=\"font-size: 10px; color:{series.color}\">{series.name}</span><br/>',\r\n\t\tpointFormat: 'x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>',\r\n\t\tfollowPointer: true\r\n\t},\r\n\tstickyTracking: false\r\n});\r\n\r\n/**\r\n * The scatter series class\r\n */\r\nvar ScatterSeries = extendClass(Series, {\r\n\ttype: 'scatter',\r\n\tsorted: false,\r\n\trequireSorting: false,\r\n\tnoSharedTooltip: true,\r\n\ttrackerGroups: ['markerGroup'],\r\n\ttakeOrdinalPosition: false, // #2342\r\n\tdrawTracker: ColumnSeries.prototype.drawTracker,\r\n\t\r\n\tsetTooltipPoints: noop\r\n});\r\nseriesTypes.scatter = ScatterSeries;\r\n\r\n/**\r\n * Set the default options for pie\r\n */\r\ndefaultPlotOptions.pie = merge(defaultSeriesOptions, {\r\n\tborderColor: '#FFFFFF',\r\n\tborderWidth: 1,\r\n\tcenter: [null, null],\r\n\tclip: false,\r\n\tcolorByPoint: true, // always true for pies\r\n\tdataLabels: {\r\n\t\t// align: null,\r\n\t\t// connectorWidth: 1,\r\n\t\t// connectorColor: point.color,\r\n\t\t// connectorPadding: 5,\r\n\t\tdistance: 30,\r\n\t\tenabled: true,\r\n\t\tformatter: function () {\r\n\t\t\treturn this.point.name;\r\n\t\t}\r\n\t\t// softConnector: true,\r\n\t\t//y: 0\r\n\t},\r\n\tignoreHiddenPoint: true,\r\n\t//innerSize: 0,\r\n\tlegendType: 'point',\r\n\tmarker: null, // point options are specified in the base options\r\n\tsize: null,\r\n\tshowInLegend: false,\r\n\tslicedOffset: 10,\r\n\tstates: {\r\n\t\thover: {\r\n\t\t\tbrightness: 0.1,\r\n\t\t\tshadow: false\r\n\t\t}\r\n\t},\r\n\tstickyTracking: false,\r\n\ttooltip: {\r\n\t\tfollowPointer: true\r\n\t}\r\n});\r\n\r\n/**\r\n * Extended point object for pies\r\n */\r\nvar PiePoint = extendClass(Point, {\r\n\t/**\r\n\t * Initiate the pie slice\r\n\t */\r\n\tinit: function () {\r\n\r\n\t\tPoint.prototype.init.apply(this, arguments);\r\n\r\n\t\tvar point = this,\r\n\t\t\ttoggleSlice;\r\n\r\n\t\t// Disallow negative values (#1530)\r\n\t\tif (point.y < 0) {\r\n\t\t\tpoint.y = null;\r\n\t\t}\r\n\r\n\t\t//visible: options.visible !== false,\r\n\t\textend(point, {\r\n\t\t\tvisible: point.visible !== false,\r\n\t\t\tname: pick(point.name, 'Slice')\r\n\t\t});\r\n\r\n\t\t// add event listener for select\r\n\t\ttoggleSlice = function (e) {\r\n\t\t\tpoint.slice(e.type === 'select');\r\n\t\t};\r\n\t\taddEvent(point, 'select', toggleSlice);\r\n\t\taddEvent(point, 'unselect', toggleSlice);\r\n\r\n\t\treturn point;\r\n\t},\r\n\r\n\t/**\r\n\t * Toggle the visibility of the pie slice\r\n\t * @param {Boolean} vis Whether to show the slice or not. If undefined, the\r\n\t * visibility is toggled\r\n\t */\r\n\tsetVisible: function (vis) {\r\n\t\tvar point = this,\r\n\t\t\tseries = point.series,\r\n\t\t\tchart = series.chart,\r\n\t\t\tmethod;\r\n\r\n\t\t// if called without an argument, toggle visibility\r\n\t\tpoint.visible = point.options.visible = vis = vis === UNDEFINED ? !point.visible : vis;\r\n\t\tseries.options.data[inArray(point, series.data)] = point.options; // update userOptions.data\r\n\t\t\r\n\t\tmethod = vis ? 'show' : 'hide';\r\n\r\n\t\t// Show and hide associated elements\r\n\t\teach(['graphic', 'dataLabel', 'connector', 'shadowGroup'], function (key) {\r\n\t\t\tif (point[key]) {\r\n\t\t\t\tpoint[key][method]();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (point.legendItem) {\r\n\t\t\tchart.legend.colorizeItem(point, vis);\r\n\t\t}\r\n\t\t\r\n\t\t// Handle ignore hidden slices\r\n\t\tif (!series.isDirty && series.options.ignoreHiddenPoint) {\r\n\t\t\tseries.isDirty = true;\r\n\t\t\tchart.redraw();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Set or toggle whether the slice is cut out from the pie\r\n\t * @param {Boolean} sliced When undefined, the slice state is toggled\r\n\t * @param {Boolean} redraw Whether to redraw the chart. True by default.\r\n\t */\r\n\tslice: function (sliced, redraw, animation) {\r\n\t\tvar point = this,\r\n\t\t\tseries = point.series,\r\n\t\t\tchart = series.chart,\r\n\t\t\ttranslation;\r\n\r\n\t\tsetAnimation(animation, chart);\r\n\r\n\t\t// redraw is true by default\r\n\t\tredraw = pick(redraw, true);\r\n\r\n\t\t// if called without an argument, toggle\r\n\t\tpoint.sliced = point.options.sliced = sliced = defined(sliced) ? sliced : !point.sliced;\r\n\t\tseries.options.data[inArray(point, series.data)] = point.options; // update userOptions.data\r\n\r\n\t\ttranslation = sliced ? point.slicedTranslation : {\r\n\t\t\ttranslateX: 0,\r\n\t\t\ttranslateY: 0\r\n\t\t};\r\n\r\n\t\tpoint.graphic.animate(translation);\r\n\t\t\r\n\t\tif (point.shadowGroup) {\r\n\t\t\tpoint.shadowGroup.animate(translation);\r\n\t\t}\r\n\r\n\t}\r\n});\r\n\r\n/**\r\n * The Pie series class\r\n */\r\nvar PieSeries = {\r\n\ttype: 'pie',\r\n\tisCartesian: false,\r\n\tpointClass: PiePoint,\r\n\trequireSorting: false,\r\n\tnoSharedTooltip: true,\r\n\ttrackerGroups: ['group', 'dataLabelsGroup'],\r\n\tpointAttrToOptions: { // mapping between SVG attributes and the corresponding options\r\n\t\tstroke: 'borderColor',\r\n\t\t'stroke-width': 'borderWidth',\r\n\t\tfill: 'color'\r\n\t},\r\n\r\n\t/**\r\n\t * Pies have one color each point\r\n\t */\r\n\tgetColor: noop,\r\n\r\n\t/**\r\n\t * Animate the pies in\r\n\t */\r\n\tanimate: function (init) {\r\n\t\tvar series = this,\r\n\t\t\tpoints = series.points,\r\n\t\t\tstartAngleRad = series.startAngleRad;\r\n\r\n\t\tif (!init) {\r\n\t\t\teach(points, function (point) {\r\n\t\t\t\tvar graphic = point.graphic,\r\n\t\t\t\t\targs = point.shapeArgs;\r\n\r\n\t\t\t\tif (graphic) {\r\n\t\t\t\t\t// start values\r\n\t\t\t\t\tgraphic.attr({\r\n\t\t\t\t\t\tr: series.center[3] / 2, // animate from inner radius (#779)\r\n\t\t\t\t\t\tstart: startAngleRad,\r\n\t\t\t\t\t\tend: startAngleRad\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\t// animate\r\n\t\t\t\t\tgraphic.animate({\r\n\t\t\t\t\t\tr: args.r,\r\n\t\t\t\t\t\tstart: args.start,\r\n\t\t\t\t\t\tend: args.end\r\n\t\t\t\t\t}, series.options.animation);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// delete this function to allow it only once\r\n\t\t\tseries.animate = null;\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Extend the basic setData method by running processData and generatePoints immediately,\r\n\t * in order to access the points from the legend.\r\n\t */\r\n\tsetData: function (data, redraw) {\r\n\t\tSeries.prototype.setData.call(this, data, false);\r\n\t\tthis.processData();\r\n\t\tthis.generatePoints();\r\n\t\tif (pick(redraw, true)) {\r\n\t\t\tthis.chart.redraw();\r\n\t\t} \r\n\t},\r\n\r\n\t/**\r\n\t * Extend the generatePoints method by adding total and percentage properties to each point\r\n\t */\r\n\tgeneratePoints: function () {\r\n\t\tvar i,\r\n\t\t\ttotal = 0,\r\n\t\t\tpoints,\r\n\t\t\tlen,\r\n\t\t\tpoint,\r\n\t\t\tignoreHiddenPoint = this.options.ignoreHiddenPoint;\r\n\r\n\t\tSeries.prototype.generatePoints.call(this);\r\n\r\n\t\t// Populate local vars\r\n\t\tpoints = this.points;\r\n\t\tlen = points.length;\r\n\t\t\r\n\t\t// Get the total sum\r\n\t\tfor (i = 0; i < len; i++) {\r\n\t\t\tpoint = points[i];\r\n\t\t\ttotal += (ignoreHiddenPoint && !point.visible) ? 0 : point.y;\r\n\t\t}\r\n\t\tthis.total = total;\r\n\r\n\t\t// Set each point's properties\r\n\t\tfor (i = 0; i < len; i++) {\r\n\t\t\tpoint = points[i];\r\n\t\t\tpoint.percentage = total > 0 ? (point.y / total) * 100 : 0;\r\n\t\t\tpoint.total = total;\r\n\t\t}\r\n\t\t\r\n\t},\r\n\t\r\n\t/**\r\n\t * Get the center of the pie based on the size and center options relative to the \r\n\t * plot area. Borrowed by the polar and gauge series types.\r\n\t */\r\n\tgetCenter: function () {\r\n\t\t\r\n\t\tvar options = this.options,\r\n\t\t\tchart = this.chart,\r\n\t\t\tslicingRoom = 2 * (options.slicedOffset || 0),\r\n\t\t\thandleSlicingRoom,\r\n\t\t\tplotWidth = chart.plotWidth - 2 * slicingRoom,\r\n\t\t\tplotHeight = chart.plotHeight - 2 * slicingRoom,\r\n\t\t\tcenterOption = options.center,\r\n\t\t\tpositions = [pick(centerOption[0], '50%'), pick(centerOption[1], '50%'), options.size || '100%', options.innerSize || 0],\r\n\t\t\tsmallestSize = mathMin(plotWidth, plotHeight),\r\n\t\t\tisPercent;\r\n\t\t\r\n\t\treturn map(positions, function (length, i) {\r\n\t\t\tisPercent = /%$/.test(length);\r\n\t\t\thandleSlicingRoom = i < 2 || (i === 2 && isPercent);\r\n\t\t\treturn (isPercent ?\r\n\t\t\t\t// i == 0: centerX, relative to width\r\n\t\t\t\t// i == 1: centerY, relative to height\r\n\t\t\t\t// i == 2: size, relative to smallestSize\r\n\t\t\t\t// i == 4: innerSize, relative to smallestSize\r\n\t\t\t\t[plotWidth, plotHeight, smallestSize, smallestSize][i] *\r\n\t\t\t\t\tpInt(length) / 100 :\r\n\t\t\t\tlength) + (handleSlicingRoom ? slicingRoom : 0);\r\n\t\t});\r\n\t},\r\n\t\r\n\t/**\r\n\t * Do translation for pie slices\r\n\t */\r\n\ttranslate: function (positions) {\r\n\t\tthis.generatePoints();\r\n\t\t\r\n\t\tvar series = this,\r\n\t\t\tcumulative = 0,\r\n\t\t\tprecision = 1000, // issue #172\r\n\t\t\toptions = series.options,\r\n\t\t\tslicedOffset = options.slicedOffset,\r\n\t\t\tconnectorOffset = slicedOffset + options.borderWidth,\r\n\t\t\tstart,\r\n\t\t\tend,\r\n\t\t\tangle,\r\n\t\t\tstartAngle = options.startAngle || 0,\r\n\t\t\tstartAngleRad = series.startAngleRad = mathPI / 180 * (startAngle - 90),\r\n\t\t\tendAngleRad = series.endAngleRad = mathPI / 180 * ((options.endAngle || (startAngle + 360)) - 90),\r\n\t\t\tcirc = endAngleRad - startAngleRad, //2 * mathPI,\r\n\t\t\tpoints = series.points,\r\n\t\t\tradiusX, // the x component of the radius vector for a given point\r\n\t\t\tradiusY,\r\n\t\t\tlabelDistance = options.dataLabels.distance,\r\n\t\t\tignoreHiddenPoint = options.ignoreHiddenPoint,\r\n\t\t\ti,\r\n\t\t\tlen = points.length,\r\n\t\t\tpoint;\r\n\r\n\t\t// Get positions - either an integer or a percentage string must be given.\r\n\t\t// If positions are passed as a parameter, we're in a recursive loop for adjusting\r\n\t\t// space for data labels.\r\n\t\tif (!positions) {\r\n\t\t\tseries.center = positions = series.getCenter();\r\n\t\t}\r\n\r\n\t\t// utility for getting the x value from a given y, used for anticollision logic in data labels\r\n\t\tseries.getX = function (y, left) {\r\n\r\n\t\t\tangle = math.asin((y - positions[1]) / (positions[2] / 2 + labelDistance));\r\n\r\n\t\t\treturn positions[0] +\r\n\t\t\t\t(left ? -1 : 1) *\r\n\t\t\t\t(mathCos(angle) * (positions[2] / 2 + labelDistance));\r\n\t\t};\r\n\r\n\t\t// Calculate the geometry for each point\r\n\t\tfor (i = 0; i < len; i++) {\r\n\t\t\t\r\n\t\t\tpoint = points[i];\r\n\t\t\t\r\n\t\t\t// set start and end angle\r\n\t\t\tstart = startAngleRad + (cumulative * circ);\r\n\t\t\tif (!ignoreHiddenPoint || point.visible) {\r\n\t\t\t\tcumulative += point.percentage / 100;\r\n\t\t\t}\r\n\t\t\tend = startAngleRad + (cumulative * circ);\r\n\r\n\t\t\t// set the shape\r\n\t\t\tpoint.shapeType = 'arc';\r\n\t\t\tpoint.shapeArgs = {\r\n\t\t\t\tx: positions[0],\r\n\t\t\t\ty: positions[1],\r\n\t\t\t\tr: positions[2] / 2,\r\n\t\t\t\tinnerR: positions[3] / 2,\r\n\t\t\t\tstart: mathRound(start * precision) / precision,\r\n\t\t\t\tend: mathRound(end * precision) / precision\r\n\t\t\t};\r\n\r\n\t\t\t// center for the sliced out slice\r\n\t\t\tangle = (end + start) / 2;\r\n\t\t\tif (angle > 0.75 * circ) {\r\n\t\t\t\tangle -= 2 * mathPI;\r\n\t\t\t}\r\n\t\t\tpoint.slicedTranslation = {\r\n\t\t\t\ttranslateX: mathRound(mathCos(angle) * slicedOffset),\r\n\t\t\t\ttranslateY: mathRound(mathSin(angle) * slicedOffset)\r\n\t\t\t};\r\n\r\n\t\t\t// set the anchor point for tooltips\r\n\t\t\tradiusX = mathCos(angle) * positions[2] / 2;\r\n\t\t\tradiusY = mathSin(angle) * positions[2] / 2;\r\n\t\t\tpoint.tooltipPos = [\r\n\t\t\t\tpositions[0] + radiusX * 0.7,\r\n\t\t\t\tpositions[1] + radiusY * 0.7\r\n\t\t\t];\r\n\t\t\t\r\n\t\t\tpoint.half = angle < -mathPI / 2 || angle > mathPI / 2 ? 1 : 0;\r\n\t\t\tpoint.angle = angle;\r\n\r\n\t\t\t// set the anchor point for data labels\r\n\t\t\tconnectorOffset = mathMin(connectorOffset, labelDistance / 2); // #1678\r\n\t\t\tpoint.labelPos = [\r\n\t\t\t\tpositions[0] + radiusX + mathCos(angle) * labelDistance, // first break of connector\r\n\t\t\t\tpositions[1] + radiusY + mathSin(angle) * labelDistance, // a/a\r\n\t\t\t\tpositions[0] + radiusX + mathCos(angle) * connectorOffset, // second break, right outside pie\r\n\t\t\t\tpositions[1] + radiusY + mathSin(angle) * connectorOffset, // a/a\r\n\t\t\t\tpositions[0] + radiusX, // landing point for connector\r\n\t\t\t\tpositions[1] + radiusY, // a/a\r\n\t\t\t\tlabelDistance < 0 ? // alignment\r\n\t\t\t\t\t'center' :\r\n\t\t\t\t\tpoint.half ? 'right' : 'left', // alignment\r\n\t\t\t\tangle // center angle\r\n\t\t\t];\r\n\r\n\t\t}\r\n\t},\r\n\r\n\tsetTooltipPoints: noop,\r\n\tdrawGraph: null,\r\n\r\n\t/**\r\n\t * Draw the data points\r\n\t */\r\n\tdrawPoints: function () {\r\n\t\tvar series = this,\r\n\t\t\tchart = series.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\tgroupTranslation,\r\n\t\t\t//center,\r\n\t\t\tgraphic,\r\n\t\t\t//group,\r\n\t\t\tshadow = series.options.shadow,\r\n\t\t\tshadowGroup,\r\n\t\t\tshapeArgs;\r\n\r\n\t\tif (shadow && !series.shadowGroup) {\r\n\t\t\tseries.shadowGroup = renderer.g('shadow')\r\n\t\t\t\t.add(series.group);\r\n\t\t}\r\n\r\n\t\t// draw the slices\r\n\t\teach(series.points, function (point) {\r\n\t\t\tgraphic = point.graphic;\r\n\t\t\tshapeArgs = point.shapeArgs;\r\n\t\t\tshadowGroup = point.shadowGroup;\r\n\r\n\t\t\t// put the shadow behind all points\r\n\t\t\tif (shadow && !shadowGroup) {\r\n\t\t\t\tshadowGroup = point.shadowGroup = renderer.g('shadow')\r\n\t\t\t\t\t.add(series.shadowGroup);\r\n\t\t\t}\r\n\r\n\t\t\t// if the point is sliced, use special translation, else use plot area traslation\r\n\t\t\tgroupTranslation = point.sliced ? point.slicedTranslation : {\r\n\t\t\t\ttranslateX: 0,\r\n\t\t\t\ttranslateY: 0\r\n\t\t\t};\r\n\r\n\t\t\t//group.translate(groupTranslation[0], groupTranslation[1]);\r\n\t\t\tif (shadowGroup) {\r\n\t\t\t\tshadowGroup.attr(groupTranslation);\r\n\t\t\t}\r\n\r\n\t\t\t// draw the slice\r\n\t\t\tif (graphic) {\r\n\t\t\t\tgraphic.animate(extend(shapeArgs, groupTranslation));\r\n\t\t\t} else {\r\n\t\t\t\tpoint.graphic = graphic = renderer.arc(shapeArgs)\r\n\t\t\t\t\t.setRadialReference(series.center)\r\n\t\t\t\t\t.attr(\r\n\t\t\t\t\t\tpoint.pointAttr[point.selected ? SELECT_STATE : NORMAL_STATE]\r\n\t\t\t\t\t)\r\n\t\t\t\t\t.attr({ 'stroke-linejoin': 'round' })\r\n\t\t\t\t\t.attr(groupTranslation)\r\n\t\t\t\t\t.add(series.group)\r\n\t\t\t\t\t.shadow(shadow, shadowGroup);\t\r\n\t\t\t}\r\n\r\n\t\t\t// detect point specific visibility\r\n\t\t\tif (point.visible === false) {\r\n\t\t\t\tpoint.setVisible(false);\r\n\t\t\t}\r\n\r\n\t\t});\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Utility for sorting data labels\r\n\t */\r\n\tsortByAngle: function (points, sign) {\r\n\t\tpoints.sort(function (a, b) {\r\n\t\t\treturn a.angle !== undefined && (b.angle - a.angle) * sign;\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Override the base drawDataLabels method by pie specific functionality\r\n\t */\r\n\tdrawDataLabels: function () {\r\n\t\tvar series = this,\r\n\t\t\tdata = series.data,\r\n\t\t\tpoint,\r\n\t\t\tchart = series.chart,\r\n\t\t\toptions = series.options.dataLabels,\r\n\t\t\tconnectorPadding = pick(options.connectorPadding, 10),\r\n\t\t\tconnectorWidth = pick(options.connectorWidth, 1),\r\n\t\t\tplotWidth = chart.plotWidth,\r\n\t\t\tplotHeight = chart.plotHeight,\r\n\t\t\tconnector,\r\n\t\t\tconnectorPath,\r\n\t\t\tsoftConnector = pick(options.softConnector, true),\r\n\t\t\tdistanceOption = options.distance,\r\n\t\t\tseriesCenter = series.center,\r\n\t\t\tradius = seriesCenter[2] / 2,\r\n\t\t\tcenterY = seriesCenter[1],\r\n\t\t\toutside = distanceOption > 0,\r\n\t\t\tdataLabel,\r\n\t\t\tdataLabelWidth,\r\n\t\t\tlabelPos,\r\n\t\t\tlabelHeight,\r\n\t\t\thalves = [// divide the points into right and left halves for anti collision\r\n\t\t\t\t[], // right\r\n\t\t\t\t[] // left\r\n\t\t\t],\r\n\t\t\tx,\r\n\t\t\ty,\r\n\t\t\tvisibility,\r\n\t\t\trankArr,\r\n\t\t\ti,\r\n\t\t\tj,\r\n\t\t\toverflow = [0, 0, 0, 0], // top, right, bottom, left\r\n\t\t\tsort = function (a, b) {\r\n\t\t\t\treturn b.y - a.y;\r\n\t\t\t};\r\n\r\n\t\t// get out if not enabled\r\n\t\tif (!series.visible || (!options.enabled && !series._hasPointLabels)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// run parent method\r\n\t\tSeries.prototype.drawDataLabels.apply(series);\r\n\r\n\t\t// arrange points for detection collision\r\n\t\teach(data, function (point) {\r\n\t\t\tif (point.dataLabel) { // it may have been cancelled in the base method (#407)\r\n\t\t\t\thalves[point.half].push(point);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// assume equal label heights\r\n\t\ti = 0;\r\n\t\twhile (!labelHeight && data[i]) { // #1569\r\n\t\t\tlabelHeight = data[i] && data[i].dataLabel && (data[i].dataLabel.getBBox().height || 21); // 21 is for #968\r\n\t\t\ti++;\r\n\t\t}\r\n\r\n\t\t/* Loop over the points in each half, starting from the top and bottom\r\n\t\t * of the pie to detect overlapping labels.\r\n\t\t */\r\n\t\ti = 2;\r\n\t\twhile (i--) {\r\n\r\n\t\t\tvar slots = [],\r\n\t\t\t\tslotsLength,\r\n\t\t\t\tusedSlots = [],\r\n\t\t\t\tpoints = halves[i],\r\n\t\t\t\tpos,\r\n\t\t\t\tlength = points.length,\r\n\t\t\t\tslotIndex;\r\n\t\t\t\t\r\n\t\t\t// Sort by angle\r\n\t\t\tseries.sortByAngle(points, i - 0.5);\r\n\r\n\t\t\t// Only do anti-collision when we are outside the pie and have connectors (#856)\r\n\t\t\tif (distanceOption > 0) {\r\n\t\t\t\t\r\n\t\t\t\t// build the slots\r\n\t\t\t\tfor (pos = centerY - radius - distanceOption; pos <= centerY + radius + distanceOption; pos += labelHeight) {\r\n\t\t\t\t\tslots.push(pos);\r\n\t\t\t\t\t\r\n\t\t\t\t\t// visualize the slot\r\n\t\t\t\t\t/*\r\n\t\t\t\t\tvar slotX = series.getX(pos, i) + chart.plotLeft - (i ? 100 : 0),\r\n\t\t\t\t\t\tslotY = pos + chart.plotTop;\r\n\t\t\t\t\tif (!isNaN(slotX)) {\r\n\t\t\t\t\t\tchart.renderer.rect(slotX, slotY - 7, 100, labelHeight, 1)\r\n\t\t\t\t\t\t\t.attr({\r\n\t\t\t\t\t\t\t\t'stroke-width': 1,\r\n\t\t\t\t\t\t\t\tstroke: 'silver'\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t.add();\r\n\t\t\t\t\t\tchart.renderer.text('Slot '+ (slots.length - 1), slotX, slotY + 4)\r\n\t\t\t\t\t\t\t.attr({\r\n\t\t\t\t\t\t\t\tfill: 'silver'\r\n\t\t\t\t\t\t\t}).add();\r\n\t\t\t\t\t}\r\n\t\t\t\t\t*/\r\n\t\t\t\t}\r\n\t\t\t\tslotsLength = slots.length;\r\n\t\r\n\t\t\t\t// if there are more values than available slots, remove lowest values\r\n\t\t\t\tif (length > slotsLength) {\r\n\t\t\t\t\t// create an array for sorting and ranking the points within each quarter\r\n\t\t\t\t\trankArr = [].concat(points);\r\n\t\t\t\t\trankArr.sort(sort);\r\n\t\t\t\t\tj = length;\r\n\t\t\t\t\twhile (j--) {\r\n\t\t\t\t\t\trankArr[j].rank = j;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tj = length;\r\n\t\t\t\t\twhile (j--) {\r\n\t\t\t\t\t\tif (points[j].rank >= slotsLength) {\r\n\t\t\t\t\t\t\tpoints.splice(j, 1);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlength = points.length;\r\n\t\t\t\t}\r\n\t\r\n\t\t\t\t// The label goes to the nearest open slot, but not closer to the edge than\r\n\t\t\t\t// the label's index.\r\n\t\t\t\tfor (j = 0; j < length; j++) {\r\n\t\r\n\t\t\t\t\tpoint = points[j];\r\n\t\t\t\t\tlabelPos = point.labelPos;\r\n\t\r\n\t\t\t\t\tvar closest = 9999,\r\n\t\t\t\t\t\tdistance,\r\n\t\t\t\t\t\tslotI;\r\n\t\r\n\t\t\t\t\t// find the closest slot index\r\n\t\t\t\t\tfor (slotI = 0; slotI < slotsLength; slotI++) {\r\n\t\t\t\t\t\tdistance = mathAbs(slots[slotI] - labelPos[1]);\r\n\t\t\t\t\t\tif (distance < closest) {\r\n\t\t\t\t\t\t\tclosest = distance;\r\n\t\t\t\t\t\t\tslotIndex = slotI;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\r\n\t\t\t\t\t// if that slot index is closer to the edges of the slots, move it\r\n\t\t\t\t\t// to the closest appropriate slot\r\n\t\t\t\t\tif (slotIndex < j && slots[j] !== null) { // cluster at the top\r\n\t\t\t\t\t\tslotIndex = j;\r\n\t\t\t\t\t} else if (slotsLength < length - j + slotIndex && slots[j] !== null) { // cluster at the bottom\r\n\t\t\t\t\t\tslotIndex = slotsLength - length + j;\r\n\t\t\t\t\t\twhile (slots[slotIndex] === null) { // make sure it is not taken\r\n\t\t\t\t\t\t\tslotIndex++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// Slot is taken, find next free slot below. In the next run, the next slice will find the\r\n\t\t\t\t\t\t// slot above these, because it is the closest one\r\n\t\t\t\t\t\twhile (slots[slotIndex] === null) { // make sure it is not taken\r\n\t\t\t\t\t\t\tslotIndex++;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\r\n\t\t\t\t\tusedSlots.push({ i: slotIndex, y: slots[slotIndex] });\r\n\t\t\t\t\tslots[slotIndex] = null; // mark as taken\r\n\t\t\t\t}\r\n\t\t\t\t// sort them in order to fill in from the top\r\n\t\t\t\tusedSlots.sort(sort);\r\n\t\t\t}\r\n\r\n\t\t\t// now the used slots are sorted, fill them up sequentially\r\n\t\t\tfor (j = 0; j < length; j++) {\r\n\t\t\t\t\r\n\t\t\t\tvar slot, naturalY;\r\n\r\n\t\t\t\tpoint = points[j];\r\n\t\t\t\tlabelPos = point.labelPos;\r\n\t\t\t\tdataLabel = point.dataLabel;\r\n\t\t\t\tvisibility = point.visible === false ? HIDDEN : VISIBLE;\r\n\t\t\t\tnaturalY = labelPos[1];\r\n\t\t\t\t\r\n\t\t\t\tif (distanceOption > 0) {\r\n\t\t\t\t\tslot = usedSlots.pop();\r\n\t\t\t\t\tslotIndex = slot.i;\r\n\r\n\t\t\t\t\t// if the slot next to currrent slot is free, the y value is allowed\r\n\t\t\t\t\t// to fall back to the natural position\r\n\t\t\t\t\ty = slot.y;\r\n\t\t\t\t\tif ((naturalY > y && slots[slotIndex + 1] !== null) ||\r\n\t\t\t\t\t\t\t(naturalY < y && slots[slotIndex - 1] !== null)) {\r\n\t\t\t\t\t\ty = naturalY;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t} else {\r\n\t\t\t\t\ty = naturalY;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// get the x - use the natural x position for first and last slot, to prevent the top\r\n\t\t\t\t// and botton slice connectors from touching each other on either side\r\n\t\t\t\tx = options.justify ? \r\n\t\t\t\t\tseriesCenter[0] + (i ? -1 : 1) * (radius + distanceOption) :\r\n\t\t\t\t\tseries.getX(slotIndex === 0 || slotIndex === slots.length - 1 ? naturalY : y, i);\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t// Record the placement and visibility\r\n\t\t\t\tdataLabel._attr = {\r\n\t\t\t\t\tvisibility: visibility,\r\n\t\t\t\t\talign: labelPos[6]\r\n\t\t\t\t};\r\n\t\t\t\tdataLabel._pos = {\r\n\t\t\t\t\tx: x + options.x +\r\n\t\t\t\t\t\t({ left: connectorPadding, right: -connectorPadding }[labelPos[6]] || 0),\r\n\t\t\t\t\ty: y + options.y - 10 // 10 is for the baseline (label vs text)\r\n\t\t\t\t};\r\n\t\t\t\tdataLabel.connX = x;\r\n\t\t\t\tdataLabel.connY = y;\r\n\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t// Detect overflowing data labels\r\n\t\t\t\tif (this.options.size === null) {\r\n\t\t\t\t\tdataLabelWidth = dataLabel.width;\r\n\t\t\t\t\t// Overflow left\r\n\t\t\t\t\tif (x - dataLabelWidth < connectorPadding) {\r\n\t\t\t\t\t\toverflow[3] = mathMax(mathRound(dataLabelWidth - x + connectorPadding), overflow[3]);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t// Overflow right\r\n\t\t\t\t\t} else if (x + dataLabelWidth > plotWidth - connectorPadding) {\r\n\t\t\t\t\t\toverflow[1] = mathMax(mathRound(x + dataLabelWidth - plotWidth + connectorPadding), overflow[1]);\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Overflow top\r\n\t\t\t\t\tif (y - labelHeight / 2 < 0) {\r\n\t\t\t\t\t\toverflow[0] = mathMax(mathRound(-y + labelHeight / 2), overflow[0]);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t// Overflow left\r\n\t\t\t\t\t} else if (y + labelHeight / 2 > plotHeight) {\r\n\t\t\t\t\t\toverflow[2] = mathMax(mathRound(y + labelHeight / 2 - plotHeight), overflow[2]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} // for each point\r\n\t\t} // for each half\r\n\t\t\r\n\t\t// Do not apply the final placement and draw the connectors until we have verified\r\n\t\t// that labels are not spilling over. \r\n\t\tif (arrayMax(overflow) === 0 || this.verifyDataLabelOverflow(overflow)) {\r\n\t\t\t\r\n\t\t\t// Place the labels in the final position\r\n\t\t\tthis.placeDataLabels();\r\n\t\t\t\r\n\t\t\t// Draw the connectors\r\n\t\t\tif (outside && connectorWidth) {\r\n\t\t\t\teach(this.points, function (point) {\r\n\t\t\t\t\tconnector = point.connector;\r\n\t\t\t\t\tlabelPos = point.labelPos;\r\n\t\t\t\t\tdataLabel = point.dataLabel;\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (dataLabel && dataLabel._pos) {\r\n\t\t\t\t\t\tvisibility = dataLabel._attr.visibility;\r\n\t\t\t\t\t\tx = dataLabel.connX;\r\n\t\t\t\t\t\ty = dataLabel.connY;\r\n\t\t\t\t\t\tconnectorPath = softConnector ? [\r\n\t\t\t\t\t\t\tM,\r\n\t\t\t\t\t\t\tx + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label\r\n\t\t\t\t\t\t\t'C',\r\n\t\t\t\t\t\t\tx, y, // first break, next to the label\r\n\t\t\t\t\t\t\t2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],\r\n\t\t\t\t\t\t\tlabelPos[2], labelPos[3], // second break\r\n\t\t\t\t\t\t\tL,\r\n\t\t\t\t\t\t\tlabelPos[4], labelPos[5] // base\r\n\t\t\t\t\t\t] : [\r\n\t\t\t\t\t\t\tM,\r\n\t\t\t\t\t\t\tx + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label\r\n\t\t\t\t\t\t\tL,\r\n\t\t\t\t\t\t\tlabelPos[2], labelPos[3], // second break\r\n\t\t\t\t\t\t\tL,\r\n\t\t\t\t\t\t\tlabelPos[4], labelPos[5] // base\r\n\t\t\t\t\t\t];\r\n\t\t\r\n\t\t\t\t\t\tif (connector) {\r\n\t\t\t\t\t\t\tconnector.animate({ d: connectorPath });\r\n\t\t\t\t\t\t\tconnector.attr('visibility', visibility);\r\n\t\t\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tpoint.connector = connector = series.chart.renderer.path(connectorPath).attr({\r\n\t\t\t\t\t\t\t\t'stroke-width': connectorWidth,\r\n\t\t\t\t\t\t\t\tstroke: options.connectorColor || point.color || '#606060',\r\n\t\t\t\t\t\t\t\tvisibility: visibility\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t.add(series.group);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (connector) {\r\n\t\t\t\t\t\tpoint.connector = connector.destroy();\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\t\t\t\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * Verify whether the data labels are allowed to draw, or we should run more translation and data\r\n\t * label positioning to keep them inside the plot area. Returns true when data labels are ready \r\n\t * to draw.\r\n\t */\r\n\tverifyDataLabelOverflow: function (overflow) {\r\n\t\t\r\n\t\tvar center = this.center,\r\n\t\t\toptions = this.options,\r\n\t\t\tcenterOption = options.center,\r\n\t\t\tminSize = options.minSize || 80,\r\n\t\t\tnewSize = minSize,\r\n\t\t\tret;\r\n\t\t\t\r\n\t\t// Handle horizontal size and center\r\n\t\tif (centerOption[0] !== null) { // Fixed center\r\n\t\t\tnewSize = mathMax(center[2] - mathMax(overflow[1], overflow[3]), minSize);\r\n\t\t\t\r\n\t\t} else { // Auto center\r\n\t\t\tnewSize = mathMax(\r\n\t\t\t\tcenter[2] - overflow[1] - overflow[3], // horizontal overflow\t\t\t\t\t\r\n\t\t\t\tminSize\r\n\t\t\t);\r\n\t\t\tcenter[0] += (overflow[3] - overflow[1]) / 2; // horizontal center\r\n\t\t}\r\n\t\t\r\n\t\t// Handle vertical size and center\r\n\t\tif (centerOption[1] !== null) { // Fixed center\r\n\t\t\tnewSize = mathMax(mathMin(newSize, center[2] - mathMax(overflow[0], overflow[2])), minSize);\r\n\t\t\t\r\n\t\t} else { // Auto center\r\n\t\t\tnewSize = mathMax(\r\n\t\t\t\tmathMin(\r\n\t\t\t\t\tnewSize,\t\t\r\n\t\t\t\t\tcenter[2] - overflow[0] - overflow[2] // vertical overflow\r\n\t\t\t\t),\r\n\t\t\t\tminSize\r\n\t\t\t);\r\n\t\t\tcenter[1] += (overflow[0] - overflow[2]) / 2; // vertical center\r\n\t\t}\r\n\t\t\r\n\t\t// If the size must be decreased, we need to run translate and drawDataLabels again\r\n\t\tif (newSize < center[2]) {\r\n\t\t\tcenter[2] = newSize;\r\n\t\t\tthis.translate(center);\r\n\t\t\teach(this.points, function (point) {\r\n\t\t\t\tif (point.dataLabel) {\r\n\t\t\t\t\tpoint.dataLabel._pos = null; // reset\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\tthis.drawDataLabels();\r\n\t\t\t\r\n\t\t// Else, return true to indicate that the pie and its labels is within the plot area\r\n\t\t} else {\r\n\t\t\tret = true;\r\n\t\t}\r\n\t\treturn ret;\r\n\t},\r\n\t\r\n\t/**\r\n\t * Perform the final placement of the data labels after we have verified that they\r\n\t * fall within the plot area.\r\n\t */\r\n\tplaceDataLabels: function () {\r\n\t\teach(this.points, function (point) {\r\n\t\t\tvar dataLabel = point.dataLabel,\r\n\t\t\t\t_pos;\r\n\t\t\t\r\n\t\t\tif (dataLabel) {\r\n\t\t\t\t_pos = dataLabel._pos;\r\n\t\t\t\tif (_pos) {\r\n\t\t\t\t\tdataLabel.attr(dataLabel._attr);\t\t\t\r\n\t\t\t\t\tdataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);\r\n\t\t\t\t\tdataLabel.moved = true;\r\n\t\t\t\t} else if (dataLabel) {\r\n\t\t\t\t\tdataLabel.attr({ y: -999 });\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\t\r\n\talignDataLabel: noop,\r\n\r\n\t/**\r\n\t * Draw point specific tracker objects. Inherit directly from column series.\r\n\t */\r\n\tdrawTracker: ColumnSeries.prototype.drawTracker,\r\n\r\n\t/**\r\n\t * Use a simple symbol from column prototype\r\n\t */\r\n\tdrawLegendSymbol: AreaSeries.prototype.drawLegendSymbol,\r\n\r\n\t/**\r\n\t * Pies don't have point marker symbols\r\n\t */\r\n\tgetSymbol: noop\r\n\r\n};\r\nPieSeries = extendClass(Series, PieSeries);\r\nseriesTypes.pie = PieSeries;\r\n\r\n/* ****************************************************************************\r\n * Start data grouping module\t\t\t\t\t\t\t\t\t\t\t\t *\r\n ******************************************************************************/\r\n/*jslint white:true */\r\nvar DATA_GROUPING = 'dataGrouping',\r\n\tseriesProto = Series.prototype,\r\n\tbaseProcessData = seriesProto.processData,\r\n\tbaseGeneratePoints = seriesProto.generatePoints,\r\n\tbaseDestroy = seriesProto.destroy,\r\n\tbaseTooltipHeaderFormatter = seriesProto.tooltipHeaderFormatter,\r\n\tNUMBER = 'number',\r\n\t\r\n\tcommonOptions = {\r\n\t\tapproximation: 'average', // average, open, high, low, close, sum\r\n\t\t//enabled: null, // (true for stock charts, false for basic),\r\n\t\t//forced: undefined,\r\n\t\tgroupPixelWidth: 2,\r\n\t\t// the first one is the point or start value, the second is the start value if we're dealing with range,\r\n\t\t// the third one is the end value if dealing with a range\r\n\t\tdateTimeLabelFormats: hash( \r\n\t\t\tMILLISECOND, ['%A, %e %b, %H:%M:%S.%L', '%A, %b %e, %H:%M:%S.%L', '-%H:%M:%S.%L'],\r\n\t\t\tSECOND, ['%A, %e %b, %H:%M:%S', '%A, %b %e, %H:%M:%S', '-%H:%M:%S'],\r\n\t\t\tMINUTE, ['%A, %e %b, %H:%M', '%A, %b %e, %H:%M', '-%H:%M'],\r\n\t\t\tHOUR, ['%A, %e %b, %H:%M', '%A, %b %e, %H:%M', '-%H:%M'],\r\n\t\t\tDAY, ['%A, %e %b, %Y', '%A, %b %e', '-%A, %b %e, %Y'],\r\n\t\t\tWEEK, ['Semaine du %A, %e %b, %Y', '%A, %b %e', '-%A, %b %e, %Y'],\r\n\t\t\tMONTH, ['%B %Y', '%B', '-%B %Y'],\r\n\t\t\tYEAR, ['%Y', '%Y', '-%Y']\r\n\t\t)\r\n\t\t// smoothed = false, // enable this for navigator series only\r\n\t},\r\n\t\r\n\tspecificOptions = { // extends common options\r\n\t\tline: {}, \r\n\t\tspline: {},\r\n\t\tarea: {},\r\n\t\tareaspline: {},\r\n\t\tcolumn: {\r\n\t\t\tapproximation: 'sum',\r\n\t\t\tgroupPixelWidth: 10\r\n\t\t},\r\n\t\tarearange: {\r\n\t\t\tapproximation: 'range'\r\n\t\t},\r\n\t\tareasplinerange: {\r\n\t\t\tapproximation: 'range'\r\n\t\t},\r\n\t\tcolumnrange: {\r\n\t\t\tapproximation: 'range',\r\n\t\t\tgroupPixelWidth: 10\r\n\t\t},\r\n\t\tcandlestick: {\r\n\t\t\tapproximation: 'ohlc',\r\n\t\t\tgroupPixelWidth: 10\r\n\t\t},\r\n\t\tohlc: {\r\n\t\t\tapproximation: 'ohlc',\r\n\t\t\tgroupPixelWidth: 5\r\n\t\t}\r\n\t},\r\n\t\r\n\t// units are defined in a separate array to allow complete overriding in case of a user option\r\n\tdefaultDataGroupingUnits = [[\r\n\t\t\tMILLISECOND, // unit name\r\n\t\t\t[1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\r\n\t\t], [\r\n\t\t\tSECOND,\r\n\t\t\t[1, 2, 5, 10, 15, 30]\r\n\t\t], [\r\n\t\t\tMINUTE,\r\n\t\t\t[1, 2, 5, 10, 15, 30]\r\n\t\t], [\r\n\t\t\tHOUR,\r\n\t\t\t[1, 2, 3, 4, 6, 8, 12]\r\n\t\t], [\r\n\t\t\tDAY,\r\n\t\t\t[1]\r\n\t\t], [\r\n\t\t\tWEEK,\r\n\t\t\t[1]\r\n\t\t], [\r\n\t\t\tMONTH,\r\n\t\t\t[1, 3, 6]\r\n\t\t], [\r\n\t\t\tYEAR,\r\n\t\t\tnull\r\n\t\t]\r\n\t],\r\n\t\r\n\t\r\n\t/**\r\n\t * Define the available approximation types. The data grouping approximations takes an array\r\n\t * or numbers as the first parameter. In case of ohlc, four arrays are sent in as four parameters.\r\n\t * Each array consists only of numbers. In case null values belong to the group, the property\r\n\t * .hasNulls will be set to true on the array.\r\n\t */\r\n\tapproximations = {\r\n\t\tsum: function (arr) {\r\n\t\t\tvar len = arr.length, \r\n\t\t\t\tret;\r\n\t\t\t\t\r\n\t\t\t// 1. it consists of nulls exclusively\r\n\t\t\tif (!len && arr.hasNulls) {\r\n\t\t\t\tret = null;\r\n\t\t\t// 2. it has a length and real values\r\n\t\t\t} else if (len) {\r\n\t\t\t\tret = 0;\r\n\t\t\t\twhile (len--) {\r\n\t\t\t\t\tret += arr[len];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// 3. it has zero length, so just return undefined \r\n\t\t\t// => doNothing()\r\n\t\t\t\r\n\t\t\treturn ret;\r\n\t\t},\r\n\t\taverage: function (arr) {\r\n\t\t\tvar len = arr.length,\r\n\t\t\t\tret = approximations.sum(arr);\r\n\t\t\t\t\r\n\t\t\t// If we have a number, return it divided by the length. If not, return\r\n\t\t\t// null or undefined based on what the sum method finds.\r\n\t\t\tif (typeof ret === NUMBER && len) {\r\n\t\t\t\tret = ret / len;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\treturn ret;\r\n\t\t},\r\n\t\topen: function (arr) {\r\n\t\t\treturn arr.length ? arr[0] : (arr.hasNulls ? null : UNDEFINED);\r\n\t\t},\r\n\t\thigh: function (arr) {\r\n\t\t\treturn arr.length ? arrayMax(arr) : (arr.hasNulls ? null : UNDEFINED);\r\n\t\t},\r\n\t\tlow: function (arr) {\r\n\t\t\treturn arr.length ? arrayMin(arr) : (arr.hasNulls ? null : UNDEFINED);\r\n\t\t},\r\n\t\tclose: function (arr) {\r\n\t\t\treturn arr.length ? arr[arr.length - 1] : (arr.hasNulls ? null : UNDEFINED);\r\n\t\t},\r\n\t\t// ohlc and range are special cases where a multidimensional array is input and an array is output\r\n\t\tohlc: function (open, high, low, close) {\r\n\t\t\topen = approximations.open(open);\r\n\t\t\thigh = approximations.high(high);\r\n\t\t\tlow = approximations.low(low);\r\n\t\t\tclose = approximations.close(close);\r\n\t\t\t\r\n\t\t\tif (typeof open === NUMBER || typeof high === NUMBER || typeof low === NUMBER || typeof close === NUMBER) {\r\n\t\t\t\treturn [open, high, low, close];\r\n\t\t\t} \r\n\t\t\t// else, return is undefined\r\n\t\t},\r\n\t\trange: function (low, high) {\r\n\t\t\tlow = approximations.low(low);\r\n\t\t\thigh = approximations.high(high);\r\n\t\t\t\r\n\t\t\tif (typeof low === NUMBER || typeof high === NUMBER) {\r\n\t\t\t\treturn [low, high];\r\n\t\t\t} \r\n\t\t\t// else, return is undefined\r\n\t\t}\r\n\t};\r\n\r\n/*jslint white:false */\r\n\r\n/**\r\n * Takes parallel arrays of x and y data and groups the data into intervals defined by groupPositions, a collection\r\n * of starting x values for each group.\r\n */\r\nseriesProto.groupData = function (xData, yData, groupPositions, approximation) {\r\n\tvar series = this,\r\n\t\tdata = series.data,\r\n\t\tdataOptions = series.options.data,\r\n\t\tgroupedXData = [],\r\n\t\tgroupedYData = [],\r\n\t\tdataLength = xData.length,\r\n\t\tpointX,\r\n\t\tpointY,\r\n\t\tgroupedY,\r\n\t\thandleYData = !!yData, // when grouping the fake extended axis for panning, we don't need to consider y\r\n\t\tvalues = [[], [], [], []],\r\n\t\tapproximationFn = typeof approximation === 'function' ? approximation : approximations[approximation],\r\n\t\tpointArrayMap = series.pointArrayMap,\r\n\t\tpointArrayMapLength = pointArrayMap && pointArrayMap.length,\r\n\t\ti;\r\n\t\r\n\t\tfor (i = 0; i <= dataLength; i++) {\r\n\r\n\t\t\t// when a new group is entered, summarize and initiate the previous group\r\n\t\t\twhile ((groupPositions[1] !== UNDEFINED && xData[i] >= groupPositions[1]) ||\r\n\t\t\t\t\ti === dataLength) { // get the last group\r\n\r\n\t\t\t\t// get group x and y \r\n\t\t\t\tpointX = groupPositions.shift();\t\t\t\t\r\n\t\t\t\tgroupedY = approximationFn.apply(0, values);\r\n\t\t\t\t\r\n\t\t\t\t// push the grouped data\t\t\r\n\t\t\t\tif (groupedY !== UNDEFINED) {\r\n\t\t\t\t\tgroupedXData.push(pointX);\r\n\t\t\t\t\tgroupedYData.push(groupedY);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// reset the aggregate arrays\r\n\t\t\t\tvalues[0] = [];\r\n\t\t\t\tvalues[1] = [];\r\n\t\t\t\tvalues[2] = [];\r\n\t\t\t\tvalues[3] = [];\r\n\t\t\t\t\r\n\t\t\t\t// don't loop beyond the last group\r\n\t\t\t\tif (i === dataLength) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// break out\r\n\t\t\tif (i === dataLength) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// for each raw data point, push it to an array that contains all values for this specific group\r\n\t\t\tif (pointArrayMap) {\r\n\t\t\t\t\r\n\t\t\t\tvar index = series.cropStart + i,\r\n\t\t\t\t\tpoint = (data && data[index]) || series.pointClass.prototype.applyOptions.apply({ series: series }, [dataOptions[index]]),\r\n\t\t\t\t\tj,\r\n\t\t\t\t\tval;\r\n\t\t\t\t\t\r\n\t\t\t\tfor (j = 0; j < pointArrayMapLength; j++) {\r\n\t\t\t\t\tval = point[pointArrayMap[j]];\r\n\t\t\t\t\tif (typeof val === NUMBER) {\r\n\t\t\t\t\t\tvalues[j].push(val);\r\n\t\t\t\t\t} else if (val === null) {\r\n\t\t\t\t\t\tvalues[j].hasNulls = true;\r\n\t\t\t\t\t}\t\t\t\t\t\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t} else {\r\n\t\t\t\tpointY = handleYData ? yData[i] : null;\r\n\t\t\t\r\n\t\t\t\tif (typeof pointY === NUMBER) {\r\n\t\t\t\t\tvalues[0].push(pointY);\r\n\t\t\t\t} else if (pointY === null) {\r\n\t\t\t\t\tvalues[0].hasNulls = true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t}\r\n\treturn [groupedXData, groupedYData];\r\n};\r\n\r\n/**\r\n * Extend the basic processData method, that crops the data to the current zoom\r\n * range, with data grouping logic.\r\n */\r\nseriesProto.processData = function () {\r\n\tvar series = this,\r\n\t\tchart = series.chart,\r\n\t\toptions = series.options,\r\n\t\tdataGroupingOptions = options[DATA_GROUPING],\r\n\t\tgroupingEnabled = dataGroupingOptions && pick(dataGroupingOptions.enabled, chart.options._stock),\r\n\t\thasGroupedData;\r\n\r\n\t// run base method\r\n\tseries.forceCrop = groupingEnabled; // #334\r\n\t\r\n\t// skip if processData returns false or if grouping is disabled (in that order)\r\n\tif (baseProcessData.apply(series, arguments) === false || !groupingEnabled) {\r\n\t\treturn;\r\n\t\t\r\n\t} else {\r\n\t\tseries.destroyGroupedData();\r\n\t\t\r\n\t}\r\n\tvar i,\r\n\t\tprocessedXData = series.processedXData,\r\n\t\tprocessedYData = series.processedYData,\r\n\t\tplotSizeX = chart.plotSizeX,\r\n\t\txAxis = series.xAxis,\r\n\t\tgroupPixelWidth = series.groupPixelWidth = xAxis.getGroupPixelWidth && xAxis.getGroupPixelWidth(),\r\n\t\tnonGroupedPointRange = series.pointRange;\r\n\r\n\t// Execute grouping if the amount of points is greater than the limit defined in groupPixelWidth\r\n\tif (groupPixelWidth) {\r\n\t\thasGroupedData = true;\r\n\r\n\t\tseries.points = null; // force recreation of point instances in series.translate\r\n\r\n\t\tvar extremes = xAxis.getExtremes(),\r\n\t\t\txMin = extremes.min,\r\n\t\t\txMax = extremes.max,\r\n\t\t\tgroupIntervalFactor = (xAxis.getGroupIntervalFactor && xAxis.getGroupIntervalFactor(xMin, xMax, processedXData)) || 1,\r\n\t\t\tinterval = (groupPixelWidth * (xMax - xMin) / plotSizeX) * groupIntervalFactor,\t\t\t\r\n\t\t\tgroupPositions = (xAxis.getNonLinearTimeTicks || getTimeTicks)(\r\n\t\t\t\tnormalizeTimeTickInterval(interval, dataGroupingOptions.units || defaultDataGroupingUnits),\r\n\t\t\t\txMin, \r\n\t\t\t\txMax, \r\n\t\t\t\tnull, \r\n\t\t\t\tprocessedXData, \r\n\t\t\t\tseries.closestPointRange\r\n\t\t\t),\r\n\t\t\tgroupedXandY = seriesProto.groupData.apply(series, [processedXData, processedYData, groupPositions, dataGroupingOptions.approximation]),\r\n\t\t\tgroupedXData = groupedXandY[0],\r\n\t\t\tgroupedYData = groupedXandY[1];\r\n\t\t\t\r\n\t\t// prevent the smoothed data to spill out left and right, and make\r\n\t\t// sure data is not shifted to the left\r\n\t\tif (dataGroupingOptions.smoothed) {\r\n\t\t\ti = groupedXData.length - 1;\r\n\t\t\tgroupedXData[i] = xMax;\r\n\t\t\twhile (i-- && i > 0) {\r\n\t\t\t\tgroupedXData[i] += interval / 2;\r\n\t\t\t}\r\n\t\t\tgroupedXData[0] = xMin;\r\n\t\t}\r\n\r\n\t\t// record what data grouping values were used\r\n\t\tseries.currentDataGrouping = groupPositions.info;\r\n\t\tif (options.pointRange === null) { // null means auto, as for columns, candlesticks and OHLC\r\n\t\t\tseries.pointRange = groupPositions.info.totalRange;\r\n\t\t}\r\n\t\tseries.closestPointRange = groupPositions.info.totalRange;\r\n\t\t\r\n\t\t// set series props\r\n\t\tseries.processedXData = groupedXData;\r\n\t\tseries.processedYData = groupedYData;\r\n\t} else {\r\n\t\tseries.currentDataGrouping = null;\r\n\t\tseries.pointRange = nonGroupedPointRange;\r\n\t}\r\n\tseries.hasGroupedData = hasGroupedData;\r\n};\r\n\r\n/**\r\n * Destroy the grouped data points. #622, #740\r\n */\r\nseriesProto.destroyGroupedData = function () {\r\n\t\r\n\tvar groupedData = this.groupedData;\r\n\t\r\n\t// clear previous groups\r\n\teach(groupedData || [], function (point, i) {\r\n\t\tif (point) {\r\n\t\t\tgroupedData[i] = point.destroy ? point.destroy() : null;\r\n\t\t}\r\n\t});\r\n\tthis.groupedData = null;\t\r\n};\r\n\r\n/**\r\n * Override the generatePoints method by adding a reference to grouped data\r\n */\r\nseriesProto.generatePoints = function () {\r\n\t\r\n\tbaseGeneratePoints.apply(this);\r\n\r\n\t// record grouped data in order to let it be destroyed the next time processData runs\r\n\tthis.destroyGroupedData(); // #622\r\n\tthis.groupedData = this.hasGroupedData ? this.points : null;\r\n};\r\n\r\n/**\r\n * Make the tooltip's header reflect the grouped range\r\n */\r\nseriesProto.tooltipHeaderFormatter = function (point) {\r\n\tvar series = this,\r\n\t\toptions = series.options,\r\n\t\ttooltipOptions = series.tooltipOptions,\r\n\t\tdataGroupingOptions = options.dataGrouping,\r\n\t\txDateFormat = tooltipOptions.xDateFormat,\r\n\t\txDateFormatEnd,\r\n\t\txAxis = series.xAxis,\r\n\t\tcurrentDataGrouping,\r\n\t\tdateTimeLabelFormats,\r\n\t\tlabelFormats,\r\n\t\tformattedKey,\r\n\t\tn,\r\n\t\tret;\r\n\t\r\n\t// apply only to grouped series\r\n\tif (xAxis && xAxis.options.type === 'datetime' && dataGroupingOptions && isNumber(point.key)) {\r\n\t\t\r\n\t\t// set variables\r\n\t\tcurrentDataGrouping = series.currentDataGrouping;\t\t\r\n\t\tdateTimeLabelFormats = dataGroupingOptions.dateTimeLabelFormats;\r\n\t\t\r\n\t\t// if we have grouped data, use the grouping information to get the right format\r\n\t\tif (currentDataGrouping) {\r\n\t\t\tlabelFormats = dateTimeLabelFormats[currentDataGrouping.unitName];\r\n\t\t\tif (currentDataGrouping.count === 1) {\r\n\t\t\t\txDateFormat = labelFormats[0];\r\n\t\t\t} else {\r\n\t\t\t\txDateFormat = labelFormats[1];\r\n\t\t\t\txDateFormatEnd = labelFormats[2];\r\n\t\t\t} \r\n\t\t// if not grouped, and we don't have set the xDateFormat option, get the best fit,\r\n\t\t// so if the least distance between points is one minute, show it, but if the \r\n\t\t// least distance is one day, skip hours and minutes etc.\r\n\t\t} else if (!xDateFormat && dateTimeLabelFormats) {\r\n\t\t\tfor (n in timeUnits) {\r\n\t\t\t\tif (timeUnits[n] >= xAxis.closestPointRange) {\r\n\t\t\t\t\txDateFormat = dateTimeLabelFormats[n][0];\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\t\r\n\t\t\t}\t\t\r\n\t\t}\r\n\t\t\r\n\t\t// now format the key\r\n\t\tformattedKey = dateFormat(xDateFormat, point.key);\r\n\t\tif (xDateFormatEnd) {\r\n\t\t\tformattedKey += dateFormat(xDateFormatEnd, point.key + currentDataGrouping.totalRange - 1);\r\n\t\t}\r\n\t\t\r\n\t\t// return the replaced format\r\n\t\tret = tooltipOptions.headerFormat.replace('{point.key}', formattedKey);\r\n\t\r\n\t// else, fall back to the regular formatter\r\n\t} else {\r\n\t\tret = baseTooltipHeaderFormatter.call(series, point);\r\n\t}\r\n\t\r\n\treturn ret;\r\n};\r\n\r\n/**\r\n * Extend the series destroyer\r\n */\r\nseriesProto.destroy = function () {\r\n\tvar series = this,\r\n\t\tgroupedData = series.groupedData || [],\r\n\t\ti = groupedData.length;\r\n\r\n\twhile (i--) {\r\n\t\tif (groupedData[i]) {\r\n\t\t\tgroupedData[i].destroy();\r\n\t\t}\r\n\t}\r\n\tbaseDestroy.apply(series);\r\n};\r\n\r\n\r\n// Handle default options for data grouping. This must be set at runtime because some series types are\r\n// defined after this.\r\nwrap(seriesProto, 'setOptions', function (proceed, itemOptions) {\r\n\t\r\n\tvar options = proceed.call(this, itemOptions),\r\n\t\ttype = this.type,\r\n\t\tplotOptions = this.chart.options.plotOptions,\r\n\t\tdefaultOptions = defaultPlotOptions[type].dataGrouping;\r\n\t\t\r\n\tif (specificOptions[type]) { // #1284\r\n\t\tif (!defaultOptions) {\r\n\t\t\tdefaultOptions = merge(commonOptions, specificOptions[type]);\r\n\t\t}\r\n\t\t\r\n\t\toptions.dataGrouping = merge(\r\n\t\t\tdefaultOptions,\r\n\t\t\tplotOptions.series && plotOptions.series.dataGrouping, // #1228\r\n\t\t\tplotOptions[type].dataGrouping, // Set by the StockChart constructor\r\n\t\t\titemOptions.dataGrouping\r\n\t\t);\r\n\t}\r\n\t\r\n\tif (this.chart.options._stock) {\r\n\t\tthis.requireSorting = true;\r\n\t}\r\n\t\r\n\treturn options;\r\n});\r\n\r\n/**\r\n * Get the data grouping pixel width based on the greatest defined individual width\r\n * of the axis' series, and if whether one of the axes need grouping.\r\n */\r\nAxis.prototype.getGroupPixelWidth = function () {\r\n\r\n\tvar series = this.series,\r\n\t\tlen = series.length,\r\n\t\ti,\r\n\t\tgroupPixelWidth = 0,\r\n\t\tdoGrouping = false,\r\n\t\tdataLength,\r\n\t\tdgOptions;\r\n\r\n\t// If multiple series are compared on the same x axis, give them the same\r\n\t// group pixel width (#334)\r\n\ti = len;\r\n\twhile (i--) {\r\n\t\tdgOptions = series[i].options.dataGrouping;\r\n\t\tif (dgOptions) {\r\n\t\t\tgroupPixelWidth = mathMax(groupPixelWidth, dgOptions.groupPixelWidth);\r\n\r\n\t\t}\r\n\t}\r\n\r\n\t// If one of the series needs grouping, apply it to all (#1634)\r\n\ti = len;\r\n\twhile (i--) {\r\n\t\tdgOptions = series[i].options.dataGrouping;\r\n\t\tif (dgOptions) {\r\n\t\t\r\n\t\t\tdataLength = (series[i].processedXData || series[i].data).length;\r\n\r\n\t\t\t// Execute grouping if the amount of points is greater than the limit defined in groupPixelWidth\r\n\t\t\tif (series[i].groupPixelWidth || dataLength > (this.chart.plotSizeX / groupPixelWidth) || (dataLength && dgOptions.forced)) {\r\n\t\t\t\tdoGrouping = true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\t\r\n\treturn doGrouping ? groupPixelWidth : 0;\r\n};\r\n\r\n\r\n\r\n/* ****************************************************************************\r\n * End data grouping module\t\t\t\t\t\t\t\t\t\t\t\t *\r\n ******************************************************************************//* ****************************************************************************\r\n * Start OHLC series code\t\t\t\t\t\t\t\t\t\t\t\t\t *\r\n *****************************************************************************/\r\n\r\n// 1 - Set default options\r\ndefaultPlotOptions.ohlc = merge(defaultPlotOptions.column, {\r\n\tlineWidth: 1,\r\n\ttooltip: {\r\n\t\tpointFormat: '<span style=\"color:{series.color};font-weight:bold\">{series.name}</span><br/>' +\r\n\t\t\t'Open: {point.open}<br/>' +\r\n\t\t\t'High: {point.high}<br/>' +\r\n\t\t\t'Low: {point.low}<br/>' +\r\n\t\t\t'Close: {point.close}<br/>'\r\n\t},\r\n\tstates: {\r\n\t\thover: {\r\n\t\t\tlineWidth: 3\r\n\t\t}\r\n\t},\r\n\tthreshold: null\r\n\t//upColor: undefined\r\n});\r\n\r\n// 2 - Create the OHLCSeries object\r\nvar OHLCSeries = extendClass(seriesTypes.column, {\r\n\ttype: 'ohlc',\r\n\tpointArrayMap: ['open', 'high', 'low', 'close'], // array point configs are mapped to this\r\n\ttoYData: function (point) { // return a plain array for speedy calculation\r\n\t\treturn [point.open, point.high, point.low, point.close];\r\n\t},\r\n\tpointValKey: 'high',\r\n\r\n\tpointAttrToOptions: { // mapping between SVG attributes and the corresponding options\r\n\t\tstroke: 'color',\r\n\t\t'stroke-width': 'lineWidth'\r\n\t},\r\n\tupColorProp: 'stroke',\r\n\r\n\t/**\r\n\t * Postprocess mapping between options and SVG attributes\r\n\t */\r\n\tgetAttribs: function () {\r\n\t\tseriesTypes.column.prototype.getAttribs.apply(this, arguments);\r\n\t\tvar series = this,\r\n\t\t\toptions = series.options,\r\n\t\t\tstateOptions = options.states,\r\n\t\t\tupColor = options.upColor || series.color,\r\n\t\t\tseriesDownPointAttr = merge(series.pointAttr),\r\n\t\t\tupColorProp = series.upColorProp;\r\n\r\n\t\tseriesDownPointAttr[''][upColorProp] = upColor;\r\n\t\tseriesDownPointAttr.hover[upColorProp] = stateOptions.hover.upColor || upColor;\r\n\t\tseriesDownPointAttr.select[upColorProp] = stateOptions.select.upColor || upColor;\r\n\r\n\t\teach(series.points, function (point) {\r\n\t\t\tif (point.open < point.close) {\r\n\t\t\t\tpoint.pointAttr = seriesDownPointAttr;\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Translate data points from raw values x and y to plotX and plotY\r\n\t */\r\n\ttranslate: function () {\r\n\t\tvar series = this,\r\n\t\t\tyAxis = series.yAxis;\r\n\r\n\t\tseriesTypes.column.prototype.translate.apply(series);\r\n\r\n\t\t// do the translation\r\n\t\teach(series.points, function (point) {\r\n\t\t\t// the graphics\r\n\t\t\tif (point.open !== null) {\r\n\t\t\t\tpoint.plotOpen = yAxis.translate(point.open, 0, 1, 0, 1);\r\n\t\t\t}\r\n\t\t\tif (point.close !== null) {\r\n\t\t\t\tpoint.plotClose = yAxis.translate(point.close, 0, 1, 0, 1);\r\n\t\t\t}\r\n\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Draw the data points\r\n\t */\r\n\tdrawPoints: function () {\r\n\t\tvar series = this,\r\n\t\t\tpoints = series.points,\r\n\t\t\tchart = series.chart,\r\n\t\t\tpointAttr,\r\n\t\t\tplotOpen,\r\n\t\t\tplotClose,\r\n\t\t\tcrispCorr,\r\n\t\t\thalfWidth,\r\n\t\t\tpath,\r\n\t\t\tgraphic,\r\n\t\t\tcrispX;\r\n\r\n\r\n\t\teach(points, function (point) {\r\n\t\t\tif (point.plotY !== UNDEFINED) {\r\n\r\n\t\t\t\tgraphic = point.graphic;\r\n\t\t\t\tpointAttr = point.pointAttr[point.selected ? 'selected' : ''];\r\n\r\n\t\t\t\t// crisp vector coordinates\r\n\t\t\t\tcrispCorr = (pointAttr['stroke-width'] % 2) / 2;\r\n\t\t\t\tcrispX = mathRound(point.plotX) + crispCorr;\r\n\t\t\t\thalfWidth = mathRound(point.shapeArgs.width / 2);\r\n\r\n\t\t\t\t// the vertical stem\r\n\t\t\t\tpath = [\r\n\t\t\t\t\t'M',\r\n\t\t\t\t\tcrispX, mathRound(point.yBottom),\r\n\t\t\t\t\t'L',\r\n\t\t\t\t\tcrispX, mathRound(point.plotY)\r\n\t\t\t\t];\r\n\r\n\t\t\t\t// open\r\n\t\t\t\tif (point.open !== null) {\r\n\t\t\t\t\tplotOpen = mathRound(point.plotOpen) + crispCorr;\r\n\t\t\t\t\tpath.push(\r\n\t\t\t\t\t\t'M',\r\n\t\t\t\t\t\tcrispX,\r\n\t\t\t\t\t\tplotOpen,\r\n\t\t\t\t\t\t'L',\r\n\t\t\t\t\t\tcrispX - halfWidth,\r\n\t\t\t\t\t\tplotOpen\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// close\r\n\t\t\t\tif (point.close !== null) {\r\n\t\t\t\t\tplotClose = mathRound(point.plotClose) + crispCorr;\r\n\t\t\t\t\tpath.push(\r\n\t\t\t\t\t\t'M',\r\n\t\t\t\t\t\tcrispX,\r\n\t\t\t\t\t\tplotClose,\r\n\t\t\t\t\t\t'L',\r\n\t\t\t\t\t\tcrispX + halfWidth,\r\n\t\t\t\t\t\tplotClose\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// create and/or update the graphic\r\n\t\t\t\tif (graphic) {\r\n\t\t\t\t\tgraphic.animate({ d: path });\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpoint.graphic = chart.renderer.path(path)\r\n\t\t\t\t\t\t.attr(pointAttr)\r\n\t\t\t\t\t\t.add(series.group);\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\r\n\t\t});\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Disable animation\r\n\t */\r\n\tanimate: null\r\n\r\n\r\n});\r\nseriesTypes.ohlc = OHLCSeries;\r\n/* ****************************************************************************\r\n * End OHLC series code\t\t\t\t\t\t\t\t\t\t\t\t\t *\r\n *****************************************************************************/\r\n/* ****************************************************************************\r\n * Start Candlestick series code\t\t\t\t\t\t\t\t\t\t\t *\r\n *****************************************************************************/\r\n\r\n// 1 - set default options\r\ndefaultPlotOptions.candlestick = merge(defaultPlotOptions.column, {\r\n\tlineColor: 'black',\r\n\tlineWidth: 1,\r\n\tstates: {\r\n\t\thover: {\r\n\t\t\tlineWidth: 2\r\n\t\t}\r\n\t},\r\n\ttooltip: defaultPlotOptions.ohlc.tooltip,\r\n\tthreshold: null,\r\n\tupColor: 'white'\r\n\t// upLineColor: null\r\n});\r\n\r\n// 2 - Create the CandlestickSeries object\r\nvar CandlestickSeries = extendClass(OHLCSeries, {\r\n\ttype: 'candlestick',\r\n\r\n\t/**\r\n\t * One-to-one mapping from options to SVG attributes\r\n\t */\r\n\tpointAttrToOptions: { // mapping between SVG attributes and the corresponding options\r\n\t\tfill: 'color',\r\n\t\tstroke: 'lineColor',\r\n\t\t'stroke-width': 'lineWidth'\r\n\t},\r\n\tupColorProp: 'fill',\r\n\r\n\t/**\r\n\t * Postprocess mapping between options and SVG attributes\r\n\t */\r\n\tgetAttribs: function () {\r\n\t\tseriesTypes.ohlc.prototype.getAttribs.apply(this, arguments);\r\n\t\tvar series = this,\r\n\t\t\toptions = series.options,\r\n\t\t\tstateOptions = options.states,\t\t\t\r\n\t\t\tupLineColor = options.upLineColor || options.lineColor,\r\n\t\t\thoverStroke = stateOptions.hover.upLineColor || upLineColor, \r\n\t\t\tselectStroke = stateOptions.select.upLineColor || upLineColor;\r\n\r\n\t\t// Add custom line color for points going up (close > open).\r\n\t\t// Fill is handled by OHLCSeries' getAttribs.\r\n\t\teach(series.points, function (point) {\r\n\t\t\tif (point.open < point.close) {\r\n\t\t\t\tpoint.pointAttr[''].stroke = upLineColor;\r\n\t\t\t\tpoint.pointAttr.hover.stroke = hoverStroke;\r\n\t\t\t\tpoint.pointAttr.select.stroke = selectStroke;\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Draw the data points\r\n\t */\r\n\tdrawPoints: function () {\r\n\t\tvar series = this, //state = series.state,\r\n\t\t\tpoints = series.points,\r\n\t\t\tchart = series.chart,\r\n\t\t\tpointAttr,\r\n\t\t\tplotOpen,\r\n\t\t\tplotClose,\r\n\t\t\ttopBox,\r\n\t\t\tbottomBox,\r\n\t\t\thasTopWhisker,\r\n\t\t\thasBottomWhisker,\r\n\t\t\tcrispCorr,\r\n\t\t\tcrispX,\r\n\t\t\tgraphic,\r\n\t\t\tpath,\r\n\t\t\thalfWidth;\r\n\r\n\r\n\t\teach(points, function (point) {\r\n\r\n\t\t\tgraphic = point.graphic;\r\n\t\t\tif (point.plotY !== UNDEFINED) {\r\n\r\n\t\t\t\tpointAttr = point.pointAttr[point.selected ? 'selected' : ''];\r\n\r\n\t\t\t\t// crisp vector coordinates\r\n\t\t\t\tcrispCorr = (pointAttr['stroke-width'] % 2) / 2;\r\n\t\t\t\tcrispX = mathRound(point.plotX) + crispCorr;\r\n\t\t\t\tplotOpen = point.plotOpen;\r\n\t\t\t\tplotClose = point.plotClose;\r\n\t\t\t\ttopBox = math.min(plotOpen, plotClose);\r\n\t\t\t\tbottomBox = math.max(plotOpen, plotClose);\r\n\t\t\t\thalfWidth = mathRound(point.shapeArgs.width / 2);\r\n\t\t\t\thasTopWhisker = mathRound(topBox) !== mathRound(point.plotY);\r\n\t\t\t\thasBottomWhisker = bottomBox !== point.yBottom;\r\n\t\t\t\ttopBox = mathRound(topBox) + crispCorr;\r\n\t\t\t\tbottomBox = mathRound(bottomBox) + crispCorr;\r\n\r\n\t\t\t\t// create the path\r\n\t\t\t\tpath = [\r\n\t\t\t\t\t'M',\r\n\t\t\t\t\tcrispX - halfWidth, bottomBox,\r\n\t\t\t\t\t'L',\r\n\t\t\t\t\tcrispX - halfWidth, topBox,\r\n\t\t\t\t\t'L',\r\n\t\t\t\t\tcrispX + halfWidth, topBox,\r\n\t\t\t\t\t'L',\r\n\t\t\t\t\tcrispX + halfWidth, bottomBox,\r\n\t\t\t\t\t'L',\r\n\t\t\t\t\tcrispX - halfWidth, bottomBox,\r\n\t\t\t\t\t'M',\r\n\t\t\t\t\tcrispX, topBox,\r\n\t\t\t\t\t'L',\r\n\t\t\t\t\tcrispX, hasTopWhisker ? mathRound(point.plotY) : topBox, // #460, #2094\r\n\t\t\t\t\t'M',\r\n\t\t\t\t\tcrispX, bottomBox,\r\n\t\t\t\t\t'L',\r\n\t\t\t\t\tcrispX, hasBottomWhisker ? mathRound(point.yBottom) : bottomBox, // #460, #2094\r\n\t\t\t\t\t'Z'\r\n\t\t\t\t];\r\n\r\n\t\t\t\tif (graphic) {\r\n\t\t\t\t\tgraphic.animate({ d: path });\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpoint.graphic = chart.renderer.path(path)\r\n\t\t\t\t\t\t.attr(pointAttr)\r\n\t\t\t\t\t\t.add(series.group)\r\n\t\t\t\t\t\t.shadow(series.options.shadow);\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t}\r\n\r\n\r\n});\r\n\r\nseriesTypes.candlestick = CandlestickSeries;\r\n\r\n/* ****************************************************************************\r\n * End Candlestick series code\t\t\t\t\t\t\t\t\t\t\t\t*\r\n *****************************************************************************/\r\n/* ****************************************************************************\r\n * Start Flags series code\t\t\t\t\t\t\t\t\t\t\t\t\t*\r\n *****************************************************************************/\r\n\r\nvar symbols = SVGRenderer.prototype.symbols;\r\n\r\n// 1 - set default options\r\ndefaultPlotOptions.flags = merge(defaultPlotOptions.column, {\r\n\tdataGrouping: null,\r\n\tfillColor: 'white',\r\n\tlineWidth: 1,\r\n\tpointRange: 0, // #673\r\n\t//radius: 2,\r\n\tshape: 'flag',\r\n\tstackDistance: 12,\r\n\tstates: {\r\n\t\thover: {\r\n\t\t\tlineColor: 'black',\r\n\t\t\tfillColor: '#FCFFC5'\r\n\t\t}\r\n\t},\r\n\tstyle: {\r\n\t\tfontSize: '11px',\r\n\t\tfontWeight: 'bold',\r\n\t\ttextAlign: 'center'\r\n\t},\r\n\ttooltip: {\r\n\t\tpointFormat: '{point.text}<br/>'\r\n\t},\r\n\tthreshold: null,\r\n\ty: -30\r\n});\r\n\r\n// 2 - Create the CandlestickSeries object\r\nseriesTypes.flags = extendClass(seriesTypes.column, {\r\n\ttype: 'flags',\r\n\tsorted: false,\r\n\tnoSharedTooltip: true,\r\n\ttakeOrdinalPosition: false, // #1074\r\n\tforceCrop: true,\r\n\t/**\r\n\t * Inherit the initialization from base Series\r\n\t */\r\n\tinit: Series.prototype.init,\r\n\r\n\t/**\r\n\t * One-to-one mapping from options to SVG attributes\r\n\t */\r\n\tpointAttrToOptions: { // mapping between SVG attributes and the corresponding options\r\n\t\tfill: 'fillColor',\r\n\t\tstroke: 'color',\r\n\t\t'stroke-width': 'lineWidth',\r\n\t\tr: 'radius'\r\n\t},\r\n\r\n\t/**\r\n\t * Extend the translate method by placing the point on the related series\r\n\t */\r\n\ttranslate: function () {\r\n\r\n\t\tseriesTypes.column.prototype.translate.apply(this);\r\n\r\n\t\tvar series = this,\r\n\t\t\toptions = series.options,\r\n\t\t\tchart = series.chart,\r\n\t\t\tpoints = series.points,\r\n\t\t\tcursor = points.length - 1,\r\n\t\t\tpoint,\r\n\t\t\tlastPoint,\r\n\t\t\toptionsOnSeries = options.onSeries,\r\n\t\t\tonSeries = optionsOnSeries && chart.get(optionsOnSeries),\r\n\t\t\tstep = onSeries && onSeries.options.step,\r\n\t\t\tonData = onSeries && onSeries.points,\r\n\t\t\ti = onData && onData.length,\r\n\t\t\txAxis = series.xAxis,\r\n\t\t\txAxisExt = xAxis.getExtremes(),\r\n\t\t\tleftPoint,\r\n\t\t\tlastX,\r\n\t\t\trightPoint;\r\n\r\n\t\t// relate to a master series\r\n\t\tif (onSeries && onSeries.visible && i) {\r\n\t\t\tlastX = onData[i - 1].x;\r\n\r\n\t\t\t// sort the data points\r\n\t\t\tpoints.sort(function (a, b) {\r\n\t\t\t\treturn (a.x - b.x);\r\n\t\t\t});\r\n\r\n\t\t\twhile (i-- && points[cursor]) {\r\n\t\t\t\tpoint = points[cursor];\r\n\t\t\t\tleftPoint = onData[i];\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tif (leftPoint.x <= point.x && leftPoint.plotY !== UNDEFINED) {\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (point.x <= lastX) { // #803\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tpoint.plotY = leftPoint.plotY;\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t// interpolate between points, #666\r\n\t\t\t\t\t\tif (leftPoint.x < point.x && !step) { \r\n\t\t\t\t\t\t\trightPoint = onData[i + 1];\r\n\t\t\t\t\t\t\tif (rightPoint && rightPoint.plotY !== UNDEFINED) {\r\n\t\t\t\t\t\t\t\tpoint.plotY += \r\n\t\t\t\t\t\t\t\t\t((point.x - leftPoint.x) / (rightPoint.x - leftPoint.x)) * // the distance ratio, between 0 and 1 \r\n\t\t\t\t\t\t\t\t\t(rightPoint.plotY - leftPoint.plotY); // the y distance\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcursor--;\r\n\t\t\t\t\ti++; // check again for points in the same x position\r\n\t\t\t\t\tif (cursor < 0) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Add plotY position and handle stacking\r\n\t\teach(points, function (point, i) {\r\n\t\t\t\r\n\t\t\t// Undefined plotY means the point is either on axis, outside series range or hidden series.\r\n\t\t\t// If the series is outside the range of the x axis it should fall through with \r\n\t\t\t// an undefined plotY, but then we must remove the shapeArgs (#847).\r\n\t\t\tif (point.plotY === UNDEFINED) {\r\n\t\t\t\tif (point.x >= xAxisExt.min && point.x <= xAxisExt.max) { // we're inside xAxis range\r\n\t\t\t\t\tpoint.plotY = chart.chartHeight - xAxis.bottom - (xAxis.opposite ? xAxis.height : 0) + xAxis.offset - chart.plotTop;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpoint.shapeArgs = {}; // 847\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// if multiple flags appear at the same x, order them into a stack\r\n\t\t\tlastPoint = points[i - 1];\r\n\t\t\tif (lastPoint && lastPoint.plotX === point.plotX) {\r\n\t\t\t\tif (lastPoint.stackIndex === UNDEFINED) {\r\n\t\t\t\t\tlastPoint.stackIndex = 0;\r\n\t\t\t\t}\r\n\t\t\t\tpoint.stackIndex = lastPoint.stackIndex + 1;\r\n\t\t\t}\r\n\t\t\t\t\t\r\n\t\t});\r\n\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Draw the markers\r\n\t */\r\n\tdrawPoints: function () {\r\n\t\tvar series = this,\r\n\t\t\tpointAttr,\r\n\t\t\tpoints = series.points,\r\n\t\t\tchart = series.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\tplotX,\r\n\t\t\tplotY,\r\n\t\t\toptions = series.options,\r\n\t\t\toptionsY = options.y,\r\n\t\t\tshape,\r\n\t\t\tbox,\r\n\t\t\tbBox,\r\n\t\t\ti,\r\n\t\t\tpoint,\r\n\t\t\tgraphic,\r\n\t\t\tstackIndex,\r\n\t\t\tcrisp = (options.lineWidth % 2 / 2),\r\n\t\t\tanchorX,\r\n\t\t\tanchorY;\r\n\r\n\t\ti = points.length;\r\n\t\twhile (i--) {\r\n\t\t\tpoint = points[i];\r\n\t\t\tplotX = point.plotX + crisp;\r\n\t\t\tstackIndex = point.stackIndex;\r\n\t\t\tshape = point.options.shape || options.shape;\r\n\t\t\tplotY = point.plotY;\r\n\t\t\tif (plotY !== UNDEFINED) {\r\n\t\t\t\tplotY = point.plotY + optionsY + crisp - (stackIndex !== UNDEFINED && stackIndex * options.stackDistance);\r\n\t\t\t}\r\n\t\t\tanchorX = stackIndex ? UNDEFINED : point.plotX + crisp; // skip connectors for higher level stacked points\r\n\t\t\tanchorY = stackIndex ? UNDEFINED : point.plotY;\r\n\r\n\t\t\tgraphic = point.graphic;\r\n\r\n\t\t\t// only draw the point if y is defined and the flag is within the visible area\r\n\t\t\tif (plotY !== UNDEFINED && plotX >= 0 && plotX < series.xAxis.len) {\r\n\t\t\t\t// shortcuts\r\n\t\t\t\tpointAttr = point.pointAttr[point.selected ? 'select' : ''];\r\n\t\t\t\tif (graphic) { // update\r\n\t\t\t\t\tgraphic.attr({\r\n\t\t\t\t\t\tx: plotX,\r\n\t\t\t\t\t\ty: plotY,\r\n\t\t\t\t\t\tr: pointAttr.r,\r\n\t\t\t\t\t\tanchorX: anchorX,\r\n\t\t\t\t\t\tanchorY: anchorY\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\tgraphic = point.graphic = renderer.label(\r\n\t\t\t\t\t\tpoint.options.title || options.title || 'A',\r\n\t\t\t\t\t\tplotX,\r\n\t\t\t\t\t\tplotY,\r\n\t\t\t\t\t\tshape,\r\n\t\t\t\t\t\tanchorX,\r\n\t\t\t\t\t\tanchorY,\r\n\t\t\t\t\t\toptions.useHTML\r\n\t\t\t\t\t)\r\n\t\t\t\t\t.css(merge(options.style, point.style))\r\n\t\t\t\t\t.attr(pointAttr)\r\n\t\t\t\t\t.attr({\r\n\t\t\t\t\t\talign: shape === 'flag' ? 'left' : 'center',\r\n\t\t\t\t\t\twidth: options.width,\r\n\t\t\t\t\t\theight: options.height\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.add(series.group)\r\n\t\t\t\t\t.shadow(options.shadow);\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// get the bounding box\r\n\t\t\t\tbox = graphic.box;\r\n\t\t\t\tbBox = box.getBBox();\r\n\r\n\t\t\t\t// Set the tooltip anchor position\r\n\t\t\t\tpoint.tooltipPos = [plotX, plotY];\r\n\r\n\t\t\t} else if (graphic) {\r\n\t\t\t\tpoint.graphic = graphic.destroy();\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t},\r\n\r\n\t/**\r\n\t * Extend the column trackers with listeners to expand and contract stacks\r\n\t */\r\n\tdrawTracker: function () {\r\n\t\tvar series = this,\r\n\t\t\tpoints = series.points;\r\n\t\t\r\n\t\tseriesTypes.column.prototype.drawTracker.apply(this);\r\n\r\n\t\t// Bring each stacked flag up on mouse over, this allows readability of vertically\r\n\t\t// stacked elements as well as tight points on the x axis. #1924.\r\n\t\teach(points, function (point) {\r\n\t\t\tvar graphic = point.graphic;\r\n\t\t\tif (graphic) {\r\n\t\t\t\taddEvent(graphic.element, 'mouseover', function () {\r\n\r\n\t\t\t\t\t// Raise this point\r\n\t\t\t\t\tif (point.stackIndex > 0 && !point.raised) {\r\n\t\t\t\t\t\tpoint._y = graphic.y;\r\n\t\t\t\t\t\tgraphic.attr({\r\n\t\t\t\t\t\t\ty: point._y - 8\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tpoint.raised = true;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\t// Revert other raised points\r\n\t\t\t\t\teach(points, function (otherPoint) {\r\n\t\t\t\t\t\tif (otherPoint !== point && otherPoint.raised && otherPoint.graphic) {\r\n\t\t\t\t\t\t\totherPoint.graphic.attr({\r\n\t\t\t\t\t\t\t\ty: otherPoint._y\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\totherPoint.raised = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Disable animation\r\n\t */\r\n\tanimate: noop\r\n\r\n});\r\n\r\n// create the flag icon with anchor\r\nsymbols.flag = function (x, y, w, h, options) {\r\n\tvar anchorX = (options && options.anchorX) || x,\r\n\t\tanchorY = (options && options.anchorY) || y;\r\n\r\n\treturn [\r\n\t\t'M', anchorX, anchorY,\r\n\t\t'L', x, y + h,\r\n\t\tx, y,\r\n\t\tx + w, y,\r\n\t\tx + w, y + h,\r\n\t\tx, y + h,\r\n\t\t'M', anchorX, anchorY,\r\n\t\t'Z'\r\n\t];\r\n};\r\n\r\n// create the circlepin and squarepin icons with anchor\r\neach(['circle', 'square'], function (shape) {\r\n\tsymbols[shape + 'pin'] = function (x, y, w, h, options) {\r\n\r\n\t\tvar anchorX = options && options.anchorX,\r\n\t\t\tanchorY = options && options.anchorY,\r\n\t\t\tpath = symbols[shape](x, y, w, h),\r\n\t\t\tlabelTopOrBottomY;\r\n\r\n\t\tif (anchorX && anchorY) {\r\n\t\t\t// if the label is below the anchor, draw the connecting line from the top edge of the label\r\n\t\t\t// otherwise start drawing from the bottom edge\r\n\t\t\tlabelTopOrBottomY = (y > anchorY) ? y : y + h;\r\n\t\t\tpath.push('M', anchorX, labelTopOrBottomY, 'L', anchorX, anchorY);\r\n\t\t}\r\n\r\n\t\treturn path;\r\n\t};\r\n});\r\n\r\n// The symbol callbacks are generated on the SVGRenderer object in all browsers. Even\r\n// VML browsers need this in order to generate shapes in export. Now share\r\n// them with the VMLRenderer.\r\nif (Renderer === VMLRenderer) {\r\n\teach(['flag', 'circlepin', 'squarepin'], function (shape) {\r\n\t\tVMLRenderer.prototype.symbols[shape] = symbols[shape];\r\n\t});\r\n}\r\n\r\n/* ****************************************************************************\r\n * End Flags series code\t\t\t\t\t\t\t\t\t\t\t\t\t *\r\n *****************************************************************************/\r\n/* ****************************************************************************\r\n * Start Scroller code\t\t\t\t\t\t\t\t\t\t\t\t\t\t*\r\n *****************************************************************************/\r\n/*jslint white:true */\r\nvar buttonGradient = hash(\r\n\t\tLINEAR_GRADIENT, { x1: 0, y1: 0, x2: 0, y2: 1 },\r\n\t\tSTOPS, [\r\n\t\t\t[0, '#FFF'],\r\n\t\t\t[1, '#CCC']\r\n\t\t]\r\n\t),\r\n\tunits = [].concat(defaultDataGroupingUnits); // copy\r\n\r\n// add more resolution to units\r\nunits[4] = [DAY, [1, 2, 3, 4]]; // allow more days\r\nunits[5] = [WEEK, [1, 2, 3]]; // allow more weeks\r\n\r\nextend(defaultOptions, {\r\n\tnavigator: {\r\n\t\t//enabled: true,\r\n\t\thandles: {\r\n\t\t\tbackgroundColor: '#FFF',\r\n\t\t\tborderColor: '#666'\r\n\t\t},\r\n\t\theight: 40,\r\n\t\tmargin: 10,\r\n\t\tmaskFill: 'rgba(255, 255, 255, 0.75)',\r\n\t\toutlineColor: '#444',\r\n\t\toutlineWidth: 1,\r\n\t\tseries: {\r\n\t\t\ttype: 'areaspline',\r\n\t\t\tcolor: '#4572A7',\r\n\t\t\tcompare: null,\r\n\t\t\tfillOpacity: 0.4,\r\n\t\t\tdataGrouping: {\r\n\t\t\t\tapproximation: 'average',\r\n\t\t\t\tenabled: true,\r\n\t\t\t\tgroupPixelWidth: 2,\r\n\t\t\t\tsmoothed: true,\r\n\t\t\t\tunits: units\r\n\t\t\t},\r\n\t\t\tdataLabels: {\r\n\t\t\t\tenabled: false,\r\n\t\t\t\tzIndex: 2 // #1839\r\n\t\t\t},\r\n\t\t\tid: PREFIX + 'navigator-series',\r\n\t\t\tlineColor: '#4572A7',\r\n\t\t\tlineWidth: 1,\r\n\t\t\tmarker: {\r\n\t\t\t\tenabled: false\r\n\t\t\t},\r\n\t\t\tpointRange: 0,\r\n\t\t\tshadow: false,\r\n\t\t\tthreshold: null\r\n\t\t},\r\n\t\t//top: undefined,\r\n\t\txAxis: {\r\n\t\t\ttickWidth: 0,\r\n\t\t\tlineWidth: 0,\r\n\t\t\tgridLineWidth: 1,\r\n\t\t\ttickPixelInterval: 200,\r\n\t\t\tlabels: {\r\n\t\t\t\talign: 'left',\r\n\t\t\t\tx: 3,\r\n\t\t\t\ty: -4\r\n\t\t\t}\r\n\t\t},\r\n\t\tyAxis: {\r\n\t\t\tgridLineWidth: 0,\r\n\t\t\tstartOnTick: false,\r\n\t\t\tendOnTick: false,\r\n\t\t\tminPadding: 0.1,\r\n\t\t\tmaxPadding: 0.1,\r\n\t\t\tlabels: {\r\n\t\t\t\tenabled: false\r\n\t\t\t},\r\n\t\t\ttitle: {\r\n\t\t\t\ttext: null\r\n\t\t\t},\r\n\t\t\ttickWidth: 0\r\n\t\t}\r\n\t},\r\n\tscrollbar: {\r\n\t\t//enabled: true\r\n\t\theight: isTouchDevice ? 20 : 14,\r\n\t\tbarBackgroundColor: buttonGradient,\r\n\t\tbarBorderRadius: 2,\r\n\t\tbarBorderWidth: 1,\r\n\t\tbarBorderColor: '#666',\r\n\t\tbuttonArrowColor: '#666',\r\n\t\tbuttonBackgroundColor: buttonGradient,\r\n\t\tbuttonBorderColor: '#666',\r\n\t\tbuttonBorderRadius: 2,\r\n\t\tbuttonBorderWidth: 1,\r\n\t\tminWidth: 6,\r\n\t\trifleColor: '#666',\r\n\t\ttrackBackgroundColor: hash(\r\n\t\t\tLINEAR_GRADIENT, { x1: 0, y1: 0, x2: 0, y2: 1 },\r\n\t\t\tSTOPS, [\r\n\t\t\t\t[0, '#EEE'],\r\n\t\t\t\t[1, '#FFF']\r\n\t\t\t]\r\n\t\t),\r\n\t\ttrackBorderColor: '#CCC',\r\n\t\ttrackBorderWidth: 1,\r\n\t\t// trackBorderRadius: 0\r\n\t\tliveRedraw: hasSVG && !isTouchDevice\r\n\t}\r\n});\r\n/*jslint white:false */\r\n\r\n/**\r\n * The Scroller class\r\n * @param {Object} chart\r\n */\r\nfunction Scroller(chart) {\r\n\tvar chartOptions = chart.options,\r\n\t\tnavigatorOptions = chartOptions.navigator,\r\n\t\tnavigatorEnabled = navigatorOptions.enabled,\r\n\t\tscrollbarOptions = chartOptions.scrollbar,\r\n\t\tscrollbarEnabled = scrollbarOptions.enabled,\r\n\t\theight = navigatorEnabled ? navigatorOptions.height : 0,\r\n\t\tscrollbarHeight = scrollbarEnabled ? scrollbarOptions.height : 0;\r\n\r\n\t\r\n\tthis.handles = [];\r\n\tthis.scrollbarButtons = [];\r\n\tthis.elementsToDestroy = []; // Array containing the elements to destroy when Scroller is destroyed\r\n\t\r\n\tthis.chart = chart;\r\n\tthis.setBaseSeries();\r\n\r\n\tthis.height = height;\r\n\tthis.scrollbarHeight = scrollbarHeight;\r\n\tthis.scrollbarEnabled = scrollbarEnabled;\r\n\tthis.navigatorEnabled = navigatorEnabled;\r\n\tthis.navigatorOptions = navigatorOptions;\r\n\tthis.scrollbarOptions = scrollbarOptions;\r\n\tthis.outlineHeight = height + scrollbarHeight;\r\n\r\n\t// Run scroller\r\n\tthis.init();\r\n}\r\n\r\nScroller.prototype = {\r\n\t/**\r\n\t * Draw one of the handles on the side of the zoomed range in the navigator\r\n\t * @param {Number} x The x center for the handle\r\n\t * @param {Number} index 0 for left and 1 for right\r\n\t */\r\n\tdrawHandle: function (x, index) {\r\n\t\tvar scroller = this,\r\n\t\t\tchart = scroller.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\telementsToDestroy = scroller.elementsToDestroy,\r\n\t\t\thandles = scroller.handles,\r\n\t\t\thandlesOptions = scroller.navigatorOptions.handles,\r\n\t\t\tattr = {\r\n\t\t\t\tfill: handlesOptions.backgroundColor,\r\n\t\t\t\tstroke: handlesOptions.borderColor,\r\n\t\t\t\t'stroke-width': 1\r\n\t\t\t},\r\n\t\t\ttempElem;\r\n\r\n\t\t// create the elements\r\n\t\tif (!scroller.rendered) {\r\n\t\t\t// the group\r\n\t\t\thandles[index] = renderer.g()\r\n\t\t\t\t.css({ cursor: 'e-resize' })\r\n\t\t\t\t.attr({ zIndex: 4 - index }) // zIndex = 3 for right handle, 4 for left\r\n\t\t\t\t.add();\r\n\r\n\t\t\t// the rectangle\r\n\t\t\ttempElem = renderer.rect(-4.5, 0, 9, 16, 3, 1)\r\n\t\t\t\t.attr(attr)\r\n\t\t\t\t.add(handles[index]);\r\n\t\t\telementsToDestroy.push(tempElem);\r\n\r\n\t\t\t// the rifles\r\n\t\t\ttempElem = renderer.path([\r\n\t\t\t\t\t'M',\r\n\t\t\t\t\t-1.5, 4,\r\n\t\t\t\t\t'L',\r\n\t\t\t\t\t-1.5, 12,\r\n\t\t\t\t\t'M',\r\n\t\t\t\t\t0.5, 4,\r\n\t\t\t\t\t'L',\r\n\t\t\t\t\t0.5, 12\r\n\t\t\t\t]).attr(attr)\r\n\t\t\t\t.add(handles[index]);\r\n\t\t\telementsToDestroy.push(tempElem);\r\n\t\t}\r\n\r\n\t\t// Place it\r\n\t\thandles[index][chart.isResizing ? 'animate' : 'attr']({\r\n\t\t\ttranslateX: scroller.scrollerLeft + scroller.scrollbarHeight + parseInt(x, 10), \r\n\t\t\ttranslateY: scroller.top + scroller.height / 2 - 8\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Draw the scrollbar buttons with arrows\r\n\t * @param {Number} index 0 is left, 1 is right\r\n\t */\r\n\tdrawScrollbarButton: function (index) {\r\n\t\tvar scroller = this,\r\n\t\t\tchart = scroller.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\telementsToDestroy = scroller.elementsToDestroy,\r\n\t\t\tscrollbarButtons = scroller.scrollbarButtons,\r\n\t\t\tscrollbarHeight = scroller.scrollbarHeight,\r\n\t\t\tscrollbarOptions = scroller.scrollbarOptions,\r\n\t\t\ttempElem;\r\n\r\n\t\tif (!scroller.rendered) {\r\n\t\t\tscrollbarButtons[index] = renderer.g().add(scroller.scrollbarGroup);\r\n\r\n\t\t\ttempElem = renderer.rect(\r\n\t\t\t\t\t-0.5,\r\n\t\t\t\t\t-0.5,\r\n\t\t\t\t\tscrollbarHeight + 1, // +1 to compensate for crispifying in rect method\r\n\t\t\t\t\tscrollbarHeight + 1,\r\n\t\t\t\t\tscrollbarOptions.buttonBorderRadius,\r\n\t\t\t\t\tscrollbarOptions.buttonBorderWidth\r\n\t\t\t\t).attr({\r\n\t\t\t\t\tstroke: scrollbarOptions.buttonBorderColor,\r\n\t\t\t\t\t'stroke-width': scrollbarOptions.buttonBorderWidth,\r\n\t\t\t\t\tfill: scrollbarOptions.buttonBackgroundColor\r\n\t\t\t\t}).add(scrollbarButtons[index]);\r\n\t\t\telementsToDestroy.push(tempElem);\r\n\r\n\t\t\ttempElem = renderer.path([\r\n\t\t\t\t\t'M',\r\n\t\t\t\t\tscrollbarHeight / 2 + (index ? -1 : 1), scrollbarHeight / 2 - 3,\r\n\t\t\t\t\t'L',\r\n\t\t\t\t\tscrollbarHeight / 2 + (index ? -1 : 1), scrollbarHeight / 2 + 3,\r\n\t\t\t\t\tscrollbarHeight / 2 + (index ? 2 : -2), scrollbarHeight / 2\r\n\t\t\t\t]).attr({\r\n\t\t\t\t\tfill: scrollbarOptions.buttonArrowColor\r\n\t\t\t\t}).add(scrollbarButtons[index]);\r\n\t\t\telementsToDestroy.push(tempElem);\r\n\t\t}\r\n\r\n\t\t// adjust the right side button to the varying length of the scroll track\r\n\t\tif (index) {\r\n\t\t\tscrollbarButtons[index].attr({\r\n\t\t\t\ttranslateX: scroller.scrollerWidth - scrollbarHeight\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Render the navigator and scroll bar\r\n\t * @param {Number} min X axis value minimum\r\n\t * @param {Number} max X axis value maximum\r\n\t * @param {Number} pxMin Pixel value minimum\r\n\t * @param {Number} pxMax Pixel value maximum\r\n\t */\r\n\trender: function (min, max, pxMin, pxMax) {\r\n\t\tvar scroller = this,\r\n\t\t\tchart = scroller.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\tnavigatorLeft,\r\n\t\t\tnavigatorWidth,\r\n\t\t\tscrollerLeft,\r\n\t\t\tscrollerWidth,\r\n\t\t\tscrollbarGroup = scroller.scrollbarGroup,\r\n\t\t\tnavigatorGroup = scroller.navigatorGroup,\r\n\t\t\tscrollbar = scroller.scrollbar,\r\n\t\t\txAxis = scroller.xAxis,\r\n\t\t\tscrollbarTrack = scroller.scrollbarTrack,\r\n\t\t\tscrollbarHeight = scroller.scrollbarHeight,\r\n\t\t\tscrollbarEnabled = scroller.scrollbarEnabled,\r\n\t\t\tnavigatorOptions = scroller.navigatorOptions,\r\n\t\t\tscrollbarOptions = scroller.scrollbarOptions,\r\n\t\t\tscrollbarMinWidth = scrollbarOptions.minWidth,\r\n\t\t\theight = scroller.height,\r\n\t\t\ttop = scroller.top,\r\n\t\t\tnavigatorEnabled = scroller.navigatorEnabled,\r\n\t\t\toutlineWidth = navigatorOptions.outlineWidth,\r\n\t\t\thalfOutline = outlineWidth / 2,\r\n\t\t\tzoomedMin,\r\n\t\t\tzoomedMax,\r\n\t\t\trange,\r\n\t\t\tscrX,\r\n\t\t\tscrWidth,\r\n\t\t\tscrollbarPad = 0,\r\n\t\t\toutlineHeight = scroller.outlineHeight,\r\n\t\t\tbarBorderRadius = scrollbarOptions.barBorderRadius,\r\n\t\t\tstrokeWidth,\r\n\t\t\tscrollbarStrokeWidth = scrollbarOptions.barBorderWidth,\r\n\t\t\tcenterBarX,\r\n\t\t\toutlineTop = top + halfOutline,\r\n\t\t\tverb,\r\n\t\t\tunionExtremes;\r\n\r\n\t\t// don't render the navigator until we have data (#486)\r\n\t\tif (isNaN(min)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tscroller.navigatorLeft = navigatorLeft = pick(\r\n\t\t\txAxis.left,\r\n\t\t\tchart.plotLeft + scrollbarHeight // in case of scrollbar only, without navigator\r\n\t\t);\r\n\t\tscroller.navigatorWidth = navigatorWidth = pick(xAxis.len, chart.plotWidth - 2 * scrollbarHeight);\r\n\t\tscroller.scrollerLeft = scrollerLeft = navigatorLeft - scrollbarHeight;\r\n\t\tscroller.scrollerWidth = scrollerWidth = scrollerWidth = navigatorWidth + 2 * scrollbarHeight;\r\n\r\n\t\t// Set the scroller x axis extremes to reflect the total. The navigator extremes\r\n\t\t// should always be the extremes of the union of all series in the chart as\r\n\t\t// well as the navigator series.\r\n\t\tif (xAxis.getExtremes) {\r\n\t\t\tunionExtremes = scroller.getUnionExtremes(true);\r\n\r\n\t\t\tif (unionExtremes && (unionExtremes.dataMin !== xAxis.min || unionExtremes.dataMax !== xAxis.max)) {\r\n\t\t\t\txAxis.setExtremes(unionExtremes.dataMin, unionExtremes.dataMax, true, false);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Get the pixel position of the handles\r\n\t\tpxMin = pick(pxMin, xAxis.translate(min));\r\n\t\tpxMax = pick(pxMax, xAxis.translate(max));\r\n\t\tif (isNaN(pxMin) || mathAbs(pxMin) === Infinity) { // Verify (#1851, #2238)\r\n\t\t\tpxMin = 0;\r\n\t\t\tpxMax = scrollerWidth;\r\n\t\t}\r\n\r\n\t\t// handles are allowed to cross, but never exceed the plot area\r\n\t\tscroller.zoomedMax = zoomedMax = mathMin(pInt(mathMax(pxMin, pxMax)), navigatorWidth);\r\n\t\tscroller.zoomedMin = zoomedMin = \r\n\t\t\tmathMax(scroller.fixedWidth ? zoomedMax - scroller.fixedWidth : pInt(mathMin(pxMin, pxMax)), 0);\r\n\t\tscroller.range = range = zoomedMax - zoomedMin;\r\n\r\n\t\t// on first render, create all elements\r\n\t\tif (!scroller.rendered) {\r\n\r\n\t\t\tif (navigatorEnabled) {\r\n\r\n\t\t\t\t// draw the navigator group\r\n\t\t\t\tscroller.navigatorGroup = navigatorGroup = renderer.g('navigator')\r\n\t\t\t\t\t.attr({\r\n\t\t\t\t\t\tzIndex: 3\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.add();\r\n\r\n\t\t\t\tscroller.leftShade = renderer.rect()\r\n\t\t\t\t\t.attr({\r\n\t\t\t\t\t\tfill: navigatorOptions.maskFill\r\n\t\t\t\t\t}).add(navigatorGroup);\r\n\t\t\t\tscroller.rightShade = renderer.rect()\r\n\t\t\t\t\t.attr({\r\n\t\t\t\t\t\tfill: navigatorOptions.maskFill\r\n\t\t\t\t\t}).add(navigatorGroup);\r\n\t\t\t\tscroller.outline = renderer.path()\r\n\t\t\t\t\t.attr({\r\n\t\t\t\t\t\t'stroke-width': outlineWidth,\r\n\t\t\t\t\t\tstroke: navigatorOptions.outlineColor\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.add(navigatorGroup);\r\n\t\t\t}\r\n\r\n\t\t\tif (scrollbarEnabled) {\r\n\r\n\t\t\t\t// draw the scrollbar group\r\n\t\t\t\tscroller.scrollbarGroup = scrollbarGroup = renderer.g('scrollbar').add();\r\n\r\n\t\t\t\t// the scrollbar track\r\n\t\t\t\tstrokeWidth = scrollbarOptions.trackBorderWidth;\r\n\t\t\t\tscroller.scrollbarTrack = scrollbarTrack = renderer.rect().attr({\r\n\t\t\t\t\ty: -strokeWidth % 2 / 2,\r\n\t\t\t\t\tfill: scrollbarOptions.trackBackgroundColor,\r\n\t\t\t\t\tstroke: scrollbarOptions.trackBorderColor,\r\n\t\t\t\t\t'stroke-width': strokeWidth,\r\n\t\t\t\t\tr: scrollbarOptions.trackBorderRadius || 0,\r\n\t\t\t\t\theight: scrollbarHeight\r\n\t\t\t\t}).add(scrollbarGroup);\r\n\r\n\t\t\t\t// the scrollbar itself\r\n\t\t\t\tscroller.scrollbar = scrollbar = renderer.rect()\r\n\t\t\t\t\t.attr({\r\n\t\t\t\t\t\ty: -scrollbarStrokeWidth % 2 / 2,\r\n\t\t\t\t\t\theight: scrollbarHeight,\r\n\t\t\t\t\t\tfill: scrollbarOptions.barBackgroundColor,\r\n\t\t\t\t\t\tstroke: scrollbarOptions.barBorderColor,\r\n\t\t\t\t\t\t'stroke-width': scrollbarStrokeWidth,\r\n\t\t\t\t\t\tr: barBorderRadius\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.add(scrollbarGroup);\r\n\r\n\t\t\t\tscroller.scrollbarRifles = renderer.path()\r\n\t\t\t\t\t.attr({\r\n\t\t\t\t\t\tstroke: scrollbarOptions.rifleColor,\r\n\t\t\t\t\t\t'stroke-width': 1\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.add(scrollbarGroup);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// place elements\r\n\t\tverb = chart.isResizing ? 'animate' : 'attr';\r\n\r\n\t\tif (navigatorEnabled) {\r\n\t\t\tscroller.leftShade[verb]({\r\n\t\t\t\tx: navigatorLeft,\r\n\t\t\t\ty: top,\r\n\t\t\t\twidth: zoomedMin,\r\n\t\t\t\theight: height\r\n\t\t\t});\r\n\t\t\tscroller.rightShade[verb]({\r\n\t\t\t\tx: navigatorLeft + zoomedMax,\r\n\t\t\t\ty: top,\r\n\t\t\t\twidth: navigatorWidth - zoomedMax,\r\n\t\t\t\theight: height\r\n\t\t\t});\r\n\t\t\tscroller.outline[verb]({ d: [\r\n\t\t\t\tM,\r\n\t\t\t\tscrollerLeft, outlineTop, // left\r\n\t\t\t\tL,\r\n\t\t\t\tnavigatorLeft + zoomedMin + halfOutline, outlineTop, // upper left of zoomed range\r\n\t\t\t\tnavigatorLeft + zoomedMin + halfOutline, outlineTop + outlineHeight - scrollbarHeight, // lower left of z.r.\r\n\t\t\t\tM,\r\n\t\t\t\tnavigatorLeft + zoomedMax - halfOutline, outlineTop + outlineHeight - scrollbarHeight, // lower right of z.r.\r\n\t\t\t\tL,\r\n\t\t\t\tnavigatorLeft + zoomedMax - halfOutline, outlineTop, // upper right of z.r.\r\n\t\t\t\tscrollerLeft + scrollerWidth, outlineTop // right\r\n\t\t\t]});\r\n\t\t\t// draw handles\r\n\t\t\tscroller.drawHandle(zoomedMin + halfOutline, 0);\r\n\t\t\tscroller.drawHandle(zoomedMax + halfOutline, 1);\r\n\t\t}\r\n\r\n\t\t// draw the scrollbar\r\n\t\tif (scrollbarEnabled && scrollbarGroup) {\r\n\r\n\t\t\t// draw the buttons\r\n\t\t\tscroller.drawScrollbarButton(0);\r\n\t\t\tscroller.drawScrollbarButton(1);\r\n\r\n\t\t\tscrollbarGroup[verb]({\r\n\t\t\t\ttranslateX: scrollerLeft, \r\n\t\t\t\ttranslateY: mathRound(outlineTop + height)\r\n\t\t\t});\r\n\r\n\t\t\tscrollbarTrack[verb]({\r\n\t\t\t\twidth: scrollerWidth\r\n\t\t\t});\r\n\r\n\t\t\t// prevent the scrollbar from drawing to small (#1246)\r\n\t\t\tscrX = scrollbarHeight + zoomedMin;\r\n\t\t\tscrWidth = range - scrollbarStrokeWidth;\r\n\t\t\tif (scrWidth < scrollbarMinWidth) {\r\n\t\t\t\tscrollbarPad = (scrollbarMinWidth - scrWidth) / 2;\r\n\t\t\t\tscrWidth = scrollbarMinWidth;\r\n\t\t\t\tscrX -= scrollbarPad;\r\n\t\t\t}\r\n\t\t\tscroller.scrollbarPad = scrollbarPad;\r\n\t\t\tscrollbar[verb]({\r\n\t\t\t\tx: mathFloor(scrX) + (scrollbarStrokeWidth % 2 / 2),\r\n\t\t\t\twidth: scrWidth\r\n\t\t\t});\r\n\r\n\t\t\tcenterBarX = scrollbarHeight + zoomedMin + range / 2 - 0.5;\r\n\r\n\t\t\tscroller.scrollbarRifles\r\n\t\t\t\t.attr({\r\n\t\t\t\t\tvisibility: range > 12 ? VISIBLE : HIDDEN\r\n\t\t\t\t})[verb]({ \r\n\t\t\t\t\td: [\r\n\t\t\t\t\t\tM,\r\n\t\t\t\t\t\tcenterBarX - 3, scrollbarHeight / 4,\r\n\t\t\t\t\t\tL,\r\n\t\t\t\t\t\tcenterBarX - 3, 2 * scrollbarHeight / 3,\r\n\t\t\t\t\t\tM,\r\n\t\t\t\t\t\tcenterBarX, scrollbarHeight / 4,\r\n\t\t\t\t\t\tL,\r\n\t\t\t\t\t\tcenterBarX, 2 * scrollbarHeight / 3,\r\n\t\t\t\t\t\tM,\r\n\t\t\t\t\t\tcenterBarX + 3, scrollbarHeight / 4,\r\n\t\t\t\t\t\tL,\r\n\t\t\t\t\t\tcenterBarX + 3, 2 * scrollbarHeight / 3\r\n\t\t\t\t\t]\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t\tscroller.scrollbarPad = scrollbarPad;\r\n\t\tscroller.rendered = true;\r\n\t},\r\n\r\n\t/**\r\n\t * Set up the mouse and touch events for the navigator and scrollbar\r\n\t */\r\n\taddEvents: function () {\r\n\t\tvar container = this.chart.container,\r\n\t\t\tmouseDownHandler = this.mouseDownHandler,\r\n\t\t\tmouseMoveHandler = this.mouseMoveHandler,\r\n\t\t\tmouseUpHandler = this.mouseUpHandler,\r\n\t\t\t_events;\r\n\t\t\r\n\t\t// Mouse events\r\n\t\t_events = [\r\n\t\t\t[container, 'mousedown', mouseDownHandler],\r\n\t\t\t[container, 'mousemove', mouseMoveHandler],\r\n\t\t\t[document, 'mouseup', mouseUpHandler]\r\n\t\t];\r\n\t\t\r\n\t\t// Touch events\r\n\t\tif (hasTouch) {\r\n\t\t\t_events.push(\r\n\t\t\t\t[container, 'touchstart', mouseDownHandler],\r\n\t\t\t\t[container, 'touchmove', mouseMoveHandler],\r\n\t\t\t\t[document, 'touchend', mouseUpHandler]\r\n\t\t\t);\r\n\t\t}\r\n\t\t\r\n\t\t// Add them all\r\n\t\teach(_events, function (args) {\r\n\t\t\taddEvent.apply(null, args);\r\n\t\t});\r\n\t\tthis._events = _events;\r\n\t},\r\n\r\n\t/**\r\n\t * Removes the event handlers attached previously with addEvents.\r\n\t */\r\n\tremoveEvents: function () {\r\n\t\t\r\n\t\teach(this._events, function (args) {\r\n\t\t\tremoveEvent.apply(null, args);\r\n\t\t});\r\n\t\tthis._events = UNDEFINED;\r\n\t\tif (this.navigatorEnabled && this.baseSeries) {\r\n\t\t\tremoveEvent(this.baseSeries, 'updatedData', this.updatedDataHandler);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Initiate the Scroller object\r\n\t */\r\n\tinit: function () {\r\n\t\tvar scroller = this,\r\n\t\t\tchart = scroller.chart,\r\n\t\t\txAxis,\r\n\t\t\tyAxis,\r\n\t\t\tscrollbarHeight = scroller.scrollbarHeight,\r\n\t\t\tnavigatorOptions = scroller.navigatorOptions,\r\n\t\t\theight = scroller.height,\r\n\t\t\ttop = scroller.top,\r\n\t\t\tdragOffset,\r\n\t\t\thasDragged,\r\n\t\t\tbodyStyle = document.body.style,\r\n\t\t\tdefaultBodyCursor,\r\n\t\t\tbaseSeries = scroller.baseSeries;\r\n\r\n\t\t/**\r\n\t\t * Event handler for the mouse down event.\r\n\t\t */\r\n\t\tscroller.mouseDownHandler = function (e) {\r\n\t\t\te = chart.pointer.normalize(e);\r\n\r\n\t\t\tvar zoomedMin = scroller.zoomedMin,\r\n\t\t\t\tzoomedMax = scroller.zoomedMax,\r\n\t\t\t\ttop = scroller.top,\r\n\t\t\t\tscrollbarHeight = scroller.scrollbarHeight,\r\n\t\t\t\tscrollerLeft = scroller.scrollerLeft,\r\n\t\t\t\tscrollerWidth = scroller.scrollerWidth,\r\n\t\t\t\tnavigatorLeft = scroller.navigatorLeft,\r\n\t\t\t\tnavigatorWidth = scroller.navigatorWidth,\r\n\t\t\t\tscrollbarPad = scroller.scrollbarPad,\r\n\t\t\t\trange = scroller.range,\r\n\t\t\t\tchartX = e.chartX,\r\n\t\t\t\tchartY = e.chartY,\r\n\t\t\t\tbaseXAxis = chart.xAxis[0],\r\n\t\t\t\tfixedMax,\r\n\t\t\t\text,\r\n\t\t\t\thandleSensitivity = isTouchDevice ? 10 : 7,\r\n\t\t\t\tleft,\r\n\t\t\t\tisOnNavigator;\r\n\r\n\t\t\tif (chartY > top && chartY < top + height + scrollbarHeight) { // we're vertically inside the navigator\r\n\t\t\t\tisOnNavigator = !scroller.scrollbarEnabled || chartY < top + height;\r\n\r\n\t\t\t\t// grab the left handle\r\n\t\t\t\tif (isOnNavigator && math.abs(chartX - zoomedMin - navigatorLeft) < handleSensitivity) {\r\n\t\t\t\t\tscroller.grabbedLeft = true;\r\n\t\t\t\t\tscroller.otherHandlePos = zoomedMax;\r\n\t\t\t\t\tscroller.fixedExtreme = baseXAxis.max;\r\n\t\t\t\t\tchart.fixedRange = null;\r\n\r\n\t\t\t\t// grab the right handle\r\n\t\t\t\t} else if (isOnNavigator && math.abs(chartX - zoomedMax - navigatorLeft) < handleSensitivity) {\r\n\t\t\t\t\tscroller.grabbedRight = true;\r\n\t\t\t\t\tscroller.otherHandlePos = zoomedMin;\r\n\t\t\t\t\tscroller.fixedExtreme = baseXAxis.min;\r\n\t\t\t\t\tchart.fixedRange = null;\r\n\r\n\t\t\t\t// grab the zoomed range\r\n\t\t\t\t} else if (chartX > navigatorLeft + zoomedMin - scrollbarPad && chartX < navigatorLeft + zoomedMax + scrollbarPad) {\r\n\t\t\t\t\tscroller.grabbedCenter = chartX;\r\n\t\t\t\t\tscroller.fixedWidth = range;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t// In SVG browsers, change the cursor. IE6 & 7 produce an error on changing the cursor,\r\n\t\t\t\t\t// and IE8 isn't able to show it while dragging anyway.\r\n\t\t\t\t\tif (chart.renderer.isSVG) {\r\n\t\t\t\t\t\tdefaultBodyCursor = bodyStyle.cursor;\r\n\t\t\t\t\t\tbodyStyle.cursor = 'ew-resize';\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdragOffset = chartX - zoomedMin;\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t// shift the range by clicking on shaded areas, scrollbar track or scrollbar buttons\r\n\t\t\t\t} else if (chartX > scrollerLeft && chartX < scrollerLeft + scrollerWidth) {\r\n\r\n\t\t\t\t\tif (isOnNavigator) { // center around the clicked point\r\n\t\t\t\t\t\tleft = chartX - navigatorLeft - range / 2;\r\n\t\t\t\t\t} else { // click on scrollbar\r\n\t\t\t\t\t\tif (chartX < navigatorLeft) { // click left scrollbar button\r\n\t\t\t\t\t\t\tleft = zoomedMin - mathMax(mathMin(10, range), 1);\r\n\t\t\t\t\t\t} else if (chartX > scrollerLeft + scrollerWidth - scrollbarHeight) {\r\n\t\t\t\t\t\t\tleft = zoomedMin + mathMax(mathMin(10, range), 1);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t// click on scrollbar track, shift the scrollbar by one range\r\n\t\t\t\t\t\t\tleft = chartX < navigatorLeft + zoomedMin ? // on the left\r\n\t\t\t\t\t\t\t\tzoomedMin - range :\r\n\t\t\t\t\t\t\t\tzoomedMax;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (left < 0) {\r\n\t\t\t\t\t\tleft = 0;\r\n\t\t\t\t\t} else if (left + range >= navigatorWidth) {\r\n\t\t\t\t\t\tleft = navigatorWidth - range;\r\n\t\t\t\t\t\tfixedMax = xAxis.dataMax; // #2293\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (left !== zoomedMin) { // it has actually moved\r\n\t\t\t\t\t\tscroller.fixedWidth = range; // #1370\r\n\r\n\t\t\t\t\t\text = xAxis.toFixedRange(left, left + range, null, fixedMax);\r\n\t\t\t\t\t\tbaseXAxis.setExtremes(\r\n\t\t\t\t\t\t\text.min,\r\n\t\t\t\t\t\t\text.max,\r\n\t\t\t\t\t\t\ttrue,\r\n\t\t\t\t\t\t\tfalse,\r\n\t\t\t\t\t\t\t{ trigger: 'navigator' }\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Event handler for the mouse move event.\r\n\t\t */\r\n\t\tscroller.mouseMoveHandler = function (e) {\r\n\t\t\tvar scrollbarHeight = scroller.scrollbarHeight,\r\n\t\t\t\tnavigatorLeft = scroller.navigatorLeft,\r\n\t\t\t\tnavigatorWidth = scroller.navigatorWidth,\r\n\t\t\t\tscrollerLeft = scroller.scrollerLeft,\r\n\t\t\t\tscrollerWidth = scroller.scrollerWidth,\r\n\t\t\t\trange = scroller.range,\r\n\t\t\t\tchartX;\r\n\t\t\t\t\r\n\t\t\t// In iOS, a mousemove event with e.pageX === 0 is fired when holding the finger\r\n\t\t\t// down in the center of the scrollbar. This should be ignored.\r\n\t\t\tif (e.pageX !== 0) {\r\n\t\t\t\r\n\t\t\t\te = chart.pointer.normalize(e);\r\n\t\t\t\tchartX = e.chartX;\r\n\t\r\n\t\t\t\t// validation for handle dragging\r\n\t\t\t\tif (chartX < navigatorLeft) {\r\n\t\t\t\t\tchartX = navigatorLeft;\r\n\t\t\t\t} else if (chartX > scrollerLeft + scrollerWidth - scrollbarHeight) {\r\n\t\t\t\t\tchartX = scrollerLeft + scrollerWidth - scrollbarHeight;\r\n\t\t\t\t}\r\n\t\r\n\t\t\t\t// drag left handle\r\n\t\t\t\tif (scroller.grabbedLeft) {\r\n\t\t\t\t\thasDragged = true;\r\n\t\t\t\t\tscroller.render(0, 0, chartX - navigatorLeft, scroller.otherHandlePos);\r\n\t\r\n\t\t\t\t// drag right handle\r\n\t\t\t\t} else if (scroller.grabbedRight) {\r\n\t\t\t\t\thasDragged = true;\r\n\t\t\t\t\tscroller.render(0, 0, scroller.otherHandlePos, chartX - navigatorLeft);\r\n\t\r\n\t\t\t\t// drag scrollbar or open area in navigator\r\n\t\t\t\t} else if (scroller.grabbedCenter) {\r\n\t\t\t\t\t\r\n\t\t\t\t\thasDragged = true;\r\n\t\t\t\t\tif (chartX < dragOffset) { // outside left\r\n\t\t\t\t\t\tchartX = dragOffset;\r\n\t\t\t\t\t} else if (chartX > navigatorWidth + dragOffset - range) { // outside right\r\n\t\t\t\t\t\tchartX = navigatorWidth + dragOffset - range;\r\n\t\t\t\t\t}\r\n\t\r\n\t\t\t\t\tscroller.render(0, 0, chartX - dragOffset, chartX - dragOffset + range);\r\n\r\n\t\t\t\t}\r\n\t\t\t\tif (hasDragged && scroller.scrollbarOptions.liveRedraw) {\r\n\t\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\t\tscroller.mouseUpHandler(e);\r\n\t\t\t\t\t}, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Event handler for the mouse up event.\r\n\t\t */\r\n\t\tscroller.mouseUpHandler = function (e) {\r\n\t\t\tvar ext,\r\n\t\t\t\tfixedMin,\r\n\t\t\t\tfixedMax;\r\n\t\t\t\r\n\t\t\tif (hasDragged) {\r\n\t\t\t\t// When dragging one handle, make sure the other one doesn't change\r\n\t\t\t\tif (scroller.zoomedMin === scroller.otherHandlePos) {\r\n\t\t\t\t\tfixedMin = scroller.fixedExtreme;\r\n\t\t\t\t} else if (scroller.zoomedMax === scroller.otherHandlePos) {\r\n\t\t\t\t\tfixedMax = scroller.fixedExtreme;\r\n\t\t\t\t}\r\n\t\t\t\tif (scroller.zoomedMax === scroller.navigatorWidth) { // #2341\r\n\t\t\t\t\tfixedMax = xAxis.dataMax;\r\n\t\t\t\t}\r\n\r\n\t\t\t\text = xAxis.toFixedRange(scroller.zoomedMin, scroller.zoomedMax, fixedMin, fixedMax);\r\n\t\t\t\tchart.xAxis[0].setExtremes(\r\n\t\t\t\t\text.min,\r\n\t\t\t\t\text.max,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t\t{ \r\n\t\t\t\t\t\ttrigger: 'navigator',\r\n\t\t\t\t\t\ttriggerOp: 'navigator-drag',\r\n\t\t\t\t\t\tDOMEvent: e // #1838\r\n\t\t\t\t\t}\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\tif (e.type !== 'mousemove') {\r\n\t\t\t\tscroller.grabbedLeft = scroller.grabbedRight = scroller.grabbedCenter = scroller.fixedWidth = \r\n\t\t\t\t\tscroller.fixedExtreme = scroller.otherHandlePos = hasDragged = dragOffset = null;\r\n\t\t\t\tbodyStyle.cursor = defaultBodyCursor || '';\r\n\t\t\t}\r\n\t\t\t\r\n\t\t};\r\n\r\n\r\n\r\n\t\tvar xAxisIndex = chart.xAxis.length,\r\n\t\t\tyAxisIndex = chart.yAxis.length;\r\n\r\n\t\t// make room below the chart\r\n\t\tchart.extraBottomMargin = scroller.outlineHeight + navigatorOptions.margin;\r\n\t\t\r\n\t\tif (scroller.navigatorEnabled) {\r\n\t\t\t// an x axis is required for scrollbar also\r\n\t\t\tscroller.xAxis = xAxis = new Axis(chart, merge({\r\n\t\t\t\tordinal: baseSeries && baseSeries.xAxis.options.ordinal // inherit base xAxis' ordinal option\r\n\t\t\t}, navigatorOptions.xAxis, {\r\n\t\t\t\tid: 'navigator-x-axis',\r\n\t\t\t\tisX: true,\r\n\t\t\t\ttype: 'datetime',\r\n\t\t\t\tindex: xAxisIndex,\r\n\t\t\t\theight: height,\r\n\t\t\t\toffset: 0,\r\n\t\t\t\toffsetLeft: scrollbarHeight,\r\n\t\t\t\toffsetRight: -scrollbarHeight,\r\n\t\t\t\tstartOnTick: false,\r\n\t\t\t\tendOnTick: false,\r\n\t\t\t\tminPadding: 0,\r\n\t\t\t\tmaxPadding: 0,\r\n\t\t\t\tzoomEnabled: false\r\n\t\t\t}));\r\n\r\n\t\t\tscroller.yAxis = yAxis = new Axis(chart, merge(navigatorOptions.yAxis, {\r\n\t\t\t\tid: 'navigator-y-axis',\r\n\t\t\t\talignTicks: false,\r\n\t\t\t\theight: height,\r\n\t\t\t\toffset: 0,\r\n\t\t\t\tindex: yAxisIndex,\r\n\t\t\t\tzoomEnabled: false\r\n\t\t\t}));\r\n\r\n\t\t\t// If we have a base series, initialize the navigator series\r\n\t\t\tif (baseSeries || navigatorOptions.series.data) {\r\n\t\t\t\tscroller.addBaseSeries();\r\n\r\n\t\t\t// If not, set up an event to listen for added series\r\n\t\t\t} else if (chart.series.length === 0) {\r\n\r\n\t\t\t\twrap(chart, 'redraw', function (proceed, animation) {\r\n\t\t\t\t\t// We've got one, now add it as base and reset chart.redraw\r\n\t\t\t\t\tif (chart.series.length > 0 && !scroller.series) {\r\n\t\t\t\t\t\tscroller.setBaseSeries();\r\n\t\t\t\t\t\tchart.redraw = proceed; // reset\r\n\t\t\t\t\t}\r\n\t\t\t\t\tproceed.call(chart, animation);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\t\r\n\r\n\t\t// in case of scrollbar only, fake an x axis to get translation\r\n\t\t} else {\r\n\t\t\tscroller.xAxis = xAxis = {\r\n\t\t\t\ttranslate: function (value, reverse) {\r\n\t\t\t\t\tvar ext = chart.xAxis[0].getExtremes(),\r\n\t\t\t\t\t\tscrollTrackWidth = chart.plotWidth - 2 * scrollbarHeight,\r\n\t\t\t\t\t\tdataMin = ext.dataMin,\r\n\t\t\t\t\t\tvalueRange = ext.dataMax - dataMin;\r\n\r\n\t\t\t\t\treturn reverse ?\r\n\t\t\t\t\t\t// from pixel to value\r\n\t\t\t\t\t\t(value * valueRange / scrollTrackWidth) + dataMin :\r\n\t\t\t\t\t\t// from value to pixel\r\n\t\t\t\t\t\tscrollTrackWidth * (value - dataMin) / valueRange;\r\n\t\t\t\t},\r\n\t\t\t\ttoFixedRange: Axis.prototype.toFixedRange\r\n\t\t\t};\r\n\t\t}\r\n\r\n\r\n\t\t/**\r\n\t\t * For stock charts, extend the Chart.getMargins method so that we can set the final top position\r\n\t\t * of the navigator once the height of the chart, including the legend, is determined. #367.\r\n\t\t */\r\n\t\twrap(chart, 'getMargins', function (proceed) {\r\n\r\n\t\t\tvar legend = this.legend,\r\n\t\t\t\tlegendOptions = legend.options;\r\n\r\n\t\t\tproceed.call(this);\r\n\t\t\t\r\n\t\t\t// Compute the top position\r\n\t\t\tscroller.top = top = scroller.navigatorOptions.top || \r\n\t\t\t\tthis.chartHeight - scroller.height - scroller.scrollbarHeight - this.spacing[2] - \r\n\t\t\t\t\t\t(legendOptions.verticalAlign === 'bottom' && legendOptions.enabled && !legendOptions.floating ? \r\n\t\t\t\t\t\t\tlegend.legendHeight + pick(legendOptions.margin, 10) : 0);\r\n\r\n\t\t\tif (xAxis && yAxis) { // false if navigator is disabled (#904)\r\n\r\n\t\t\t\txAxis.options.top = yAxis.options.top = top;\r\n\r\n\t\t\t\txAxis.setAxisSize();\r\n\t\t\t\tyAxis.setAxisSize();\r\n\t\t\t}\r\n\t\t});\r\n\t\t\r\n\r\n\t\tscroller.addEvents();\r\n\t},\r\n\r\n\t/**\r\n\t * Get the union data extremes of the chart - the outer data extremes of the base\r\n\t * X axis and the navigator axis.\r\n\t */\r\n\tgetUnionExtremes: function (returnFalseOnNoBaseSeries) {\r\n\t\tvar baseAxis = this.chart.xAxis[0],\r\n\t\t\tnavAxis = this.xAxis,\r\n\t\t\tnavAxisOptions = navAxis.options;\r\n\r\n\t\tif (!returnFalseOnNoBaseSeries || baseAxis.dataMin !== null) {\r\n\t\t\treturn {\r\n\t\t\t\tdataMin: pick(\r\n\t\t\t\t\tnavAxisOptions && navAxisOptions.min, \r\n\t\t\t\t\t((defined(baseAxis.dataMin) && defined(navAxis.dataMin)) ? mathMin : pick)(baseAxis.dataMin, navAxis.dataMin)\r\n\t\t\t\t),\r\n\t\t\t\tdataMax: pick(\r\n\t\t\t\t\tnavAxisOptions && navAxisOptions.max, \r\n\t\t\t\t\t((defined(baseAxis.dataMax) && defined(navAxis.dataMax)) ? mathMax : pick)(baseAxis.dataMax, navAxis.dataMax)\r\n\t\t\t\t)\r\n\t\t\t};\r\n\t\t}\r\n\t\t\r\n\t},\r\n\r\n\t/**\r\n\t * Set the base series. With a bit of modification we should be able to make \r\n\t * this an API method to be called from the outside\r\n\t */\r\n\tsetBaseSeries: function (baseSeriesOption) {\r\n\t\tvar chart = this.chart;\r\n\r\n\t\tbaseSeriesOption = baseSeriesOption || chart.options.navigator.baseSeries;\r\n\r\n\t\t// If we're resetting, remove the existing series\r\n\t\tif (this.series) {\r\n\t\t\tthis.series.remove();\r\n\t\t}\r\n\r\n\t\t// Set the new base series\r\n\t\tthis.baseSeries = chart.series[baseSeriesOption] ||\r\n\t\t\t(typeof baseSeriesOption === 'string' && chart.get(baseSeriesOption)) ||\r\n\t\t\tchart.series[0];\r\n\r\n\t\t// When run after render, this.xAxis already exists\r\n\t\tif (this.xAxis) {\r\n\t\t\tthis.addBaseSeries();\r\n\t\t}\r\n\t},\r\n\r\n\taddBaseSeries: function () {\r\n\t\tvar baseSeries = this.baseSeries,\r\n\t\t\tbaseOptions = baseSeries ? baseSeries.options : {},\r\n\t\t\tbaseData = baseOptions.data,\r\n\t\t\tmergedNavSeriesOptions,\r\n\t\t\tnavigatorSeriesOptions = this.navigatorOptions.series,\r\n\t\t\tnavigatorData;\r\n\t\t\t\r\n\t\t// remove it to prevent merging one by one\r\n\t\tnavigatorData = navigatorSeriesOptions.data;\r\n\t\tthis.hasNavigatorData = !!navigatorData;\r\n\r\n\t\t// Merge the series options\r\n\t\tmergedNavSeriesOptions = merge(baseOptions, navigatorSeriesOptions, {\r\n\t\t\tclip: false,\r\n\t\t\tenableMouseTracking: false,\r\n\t\t\tgroup: 'nav', // for columns\r\n\t\t\tpadXAxis: false,\r\n\t\t\txAxis: 'navigator-x-axis',\r\n\t\t\tyAxis: 'navigator-y-axis',\r\n\t\t\tname: 'Navigator',\r\n\t\t\tshowInLegend: false,\r\n\t\t\tisInternal: true,\r\n\t\t\tvisible: true\r\n\t\t});\r\n\r\n\t\t// set the data back\r\n\t\tmergedNavSeriesOptions.data = navigatorData || baseData;\r\n\r\n\t\t// add the series\r\n\t\tthis.series = this.chart.initSeries(mergedNavSeriesOptions);\r\n\r\n\t\t// Respond to updated data in the base series.\r\n\t\t// Abort if lazy-loading data from the server.\r\n\t\tif (baseSeries && this.navigatorOptions.adaptToUpdatedData !== false) {\r\n\t\t\taddEvent(baseSeries, 'updatedData', this.updatedDataHandler);\r\n\t\t\t// Survive Series.update()\r\n\t\t\tbaseSeries.userOptions.events = extend(baseSeries.userOptions.event, { updatedData: this.updatedDataHandler });\r\n \r\n\t\t}\r\n\t},\r\n\r\n\tupdatedDataHandler: function () {\r\n\t\tvar scroller = this.chart.scroller,\r\n\t\t\tbaseSeries = scroller.baseSeries,\r\n\t\t\tbaseXAxis = baseSeries.xAxis,\r\n\t\t\tbaseExtremes = baseXAxis.getExtremes(),\r\n\t\t\tbaseMin = baseExtremes.min,\r\n\t\t\tbaseMax = baseExtremes.max,\r\n\t\t\tbaseDataMin = baseExtremes.dataMin,\r\n\t\t\tbaseDataMax = baseExtremes.dataMax,\r\n\t\t\trange = baseMax - baseMin,\r\n\t\t\tstickToMin,\r\n\t\t\tstickToMax,\r\n\t\t\tnewMax,\r\n\t\t\tnewMin,\r\n\t\t\tdoRedraw,\r\n\t\t\tnavigatorSeries = scroller.series,\r\n\t\t\tnavXData = navigatorSeries.xData,\r\n\t\t\thasSetExtremes = !!baseXAxis.setExtremes;\r\n\r\n\t\t// detect whether to move the range\r\n\t\tstickToMax = baseMax >= navXData[navXData.length - 1] - (this.closestPointRange || 0); // #570\r\n\t\tstickToMin = baseMin <= baseDataMin;\r\n\r\n\t\t// set the navigator series data to the new data of the base series\r\n\t\tif (!scroller.hasNavigatorData) {\r\n\t\t\tnavigatorSeries.options.pointStart = baseSeries.xData[0];\r\n\t\t\tnavigatorSeries.setData(baseSeries.options.data, false);\r\n\t\t\tdoRedraw = true;\r\n\t\t}\r\n\r\n\t\t// if the zoomed range is already at the min, move it to the right as new data\r\n\t\t// comes in\r\n\t\tif (stickToMin) {\r\n\t\t\tnewMin = baseDataMin;\r\n\t\t\tnewMax = newMin + range;\r\n\t\t}\r\n\r\n\t\t// if the zoomed range is already at the max, move it to the right as new data\r\n\t\t// comes in\r\n\t\tif (stickToMax) {\r\n\t\t\tnewMax = baseDataMax;\r\n\t\t\tif (!stickToMin) { // if stickToMin is true, the new min value is set above\r\n\t\t\t\tnewMin = mathMax(newMax - range, navigatorSeries.xData[0]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// update the extremes\r\n\t\tif (hasSetExtremes && (stickToMin || stickToMax)) {\r\n\t\t\tif (!isNaN(newMin)) {\r\n\t\t\t\tbaseXAxis.setExtremes(newMin, newMax, true, false, { trigger: 'updatedData' });\r\n\t\t\t}\r\n\t\t\t\r\n\t\t// if it is not at any edge, just move the scroller window to reflect the new series data\r\n\t\t} else {\r\n\t\t\tif (doRedraw) {\r\n\t\t\t\tthis.chart.redraw(false);\r\n\t\t\t}\r\n\r\n\t\t\tscroller.render(\r\n\t\t\t\tmathMax(baseMin, baseDataMin),\r\n\t\t\t\tmathMin(baseMax, baseDataMax)\r\n\t\t\t);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Destroys allocated elements.\r\n\t */\r\n\tdestroy: function () {\r\n\t\tvar scroller = this;\r\n\r\n\t\t// Disconnect events added in addEvents\r\n\t\tscroller.removeEvents();\r\n\r\n\t\t// Destroy properties\r\n\t\teach([scroller.xAxis, scroller.yAxis, scroller.leftShade, scroller.rightShade, scroller.outline, scroller.scrollbarTrack, scroller.scrollbarRifles, scroller.scrollbarGroup, scroller.scrollbar], function (prop) {\r\n\t\t\tif (prop && prop.destroy) {\r\n\t\t\t\tprop.destroy();\r\n\t\t\t}\r\n\t\t});\r\n\t\tscroller.xAxis = scroller.yAxis = scroller.leftShade = scroller.rightShade = scroller.outline = scroller.scrollbarTrack = scroller.scrollbarRifles = scroller.scrollbarGroup = scroller.scrollbar = null;\r\n\r\n\t\t// Destroy elements in collection\r\n\t\teach([scroller.scrollbarButtons, scroller.handles, scroller.elementsToDestroy], function (coll) {\r\n\t\t\tdestroyObjectProperties(coll);\r\n\t\t});\r\n\t}\r\n};\r\n\r\nHighcharts.Scroller = Scroller;\r\n\r\n\r\n/**\r\n * For Stock charts, override selection zooming with some special features because \r\n * X axis zooming is already allowed by the Navigator and Range selector. \r\n */\r\nwrap(Axis.prototype, 'zoom', function (proceed, newMin, newMax) {\r\n\tvar chart = this.chart,\r\n\t\tchartOptions = chart.options,\r\n\t\tzoomType = chartOptions.chart.zoomType,\r\n\t\tpreviousZoom,\r\n\t\tnavigator = chartOptions.navigator,\r\n\t\trangeSelector = chartOptions.rangeSelector,\r\n\t\tret;\r\n\t\r\n\tif (this.isXAxis && ((navigator && navigator.enabled) || \r\n\t\t\t(rangeSelector && rangeSelector.enabled))) {\r\n\t\t\r\n\t\t// For x only zooming, fool the chart.zoom method not to create the zoom button \r\n\t\t// because the property already exists\r\n\t\tif (zoomType === 'x') {\r\n\t\t\tchart.resetZoomButton = 'blocked';\r\n\t\t\t\r\n\t\t// For y only zooming, ignore the X axis completely\r\n\t\t} else if (zoomType === 'y') {\r\n\t\t\tret = false;\r\n\t\t\r\n\t\t// For xy zooming, record the state of the zoom before zoom selection, then when \r\n\t\t// the reset button is pressed, revert to this state\r\n\t\t} else if (zoomType === 'xy') {\r\n\t\t\tpreviousZoom = this.previousZoom;\r\n\t\t\tif (defined(newMin)) {\r\n\t\t\t\tthis.previousZoom = [this.min, this.max];\r\n\t\t\t} else if (previousZoom) {\r\n\t\t\t\tnewMin = previousZoom[0];\r\n\t\t\t\tnewMax = previousZoom[1];\r\n\t\t\t\tdelete this.previousZoom;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t}\r\n\treturn ret !== UNDEFINED ? ret : proceed.call(this, newMin, newMax);\r\n});\r\n\r\n// Initialize scroller for stock charts\r\nwrap(Chart.prototype, 'init', function (proceed, options, callback) {\r\n\t\r\n\taddEvent(this, 'beforeRender', function () {\r\n\t\tvar options = this.options;\r\n\t\tif (options.navigator.enabled || options.scrollbar.enabled) {\r\n\t\t\tthis.scroller = new Scroller(this);\r\n\t\t}\r\n\t});\r\n\r\n\tproceed.call(this, options, callback);\r\n\r\n});\r\n\r\n/* ****************************************************************************\r\n * End Scroller code\t\t\t\t\t\t\t\t\t\t\t\t\t\t *\r\n *****************************************************************************/\r\n/* ****************************************************************************\r\n * Start Range Selector code\t\t\t\t\t\t\t\t\t\t\t\t *\r\n *****************************************************************************/\r\nextend(defaultOptions, {\r\n\trangeSelector: {\r\n\t\t// enabled: true,\r\n\t\t// buttons: {Object}\r\n\t\t// buttonSpacing: 0,\r\n\t\tbuttonTheme: {\r\n\t\t\twidth: 28,\r\n\t\t\theight: 16,\r\n\t\t\tpadding: 1,\r\n\t\t\tr: 0,\r\n\t\t\tstroke: '#68A',\r\n\t\t\tzIndex: 7 // #484, #852\r\n\t\t//\tstates: {\r\n\t\t//\t\thover: {},\r\n\t\t//\t\tselect: {}\r\n\t\t// }\r\n\t\t},\r\n\t\tinputPosition: {\r\n\t\t\talign: 'right'\r\n\t\t},\r\n\t\t// inputDateFormat: '%b %e, %Y',\r\n\t\t// inputEditDateFormat: '%Y-%m-%d',\r\n\t\t// inputEnabled: true,\r\n\t\t//inputStyle: {},\r\n\t\tlabelStyle: {\r\n\t\t\tcolor: '#666'\r\n\t\t}\r\n\t\t// selected: undefined\r\n\t}\r\n});\r\ndefaultOptions.lang = merge(defaultOptions.lang, {\r\n\trangeSelectorZoom: 'Zoom',\r\n\trangeSelectorFrom: 'Du',\r\n\trangeSelectorTo: 'Au'\r\n});\r\n\r\n/**\r\n * The object constructor for the range selector\r\n * @param {Object} chart\r\n */\r\nfunction RangeSelector(chart) {\r\n\r\n\t// Run RangeSelector\r\n\tthis.init(chart);\r\n}\r\n\r\nRangeSelector.prototype = {\r\n\t/**\r\n\t * The method to run when one of the buttons in the range selectors is clicked\r\n\t * @param {Number} i The index of the button\r\n\t * @param {Object} rangeOptions\r\n\t * @param {Boolean} redraw\r\n\t */\r\n\tclickButton: function (i, rangeOptions, redraw) {\r\n\t\tvar rangeSelector = this,\r\n\t\t\tselected = rangeSelector.selected,\r\n\t\t\tchart = rangeSelector.chart,\r\n\t\t\tbuttons = rangeSelector.buttons,\r\n\t\t\tbaseAxis = chart.xAxis[0],\r\n\t\t\tunionExtremes = (chart.scroller && chart.scroller.getUnionExtremes()) || baseAxis || {},\r\n\t\t\tdataMin = unionExtremes.dataMin,\r\n\t\t\tdataMax = unionExtremes.dataMax,\r\n\t\t\tnewMin,\r\n\t\t\tnewMax = baseAxis && mathRound(mathMin(baseAxis.max, pick(dataMax, baseAxis.max))), // #1568\r\n\t\t\tnow,\r\n\t\t\tdate = new Date(newMax),\r\n\t\t\ttype = rangeOptions.type,\r\n\t\t\tcount = rangeOptions.count,\r\n\t\t\tbaseXAxisOptions,\r\n\t\t\trange = rangeOptions._range,\r\n\t\t\trangeMin,\r\n\t\t\tyear,\r\n\t\t\ttimeName;\r\n\r\n\t\tif (dataMin === null || dataMax === null || // chart has no data, base series is removed\r\n\t\t\t\ti === rangeSelector.selected) { // same button is clicked twice\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (type === 'month' || type === 'year') {\r\n\t\t\ttimeName = { month: 'Month', year: 'FullYear'}[type];\r\n\t\t\tdate['set' + timeName](date['get' + timeName]() - count);\r\n\r\n\t\t\tnewMin = date.getTime();\r\n\t\t\tdataMin = pick(dataMin, Number.MIN_VALUE);\r\n\t\t\tif (isNaN(newMin) || newMin < dataMin) {\r\n\t\t\t\tnewMin = dataMin;\r\n\t\t\t\tnewMax = mathMin(newMin + range, dataMax);\r\n\t\t\t} else {\r\n\t\t\t\trange = newMax - newMin;\r\n\t\t\t}\r\n\r\n\t\t// Fixed times like minutes, hours, days\r\n\t\t} else if (range) {\r\n\t\t\tnewMin = mathMax(newMax - range, dataMin);\r\n\t\t\tnewMax = mathMin(newMin + range, dataMax);\r\n\t\t\r\n\t\t} else if (type === 'ytd') {\r\n\r\n\t\t\t// On user clicks on the buttons, or a delayed action running from the beforeRender \r\n\t\t\t// event (below), the baseAxis is defined.\r\n\t\t\tif (baseAxis) {\r\n\r\n\t\t\t\t// When \"ytd\" is the pre-selected button for the initial view, its calculation\r\n\t\t\t\t// is delayed and rerun in the beforeRender event (below). When the series\r\n\t\t\t\t// are initialized, but before the chart is rendered, we have access to the xData\r\n\t\t\t\t// array (#942).\r\n\t\t\t\tif (dataMax === UNDEFINED) {\r\n\t\t\t\t\tdataMin = Number.MAX_VALUE;\r\n\t\t\t\t\tdataMax = Number.MIN_VALUE;\r\n\t\t\t\t\teach(chart.series, function (series) {\r\n\t\t\t\t\t\tvar xData = series.xData; // reassign it to the last item\r\n\t\t\t\t\t\tdataMin = mathMin(xData[0], dataMin);\r\n\t\t\t\t\t\tdataMax = mathMax(xData[xData.length - 1], dataMax);\r\n\t\t\t\t\t});\r\n\t\t\t\t\tredraw = false;\r\n\t\t\t\t}\r\n\t\t\t\tnow = new Date(dataMax);\r\n\t\t\t\tyear = now.getFullYear();\r\n\t\t\t\tnewMin = rangeMin = mathMax(dataMin || 0, Date.UTC(year, 0, 1));\r\n\t\t\t\tnow = now.getTime();\r\n\t\t\t\tnewMax = mathMin(dataMax || now, now);\r\n\r\n\t\t\t// \"ytd\" is pre-selected. We don't yet have access to processed point and extremes data\r\n\t\t\t// (things like pointStart and pointInterval are missing), so we delay the process (#942)\r\n\t\t\t} else {\r\n\t\t\t\taddEvent(chart, 'beforeRender', function () {\r\n\t\t\t\t\trangeSelector.clickButton(i, rangeOptions);\r\n\t\t\t\t});\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t} else if (type === 'all' && baseAxis) {\r\n\t\t\tnewMin = dataMin;\r\n\t\t\tnewMax = dataMax;\r\n\t\t}\r\n\r\n\t\t// Deselect previous button\r\n\t\tif (buttons[selected]) {\r\n\t\t\tbuttons[selected].setState(0);\r\n\t\t}\r\n\t\t// Select this button\r\n\t\tif (buttons[i]) {\r\n\t\t\tbuttons[i].setState(2);\r\n\t\t}\r\n\r\n\t\tchart.fixedRange = range;\r\n\r\n\t\t// update the chart\r\n\t\tif (!baseAxis) { // axis not yet instanciated\r\n\t\t\tbaseXAxisOptions = chart.options.xAxis;\r\n\t\t\tbaseXAxisOptions[0] = merge(\r\n\t\t\t\tbaseXAxisOptions[0],\r\n\t\t\t\t{\r\n\t\t\t\t\trange: range,\r\n\t\t\t\t\tmin: rangeMin\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t\trangeSelector.selected = i;\r\n\t\t} else { // existing axis object; after render time\r\n\t\t\tbaseAxis.setExtremes(\r\n\t\t\t\tnewMin,\r\n\t\t\t\tnewMax,\r\n\t\t\t\tpick(redraw, 1),\r\n\t\t\t\t0, \r\n\t\t\t\t{ \r\n\t\t\t\t\ttrigger: 'rangeSelectorButton',\r\n\t\t\t\t\trangeSelectorButton: rangeOptions\r\n\t\t\t\t}\r\n\t\t\t);\r\n\t\t\trangeSelector.selected = i;\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * The default buttons for pre-selecting time frames\r\n\t */\r\n\tdefaultButtons: [{\r\n\t\ttype: 'month',\r\n\t\tcount: 1,\r\n\t\ttext: '1m'\r\n\t}, {\r\n\t\ttype: 'month',\r\n\t\tcount: 3,\r\n\t\ttext: '3m'\r\n\t}, {\r\n\t\ttype: 'month',\r\n\t\tcount: 6,\r\n\t\ttext: '6m'\r\n\t}, {\r\n\t\ttype: 'ytd',\r\n\t\ttext: 'Auj'\r\n\t}, {\r\n\t\ttype: 'year',\r\n\t\tcount: 1,\r\n\t\ttext: '1an'\r\n\t}, {\r\n\t\ttype: 'all',\r\n\t\ttext: 'Tous'\r\n\t}],\r\n\r\n\t/**\r\n\t * Initialize the range selector\r\n\t */\r\n\tinit: function (chart) {\r\n\t\t\r\n\t\tvar rangeSelector = this,\r\n\t\t\toptions = chart.options.rangeSelector,\r\n\t\t\tbuttonOptions = options.buttons || [].concat(rangeSelector.defaultButtons),\r\n\t\t\tbuttons = rangeSelector.buttons = [],\r\n\t\t\tselectedOption = options.selected,\r\n\t\t\tblurInputs = rangeSelector.blurInputs = function () {\r\n\t\t\t\tvar minInput = rangeSelector.minInput,\r\n\t\t\t\t\tmaxInput = rangeSelector.maxInput;\r\n\t\t\t\tif (minInput) {\r\n\t\t\t\t\tminInput.blur();\r\n\t\t\t\t}\r\n\t\t\t\tif (maxInput) {\r\n\t\t\t\t\tmaxInput.blur();\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\trangeSelector.chart = chart;\r\n\t\t\r\n\t\tchart.extraTopMargin = 25;\r\n\t\trangeSelector.buttonOptions = buttonOptions;\r\n\r\n\t\taddEvent(chart.container, 'mousedown', blurInputs);\r\n\t\taddEvent(chart, 'resize', blurInputs);\r\n\r\n\t\t// Extend the buttonOptions with actual range\r\n\t\teach(buttonOptions, rangeSelector.computeButtonRange);\r\n\r\n\t\t// zoomed range based on a pre-selected button index\r\n\t\tif (selectedOption !== UNDEFINED && buttonOptions[selectedOption]) {\r\n\t\t\tthis.clickButton(selectedOption, buttonOptions[selectedOption], false);\r\n\t\t}\r\n\r\n\t\t// normalize the pressed button whenever a new range is selected\r\n\t\taddEvent(chart, 'load', function () {\r\n\t\t\taddEvent(chart.xAxis[0], 'afterSetExtremes', function () {\r\n\t\t\t\tif (chart.fixedRange !== mathRound(this.max - this.min)) {\r\n\t\t\t\t\tif (buttons[rangeSelector.selected] && !chart.renderer.forExport) {\r\n\t\t\t\t\t\tbuttons[rangeSelector.selected].setState(0);\r\n\t\t\t\t\t}\r\n\t\t\t\t\trangeSelector.selected = null;\r\n\t\t\t\t}\r\n\r\n\t\t\t\trangeSelector.updateButtonStates();\r\n\r\n\t\t\t});\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Dynamically update the range selector buttons after a new range has been set\r\n\t */\r\n\tupdateButtonStates: function () {\r\n\t\tvar rangeSelector = this,\r\n\t\t\tchart = this.chart,\r\n\t\t\tbaseAxis = chart.xAxis[0],\r\n\t\t\tunionExtremes = (chart.scroller && chart.scroller.getUnionExtremes()) || baseAxis,\r\n\t\t\tdataMin = unionExtremes.dataMin,\r\n\t\t\tdataMax = unionExtremes.dataMax,\r\n\t\t\tselected = rangeSelector.selected,\r\n\t\t\tbuttons = rangeSelector.buttons;\r\n\r\n\t\teach(rangeSelector.buttonOptions, function (rangeOptions, i) {\r\n\t\t\tvar range = rangeOptions._range,\r\n\t\t\t\t// Disable buttons where the range exceeds what is allowed in the current view\r\n\t\t\t\tisTooGreatRange = range > dataMax - dataMin,\r\n\t\t\t\t// Disable buttons where the range is smaller than the minimum range\r\n\t\t\t\tisTooSmallRange = range < baseAxis.minRange,\r\n\t\t\t\t// Disable the All button if we're already showing all \r\n\t\t\t\tisAllButAlreadyShowingAll = rangeOptions.type === 'all' && baseAxis.max - baseAxis.min >= dataMax - dataMin && \r\n\t\t\t\t\tbuttons[i].state !== 2,\r\n\t\t\t\t// Disable the YTD button if the complete range is within the same year\r\n\t\t\t\tisYTDButNotAvailable = rangeOptions.type === 'ytd' && dateFormat('%Y', dataMin) === dateFormat('%Y', dataMax);\r\n\r\n\t\t\t// The new zoom area happens to match the range for a button - mark it selected.\r\n\t\t\t// This happens when scrolling across an ordinal gap. It can be seen in the intraday\r\n\t\t\t// demos when selecting 1h and scroll across the night gap.\r\n\t\t\tif (range === mathRound(baseAxis.max - baseAxis.min) && i !== selected) {\r\n\t\t\t\trangeSelector.selected = i;\r\n\t\t\t\tbuttons[i].setState(2);\r\n\t\t\t\r\n\t\t\t} else if (isTooGreatRange || isTooSmallRange || isAllButAlreadyShowingAll || isYTDButNotAvailable) {\r\n\t\t\t\tbuttons[i].setState(3);\r\n\r\n\t\t\t} else if (buttons[i].state === 3) {\r\n\t\t\t\tbuttons[i].setState(0);\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/** \r\n\t * Compute and cache the range for an individual button\r\n\t */\r\n\tcomputeButtonRange: function (rangeOptions) {\r\n\t\tvar type = rangeOptions.type,\r\n\t\t\tcount = rangeOptions.count || 1,\r\n\r\n\t\t\t// these time intervals have a fixed number of milliseconds, as opposed\r\n\t\t\t// to month, ytd and year\r\n\t\t\tfixedTimes = {\r\n\t\t\t\tmillisecond: 1,\r\n\t\t\t\tsecond: 1000,\r\n\t\t\t\tminute: 60 * 1000,\r\n\t\t\t\thour: 3600 * 1000,\r\n\t\t\t\tday: 24 * 3600 * 1000,\r\n\t\t\t\tweek: 7 * 24 * 3600 * 1000\r\n\t\t\t};\r\n\t\t\r\n\t\t// Store the range on the button object\r\n\t\tif (fixedTimes[type]) {\r\n\t\t\trangeOptions._range = fixedTimes[type] * count;\t\t\t\t\r\n\t\t} else if (type === 'month' || type === 'year') {\r\n\t\t\trangeOptions._range = { month: 30, year: 365 }[type] * 24 * 36e5 * count;\r\n\t\t}\r\n\t},\r\n\t\r\n\t/**\r\n\t * Set the internal and displayed value of a HTML input for the dates\r\n\t * @param {String} name\r\n\t * @param {Number} time\r\n\t */\r\n\tsetInputValue: function (name, time) {\r\n\t\tvar options = this.chart.options.rangeSelector;\r\n\r\n\t\tif (defined(time)) {\r\n\t\t\tthis[name + 'Input'].HCTime = time;\r\n\t\t}\r\n\t\t\r\n\t\tthis[name + 'Input'].value = dateFormat(options.inputEditDateFormat || '%Y-%m-%d', this[name + 'Input'].HCTime);\r\n\t\tthis[name + 'DateBox'].attr({ text: dateFormat(options.inputDateFormat || '%b %e, %Y', this[name + 'Input'].HCTime) });\r\n\t},\r\n\r\n\t/**\r\n\t * Draw either the 'from' or the 'to' HTML input box of the range selector\r\n\t * @param {Object} name\r\n\t */\r\n\tdrawInput: function (name) {\r\n\t\tvar rangeSelector = this,\r\n\t\t\tchart = rangeSelector.chart,\r\n\t\t\tchartStyle = chart.options.chart.style,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\toptions = chart.options.rangeSelector,\r\n\t\t\tlang = defaultOptions.lang,\r\n\t\t\tdiv = rangeSelector.div,\r\n\t\t\tisMin = name === 'min',\r\n\t\t\tinput,\r\n\t\t\tlabel,\r\n\t\t\tdateBox,\r\n\t\t\tinputGroup = this.inputGroup;\r\n\r\n\t\t// Create the text label\r\n\t\tthis[name + 'Label'] = label = renderer.label(lang[isMin ? 'rangeSelectorFrom' : 'rangeSelectorTo'], this.inputGroup.offset)\r\n\t\t\t.attr({\r\n\t\t\t\tpadding: 1\r\n\t\t\t})\r\n\t\t\t.css(merge(chartStyle, options.labelStyle))\r\n\t\t\t.add(inputGroup);\r\n\t\tinputGroup.offset += label.width + 5;\r\n\t\t\r\n\t\t// Create an SVG label that shows updated date ranges and and records click events that \r\n\t\t// bring in the HTML input.\r\n\t\tthis[name + 'DateBox'] = dateBox = renderer.label('', inputGroup.offset)\r\n\t\t\t.attr({\r\n\t\t\t\tpadding: 1,\r\n\t\t\t\twidth: options.inputBoxWidth || 90,\r\n\t\t\t\theight: options.inputBoxHeight || 16,\r\n\t\t\t\tstroke: options.inputBoxBorderColor || 'silver',\r\n\t\t\t\t'stroke-width': 1\r\n\t\t\t})\r\n\t\t\t.css(merge({\r\n\t\t\t\ttextAlign: 'center'\r\n\t\t\t}, chartStyle, options.inputStyle))\r\n\t\t\t.on('click', function () {\r\n\t\t\t\trangeSelector[name + 'Input'].focus();\r\n\t\t\t})\r\n\t\t\t.add(inputGroup);\r\n\t\tinputGroup.offset += dateBox.width + (isMin ? 10 : 0);\r\n\t\t\r\n\r\n\t\t// Create the HTML input element. This is rendered as 1x1 pixel then set to the right size \r\n\t\t// when focused.\r\n\t\tthis[name + 'Input'] = input = createElement('input', {\r\n\t\t\tname: name,\r\n\t\t\tclassName: PREFIX + 'range-selector',\r\n\t\t\ttype: 'text'\r\n\t\t}, extend({\r\n\t\t\tposition: ABSOLUTE,\r\n\t\t\tborder: 0,\r\n\t\t\twidth: '1px', // Chrome needs a pixel to see it\r\n\t\t\theight: '1px',\r\n\t\t\tpadding: 0,\r\n\t\t\ttextAlign: 'center',\r\n\t\t\tfontSize: chartStyle.fontSize,\r\n\t\t\tfontFamily: chartStyle.fontFamily,\r\n\t\t\ttop: chart.plotTop + PX // prevent jump on focus in Firefox\r\n\t\t}, options.inputStyle), div);\r\n\r\n\t\t// Blow up the input box\r\n\t\tinput.onfocus = function () {\r\n\t\t\tcss(this, {\r\n\t\t\t\tleft: (inputGroup.translateX + dateBox.x) + PX,\r\n\t\t\t\ttop: inputGroup.translateY + PX,\r\n\t\t\t\twidth: (dateBox.width - 2) + PX,\r\n\t\t\t\theight: (dateBox.height - 2) + PX,\r\n\t\t\t\tborder: '2px solid silver'\r\n\t\t\t});\r\n\t\t};\r\n\t\t// Hide away the input box\r\n\t\tinput.onblur = function () {\r\n\t\t\tcss(this, {\r\n\t\t\t\tborder: 0,\r\n\t\t\t\twidth: '1px',\r\n\t\t\t\theight: '1px'\r\n\t\t\t});\r\n\t\t\trangeSelector.setInputValue(name);\r\n\t\t};\r\n\r\n\t\t// handle changes in the input boxes\r\n\t\tinput.onchange = function () {\r\n\t\t\tvar inputValue = input.value,\r\n\t\t\t\tvalue = (options.inputDateParser || Date.parse)(inputValue),\r\n\t\t\t\textremes = chart.xAxis[0].getExtremes();\r\n\r\n\t\t\t// If the value isn't parsed directly to a value by the browser's Date.parse method,\r\n\t\t\t// like YYYY-MM-DD in IE, try parsing it a different way\r\n\t\t\tif (isNaN(value)) {\r\n\t\t\t\tvalue = inputValue.split('-');\r\n\t\t\t\tvalue = Date.UTC(pInt(value[0]), pInt(value[1]) - 1, pInt(value[2]));\r\n\t\t\t}\r\n\r\n\t\t\tif (!isNaN(value)) {\r\n\r\n\t\t\t\t// Correct for timezone offset (#433)\r\n\t\t\t\tif (!defaultOptions.global.useUTC) {\r\n\t\t\t\t\tvalue = value + new Date().getTimezoneOffset() * 60 * 1000;\r\n\t\t\t\t}\r\n\r\n\t\t\t // Set the extremes\r\n\t\t\t\tif ((isMin && (value >= extremes.dataMin && value <= rangeSelector.maxInput.HCTime)) ||\r\n\t\t\t\t\t(!isMin && (value <= extremes.dataMax && value >= rangeSelector.minInput.HCTime))) {\r\n\t\t\t\t\tchart.xAxis[0].setExtremes(\r\n\t\t\t\t\t\tisMin ? value : extremes.min,\r\n\t\t\t\t\t\tisMin ? extremes.max : value,\r\n\t\t\t\t\t\tUNDEFINED,\r\n\t\t\t\t\t\tUNDEFINED,\r\n\t\t\t\t\t\t{ trigger: 'rangeSelectorInput' }\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Render the range selector including the buttons and the inputs. The first time render\r\n\t * is called, the elements are created and positioned. On subsequent calls, they are\r\n\t * moved and updated.\r\n\t * @param {Number} min X axis minimum\r\n\t * @param {Number} max X axis maximum\r\n\t */\r\n\trender: function (min, max) {\r\n\r\n\t\tvar rangeSelector = this,\r\n\t\t\tchart = rangeSelector.chart,\r\n\t\t\trenderer = chart.renderer,\r\n\t\t\tcontainer = chart.container,\r\n\t\t\tchartOptions = chart.options,\r\n\t\t\tnavButtonOptions = chartOptions.exporting && chartOptions.navigation && chartOptions.navigation.buttonOptions, \r\n\t\t\toptions = chartOptions.rangeSelector,\r\n\t\t\tbuttons = rangeSelector.buttons,\r\n\t\t\tlang = defaultOptions.lang,\r\n\t\t\tdiv = rangeSelector.div,\r\n\t\t\tinputGroup = rangeSelector.inputGroup,\r\n\t\t\tbuttonTheme = options.buttonTheme,\r\n\t\t\tinputEnabled = options.inputEnabled !== false,\r\n\t\t\tstates = buttonTheme && buttonTheme.states,\r\n\t\t\tplotLeft = chart.plotLeft,\r\n\t\t\tyAlign,\r\n\t\t\tbuttonLeft;\r\n\r\n\t\t// create the elements\r\n\t\tif (!rangeSelector.rendered) {\r\n\t\t\trangeSelector.zoomText = renderer.text(lang.rangeSelectorZoom, plotLeft, chart.plotTop - 10)\r\n\t\t\t\t.css(options.labelStyle)\r\n\t\t\t\t.add();\r\n\r\n\t\t\t// button starting position\r\n\t\t\tbuttonLeft = plotLeft + rangeSelector.zoomText.getBBox().width + 5;\r\n\r\n\t\t\teach(rangeSelector.buttonOptions, function (rangeOptions, i) {\r\n\t\t\t\tbuttons[i] = renderer.button(\r\n\t\t\t\t\t\trangeOptions.text,\r\n\t\t\t\t\t\tbuttonLeft,\r\n\t\t\t\t\t\tchart.plotTop - 25,\r\n\t\t\t\t\t\tfunction () {\r\n\t\t\t\t\t\t\trangeSelector.clickButton(i, rangeOptions);\r\n\t\t\t\t\t\t\trangeSelector.isActive = true;\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\tbuttonTheme,\r\n\t\t\t\t\t\tstates && states.hover,\r\n\t\t\t\t\t\tstates && states.select\r\n\t\t\t\t\t)\r\n\t\t\t\t\t.css({\r\n\t\t\t\t\t\ttextAlign: 'center'\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.add();\r\n\r\n\t\t\t\t// increase button position for the next button\r\n\t\t\t\tbuttonLeft += buttons[i].width + (options.buttonSpacing || 0);\r\n\r\n\t\t\t\tif (rangeSelector.selected === i) {\r\n\t\t\t\t\tbuttons[i].setState(2);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\trangeSelector.updateButtonStates();\r\n\r\n\t\t\t// first create a wrapper outside the container in order to make\r\n\t\t\t// the inputs work and make export correct\r\n\t\t\tif (inputEnabled) {\r\n\t\t\t\trangeSelector.div = div = createElement('div', null, {\r\n\t\t\t\t\tposition: 'relative',\r\n\t\t\t\t\theight: 0,\r\n\t\t\t\t\tzIndex: 1 // above container\r\n\t\t\t\t});\r\n\r\n\t\t\t\tcontainer.parentNode.insertBefore(div, container);\r\n\r\n\t\t\t\t// Create the group to keep the inputs\r\n\t\t\t\trangeSelector.inputGroup = inputGroup = renderer.g('input-group')\r\n\t\t\t\t\t.add();\r\n\t\t\t\tinputGroup.offset = 0;\r\n\r\n\t\t\t\trangeSelector.drawInput('min');\r\n\t\t\t\trangeSelector.drawInput('max');\t\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tif (inputEnabled) {\r\n\t\t\r\n\t\t\t// Update the alignment to the updated spacing box\r\n\t\t\tyAlign = chart.plotTop - 35;\t\t\r\n\t\t\tinputGroup.align(extend({\r\n\t\t\t\ty: yAlign,\r\n\t\t\t\twidth: inputGroup.offset,\r\n\t\t\t\t// detect collision with the exporting buttons\r\n\t\t\t\tx: navButtonOptions && (yAlign < (navButtonOptions.y || 0) + navButtonOptions.height - chart.spacing[0]) ? \r\n\t\t\t\t\t-40 : 0\r\n\t\t\t}, options.inputPosition), true, chart.spacingBox);\r\n\t\r\n\t\t\t// Set or reset the input values\r\n\t\t\trangeSelector.setInputValue('min', min);\r\n\t\t\trangeSelector.setInputValue('max', max);\r\n\t\t}\r\n\r\n\t\trangeSelector.rendered = true;\r\n\t},\r\n\r\n\t/**\r\n\t * Destroys allocated elements.\r\n\t */\r\n\tdestroy: function () {\r\n\t\tvar minInput = this.minInput,\r\n\t\t\tmaxInput = this.maxInput,\r\n\t\t\tchart = this.chart,\r\n\t\t\tblurInputs = this.blurInputs,\r\n\t\t\tkey;\r\n\r\n\t\tremoveEvent(chart.container, 'mousedown', blurInputs);\r\n\t\tremoveEvent(chart, 'resize', blurInputs);\r\n\r\n\t\t// Destroy elements in collections\r\n\t\tdestroyObjectProperties(this.buttons);\r\n\t\t\r\n\t\t// Clear input element events\r\n\t\tif (minInput) {\r\n\t\t\tminInput.onfocus = minInput.onblur = minInput.onchange = null;\r\n\t\t}\r\n\t\tif (maxInput) {\r\n\t\t\tmaxInput.onfocus = maxInput.onblur = maxInput.onchange = null;\r\n\t\t}\r\n\r\n\t\t// Destroy HTML and SVG elements\r\n\t\tfor (key in this) {\r\n\t\t\tif (this[key] && key !== 'chart') {\r\n\t\t\t\tif (this[key].destroy) { // SVGElement\r\n\t\t\t\t\tthis[key].destroy();\r\n\t\t\t\t} else if (this[key].nodeType) { // HTML element\r\n\t\t\t\t\tdiscardElement(this[key]);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis[key] = null;\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * Add logic to normalize the zoomed range in order to preserve the pressed state of range selector buttons\r\n */\r\nAxis.prototype.toFixedRange = function (pxMin, pxMax, fixedMin, fixedMax) {\r\n\tvar fixedRange = this.chart && this.chart.fixedRange,\r\n\t\tnewMin = pick(fixedMin, this.translate(pxMin, true)),\r\n\t\tnewMax = pick(fixedMax, this.translate(pxMax, true));\r\n\r\n\t// If the difference between the fixed range and the actual requested range is\r\n\t// too great, the user is dragging across an ordinal gap, and we need to release\r\n\t// the range selector button.\r\n\tif (fixedRange && (newMax - newMin) / fixedRange < 1.3) {\r\n\t\tif (fixedMax) {\r\n\t\t\tnewMin = newMax - fixedRange;\r\n\t\t} else {\r\n\t\t\tnewMax = newMin + fixedRange;\r\n\t\t}\r\n\t}\r\n\r\n\treturn {\r\n\t\tmin: newMin,\r\n\t\tmax: newMax\r\n\t};\r\n};\r\n\r\n// Initialize scroller for stock charts\r\nwrap(Chart.prototype, 'init', function (proceed, options, callback) {\r\n\t\r\n\taddEvent(this, 'init', function () {\r\n\t\tif (this.options.rangeSelector.enabled) {\r\n\t\t\tthis.rangeSelector = new RangeSelector(this);\r\n\t\t}\r\n\t});\r\n\r\n\tproceed.call(this, options, callback);\r\n\t\r\n});\r\n\r\n\r\nHighcharts.RangeSelector = RangeSelector;\r\n\r\n/* ****************************************************************************\r\n * End Range Selector code\t\t\t\t\t\t\t\t\t\t\t\t\t*\r\n *****************************************************************************/\r\n\r\n\r\n\r\nChart.prototype.callbacks.push(function (chart) {\r\n\tvar extremes,\r\n\t\tscroller = chart.scroller,\r\n\t\trangeSelector = chart.rangeSelector;\r\n\r\n\tfunction renderScroller() {\r\n\t\textremes = chart.xAxis[0].getExtremes();\r\n\t\tscroller.render(extremes.min, extremes.max);\r\n\t}\r\n\r\n\tfunction renderRangeSelector() {\r\n\t\textremes = chart.xAxis[0].getExtremes();\r\n\t\tif (!isNaN(extremes.min)) {\r\n\t\t\trangeSelector.render(extremes.min, extremes.max);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction afterSetExtremesHandlerScroller(e) {\r\n\t\tif (e.triggerOp !== 'navigator-drag') {\r\n\t\t\tscroller.render(e.min, e.max);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction afterSetExtremesHandlerRangeSelector(e) {\r\n\t\trangeSelector.render(e.min, e.max);\r\n\t}\r\n\r\n\tfunction destroyEvents() {\r\n\t\tif (scroller) {\r\n\t\t\tremoveEvent(chart.xAxis[0], 'afterSetExtremes', afterSetExtremesHandlerScroller);\r\n\t\t}\r\n\t\tif (rangeSelector) {\r\n\t\t\tremoveEvent(chart, 'resize', renderRangeSelector);\r\n\t\t\tremoveEvent(chart.xAxis[0], 'afterSetExtremes', afterSetExtremesHandlerRangeSelector);\r\n\t\t}\r\n\t}\r\n\r\n\t// initiate the scroller\r\n\tif (scroller) {\r\n\t\t// redraw the scroller on setExtremes\r\n\t\taddEvent(chart.xAxis[0], 'afterSetExtremes', afterSetExtremesHandlerScroller);\r\n\r\n\t\t// redraw the scroller on chart resize or box resize\r\n\t\twrap(chart, 'drawChartBox', function (proceed) {\r\n\t\t\tvar isDirtyBox = this.isDirtyBox;\r\n\t\t\tproceed.call(this);\r\n\t\t\tif (isDirtyBox) {\r\n\t\t\t\trenderScroller();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// do it now\r\n\t\trenderScroller();\r\n\t}\r\n\tif (rangeSelector) {\r\n\t\t// redraw the scroller on setExtremes\r\n\t\taddEvent(chart.xAxis[0], 'afterSetExtremes', afterSetExtremesHandlerRangeSelector);\r\n\r\n\t\t// redraw the scroller chart resize\r\n\t\taddEvent(chart, 'resize', renderRangeSelector);\r\n\r\n\t\t// do it now\r\n\t\trenderRangeSelector();\r\n\t}\r\n\r\n\t// Remove resize/afterSetExtremes at chart destroy\r\n\taddEvent(chart, 'destroy', destroyEvents);\r\n});\r\n/**\r\n * A wrapper for Chart with all the default values for a Stock chart\r\n */\r\nHighcharts.StockChart = function (options, callback) {\r\n\tvar seriesOptions = options.series, // to increase performance, don't merge the data \r\n\t\topposite,\r\n\r\n\t\t// Always disable startOnTick:true on the main axis when the navigator is enabled (#1090)\r\n\t\tnavigatorEnabled = pick(options.navigator && options.navigator.enabled, true),\r\n\t\tdisableStartOnTick = navigatorEnabled ? {\r\n\t\t\tstartOnTick: false,\r\n\t\t\tendOnTick: false\r\n\t\t} : null,\r\n\r\n\t\tlineOptions = {\r\n\r\n\t\t\tmarker: {\r\n\t\t\t\tenabled: false,\r\n\t\t\t\tstates: {\r\n\t\t\t\t\thover: {\r\n\t\t\t\t\t\tradius: 5\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t// gapSize: 0,\r\n\t\t\tstates: {\r\n\t\t\t\thover: {\r\n\t\t\t\t\tlineWidth: 2\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\tcolumnOptions = {\r\n\t\t\tshadow: false,\r\n\t\t\tborderWidth: 0\r\n\t\t};\r\n\r\n\t// apply X axis options to both single and multi y axes\r\n\toptions.xAxis = map(splat(options.xAxis || {}), function (xAxisOptions) {\r\n\t\treturn merge({ // defaults\r\n\t\t\t\tminPadding: 0,\r\n\t\t\t\tmaxPadding: 0,\r\n\t\t\t\tordinal: true,\r\n\t\t\t\ttitle: {\r\n\t\t\t\t\ttext: null\r\n\t\t\t\t},\r\n\t\t\t\tlabels: {\r\n\t\t\t\t\toverflow: 'justify'\r\n\t\t\t\t},\r\n\t\t\t\tshowLastLabel: true\r\n\t\t\t}, xAxisOptions, // user options \r\n\t\t\t{ // forced options\r\n\t\t\t\ttype: 'datetime',\r\n\t\t\t\tcategories: null\r\n\t\t\t},\r\n\t\t\tdisableStartOnTick\r\n\t\t);\r\n\t});\r\n\r\n\t// apply Y axis options to both single and multi y axes\r\n\toptions.yAxis = map(splat(options.yAxis || {}), function (yAxisOptions) {\r\n\t\topposite = yAxisOptions.opposite;\r\n\t\treturn merge({ // defaults\r\n\t\t\tlabels: {\r\n\t\t\t\talign: opposite ? 'right' : 'left',\r\n\t\t\t\tx: opposite ? -2 : 2,\r\n\t\t\t\ty: -2\r\n\t\t\t},\r\n\t\t\tshowLastLabel: false,\r\n\t\t\ttitle: {\r\n\t\t\t\ttext: null\r\n\t\t\t}\r\n\t\t}, yAxisOptions // user options\r\n\t\t);\r\n\t});\r\n\r\n\toptions.series = null;\r\n\r\n\toptions = merge({\r\n\t\tchart: {\r\n\t\t\tpanning: true,\r\n\t\t\tpinchType: 'x'\r\n\t\t},\r\n\t\tnavigator: {\r\n\t\t\tenabled: true\r\n\t\t},\r\n\t\tscrollbar: {\r\n\t\t\tenabled: true\r\n\t\t},\r\n\t\trangeSelector: {\r\n\t\t\tenabled: true\r\n\t\t},\r\n\t\ttitle: {\r\n\t\t\ttext: null\r\n\t\t},\r\n\t\ttooltip: {\r\n\t\t\tshared: true,\r\n\t\t\tcrosshairs: true\r\n\t\t},\r\n\t\tlegend: {\r\n\t\t\tenabled: false\r\n\t\t},\r\n\r\n\t\tplotOptions: {\r\n\t\t\tline: lineOptions,\r\n\t\t\tspline: lineOptions,\r\n\t\t\tarea: lineOptions,\r\n\t\t\tareaspline: lineOptions,\r\n\t\t\tarearange: lineOptions,\r\n\t\t\tareasplinerange: lineOptions,\r\n\t\t\tcolumn: columnOptions,\r\n\t\t\tcolumnrange: columnOptions,\r\n\t\t\tcandlestick: columnOptions,\r\n\t\t\tohlc: columnOptions\r\n\t\t}\r\n\r\n\t},\r\n\toptions, // user's options\r\n\r\n\t{ // forced options\r\n\t\t_stock: true, // internal flag\r\n\t\tchart: {\r\n\t\t\tinverted: false\r\n\t\t}\r\n\t});\r\n\r\n\toptions.series = seriesOptions;\r\n\r\n\r\n\treturn new Chart(options, callback);\r\n};\r\n\r\n// Implement the pinchType option\r\nwrap(Pointer.prototype, 'init', function (proceed, chart, options) {\r\n\r\n\tvar pinchType = options.chart.pinchType || '';\r\n\t\t\r\n\tproceed.call(this, chart, options);\r\n\r\n\t// Pinch status\r\n\tthis.pinchX = this.pinchHor = pinchType.indexOf('x') !== -1;\r\n\tthis.pinchY = this.pinchVert = pinchType.indexOf('y') !== -1;\r\n});\r\n\r\n\r\n/* ****************************************************************************\r\n * Start value compare logic *\r\n *****************************************************************************/\r\n \r\nvar seriesInit = seriesProto.init, \r\n\tseriesProcessData = seriesProto.processData,\r\n\tpointTooltipFormatter = Point.prototype.tooltipFormatter;\r\n\t\r\n/**\r\n * Extend series.init by adding a method to modify the y value used for plotting\r\n * on the y axis. This method is called both from the axis when finding dataMin\r\n * and dataMax, and from the series.translate method.\r\n */\r\nseriesProto.init = function () {\r\n\t\r\n\t// Call base method\r\n\tseriesInit.apply(this, arguments);\r\n\t\r\n\t// Set comparison mode\r\n\tthis.setCompare(this.options.compare);\r\n};\r\n\r\n/**\r\n * The setCompare method can be called also from the outside after render time\r\n */\r\nseriesProto.setCompare = function (compare) {\r\n\r\n\t// Set or unset the modifyValue method\r\n\tthis.modifyValue = (compare === 'value' || compare === 'percent') ? function (value, point) {\r\n\t\tvar compareValue = this.compareValue;\r\n\t\t\r\n\t\t// get the modified value\r\n\t\tvalue = compare === 'value' ? \r\n\t\t\tvalue - compareValue : // compare value\r\n\t\t\tvalue = 100 * (value / compareValue) - 100; // compare percent\r\n\t\t\t\r\n\t\t// record for tooltip etc.\r\n\t\tif (point) {\r\n\t\t\tpoint.change = value;\r\n\t\t}\r\n\t\t\r\n\t\treturn value;\r\n\t} : null;\r\n\r\n\t// Mark dirty\r\n\tif (this.chart.hasRendered) {\r\n\t\tthis.isDirty = true;\r\n\t}\r\n\r\n};\r\n\r\n/**\r\n * Extend series.processData by finding the first y value in the plot area,\r\n * used for comparing the following values \r\n */\r\nseriesProto.processData = function () {\r\n\tvar series = this,\r\n\t\ti = 0,\r\n\t\tprocessedXData,\r\n\t\tprocessedYData,\r\n\t\tlength;\r\n\t\r\n\t// call base method\r\n\tseriesProcessData.apply(this, arguments);\r\n\r\n\tif (series.xAxis && series.processedYData) { // not pies\r\n\t\t\r\n\t\t// local variables\r\n\t\tprocessedXData = series.processedXData;\r\n\t\tprocessedYData = series.processedYData;\r\n\t\tlength = processedYData.length;\r\n\t\t\r\n\t\t// find the first value for comparison\r\n\t\tfor (; i < length; i++) {\r\n\t\t\tif (typeof processedYData[i] === NUMBER && processedXData[i] >= series.xAxis.min) {\r\n\t\t\t\tseries.compareValue = processedYData[i];\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * Modify series extremes\r\n */\r\nwrap(seriesProto, 'getExtremes', function (proceed) {\r\n\tproceed.call(this);\r\n\r\n\tif (this.modifyValue) {\r\n\t\tthis.dataMax = this.modifyValue(this.dataMax);\r\n\t\tthis.dataMin = this.modifyValue(this.dataMin);\r\n\t}\t\t\r\n});\r\n\r\n/**\r\n * Add a utility method, setCompare, to the Y axis\r\n */\r\nAxis.prototype.setCompare = function (compare, redraw) {\r\n\tif (!this.isXAxis) {\r\n\t\teach(this.series, function (series) {\r\n\t\t\tseries.setCompare(compare);\r\n\t\t});\r\n\t\tif (pick(redraw, true)) {\r\n\t\t\tthis.chart.redraw();\r\n\t\t}\r\n\t}\r\n};\r\n\r\n/**\r\n * Extend the tooltip formatter by adding support for the point.change variable\r\n * as well as the changeDecimals option\r\n */\r\nPoint.prototype.tooltipFormatter = function (pointFormat) {\r\n\tvar point = this;\r\n\t\r\n\tpointFormat = pointFormat.replace(\r\n\t\t'{point.change}',\r\n\t\t(point.change > 0 ? '+' : '') + numberFormat(point.change, pick(point.series.tooltipOptions.changeDecimals, 2))\r\n\t); \r\n\t\r\n\treturn pointTooltipFormatter.apply(this, [pointFormat]);\r\n};\r\n\r\n/* ****************************************************************************\r\n * End value compare logic *\r\n *****************************************************************************/\r\n\r\n/* ****************************************************************************\r\n * Start ordinal axis logic *\r\n *****************************************************************************/\r\n\r\n(function () {\r\n\tvar baseInit = seriesProto.init,\r\n\t\tbaseGetSegments = seriesProto.getSegments;\r\n\t\t\r\n\tseriesProto.init = function () {\r\n\t\tvar series = this,\r\n\t\t\tchart,\r\n\t\t\txAxis;\r\n\t\t\r\n\t\t// call base method\r\n\t\tbaseInit.apply(series, arguments);\r\n\t\t\r\n\t\t// chart and xAxis are set in base init\r\n\t\tchart = series.chart;\r\n\t\txAxis = series.xAxis;\r\n\t\t\r\n\t\t// Destroy the extended ordinal index on updated data\r\n\t\tif (xAxis && xAxis.options.ordinal) {\r\n\t\t\taddEvent(series, 'updatedData', function () {\r\n\t\t\t\tdelete xAxis.ordinalIndex;\r\n\t\t\t});\r\n\t\t}\r\n\t\t\r\n\t\t/**\r\n\t\t * Extend the ordinal axis object. If we rewrite the axis object to a prototype model,\r\n\t\t * we should add these properties to the prototype instead.\r\n\t\t */\r\n\t\tif (xAxis && xAxis.options.ordinal && !xAxis.hasOrdinalExtension) {\r\n\t\t\t\t\r\n\t\t\txAxis.hasOrdinalExtension = true;\r\n\t\t\r\n\t\t\t/**\r\n\t\t\t * Calculate the ordinal positions before tick positions are calculated. \r\n\t\t\t * TODO: When we rewrite Axis to use a prototype model, this should be implemented\r\n\t\t\t * as a method extension to avoid overhead in the core.\r\n\t\t\t */\r\n\t\t\txAxis.beforeSetTickPositions = function () {\r\n\t\t\t\tvar axis = this,\r\n\t\t\t\t\tlen,\r\n\t\t\t\t\tordinalPositions = [],\r\n\t\t\t\t\tuseOrdinal = false,\r\n\t\t\t\t\tdist,\r\n\t\t\t\t\textremes = axis.getExtremes(),\r\n\t\t\t\t\tmin = extremes.min,\r\n\t\t\t\t\tmax = extremes.max,\r\n\t\t\t\t\tminIndex,\r\n\t\t\t\t\tmaxIndex,\r\n\t\t\t\t\tslope,\r\n\t\t\t\t\ti;\r\n\t\t\t\t\r\n\t\t\t\t// apply the ordinal logic\r\n\t\t\t\tif (axis.options.ordinal) {\r\n\t\t\t\t\t\r\n\t\t\t\t\teach(axis.series, function (series, i) {\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif (series.visible !== false && series.takeOrdinalPosition !== false) {\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// concatenate the processed X data into the existing positions, or the empty array \r\n\t\t\t\t\t\t\tordinalPositions = ordinalPositions.concat(series.processedXData);\r\n\t\t\t\t\t\t\tlen = ordinalPositions.length;\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// remove duplicates (#1588)\r\n\t\t\t\t\t\t\tordinalPositions.sort(function (a, b) {\r\n\t\t\t\t\t\t\t\treturn a - b; // without a custom function it is sorted as strings\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tif (len) {\r\n\t\t\t\t\t\t\t\ti = len - 1;\r\n\t\t\t\t\t\t\t\twhile (i--) {\r\n\t\t\t\t\t\t\t\t\tif (ordinalPositions[i] === ordinalPositions[i + 1]) {\r\n\t\t\t\t\t\t\t\t\t\tordinalPositions.splice(i, 1);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t});\r\n\t\t\t\t\t\r\n\t\t\t\t\t// cache the length\r\n\t\t\t\t\tlen = ordinalPositions.length;\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Check if we really need the overhead of mapping axis data against the ordinal positions.\r\n\t\t\t\t\t// If the series consist of evenly spaced data any way, we don't need any ordinal logic.\r\n\t\t\t\t\tif (len > 2) { // two points have equal distance by default\r\n\t\t\t\t\t\tdist = ordinalPositions[1] - ordinalPositions[0]; \r\n\t\t\t\t\t\ti = len - 1;\r\n\t\t\t\t\t\twhile (i-- && !useOrdinal) {\r\n\t\t\t\t\t\t\tif (ordinalPositions[i + 1] - ordinalPositions[i] !== dist) {\r\n\t\t\t\t\t\t\t\tuseOrdinal = true;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t// When zooming in on a week, prevent axis padding for weekends even though the data within\r\n\t\t\t\t\t\t// the week is evenly spaced.\r\n\t\t\t\t\t\tif (ordinalPositions[0] - min > dist || max - ordinalPositions[ordinalPositions.length - 1] > dist) {\r\n\t\t\t\t\t\t\tuseOrdinal = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Record the slope and offset to compute the linear values from the array index.\r\n\t\t\t\t\t// Since the ordinal positions may exceed the current range, get the start and \r\n\t\t\t\t\t// end positions within it (#719, #665b)\r\n\t\t\t\t\tif (useOrdinal) {\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// Register\r\n\t\t\t\t\t\taxis.ordinalPositions = ordinalPositions;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// This relies on the ordinalPositions being set. Use mathMax and mathMin to prevent\r\n\t\t\t\t\t\t// padding on either sides of the data.\r\n\t\t\t\t\t\tminIndex = xAxis.val2lin(mathMax(min, ordinalPositions[0]), true);\r\n\t\t\t\t\t\tmaxIndex = xAxis.val2lin(mathMin(max, ordinalPositions[ordinalPositions.length - 1]), true);\r\n\t\t\t\t\r\n\t\t\t\t\t\t// Set the slope and offset of the values compared to the indices in the ordinal positions\r\n\t\t\t\t\t\taxis.ordinalSlope = slope = (max - min) / (maxIndex - minIndex);\r\n\t\t\t\t\t\taxis.ordinalOffset = min - (minIndex * slope);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\taxis.ordinalPositions = axis.ordinalSlope = axis.ordinalOffset = UNDEFINED;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\t/**\r\n\t\t\t * Translate from a linear axis value to the corresponding ordinal axis position. If there\r\n\t\t\t * are no gaps in the ordinal axis this will be the same. The translated value is the value\r\n\t\t\t * that the point would have if the axis were linear, using the same min and max.\r\n\t\t\t * \r\n\t\t\t * @param Number val The axis value\r\n\t\t\t * @param Boolean toIndex Whether to return the index in the ordinalPositions or the new value\r\n\t\t\t */\r\n\t\t\txAxis.val2lin = function (val, toIndex) {\r\n\t\t\t\t\r\n\t\t\t\tvar axis = this,\r\n\t\t\t\t\tordinalPositions = axis.ordinalPositions;\r\n\t\t\t\t\r\n\t\t\t\tif (!ordinalPositions) {\r\n\t\t\t\t\treturn val;\r\n\t\t\t\t\r\n\t\t\t\t} else {\r\n\t\t\t\t\r\n\t\t\t\t\tvar ordinalLength = ordinalPositions.length,\r\n\t\t\t\t\t\ti,\r\n\t\t\t\t\t\tdistance,\r\n\t\t\t\t\t\tordinalIndex;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t// first look for an exact match in the ordinalpositions array\r\n\t\t\t\t\ti = ordinalLength;\r\n\t\t\t\t\twhile (i--) {\r\n\t\t\t\t\t\tif (ordinalPositions[i] === val) {\r\n\t\t\t\t\t\t\tordinalIndex = i;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t// if that failed, find the intermediate position between the two nearest values\r\n\t\t\t\t\ti = ordinalLength - 1;\r\n\t\t\t\t\twhile (i--) {\r\n\t\t\t\t\t\tif (val > ordinalPositions[i] || i === 0) { // interpolate\r\n\t\t\t\t\t\t\tdistance = (val - ordinalPositions[i]) / (ordinalPositions[i + 1] - ordinalPositions[i]); // something between 0 and 1\r\n\t\t\t\t\t\t\tordinalIndex = i + distance;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn toIndex ?\r\n\t\t\t\t\t\tordinalIndex :\r\n\t\t\t\t\t\taxis.ordinalSlope * (ordinalIndex || 0) + axis.ordinalOffset;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\t/**\r\n\t\t\t * Translate from linear (internal) to axis value\r\n\t\t\t * \r\n\t\t\t * @param Number val The linear abstracted value\r\n\t\t\t * @param Boolean fromIndex Translate from an index in the ordinal positions rather than a value\r\n\t\t\t */\r\n\t\t\txAxis.lin2val = function (val, fromIndex) {\r\n\t\t\t\tvar axis = this,\r\n\t\t\t\t\tordinalPositions = axis.ordinalPositions;\r\n\t\t\t\t\r\n\t\t\t\tif (!ordinalPositions) { // the visible range contains only equally spaced values\r\n\t\t\t\t\treturn val;\r\n\t\t\t\t\r\n\t\t\t\t} else {\r\n\t\t\t\t\r\n\t\t\t\t\tvar ordinalSlope = axis.ordinalSlope,\r\n\t\t\t\t\t\tordinalOffset = axis.ordinalOffset,\r\n\t\t\t\t\t\ti = ordinalPositions.length - 1,\r\n\t\t\t\t\t\tlinearEquivalentLeft,\r\n\t\t\t\t\t\tlinearEquivalentRight,\r\n\t\t\t\t\t\tdistance;\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Handle the case where we translate from the index directly, used only \r\n\t\t\t\t\t// when panning an ordinal axis\r\n\t\t\t\t\tif (fromIndex) {\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif (val < 0) { // out of range, in effect panning to the left\r\n\t\t\t\t\t\t\tval = ordinalPositions[0];\r\n\t\t\t\t\t\t} else if (val > i) { // out of range, panning to the right\r\n\t\t\t\t\t\t\tval = ordinalPositions[i];\r\n\t\t\t\t\t\t} else { // split it up\r\n\t\t\t\t\t\t\ti = mathFloor(val);\r\n\t\t\t\t\t\t\tdistance = val - i; // the decimal\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t// Loop down along the ordinal positions. When the linear equivalent of i matches\r\n\t\t\t\t\t// an ordinal position, interpolate between the left and right values.\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\twhile (i--) {\r\n\t\t\t\t\t\t\tlinearEquivalentLeft = (ordinalSlope * i) + ordinalOffset;\r\n\t\t\t\t\t\t\tif (val >= linearEquivalentLeft) {\r\n\t\t\t\t\t\t\t\tlinearEquivalentRight = (ordinalSlope * (i + 1)) + ordinalOffset;\r\n\t\t\t\t\t\t\t\tdistance = (val - linearEquivalentLeft) / (linearEquivalentRight - linearEquivalentLeft); // something between 0 and 1\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t// If the index is within the range of the ordinal positions, return the associated\r\n\t\t\t\t\t// or interpolated value. If not, just return the value\r\n\t\t\t\t\treturn distance !== UNDEFINED && ordinalPositions[i] !== UNDEFINED ?\r\n\t\t\t\t\t\tordinalPositions[i] + (distance ? distance * (ordinalPositions[i + 1] - ordinalPositions[i]) : 0) : \r\n\t\t\t\t\t\tval;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\t/**\r\n\t\t\t * Get the ordinal positions for the entire data set. This is necessary in chart panning\r\n\t\t\t * because we need to find out what points or data groups are available outside the \r\n\t\t\t * visible range. When a panning operation starts, if an index for the given grouping\r\n\t\t\t * does not exists, it is created and cached. This index is deleted on updated data, so\r\n\t\t\t * it will be regenerated the next time a panning operation starts.\r\n\t\t\t */\r\n\t\t\txAxis.getExtendedPositions = function () {\r\n\t\t\t\tvar grouping = xAxis.series[0].currentDataGrouping,\r\n\t\t\t\t\tordinalIndex = xAxis.ordinalIndex,\r\n\t\t\t\t\tkey = grouping ? grouping.count + grouping.unitName : 'raw',\r\n\t\t\t\t\textremes = xAxis.getExtremes(),\r\n\t\t\t\t\tfakeAxis,\r\n\t\t\t\t\tfakeSeries;\r\n\t\t\t\t\t\r\n\t\t\t\t// If this is the first time, or the ordinal index is deleted by updatedData,\r\n\t\t\t\t// create it.\r\n\t\t\t\tif (!ordinalIndex) {\r\n\t\t\t\t\tordinalIndex = xAxis.ordinalIndex = {};\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\tif (!ordinalIndex[key]) {\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Create a fake axis object where the extended ordinal positions are emulated\r\n\t\t\t\t\tfakeAxis = {\r\n\t\t\t\t\t\tseries: [],\r\n\t\t\t\t\t\tgetExtremes: function () {\r\n\t\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\t\tmin: extremes.dataMin,\r\n\t\t\t\t\t\t\t\tmax: extremes.dataMax\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\toptions: {\r\n\t\t\t\t\t\t\tordinal: true\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Add the fake series to hold the full data, then apply processData to it\r\n\t\t\t\t\teach(xAxis.series, function (series) {\r\n\t\t\t\t\t\tfakeSeries = {\r\n\t\t\t\t\t\t\txAxis: fakeAxis,\r\n\t\t\t\t\t\t\txData: series.xData,\r\n\t\t\t\t\t\t\tchart: chart,\r\n\t\t\t\t\t\t\tdestroyGroupedData: noop\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\tfakeSeries.options = {\r\n\t\t\t\t\t\t\tdataGrouping : grouping ? {\r\n\t\t\t\t\t\t\t\tenabled: true,\r\n\t\t\t\t\t\t\t\tforced: true,\r\n\t\t\t\t\t\t\t\tapproximation: 'open', // doesn't matter which, use the fastest\r\n\t\t\t\t\t\t\t\tunits: [[grouping.unitName, [grouping.count]]]\r\n\t\t\t\t\t\t\t} : {\r\n\t\t\t\t\t\t\t\tenabled: false\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t\tseries.processData.apply(fakeSeries);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tfakeAxis.series.push(fakeSeries);\r\n\t\t\t\t\t});\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Run beforeSetTickPositions to compute the ordinalPositions\r\n\t\t\t\t\txAxis.beforeSetTickPositions.apply(fakeAxis);\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Cache it\r\n\t\t\t\t\tordinalIndex[key] = fakeAxis.ordinalPositions;\r\n\t\t\t\t}\r\n\t\t\t\treturn ordinalIndex[key];\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\t/**\r\n\t\t\t * Find the factor to estimate how wide the plot area would have been if ordinal\r\n\t\t\t * gaps were included. This value is used to compute an imagined plot width in order\r\n\t\t\t * to establish the data grouping interval. \r\n\t\t\t * \r\n\t\t\t * A real world case is the intraday-candlestick\r\n\t\t\t * example. Without this logic, it would show the correct data grouping when viewing\r\n\t\t\t * a range within each day, but once moving the range to include the gap between two\r\n\t\t\t * days, the interval would include the cut-away night hours and the data grouping\r\n\t\t\t * would be wrong. So the below method tries to compensate by identifying the most\r\n\t\t\t * common point interval, in this case days. \r\n\t\t\t * \r\n\t\t\t * An opposite case is presented in issue #718. We have a long array of daily data,\r\n\t\t\t * then one point is appended one hour after the last point. We expect the data grouping\r\n\t\t\t * not to change.\r\n\t\t\t * \r\n\t\t\t * In the future, if we find cases where this estimation doesn't work optimally, we\r\n\t\t\t * might need to add a second pass to the data grouping logic, where we do another run\r\n\t\t\t * with a greater interval if the number of data groups is more than a certain fraction\r\n\t\t\t * of the desired group count.\r\n\t\t\t */\r\n\t\t\txAxis.getGroupIntervalFactor = function (xMin, xMax, processedXData) {\r\n\t\t\t\tvar i = 0,\r\n\t\t\t\t\tlen = processedXData.length, \r\n\t\t\t\t\tdistances = [],\r\n\t\t\t\t\tmedian;\r\n\t\t\t\t\t\r\n\t\t\t\t// Register all the distances in an array\r\n\t\t\t\tfor (; i < len - 1; i++) {\r\n\t\t\t\t\tdistances[i] = processedXData[i + 1] - processedXData[i];\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// Sort them and find the median\r\n\t\t\t\tdistances.sort(function (a, b) {\r\n\t\t\t\t\treturn a - b;\r\n\t\t\t\t});\r\n\t\t\t\tmedian = distances[mathFloor(len / 2)];\r\n\t\t\t\t\r\n\t\t\t\t// Compensate for series that don't extend through the entire axis extent. #1675.\r\n\t\t\t\txMin = mathMax(xMin, processedXData[0]);\r\n\t\t\t\txMax = mathMin(xMax, processedXData[len - 1]);\r\n\r\n\t\t\t\t// Return the factor needed for data grouping\r\n\t\t\t\treturn (len * median) / (xMax - xMin);\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\t/**\r\n\t\t\t * Make the tick intervals closer because the ordinal gaps make the ticks spread out or cluster\r\n\t\t\t */\r\n\t\t\txAxis.postProcessTickInterval = function (tickInterval) {\r\n\t\t\t\t// TODO: http://jsfiddle.net/highcharts/FQm4E/1/\r\n\t\t\t\t// This is a case where this algorithm doesn't work optimally. In this case, the \r\n\t\t\t\t// tick labels are spread out per week, but all the gaps reside within weeks. So \r\n\t\t\t\t// we have a situation where the labels are courser than the ordinal gaps, and \r\n\t\t\t\t// thus the tick interval should not be altered\t\t\t\t\r\n\t\t\t\tvar ordinalSlope = this.ordinalSlope;\r\n\t\t\t\t\r\n\t\t\t\treturn ordinalSlope ? \r\n\t\t\t\t\ttickInterval / (ordinalSlope / xAxis.closestPointRange) : \r\n\t\t\t\t\ttickInterval;\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\t/**\r\n\t\t\t * In an ordinal axis, there might be areas with dense consentrations of points, then large\r\n\t\t\t * gaps between some. Creating equally distributed ticks over this entire range\r\n\t\t\t * may lead to a huge number of ticks that will later be removed. So instead, break the \r\n\t\t\t * positions up in segments, find the tick positions for each segment then concatenize them.\r\n\t\t\t * This method is used from both data grouping logic and X axis tick position logic. \r\n\t\t\t */\r\n\t\t\txAxis.getNonLinearTimeTicks = function (normalizedInterval, min, max, startOfWeek, positions, closestDistance, findHigherRanks) {\r\n\t\t\t\t\r\n\t\t\t\tvar start = 0,\r\n\t\t\t\t\tend = 0,\r\n\t\t\t\t\tsegmentPositions,\r\n\t\t\t\t\thigherRanks = {},\r\n\t\t\t\t\thasCrossedHigherRank,\r\n\t\t\t\t\tinfo,\r\n\t\t\t\t\tposLength,\r\n\t\t\t\t\toutsideMax,\r\n\t\t\t\t\tgroupPositions = [],\r\n\t\t\t\t\tlastGroupPosition = -Number.MAX_VALUE,\r\n\t\t\t\t\ttickPixelIntervalOption = xAxis.options.tickPixelInterval;\r\n\t\t\t\t\t\r\n\t\t\t\t// The positions are not always defined, for example for ordinal positions when data\r\n\t\t\t\t// has regular interval (#1557, #2090)\r\n\t\t\t\tif (!positions || positions.length < 3 || min === UNDEFINED) {\r\n\t\t\t\t\treturn getTimeTicks(normalizedInterval, min, max, startOfWeek);\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// Analyze the positions array to split it into segments on gaps larger than 5 times\r\n\t\t\t\t// the closest distance. The closest distance is already found at this point, so \r\n\t\t\t\t// we reuse that instead of computing it again.\r\n\t\t\t\tposLength = positions.length;\r\n\t\t\t\tfor (; end < posLength; end++) {\r\n\t\t\t\t\t\r\n\t\t\t\t\toutsideMax = end && positions[end - 1] > max;\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (positions[end] < min) { // Set the last position before min\r\n\t\t\t\t\t\tstart = end;\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (end === posLength - 1 || positions[end + 1] - positions[end] > closestDistance * 5 || outsideMax) {\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// For each segment, calculate the tick positions from the getTimeTicks utility\r\n\t\t\t\t\t\t// function. The interval will be the same regardless of how long the segment is.\r\n\t\t\t\t\t\tif (positions[end] > lastGroupPosition) { // #1475\r\n\t\t\t\t\t\t\tsegmentPositions = getTimeTicks(normalizedInterval, positions[start], positions[end], startOfWeek);\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// Prevent duplicate groups, for example for multiple segments within one larger time frame (#1475)\r\n\t\t\t\t\t\t\twhile (segmentPositions.length && segmentPositions[0] <= lastGroupPosition) {\r\n\t\t\t\t\t\t\t\tsegmentPositions.shift();\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (segmentPositions.length) {\r\n\t\t\t\t\t\t\t\tlastGroupPosition = segmentPositions[segmentPositions.length - 1];\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tgroupPositions = groupPositions.concat(segmentPositions);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t// Set start of next segment\r\n\t\t\t\t\t\tstart = end + 1;\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (outsideMax) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// Get the grouping info from the last of the segments. The info is the same for\r\n\t\t\t\t// all segments.\r\n\t\t\t\tinfo = segmentPositions.info;\r\n\t\t\t\t\r\n\t\t\t\t// Optionally identify ticks with higher rank, for example when the ticks\r\n\t\t\t\t// have crossed midnight.\r\n\t\t\t\tif (findHigherRanks && info.unitRange <= timeUnits[HOUR]) {\r\n\t\t\t\t\tend = groupPositions.length - 1;\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Compare points two by two\r\n\t\t\t\t\tfor (start = 1; start < end; start++) {\r\n\t\t\t\t\t\tif (new Date(groupPositions[start])[getDate]() !== new Date(groupPositions[start - 1])[getDate]()) {\r\n\t\t\t\t\t\t\thigherRanks[groupPositions[start]] = DAY;\r\n\t\t\t\t\t\t\thasCrossedHigherRank = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t// If the complete array has crossed midnight, we want to mark the first\r\n\t\t\t\t\t// positions also as higher rank\r\n\t\t\t\t\tif (hasCrossedHigherRank) {\r\n\t\t\t\t\t\thigherRanks[groupPositions[0]] = DAY;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tinfo.higherRanks = higherRanks;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// Save the info\r\n\t\t\t\tgroupPositions.info = info;\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t// Don't show ticks within a gap in the ordinal axis, where the space between\r\n\t\t\t\t// two points is greater than a portion of the tick pixel interval\r\n\t\t\t\tif (findHigherRanks && defined(tickPixelIntervalOption)) { // check for squashed ticks\r\n\t\t\t\t\t\r\n\t\t\t\t\tvar length = groupPositions.length,\r\n\t\t\t\t\t\ti = length,\r\n\t\t\t\t\t\titemToRemove,\r\n\t\t\t\t\t\ttranslated,\r\n\t\t\t\t\t\ttranslatedArr = [],\r\n\t\t\t\t\t\tlastTranslated,\r\n\t\t\t\t\t\tmedianDistance,\r\n\t\t\t\t\t\tdistance,\r\n\t\t\t\t\t\tdistances = [];\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t// Find median pixel distance in order to keep a reasonably even distance between\r\n\t\t\t\t\t// ticks (#748)\r\n\t\t\t\t\twhile (i--) {\r\n\t\t\t\t\t\ttranslated = xAxis.translate(groupPositions[i]);\r\n\t\t\t\t\t\tif (lastTranslated) {\r\n\t\t\t\t\t\t\tdistances[i] = lastTranslated - translated;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\ttranslatedArr[i] = lastTranslated = translated; \r\n\t\t\t\t\t}\r\n\t\t\t\t\tdistances.sort();\r\n\t\t\t\t\tmedianDistance = distances[mathFloor(distances.length / 2)];\r\n\t\t\t\t\tif (medianDistance < tickPixelIntervalOption * 0.6) {\r\n\t\t\t\t\t\tmedianDistance = null;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t\r\n\t\t\t\t\t// Now loop over again and remove ticks where needed\r\n\t\t\t\t\ti = groupPositions[length - 1] > max ? length - 1 : length; // #817\r\n\t\t\t\t\tlastTranslated = undefined;\r\n\t\t\t\t\twhile (i--) {\r\n\t\t\t\t\t\ttranslated = translatedArr[i];\r\n\t\t\t\t\t\tdistance = lastTranslated - translated;\r\n\t\r\n\t\t\t\t\t\t// Remove ticks that are closer than 0.6 times the pixel interval from the one to the right,\r\n\t\t\t\t\t\t// but not if it is close to the median distance (#748).\r\n\t\t\t\t\t\tif (lastTranslated && distance < tickPixelIntervalOption * 0.8 && \r\n\t\t\t\t\t\t\t\t(medianDistance === null || distance < medianDistance * 0.8)) {\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t// Is this a higher ranked position with a normal position to the right?\r\n\t\t\t\t\t\t\tif (higherRanks[groupPositions[i]] && !higherRanks[groupPositions[i + 1]]) {\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t// Yes: remove the lower ranked neighbour to the right\r\n\t\t\t\t\t\t\t\titemToRemove = i + 1;\r\n\t\t\t\t\t\t\t\tlastTranslated = translated; // #709\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t// No: remove this one\r\n\t\t\t\t\t\t\t\titemToRemove = i;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tgroupPositions.splice(itemToRemove, 1);\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tlastTranslated = translated;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn groupPositions;\r\n\t\t\t};\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t/**\r\n\t\t\t * Overrride the chart.pan method for ordinal axes. \r\n\t\t\t */\r\n\t\t\t\r\n\t\t\tvar baseChartPan = chart.pan;\r\n\t\t\tchart.pan = function (e) {\r\n\t\t\t\tvar xAxis = chart.xAxis[0],\r\n\t\t\t\t\tchartX = e.chartX,\r\n\t\t\t\t\trunBase = false;\r\n\t\t\t\tif (xAxis.options.ordinal && xAxis.series.length) {\r\n\t\t\t\t\t\r\n\t\t\t\t\tvar mouseDownX = chart.mouseDownX,\r\n\t\t\t\t\t\textremes = xAxis.getExtremes(),\r\n\t\t\t\t\t\tdataMax = extremes.dataMax,\r\n\t\t\t\t\t\tmin = extremes.min,\r\n\t\t\t\t\t\tmax = extremes.max,\r\n\t\t\t\t\t\ttrimmedRange,\r\n\t\t\t\t\t\thoverPoints = chart.hoverPoints,\r\n\t\t\t\t\t\tclosestPointRange = xAxis.closestPointRange,\r\n\t\t\t\t\t\tpointPixelWidth = xAxis.translationSlope * (xAxis.ordinalSlope || closestPointRange),\r\n\t\t\t\t\t\tmovedUnits = (mouseDownX - chartX) / pointPixelWidth, // how many ordinal units did we move?\r\n\t\t\t\t\t\textendedAxis = { ordinalPositions: xAxis.getExtendedPositions() }, // get index of all the chart's points\r\n\t\t\t\t\t\tordinalPositions,\r\n\t\t\t\t\t\tsearchAxisLeft,\r\n\t\t\t\t\t\tlin2val = xAxis.lin2val,\r\n\t\t\t\t\t\tval2lin = xAxis.val2lin,\r\n\t\t\t\t\t\tsearchAxisRight;\r\n\t\t\t\t\t\r\n\t\t\t\t\tif (!extendedAxis.ordinalPositions) { // we have an ordinal axis, but the data is equally spaced\r\n\t\t\t\t\t\trunBase = true;\r\n\t\t\t\t\t\r\n\t\t\t\t\t} else if (mathAbs(movedUnits) > 1) {\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// Remove active points for shared tooltip\r\n\t\t\t\t\t\tif (hoverPoints) {\r\n\t\t\t\t\t\t\teach(hoverPoints, function (point) {\r\n\t\t\t\t\t\t\t\tpoint.setState();\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tif (movedUnits < 0) {\r\n\t\t\t\t\t\t\tsearchAxisLeft = extendedAxis;\r\n\t\t\t\t\t\t\tsearchAxisRight = xAxis.ordinalPositions ? xAxis : extendedAxis;\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tsearchAxisLeft = xAxis.ordinalPositions ? xAxis : extendedAxis;\r\n\t\t\t\t\t\t\tsearchAxisRight = extendedAxis;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// In grouped data series, the last ordinal position represents the grouped data, which is \r\n\t\t\t\t\t\t// to the left of the real data max. If we don't compensate for this, we will be allowed\r\n\t\t\t\t\t\t// to pan grouped data series passed the right of the plot area. \r\n\t\t\t\t\t\tordinalPositions = searchAxisRight.ordinalPositions;\r\n\t\t\t\t\t\tif (dataMax > ordinalPositions[ordinalPositions.length - 1]) {\r\n\t\t\t\t\t\t\tordinalPositions.push(dataMax);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// Get the new min and max values by getting the ordinal index for the current extreme, \r\n\t\t\t\t\t\t// then add the moved units and translate back to values. This happens on the \r\n\t\t\t\t\t\t// extended ordinal positions if the new position is out of range, else it happens\r\n\t\t\t\t\t\t// on the current x axis which is smaller and faster.\r\n\t\t\t\t\t\ttrimmedRange = xAxis.toFixedRange(null, null, \r\n\t\t\t\t\t\t\tlin2val.apply(searchAxisLeft, [\r\n\t\t\t\t\t\t\t\tval2lin.apply(searchAxisLeft, [min, true]) + movedUnits, // the new index \r\n\t\t\t\t\t\t\t\ttrue // translate from index\r\n\t\t\t\t\t\t\t]),\r\n\t\t\t\t\t\t\tlin2val.apply(searchAxisRight, [\r\n\t\t\t\t\t\t\t\tval2lin.apply(searchAxisRight, [max, true]) + movedUnits, // the new index \r\n\t\t\t\t\t\t\t\ttrue // translate from index\r\n\t\t\t\t\t\t\t])\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t// Apply it if it is within the available data range\r\n\t\t\t\t\t\tif (trimmedRange.min >= mathMin(extremes.dataMin, min) && trimmedRange.max <= mathMax(dataMax, max)) {\r\n\t\t\t\t\t\t\txAxis.setExtremes(trimmedRange.min, trimmedRange.max, true, false, { trigger: 'pan' });\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\t\tchart.mouseDownX = chartX; // set new reference for next run\r\n\t\t\t\t\t\tcss(chart.container, { cursor: 'move' });\r\n\t\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t} else {\r\n\t\t\t\t\trunBase = true;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// revert to the linear chart.pan version\r\n\t\t\t\tif (runBase) {\r\n\t\t\t\t\tbaseChartPan.apply(chart, arguments);\r\n\t\t\t\t}\r\n\t\t\t}; \r\n\t\t}\r\n\t};\r\n\t\t\t\r\n\t/**\r\n\t * Extend getSegments by identifying gaps in the ordinal data so that we can draw a gap in the \r\n\t * line or area\r\n\t */\r\n\tseriesProto.getSegments = function () {\r\n\t\t\r\n\t\tvar series = this,\r\n\t\t\tsegments,\r\n\t\t\tgapSize = series.options.gapSize,\r\n\t\t\txAxis = series.xAxis;\r\n\t\r\n\t\t// call base method\r\n\t\tbaseGetSegments.apply(series);\r\n\t\t\t\r\n\t\tif (xAxis.options.ordinal && gapSize) { // #1794\r\n\t\t\r\n\t\t\t// properties\r\n\t\t\tsegments = series.segments;\r\n\t\t\t\r\n\t\t\t// extension for ordinal breaks\r\n\t\t\teach(segments, function (segment, no) {\r\n\t\t\t\tvar i = segment.length - 1;\r\n\t\t\t\twhile (i--) {\r\n\t\t\t\t\tif (segment[i + 1].x - segment[i].x > xAxis.closestPointRange * gapSize) {\r\n\t\t\t\t\t\tsegments.splice( // insert after this one\r\n\t\t\t\t\t\t\tno + 1,\r\n\t\t\t\t\t\t\t0,\r\n\t\t\t\t\t\t\tsegment.splice(i + 1, segment.length - i)\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n}());\r\n\r\n/* ****************************************************************************\r\n * End ordinal axis logic *\r\n *****************************************************************************/\r\n// global variables\r\nextend(Highcharts, {\r\n\t\r\n\t// Constructors\r\n\tAxis: Axis,\r\n\tChart: Chart,\r\n\tColor: Color,\r\n\tLegend: Legend,\r\n\tPointer: Pointer,\r\n\tPoint: Point,\r\n\tTick: Tick,\r\n\tTooltip: Tooltip,\r\n\tRenderer: Renderer,\r\n\tSeries: Series,\r\n\tSVGElement: SVGElement,\r\n\tSVGRenderer: SVGRenderer,\r\n\t\r\n\t// Various\r\n\tarrayMin: arrayMin,\r\n\tarrayMax: arrayMax,\r\n\tcharts: charts,\r\n\tdateFormat: dateFormat,\r\n\tformat: format,\r\n\tpathAnim: pathAnim,\r\n\tgetOptions: getOptions,\r\n\thasBidiBug: hasBidiBug,\r\n\tisTouchDevice: isTouchDevice,\r\n\tnumberFormat: numberFormat,\r\n\tseriesTypes: seriesTypes,\r\n\tsetOptions: setOptions,\r\n\taddEvent: addEvent,\r\n\tremoveEvent: removeEvent,\r\n\tcreateElement: createElement,\r\n\tdiscardElement: discardElement,\r\n\tcss: css,\r\n\teach: each,\r\n\textend: extend,\r\n\tmap: map,\r\n\tmerge: merge,\r\n\tpick: pick,\r\n\tsplat: splat,\r\n\textendClass: extendClass,\r\n\tpInt: pInt,\r\n\twrap: wrap,\r\n\tsvg: hasSVG,\r\n\tcanvas: useCanVG,\r\n\tvml: !hasSVG && !useCanVG,\r\n\tproduct: PRODUCT,\r\n\tversion: VERSION\r\n});\r\n}());\r\n","/*\r\n* Directive d'Autocompletion\r\n*\t2 parametres sont nécéssaire :\r\n*\t- confirmMessage : text du boutton de confirmation\r\n*\t- cancelMessage : text du bouton d'annulation\r\n*\r\n*/\r\n\r\nAgrimarketDirectives.directive('autoComplete', function ($timeout) {\r\n\treturn function(scope, iElement, iAttrs) {\r\n\t\tiElement.autocomplete({\r\n\t\t\tsource: scope[iAttrs.uiItems],\r\n\t\t\tmessages: {\r\n\t\t\t\tnoResults: '',\r\n\t\t\t\tresults: function() {\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tselect: function(event, ui) {\r\n\t\t\t\tscope[iAttrs.uiTarget] = ui.item.item;\r\n\t\t\t\tiElement.trigger('submit');\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n});","/*\r\n* Directive d'ouverture de pop up de confirmation\r\n*\t2 parametres sont nécéssaire :\r\n*\t- confirmMessage : text du boutton de confirmation\r\n*\t- cancelMessage : text du bouton d'annulation\r\n*\r\n* 2 fonctions sont nécéssaires:\r\n* -callFunctionName: ouvre la modal\r\n* -confirmFunction: fonction a lancer apres la confirmation\r\n*/\r\n\r\nAgrimarketDirectives.directive('popupconfirm', function ($timeout) {\r\n\tvar globParam;\r\n\treturn function (scope, iElement, iAttrs) {\r\n\r\n\t\tscope[iAttrs.popupConfirm] = function () {\r\n\t\t\tiElement.unbind('dialogclose');\r\n\t\t iElement.dialog(\"close\");\r\n\t\t\tscope[iAttrs.confirmFunction](globParam);\r\n\t\t};\r\n\r\n\t\tscope[iAttrs.popupCancel] = function () {\r\n\t\t\tiElement.unbind('dialogclose');\r\n\t\t\tiElement.dialog(\"close\");\r\n\t\t\tif (iAttrs.confirmCancelFunction !== undefined && iAttrs.confirmCancelFunction !== null) {\r\n\t\t\t\tscope[iAttrs.confirmCancelFunction](globParam);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t};\r\n\r\n\t\tscope[iAttrs.callFunctionName] = function (param) {\r\n\t\t\tglobParam = param;\r\n\t\t\t\r\n\t\t\tvar viewportHeight = window.innerHeight - 20;\r\n\t\t\t\r\n\t\t\tiElement.bind('dialogclose', function (event) {\r\n\t\t\t\tif (iAttrs.confirmCancelFunction !== undefined && iAttrs.confirmCancelFunction !== null) {\r\n\t\t\t\t\tscope[iAttrs.confirmCancelFunction](globParam);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t\r\n\t\t\tiElement.dialog({\r\n\t\t\t\tresizable: false,\r\n\t\t\t\tmodal: true\r\n\t\t\t\t\r\n\t\t\t});\r\n\r\n\t\t\tif (iAttrs.popupWidth !== undefined && iAttrs.popupWidth) {\r\n\t\t\t\tiElement.dialog({width : (scope[iAttrs.popupWidth] !== undefined ? scope[iAttrs.popupWidth] : iAttrs.popupWidth)});\r\n\t\t\t}\r\n\t\t if (iAttrs.popupTitle) {\r\n\t\t \tiElement.dialog({\r\n\t\t \t\ttitle: (scope[iAttrs.popupTitle] !== undefined ? scope[iAttrs.popupTitle] : iAttrs.popupTitle)\r\n\t\t \t});\r\n\t\t }\r\n\t\t else {\r\n\t\t iElement.dialog({\r\n\t\t resizable: false,\r\n\t\t modal: true\r\n\t\t });\r\n\t\t }\r\n\r\n\t\t\tif (iAttrs.popupHeight !== undefined && iAttrs.popupHeight) {\r\n\t\t if (viewportHeight > 500)\r\n\t\t\t\t\tiElement.dialog({height: scope[iAttrs.popupHeight] !== undefined ? scope[iAttrs.popupHeight] <= viewportHeight? scope[iAttrs.popupHeight]: viewportHeight : !isNaN(iAttrs.popupHeight) ? iAttrs.popupHeight : \"auto\"});\r\n\t\t\t}\r\n\r\n\t\t};\r\n\t\tscope.$on('$destroy', function () {\r\n\t\t if (iElement.is(':ui-dialog')) {\r\n\t\t iElement.dialog('destroy').remove();\r\n\t\t }\r\n\t\t});\r\n\r\n\t};\r\n});","/*\r\n* Directive d'ouverture de pop up contenant un formulaire\r\n* 3 fonctions sont nécéssaires:\r\n* -popupsubmitOpen: ouvre la modal\r\n* -popupsubmitCheck: vérifie les champs du formulaire\r\n* -popupsubmitSave: enregistre la saisie de l'utilisateur si les champs du formulaire sont valides\r\n* Le return s'occupe d'intégrer le bouton de submit qui se trouve dans une vue partielle\r\n* Ceci est fait dans le but de ne pas fermer la modal au clic du bouton submit, si au moins un des champs n'est pas valide\r\n*/\r\n\r\nAgrimarketDirectives.directive('popupSubmit', function () {\r\n\treturn {\r\n\t\tlink: function (scope, element, attrs) {\r\n\r\n\t\t\tscope[attrs.popupSubmit] = function () {\r\n\t\t\t\tif (attrs.popupsubmitCheck && !scope[attrs.popupsubmitCheck]()) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar promise = scope[attrs.popupsubmitSave]();\r\n\t\t\t\t\tif (promise !== undefined && promise !== null)\r\n\t\t\t\t\t\tpromise.done(function (close) {\r\n\t\t\t\t\t\t\tif (close)\r\n\t\t\t\t\t\t\t\telement.dialog(\"close\");\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\telement.dialog(\"close\");\r\n\t\t\t\t}\r\n\r\n\t\t\t};\r\n\r\n\t\t\tscope[attrs.popupCancel] = function () {\r\n\t\t\t\telement.unbind('dialogclose');\r\n\t\t\t\telement.dialog(\"close\");\r\n\t\t\t\tif (attrs.confirmCancelFunction !== undefined && attrs.confirmCancelFunction !== null) {\r\n\t\t\t\t\tscope[attrs.confirmCancelFunction]();\r\n\t\t\t\t}\r\n\r\n\t\t\t};\r\n\r\n\t\t\tscope[attrs.popupsubmitOpen] = function () {\r\n\t\t\t\telement.dialog({\r\n\t\t\t\t\tresizable: false,\r\n\t\t\t\t\tmodal: true,\r\n\t\t\t\t\ttitle: (scope[attrs.popupTitle] !== undefined ? scope[attrs.popupTitle] : attrs.popupTitle),\r\n\t\t\t\t\twidth: attrs.popupsubmitWidth,\r\n\t\t\t\t});\r\n\t\t\t};\r\n\r\n\t\t\tscope.$on('$destroy', function () {\r\n\t\t\t if (element.is(':ui-dialog')) {\r\n\t\t\t element.dialog('destroy').remove();\r\n\t\t\t }\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n});","/*\r\n* Directive de datetimepicker\r\n*\r\n*/\r\n\r\nAgrimarketDirectives.directive('datepicker', function ($parse) {\r\n\treturn function (scope, iElement, iAttrs) {\r\n\t\t//if (!Modernizr.inputtypes.date) {\r\n\t iElement.attr('type', 'text');\r\n\t\t\tiElement.datepicker(\r\n\t\t\t{\r\n\t\t\t firstDay: 1,\r\n\t\t\t\tdayNamesMin: [\"Di\", \"Lu\", \"Ma\", \"Me\", \"Je\", \"Ve\", \"Sa\"],\r\n\t\t\t\tmonthNames: [\"Janvier\", \"Février\", \"Mars\", \"Avril\", \"Mai\", \"Juin\", \"Juillet\", \"Août\", \"Septembre\", \"Octobre\", \"Novembre\", \"Décembre\"],\r\n\t\t\t\tdateFormat: iAttrs.datepickerOffer === \"true\" ? 'yy-mm-dd' : 'dd/mm/yy',\r\n\t\t\t\tminDate: iAttrs.datepickerMinDate,\r\n\t\t\t\tmaxDate: iAttrs.datepickerMaxDate,\r\n\t\t\t\tonSelect: function (date) {\r\n\t\t\t\t var getter = $parse(iAttrs.datepickerTarget);\r\n\t\t\t\t\tvar setter = getter.assign; //get value\r\n\t\t\t\t\tsetter(scope, date); //set value\r\n\t\t\t\t\t//if (iAttrs.datepickerOnselected !== undefined && iAttrs.datepickerOnselected !== null) {\r\n\t\t\t\t\t//\tscope[iAttrs.datepickerOnselected]();\r\n\t\t\t\t\t//}\r\n\t\t\t\t\tscope.$apply();\r\n\t\t\t\t},\r\n\t\t\t\tonClose: function (dateText, inst) {\r\n\t\t\t\t\tiElement.datepicker(\"disable\");\r\n\t\t\t\t\tsetTimeout(function () {\r\n\t\t\t\t\t\tiElement.datepicker(\"enable\");\r\n\t\t\t\t\t}, 500);\r\n\t\t\t\t},\r\n\t\t\t\tnextText: 'Suiv', prevText: 'Préc'\r\n\t\t\t});\r\n\t\t//}\r\n\t\t\r\n\t};\r\n});","/*\r\n* Directive de datetimepicker\r\n*\r\n*/\r\n\r\nAgrimarketDirectives.directive('timepicker', function ($parse) {\r\n\treturn function (scope, element, attrs) {\r\n\t\t//if (!Modernizr.inputtypes.time) {\r\n\t\t\t\telement.attr('type', 'text');\r\n\t\t\tscope.$watch('$viewContentLoaded', function () {\r\n\r\n\t\t\t\t$(function () {\r\n\t\t\t\t\telement.timepicker({\r\n\t\t\t\t\t\tminuteText: 'Minute',\r\n\t\t\t\t\t\tsecondText: 'Seconde',\r\n\t\t\t\t\t\thourText: 'Heure',\r\n\t\t\t\t\t\ttimeSeparator: ':',\r\n\t\t\t\t\t\tdefaultTime: '00:00:00',\r\n\t\t\t\t\t\tstepMinute: 1,\r\n\t\t\t\t\t\tstepSecond: 1,\r\n\t\t\t\t\t\tshowHour: attrs.timepickerHour === \"true\" ? true : false,\r\n\t\t\t\t\t\tshowMinute: attrs.timepickerMin === \"true\" ? true : false,\r\n\t\t\t\t\t\tshowSecond: attrs.timepickerSec === \"true\" ? true : false,\r\n\t\t\t\t\t\ttimeText: 'Time',\r\n\t\t\t\t\t\ttimeFormat: attrs.timepickerFormat,\r\n\t\t\t\t\t\ttimeOnlyTitle: attrs.timepickerHour === \"true\" ? 'Sélectionnez un horaire' : 'Sélectionnez un Délai',\r\n\t\t\t\t\t\tonSelect: function (time) {\r\n\t\t\t\t\t\t\tvar getter = $parse(attrs.timepickerTarget);\r\n\t\t\t\t\t\t\tvar setter = getter.assign; //get value\r\n\t\t\t\t\t\t\tsetter(scope, time); //set value\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t});\r\n\r\n\r\n\t\t\t});\r\n\t\t//} \r\n\r\n\t\tif (element.val() === \"\") {\r\n\t\t\telement.val(\"00:00:00\");\r\n\t\t}\r\n\t};\r\n});\r\n","\r\nAgrimarketDirectives.directive('translate', function () {\r\n\treturn {\r\n\t\tlink: function(scope, element, attrs) {\r\n\r\n\t\t\tscope[attrs.displayBloc] = function () {\r\n\t\t\t\telement.animate({ 'left': 0 }, 300, \"easeInOutQuart\");\r\n\t\t\t};\r\n\r\n\t\t\tscope[attrs.hideBloc] = function () {\r\n\t\t\t\tvar widthContainer = element.outerWidth(true);\r\n\r\n\t\t\t\telement.animate({ 'left': widthContainer }, 200, \"easeInOutQuart\", function () { $(this).css('left', -widthContainer); });\r\n\t\t\t};\r\n\t\t}\r\n\t};\r\n});","AgrimarketDirectives.directive('tooltipAutoSize', function () {\r\n return function ($scope, elem, iAttrs) {\r\n\r\n // Ajouter le paramètre tooltip-auto-size-disable-watch=\"true\" si la page est chargé d'un coup (pas d'appel ajax), car l'ajout des watchs sur le ng-repeat ralenti beaucoup l'affichage de la page\r\n if (!iAttrs.tooltipAutoSizeDisableWatch || iAttrs.tooltipAutoSizeDisableWatch !== 'true') {\r\n $scope.$watch('ngRepeat', function () {\r\n $('.actions .actions_list').hide().css({ 'right': 0 });\r\n });\r\n }\r\n\r\n var $tooltip;\r\n\r\n // Initialisation variable + fonction pour choper la position du curseur à l'entrée de la souris\r\n var cursorPosition = 0;\r\n var _listener = function (event) {\r\n cursorPosition = event.clientY;\r\n };\r\n\r\n elem.hover(function () {\r\n $tooltip = this.querySelector('ul.actions_list');\r\n\r\n if ($tooltip) {\r\n $tooltip.style.display = 'block';\r\n\r\n // Ajout d'un listener pour choper la position\r\n document.addEventListener(\"mousemove\", _listener(event), true);\r\n\r\n // Calcul de la position du curseur par rapport au bouton positionCurseur - positionDeL'element - 25 pour remonter au milieu.\r\n var positionInDiv = cursorPosition - this.getBoundingClientRect().top - 25;\r\n\r\n var scrollTop = window.scrollY ? window.scrollY : 0;\r\n var elemPos = getOffset(this).top - scrollTop;\r\n var elemWidth = this.offsetWidth;\r\n var elemHeight = this.offsetHeight;\r\n var tooltipHeight = $tooltip.offsetHeight;\r\n var ratio = window.innerHeight - elemPos;\r\n\r\n var offsetop = getOffset(this).top;\r\n var windowHeight = window.innerHeight;\r\n var result = windowHeight - (offsetop - window.pageYOffset);\r\n\r\n if (result < tooltipHeight) {\r\n $tooltip.style.top = (-tooltipHeight + elemHeight) + 'px';\r\n $tooltip.style.right = elemWidth + 'px';\r\n } else { // utilisation de al position du curseur dans la div si la div est assez grande\r\n $tooltip.style.top = this.offsetHeight > 150 && positionInDiv > 0 ? positionInDiv + 'px' : 0;\r\n $tooltip.style.right = elemWidth + 'px';\r\n }\r\n }\r\n }, function () {\r\n $tooltip = this.querySelector('ul.actions_list');\r\n\r\n if ($tooltip) { // Suppression du listener\r\n document.removeEventListener(\"click\", _listener, true);\r\n $tooltip.style.display = 'none';\r\n }\r\n });\r\n\r\n function getOffset(el) {\r\n var _x = 0;\r\n var _y = 0;\r\n\r\n while (el && !isNaN(el.offsetLeft) && !isNaN(el.offsetTop)) {\r\n _x += el.offsetLeft - el.scrollLeft;\r\n _y += el.offsetTop - el.scrollTop;\r\n el = el.offsetParent;\r\n }\r\n return { top: _y, left: _x };\r\n }\r\n };\r\n});","/* Directive permettant de trier des tables\r\n* 1 paramétres sont nécessaires : \r\n* - le nom de la colonne de trie\r\n - l'index du predicate et du renverse utilisé (pour gérer le cas de plusieurs tables dans une même page)\r\n* exemple d'utilisation : <table>...<th sort-me ng-click='change(nom de la colonne)'...... | orderBy:predicate[index]:renverse[index]\r\n*/\r\n\r\nAgrimarketDirectives.directive('sortTable', function () {\r\n\treturn {\r\n\t\trestrict: 'AE',\r\n\t\tcontroller: function($scope) {\r\n\r\n\t\t\t$scope.predicate = [];\r\n\t\t\t$scope.renverse = [];\r\n\t\t\t$scope.notSorted = [];\r\n\t\t\t$scope.topSorted = [];\r\n\t\t\t$scope.bottomSorted = [];\r\n\r\n\t\t\t$scope.indexActive = 0;\r\n\r\n\r\n\t\t\t$scope.change = function(column, i) {\r\n\t\t\t\t$scope.notSorted[i] = false;\r\n\r\n\t\t\t\t$scope.indexActive = i;\r\n\t\t\t\tif ($scope.predicate[i] === undefined || $scope.predicate[i] === null) {\r\n\t\t\t\t\t$scope.predicate[i] = column;\r\n\t\t\t\t\t$scope.renverse[i] = false;\r\n\t\t\t\t\t$scope.topSorted[i] = false;\r\n\t\t\t\t\t$scope.bottomSorted[i] = true;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ($scope.predicate[i] == column) {\r\n\t\t\t\t\t$scope.renverse[i] = !$scope.renverse[i];\r\n\t\t\t\t\t$scope.topSorted[i] = !$scope.topSorted[i];\r\n\t\t\t\t\t$scope.bottomSorted[i] = !$scope.bottomSorted[i];\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$scope.predicate[i] = column;\r\n\t\t\t\t\t$scope.renverse[i] = false;\r\n\t\t\t\t\t$scope.topSorted[i] = false;\r\n\t\t\t\t\t$scope.bottomSorted[i] = true;\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t}\r\n\t};\r\n\r\n});\r\n","//Directive permettant d'éxucter une fonction lorsqu'on appuie sur Entrer\r\n\r\nAgrimarketDirectives.directive('ngEnter', function ($timeout) {\r\n\r\n\treturn function (scope, element, attrs) {\r\n\t\telement.bind(\"keydown keypress\", function (event) {\r\n\t\t\tif(event.which === 13) {\r\n\t\t\t\tscope.$apply(function (){\r\n\t\t\t\t\tscope.$eval(attrs.ngEnter);\r\n\t\t\t\t});\r\n \r\n\t\t\t\tevent.preventDefault();\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n});","/*\r\n* Directive d'ouverture de pop up de confirmation\r\n*\t2 parametres sont nécéssaire :\r\n*\t- confirmMessage : text du boutton de confirmation\r\n*\t- cancelMessage : text du bouton d'annulation\r\n*\r\n* 2 fonctions sont nécéssaires:\r\n* -callFunctionName: ouvre la modal\r\n* -confirmFunction: fonction a lancer apres la confirmation\r\n*/\r\n\r\nAgrimarketDirectives.directive('listtoselected', function () {\r\n\tvar globParam;\r\n\treturn function (scope, iElement, iAttrs) {\r\n\r\n\t\tscope[iAttrs.popupConfirm] = function() {\r\n\t\t\tiElement.dialog(\"close\");\r\n\t\t\tscope[iAttrs.confirmFunction](globParam);\r\n\t\t};\r\n\r\n\t\tscope[iAttrs.popupCancel] = function() {\r\n\t\t\tiElement.dialog(\"close\");\r\n\t\t\tif (iAttrs.confirmCancelFunction !== undefined && iAttrs.confirmCancelFunction !== null) {\r\n\t\t\t\tscope[iAttrs.confirmCancelFunction](globParam);\r\n\t\t\t}\r\n\t\t\t\r\n\t\t};\r\n\r\n\t\tscope[iAttrs.callFunctionName] = function (param) {\r\n\t\t globParam = param;\r\n\t\t if (iAttrs.popupTitle) {\r\n\t\t iElement.dialog({\r\n\t\t resizable: false,\r\n\t\t modal: true,\r\n\t\t title: scope[iAttrs.popupTitle]\r\n\t\t });\r\n\t\t }\r\n\t\t else {\r\n\t\t iElement.dialog({\r\n\t\t resizable: false,\r\n\t\t modal: true,\r\n\t\t });\r\n\t\t }\r\n\t\t};\t\t\r\n\t};\r\n});","/**\r\n * Checklist-model\r\n * AngularJS directive for list of checkboxes\r\n * http://vitalets.github.io/checklist-model/\r\n */\r\n\r\nAgrimarketDirectives.directive('checklistModel', ['$parse', '$compile', function($parse, $compile) {\r\n // contains\r\n function contains(arr, item) {\r\n if (angular.isArray(arr)) {\r\n for (var i = 0; i < arr.length; i++) {\r\n if (angular.equals(arr[i], item)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n // add\r\n function add(arr, item) {\r\n arr = angular.isArray(arr) ? arr : [];\r\n for (var i = 0; i < arr.length; i++) {\r\n if (angular.equals(arr[i], item)) {\r\n return arr;\r\n }\r\n } \r\n arr.push(item);\r\n return arr;\r\n } \r\n\r\n // remove\r\n function remove(arr, item) {\r\n if (angular.isArray(arr)) {\r\n for (var i = 0; i < arr.length; i++) {\r\n if (angular.equals(arr[i], item)) {\r\n arr.splice(i, 1);\r\n break;\r\n }\r\n }\r\n }\r\n return arr;\r\n }\r\n\r\n // http://stackoverflow.com/a/19228302/1458162\r\n function postLinkFn(scope, elem, attrs) {\r\n // compile with `ng-model` pointing to `checked`\r\n $compile(elem)(scope);\r\n\r\n // getter / setter for original model\r\n var getter = $parse(attrs.checklistModel);\r\n var setter = getter.assign;\r\n\r\n // value added to list\r\n var value = $parse(attrs.checklistValue)(scope.$parent);\r\n\r\n // watch UI checked change\r\n scope.$watch('checked', function(newValue, oldValue) {\r\n if (newValue === oldValue) { \r\n return;\r\n } \r\n var current = getter(scope.$parent);\r\n if (newValue === true) {\r\n setter(scope.$parent, add(current, value));\r\n } else {\r\n setter(scope.$parent, remove(current, value));\r\n }\r\n });\r\n\r\n // watch original model change\r\n scope.$parent.$watch(attrs.checklistModel, function(newArr, oldArr) {\r\n scope.checked = contains(newArr, value);\r\n }, true);\r\n }\r\n\r\n return {\r\n restrict: 'A',\r\n priority: 1000,\r\n terminal: true,\r\n scope: true,\r\n compile: function(tElement, tAttrs) {\r\n if (tElement[0].tagName !== 'INPUT' || !tElement.attr('type', 'checkbox')) {\r\n throw 'checklist-model should be applied to `input[type=\"checkbox\"]`.';\r\n }\r\n\r\n if (!tAttrs.checklistValue) {\r\n throw 'You should provide `checklist-value`.';\r\n }\r\n\r\n // exclude recursion\r\n tElement.removeAttr('checklist-model');\r\n \r\n // local scope var storing individual checkbox model\r\n tElement.attr('ng-model', 'checked');\r\n\r\n return postLinkFn;\r\n }\r\n };\r\n}]);","AgrimarketControllers.controller('loginController', [\r\n '$scope', \"$route\", '$rootScope', '$http', '$location', \"currentUserFactory\", 'configurationFactory', '$timeout', '$filter', 'dateService', 'parametersService',\r\n 'parametersFactory', 'modulesFactory', 'authenticationService', 'enumFactory', 'userService', '$routeParams',\r\n 'editableObjectsFactory', '$templateCache', '$window', 'routeService', '$sce',\r\n function ($scope, $route, $rootScope, $http, $location, currentUserFactory, configurationFactory, $timeout, $filter, dateService, parametersService,\r\n parametersFactory, moduleFactory, authenticationService, enumFactory, userService, $routeParams, editableObjectsFactory,\r\n $templateCache, $window, routeService, $sce) {\r\n\r\n if (($rootScope.AuthorizedBackdoor !== true || $rootScope.AuthorizedBackdoor === undefined) && ($location.$$path === \"/backdoor/\" || $location.$$path === \"/backdoor/profile\") && !sessionStorage.getItem(\"LOG_AVIV\"))\r\n $location.path(\"/backdoor\");\r\n else\r\n $rootScope.currentPath = \"/\";\r\n\r\n if ($location.protocol().indexOf(\"https\") !== -1) {\r\n for (var url in configurationFactory.Url) {\r\n configurationFactory.Url[url] = configurationFactory.Url[url].replace(\"http:\", \"https:\");\r\n }\r\n }\r\n\r\n if ($routeParams.showMenu) { \r\n sessionStorage.setItem(\"showMenu\", $routeParams.showMenu);\r\n }\r\n\r\n $scope.titleBloc = \"Connexion\";\r\n $scope.displayLoginBloc = true;\r\n $scope.displaySelectExploitationBloc = false;\r\n $rootScope.currentUserRole = '';\r\n currentUserFactory.User = null;\r\n $rootScope.isLogged = false;\r\n $rootScope.loading = false;\r\n $rootScope.showMenuCotation = false;\r\n $rootScope.editableMenus = [];\r\n $rootScope.menuAndPageContentVms = [];\r\n $scope.sendMailErrorMessage = \"\";\r\n $scope.loginErrorMessage = \"\";\r\n $rootScope.selectedClientFromTc = undefined;\r\n $rootScope.selectedClientFromTcForSubscribe = undefined;\r\n $scope.modeEdition = false;\r\n $rootScope.resetPasswordData = {};\r\n $scope.user = {};\r\n $scope.user.Login = $routeParams.login ? $routeParams.login : $scope.user.Login;\r\n $scope.user.Password = $routeParams.password ? $routeParams.password : $scope.user.Password;\r\n $rootScope.showMenu = sessionStorage.getItem(\"showMenu\") ? sessionStorage.getItem(\"showMenu\") == \"1\" : true;\r\n\r\n $scope.editableObjectConnected = 'Se connecter';\r\n $scope.editableObjectPassword = 'Mot de passe';\r\n $scope.editableObjectForgetPassword = 'Mot de passe oublié ?';\r\n $scope.editableObjectPasswordOrLoginForget = 'Veuillez renseigner un login/mot de passe';\r\n $scope.editableObjectSendButton = 'Envoyer';\r\n $scope.editableObjectBackButton = 'Retour'; \r\n\r\n /*** Gestion de la connexion par le connecteur UAC ***/\r\n $scope.loginTiers = $routeParams.loginTiers;\r\n $scope.jeton = $routeParams.jeton;\r\n $scope.adresseIpSlc = $routeParams.AdresseIpSlc;\r\n $scope.redirect = $routeParams.redirect;\r\n $rootScope.fromConnectorOrUAC = $routeParams.loginTiers && $routeParams.jeton && $routeParams.AdresseIpSlc;\r\n\r\n /*** Gestion du connecteur par hashCode ***/\r\n $scope.paramForLoginHash = $routeParams.paramForLoginHash;\r\n $scope.hashForLoginHash = $routeParams.hashForLoginHash;\r\n $scope.idLanguage = $routeParams.idLanguage;\r\n\r\n /*** Gestion de la connexion par le connecteur désinscription newsletter informations de marché ***/\r\n $scope.param = $routeParams.param;\r\n $scope.hash = $routeParams.hash;\r\n\r\n /*** Gestion de la connexion par le connecteur SSO ***/\r\n $scope.token = $routeParams.token;\r\n $scope.param = $routeParams.param;\r\n\r\n /*** Gestion de la connexion par le connecteur Url referrer ***/\r\n $scope.paramConnectorUrlReferrer = $routeParams.paramConnectorUrlReferrer;\r\n $scope.hideMenu = $routeParams.hideMenu;\r\n\r\n /*** Gestion de la visibilité du menu et de la redirection pour les connecteurs SSO et par hashcode ***/\r\n if (!$routeParams.redirect)\r\n $scope.redirect = $routeParams.page;\r\n\r\n /*** Gestion du skin de la page login en fonction de l'URL ***/\r\n $rootScope.skin = configurationFactory.Skin;\r\n if (configurationFactory.Skin.skinMultiple) {\r\n var skin = $filter('filter')(configurationFactory.Skin.skinMultiple, { urlLogin: window.location.href }, true)[0];\r\n if (skin)\r\n $rootScope.skin = skin;\r\n }\r\n\r\n /*** Initialisation des listes des profils de la Backdoor ***/\r\n if (sessionStorage.getItem(\"LOG_AVIV\")) {\r\n $scope.useTableConnections = $rootScope.allConnections != null;\r\n if ($rootScope.allUsers)\r\n $scope.userlst_selection = $rootScope.allUsers[0];\r\n if ($rootScope.allConnections)\r\n $scope.connectionlst_selection = $rootScope.allConnections[0];\r\n if ($rootScope.allTc)\r\n $scope.tclst_selection = $rootScope.allTc[0];\r\n if ($rootScope.allAdmin)\r\n $scope.adminlst_selection = $rootScope.allAdmin[0];\r\n if (sessionStorage.getItem(\"UsersActived\"))\r\n $scope.nbUserActif = sessionStorage.getItem(\"UsersActived\");\r\n }\r\n\r\n function setRootScopeUserSelected(user) {\r\n $rootScope.userSelected = user;\r\n }\r\n\r\n function manageMenu() {\r\n $(\".replaceDiv\").each(function () {\r\n $(this).replaceWith($(this).children());\r\n });\r\n\r\n //if ($rootScope.skin.css === 'basic-h' || $rootScope.skin.css === 'walagri' || $rootScope.skin.css === \"agri-activ\") {\r\n // menu('horizontal');\r\n //} else {\r\n // menu('vertical');\r\n //}\r\n\r\n if ($rootScope.skin.type === 1) {\r\n menu('vertical');\r\n } else if ($rootScope.skin.type === 2) {\r\n menu('horizontal');\r\n } else if ($rootScope.skin.type === 3) {\r\n menu('updated');\r\n }\r\n\r\n userMenu('.personnal', '.personnal_nav');\r\n userMenu('.edition', '.edition_nav');\r\n\r\n if (parametersFactory.Parameters.bDeployMenuWhenLogged.Value === \"1\")\r\n $('#primary_nav').find('.deploy').click(); // On simule le click du deploiment du menu afin de recalculer les widths etc \r\n }\r\n\r\n function redirectFromLogin() {\r\n $rootScope.crop = { IdCrop: parseInt(parametersFactory.Parameters.DefaultCrop.Value) };\r\n $timeout(manageMenu, 0);\r\n $rootScope.loading = false;\r\n $rootScope.isLogged = true;\r\n\r\n if ($scope.redirect) { // accès pour connecteur UAC ou SSO\r\n routeService.locationByParam($scope.redirect);\r\n return;\r\n }\r\n \r\n if ($rootScope.CurrentUserRole === \"User\" && sessionStorage.getItem(\"currentPath\") && sessionStorage.getItem(\"currentPath\").indexOf(\"/user/subscribe/\") !== -1)\r\n $location.path(\"/user/offers/view/1\");\r\n else if ($rootScope.CurrentUserRole !== \"TC\" && sessionStorage.getItem(\"currentPath\") && sessionStorage.getItem(\"currentPath\") !== \"/backdoor/profile\" && sessionStorage.getItem(\"currentPath\") !== \"/backdoor/\" && sessionStorage.getItem(\"currentPath\") !== \"/refresh/\") {\r\n $rootScope.currentPath = $location.$$path;\r\n $location.path(sessionStorage.getItem(\"currentPath\"));\r\n } else {\r\n var firstMenu = $filter('filter')($rootScope.editableMenus, { Enabled: true, Visible: true }, true)[0];\r\n if (!firstMenu) {\r\n $rootScope.isLogged = false;\r\n $scope.loginErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_Login_NotAccessMenu.Content;\r\n }\r\n else if (firstMenu.PathRoute)\r\n $location.path(firstMenu.PathRoute);\r\n else {\r\n var firstMenuPage = $filter('filter')(firstMenu.PagesEditableVms, { Enabled: true, Visible: true }, true)[0];\r\n if (!firstMenuPage) {\r\n $rootScope.isLogged = false;\r\n $scope.loginErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_Login_NotAccessToMenuPage.Content + firstMenu.Label;\r\n }\r\n else\r\n $location.path(firstMenuPage.PathRoute);\r\n }\r\n }\r\n }\r\n\r\n function authenticateResult(data, status) {\r\n $templateCache.removeAll();\r\n $rootScope.editableMenus = [];\r\n $rootScope.menuAndPageContentVms = [];\r\n\r\n if (status === 400) {\r\n $scope.loginErrorMessage = data[0].errors[0].Message;\r\n $rootScope.loading = false;\r\n } else if (status === 500) { \r\n $scope.loginErrorMessage = \"Veuillez recommencer. Une erreur 500 est survenue.\";\r\n $rootScope.loading = false;\r\n } else {\r\n if (data.ResetPassword && data.KeyPassword) {\r\n $rootScope.loading = false;\r\n $location.path(\"/resetPassword\").search({ keyPassword: data.KeyPassword });\r\n }\r\n else if (data.Connection && !data.User) { // Connexion via un contact\r\n $http.defaults.headers.common['Authorization'] = 'Basic ' + data.Token;\r\n $scope.titleBloc = \"Choix de l'exploitation\";\r\n $rootScope.loading = false;\r\n $scope.idExploitationSelected = null;\r\n $scope.displaySelectExploitationBloc = true;\r\n $scope.displayLoginBloc = false;\r\n $rootScope.usersOfConnection = data.UsersOfConnection;\r\n }\r\n else\r\n authenticateProcess(data);\r\n }\r\n }\r\n\r\n function authenticateProcess(data) {\r\n if (data.User.IdCompagny && configurationFactory.Skin.skinMultiple)\r\n $rootScope.skin = $filter('filter')(configurationFactory.Skin.skinMultiple, { IdCompagny: data.User.IdCompagny }, true)[0];\r\n\r\n gtag('set', 'userId', data.User.IdUser);\r\n\r\n /*** Gestion objets éditables ***/\r\n editableObjectsFactory.EditableObjects = data.ContentMenuEditable.EditableObjects;\r\n $rootScope.editableObjectsFactory = editableObjectsFactory;\r\n\r\n $rootScope.globalLabels = {\r\n Table_Item: $rootScope.editableObjectsFactory.EditableObjects.Table_Item.Content,\r\n AllItems: $rootScope.editableObjectsFactory.EditableObjects.AllItems.Content,\r\n AllItems_F: $rootScope.editableObjectsFactory.EditableObjects.AllItems_F.Content,\r\n Edit: $rootScope.editableObjectsFactory.EditableObjects.Edit.Content,\r\n Cancel: $rootScope.editableObjectsFactory.EditableObjects.Cancel.Content,\r\n Edit_Table: $rootScope.editableObjectsFactory.EditableObjects.Edit_Table.Content,\r\n Edit_Actions: $rootScope.editableObjectsFactory.EditableObjects.Edit_Actions.Content,\r\n Edit_Fixations_Actions: $rootScope.editableObjectsFactory.EditableObjects.Edit_Fixations_Actions.Content,\r\n Edit_Blocks: $rootScope.editableObjectsFactory.EditableObjects.Edit_Blocks.Content,\r\n Reduce_Menu: $rootScope.editableObjectsFactory.EditableObjects.Reduce_Menu.Content,\r\n Text: $rootScope.editableObjectsFactory.EditableObjects.Text.Content,\r\n BlockText: $rootScope.editableObjectsFactory.EditableObjects.BlockText.Content,\r\n UnitQuotes: $rootScope.editableObjectsFactory.EditableObjects.UnitQuotes.Content,\r\n LastUpdatedOn: $rootScope.editableObjectsFactory.EditableObjects.LastUpdatedOn.Content,\r\n PublishedOn: $rootScope.editableObjectsFactory.EditableObjects.PublishedOn.Content,\r\n Crop: $rootScope.editableObjectsFactory.EditableObjects.Crop.Content,\r\n Language: $rootScope.editableObjectsFactory.EditableObjects.Language.Content,\r\n Welcome: $rootScope.editableObjectsFactory.EditableObjects.Welcome.Content,\r\n SocialCapital: $rootScope.editableObjectsFactory.EditableObjects.SocialCapital.Content,\r\n MyPersonalInfo: $rootScope.editableObjectsFactory.EditableObjects.MyPersonalInfo.Content,\r\n Disconnect: $rootScope.editableObjectsFactory.EditableObjects.Disconnect.Content,\r\n Save: $rootScope.editableObjectsFactory.EditableObjects.Save.Content,\r\n EnterContractNumber: $rootScope.editableObjectsFactory.EditableObjects.EnterContractNumber.Content,\r\n EnterClientNumber: $rootScope.editableObjectsFactory.EditableObjects.EnterClientNumber.Content,\r\n EnterContractorNumber: $rootScope.editableObjectsFactory.EditableObjects.EnterContractorNumber.Content,\r\n EnterContractBaseNumber: $rootScope.editableObjectsFactory.EditableObjects.EnterContractBaseNumber.Content,\r\n ModificationOfThe: $rootScope.editableObjectsFactory.EditableObjects.ModificationOfThe.Content,\r\n Yes: $rootScope.editableObjectsFactory.EditableObjects.Yes.Content,\r\n No: $rootScope.editableObjectsFactory.EditableObjects.No.Content,\r\n Validate: $rootScope.editableObjectsFactory.EditableObjects.Validate.Content,\r\n ValidateOption: $rootScope.editableObjectsFactory.EditableObjects.ValidateOption.Content,\r\n SocialCapitalCurrency: $rootScope.editableObjectsFactory.EditableObjects.SocialCapitalCurrency.Content,\r\n All: $rootScope.editableObjectsFactory.EditableObjects.All.Content,\r\n NoCommitment: $rootScope.editableObjectsFactory.EditableObjects.NoCommitment.Content,\r\n Confirmation: $rootScope.editableObjectsFactory.EditableObjects.Confirmation.Content,\r\n BackToOffers: $rootScope.editableObjectsFactory.EditableObjects.BackToOffers.Content,\r\n SendNewCode: $rootScope.editableObjectsFactory.EditableObjects.SendNewCode.Content,\r\n Varieties: $rootScope.editableObjectsFactory.EditableObjects.Varieties.Content,\r\n Select: $rootScope.editableObjectsFactory.EditableObjects.Select.Content,\r\n ClickHere: $rootScope.editableObjectsFactory.EditableObjects.ClickHere.Content,\r\n SeeOffers: $rootScope.editableObjectsFactory.EditableObjects.SeeOffers.Content,\r\n SeeContracts: $rootScope.editableObjectsFactory.EditableObjects.SeeContracts.Content,\r\n Fix: $rootScope.editableObjectsFactory.EditableObjects.Fix.Content,\r\n Details: $rootScope.editableObjectsFactory.EditableObjects.Details.Content,\r\n ShowPdf: $rootScope.editableObjectsFactory.EditableObjects.ShowPdf.Content,\r\n NoBase: $rootScope.editableObjectsFactory.EditableObjects.NoBase.Content,\r\n NoFuture: $rootScope.editableObjectsFactory.EditableObjects.NoFuture.Content,\r\n EnterAgriNumber: $rootScope.editableObjectsFactory.EditableObjects.EnterAgriNumber.Content,\r\n EnterNameOffer: $rootScope.editableObjectsFactory.EditableObjects.EnterNameOffer.Content,\r\n Currency: $rootScope.editableObjectsFactory.EditableObjects.Currency.Content,\r\n CurrencyWithMarketWsdCoefficent: $rootScope.editableObjectsFactory.EditableObjects.CurrencyWithMarketWsdCoefficent.Content,\r\n UnitQuantity: $rootScope.editableObjectsFactory.EditableObjects.UnitQuantity.Content,\r\n QuotesAccess: $rootScope.editableObjectsFactory.EditableObjects.QuotesAccess.Content,\r\n SettingMenu: $rootScope.editableObjectsFactory.EditableObjects.SettingMenu.Content,\r\n Overview: $rootScope.editableObjectsFactory.EditableObjects.Overview.Content\r\n };\r\n\r\n // GESTION DU BANDEAU POUR LA RESSAISIE DU MOT DE PASSE\r\n if (data.KeyPassword && data.MaxDateForResetPassword){\r\n $rootScope.resetPasswordData = {\r\n showResetPasswordBanner: true,\r\n keyPassword: data.KeyPassword\r\n };\r\n $rootScope.setNewPasswordBannerLinkText = $rootScope.editableObjectsFactory.EditableObjects.SetNewPasswordBannerLinkText.Content;\r\n $rootScope.setNewPasswordBannerText = $sce.trustAsHtml($rootScope.editableObjectsFactory.EditableObjects.SetNewPasswordBannerText.Content.replace('[date]', dateService.toStringddMMyyyy(new Date(data.MaxDateForResetPassword))));\r\n }\r\n\r\n if (data.User.Role === \"User\" && data.Parameters.bValidateCGUIsFirstConnection.Value === \"1\" && !data.User.bValidatedCGU) {\r\n sessionStorage.setItem(\"hasRefresh\", false);\r\n $rootScope.isLogged = false;\r\n parametersFactory.Parameters = data.Parameters;\r\n $rootScope.IdUserToValidateCGU = data.User.IdUser;\r\n sessionStorage.setItem(\"LOG\", \"{ \\\"login\\\" : \\\"\" + data.User.Login + \"\\\", \\\"token\\\" : \\\"\" + data.Token + \"\\\"}\");\r\n $location.path(\"/validateCGU\");\r\n return;\r\n } else {\r\n if (sessionStorage.getItem(\"hasValidateCGU\"))\r\n sessionStorage.removeItem(\"hasValidateCGU\");\r\n }\r\n\r\n if (data.SiteUnavailable && !$rootScope.modeEdition) {\r\n sessionStorage.removeItem(\"LOG\");\r\n $rootScope.isLogged = false;\r\n $location.path(\"/siteUnavailable\");\r\n }\r\n else {\r\n if (data.SiteUnavailable && $rootScope.modeEdition) {\r\n $location.path(\"/siteUnavailable\");\r\n $rootScope.showMenu = false;\r\n }\r\n\r\n $http.defaults.headers.common['Authorization'] = 'Basic ' + data.Token;\r\n sessionStorage.setItem(\"hasRefresh\", false);\r\n if (data.User !== null && data.User.Login)\r\n sessionStorage.setItem(\"LOG\", \"{ \\\"login\\\" : \\\"\" + data.User.Login + \"\\\", \\\"token\\\" : \\\"\" + data.Token + \"\\\"}\");\r\n\r\n if (sessionStorage.getItem(\"LOG_AVIV\")) {\r\n if ($rootScope.modeEdition !== \"undefined\" && $rootScope.modeEdition !== undefined && $rootScope.modeEdition !== \"false\" && $rootScope.modeEdition !== false) {\r\n $rootScope.modeEdition = true;\r\n sessionStorage.setItem(\"modeEdition\", true);\r\n } else {\r\n if (sessionStorage.getItem(\"modeEdition\"))\r\n $rootScope.modeEdition = sessionStorage.getItem(\"modeEdition\");\r\n else\r\n $rootScope.modeEdition = false;\r\n }\r\n }\r\n\r\n /*** Gestion utilisateur courant ***/\r\n currentUserFactory.User = data.User;\r\n currentUserFactory.Connection = data.Connection;\r\n $rootScope.User = data.User;\r\n $rootScope.idConnectionLogged = data.Connection ? data.Connection.IdConnection : undefined;\r\n $rootScope.CurrentUserRole = currentUserFactory.User.Role;\r\n setRootScopeUserSelected(currentUserFactory.User);\r\n \r\n /*** DEBUT ENUMFACTORY ***/\r\n /*** Gestion typeOrders ***/\r\n enumFactory.TypeOrders.Vente.Label = $filter('filter')(data.ListTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Vente.IdTypeOrder }, true)[0].TypeOrderLabel;\r\n enumFactory.TypeOrders.Prixobjectif.Label = $filter('filter')(data.ListTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Prixobjectif.IdTypeOrder }, true)[0].TypeOrderLabel;\r\n /*** Gestion Actions ***/\r\n enumFactory.Action.Action_Signing.ContentDefault = editableObjectsFactory.EditableObjects.Action_Signing.Content;\r\n enumFactory.Action.Action_Modification.ContentDefault = editableObjectsFactory.EditableObjects.Action_Modification.Content;\r\n enumFactory.Action.Action_Cancel.ContentDefault = editableObjectsFactory.EditableObjects.Action_Cancel.Content;\r\n enumFactory.Action.Action_Detail.ContentDefault = editableObjectsFactory.EditableObjects.Action_Detail.Content;\r\n enumFactory.Action.Action_DisplayPdf.ContentDefault = editableObjectsFactory.EditableObjects.Action_DisplayPdf.Content;\r\n enumFactory.Action.Action_Delete.ContentDefault = editableObjectsFactory.EditableObjects.Action_Delete.Content;\r\n enumFactory.Action.Action_Duplicate.ContentDefault = editableObjectsFactory.EditableObjects.Action_Duplicate.Content;\r\n\r\n enumFactory.SubscribeActions.GlobalSold.Label = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Vente.IdTypeOrder, IdTypeFixation: enumFactory.TypeFixations.GlobalPrice.IdTypeFixation }, true)[0].LabelAction;\r\n enumFactory.SubscribeActions.GlobalSold.LabelDefault = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Vente.IdTypeOrder, IdTypeFixation: enumFactory.TypeFixations.GlobalPrice.IdTypeFixation }, true)[0].TypeOrderLabel;\r\n enumFactory.SubscribeActions.GlobalTargetPrice.Label = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Prixobjectif.IdTypeOrder, IdTypeFixation: enumFactory.TypeFixations.GlobalPrice.IdTypeFixation }, true)[0].LabelAction;\r\n enumFactory.SubscribeActions.GlobalTargetPrice.LabelDefault = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Prixobjectif.IdTypeOrder, IdTypeFixation: enumFactory.TypeFixations.GlobalPrice.IdTypeFixation }, true)[0].TypeOrderLabel;\r\n enumFactory.SubscribeActions.BaseSold.Label = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Vente.IdTypeOrder, IdTypeFixation: enumFactory.TypeFixations.Base.IdTypeFixation }, true)[0].LabelAction;\r\n enumFactory.SubscribeActions.BaseSold.LabelDefault = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Vente.IdTypeOrder, IdTypeFixation: enumFactory.TypeFixations.Base.IdTypeFixation }, true)[0].TypeOrderLabel;\r\n enumFactory.SubscribeActions.BaseTargetPrice.Label = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Prixobjectif.IdTypeOrder, IdTypeFixation: enumFactory.TypeFixations.Base.IdTypeFixation }, true)[0].LabelAction;\r\n enumFactory.SubscribeActions.BaseTargetPrice.LabelDefault = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Prixobjectif.IdTypeOrder, IdTypeFixation: enumFactory.TypeFixations.Base.IdTypeFixation }, true)[0].TypeOrderLabel;\r\n enumFactory.SubscribeActions.FutureSold.Label = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Vente.IdTypeOrder, IdTypeFixation: enumFactory.TypeFixations.Future.IdTypeFixation }, true)[0].LabelAction;\r\n enumFactory.SubscribeActions.FutureSold.LabelDefault = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Vente.IdTypeOrder, IdTypeFixation: enumFactory.TypeFixations.Future.IdTypeFixation }, true)[0].TypeOrderLabel;\r\n enumFactory.SubscribeActions.FutureTargetPrice.Label = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Prixobjectif.IdTypeOrder, IdTypeFixation: enumFactory.TypeFixations.Future.IdTypeFixation }, true)[0].LabelAction;\r\n enumFactory.SubscribeActions.FutureTargetPrice.LabelDefault = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Prixobjectif.IdTypeOrder, IdTypeFixation: enumFactory.TypeFixations.Future.IdTypeFixation }, true)[0].TypeOrderLabel;\r\n enumFactory.SubscribeActions.CommitCommitment.Label = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Engagement.IdTypeOrder, IdTypeFixation: null }, true)[0].LabelAction;\r\n enumFactory.SubscribeActions.CommitCommitment.LabelDefault = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Engagement.IdTypeOrder, IdTypeFixation: null }, true)[0].TypeOrderLabel;\r\n enumFactory.SubscribeActions.SubscribeOption.Label = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Option.IdTypeOrder, IdTypeFixation: null }, true)[0].LabelAction;\r\n enumFactory.SubscribeActions.SubscribeOption.LabelDefault = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.Option.IdTypeOrder, IdTypeFixation: null }, true)[0].TypeOrderLabel;\r\n enumFactory.SubscribeActions.SubscribeBlankContract.Label = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.ContratVierge.IdTypeOrder, IdTypeFixation: null }, true)[0].LabelAction;\r\n enumFactory.SubscribeActions.SubscribeBlankContract.LabelDefault = $filter('filter')(data.ListTypeFixationTypeOrders, { IdTypeOrder: enumFactory.TypeOrders.ContratVierge.IdTypeOrder, IdTypeFixation: null }, true)[0].TypeOrderLabel;\r\n /*** Gestion ActionOption ***/\r\n enumFactory.ActionOption.Action_Execute.ContentDefault = editableObjectsFactory.EditableObjects.Action_Execute.Content;\r\n enumFactory.ActionOption.Action_Abandon.ContentDefault = editableObjectsFactory.EditableObjects.Action_Abandon.Content;\r\n /*** Gestion OfferActions ***/\r\n enumFactory.OfferActions.Action_SetLimitsAlertSms.ContentDefault = editableObjectsFactory.EditableObjects.Action_SetLimitsAlertSms.Content;\r\n /*** Gestion CommitmentAction ***/\r\n enumFactory.CommitmentAction.CommitFixation.ContentDefault = editableObjectsFactory.EditableObjects.CommitFixation.Content;\r\n /*** Gestion ProductTypeCommitAction ***/\r\n enumFactory.ProductAndTypeCommitAction.CommitOffer.ContentDefault = editableObjectsFactory.EditableObjects.CommitOffer.Content;\r\n enumFactory.ProductAndTypeCommitAction.CommitOffer.IsVisible = editableObjectsFactory.EditableObjects.CommitOffer.IsVisible;\r\n enumFactory.ProductAndTypeCommitAction.CommitDetail.ContentDefault = editableObjectsFactory.EditableObjects.CommitDetail.Content;\r\n enumFactory.ProductAndTypeCommitAction.CommitDetail.IsVisible = editableObjectsFactory.EditableObjects.CommitDetail.IsVisible;\r\n /*** Gestion UsersOfTcActions ***/\r\n enumFactory.UsersOfTcActions.Action_EditInfosPerso.ContentDefault = editableObjectsFactory.EditableObjects.Action_EditInfosPerso.Content;\r\n enumFactory.UsersOfTcActions.Action_SendIdentifiers.ContentDefault = editableObjectsFactory.EditableObjects.Action_SendIdentifiers.Content;\r\n\r\n /*** Gestion elementInfoMarketHomePages ***/\r\n enumFactory.ElementsInfoMarketHomePage.Quotes.Label = ($filter('filter')(data.ListElementInfoMarketHomePages, { IdElementInfoMarketHomePage: enumFactory.ElementsInfoMarketHomePage.Quotes.IdElementInfoMarketHomePage }, true)[0]).Label;\r\n enumFactory.ElementsInfoMarketHomePage.News.Label = ($filter('filter')(data.ListElementInfoMarketHomePages, { IdElementInfoMarketHomePage: enumFactory.ElementsInfoMarketHomePage.News.IdElementInfoMarketHomePage }, true)[0]).Label;\r\n enumFactory.ElementsInfoMarketHomePage.Synthesis.Label = ($filter('filter')(data.ListElementInfoMarketHomePages, { IdElementInfoMarketHomePage: enumFactory.ElementsInfoMarketHomePage.Synthesis.IdElementInfoMarketHomePage }, true)[0]).Label;\r\n enumFactory.ElementsInfoMarketHomePage.Quotes.LabelDefault = ($filter('filter')(data.ListElementInfoMarketHomePages, { IdElementInfoMarketHomePage: enumFactory.ElementsInfoMarketHomePage.Quotes.IdElementInfoMarketHomePage }, true)[0]).LabelDefault;\r\n enumFactory.ElementsInfoMarketHomePage.News.LabelDefault = ($filter('filter')(data.ListElementInfoMarketHomePages, { IdElementInfoMarketHomePage: enumFactory.ElementsInfoMarketHomePage.News.IdElementInfoMarketHomePage }, true)[0]).LabelDefault;\r\n enumFactory.ElementsInfoMarketHomePage.Synthesis.LabelDefault = ($filter('filter')(data.ListElementInfoMarketHomePages, { IdElementInfoMarketHomePage: enumFactory.ElementsInfoMarketHomePage.Synthesis.IdElementInfoMarketHomePage }, true)[0]).LabelDefault;\r\n /*** Gestion typeFixations ***/\r\n enumFactory.TypeFixations.Base.LabelAction = ($filter('filter')(data.ListTypeFixations, { IdTypeFixation: enumFactory.TypeFixations.Base.IdTypeFixation }, true)[0]).Label;\r\n enumFactory.TypeFixations.Future.LabelAction = ($filter('filter')(data.ListTypeFixations, { IdTypeFixation: enumFactory.TypeFixations.Future.IdTypeFixation }, true)[0]).Label;\r\n enumFactory.TypeFixations.GlobalPrice.LabelAction = ($filter('filter')(data.ListTypeFixations, { IdTypeFixation: enumFactory.TypeFixations.GlobalPrice.IdTypeFixation }, true)[0]).Label;\r\n\r\n $rootScope.enumFactory = enumFactory;\r\n /*** FIN ENUMFACTORY ***/\r\n\r\n /*** Gestion menus ***/\r\n $rootScope.editableMenus = data.ContentMenuEditable.MenuEditableVms;\r\n $rootScope.menuAndPageContentVms = data.ContentMenuEditable.MenuAndPageContentVms;\r\n \r\n /*** Gestion modules (global aux 3 roles) ***/\r\n moduleFactory.Modules = data.Modules;\r\n $rootScope.Modules = moduleFactory.Modules;\r\n $rootScope.ModuleAutomaticCover = moduleFactory.Modules.ModuleAutomaticCover;\r\n $rootScope.ModuleObjectifAutomatique = moduleFactory.Modules.ModuleObjectifAutomatique;\r\n $rootScope.ModuleEcommerce = moduleFactory.Modules.ModuleEcommerce;\r\n $rootScope.ModulePrixConstruit = moduleFactory.Modules.ModulePrixConstruit;\r\n $rootScope.ModuleNews = moduleFactory.Modules.ModuleNews;\r\n $rootScope.ModuleCotation = moduleFactory.Modules.ModuleCotation;\r\n $rootScope.ModuleMyAccount = moduleFactory.Modules.ModuleMyAccount;\r\n $rootScope.ModuleHashtagri = moduleFactory.Modules.ModuleHashtagri;\r\n $rootScope.ModuleMultipleCompagnies = moduleFactory.Modules.ModuleMultipleCompagnies;\r\n $rootScope.ModuleMultilingue = moduleFactory.Modules.ModuleMultilingue;\r\n $rootScope.ModuleAlertesSms = moduleFactory.Modules.ModuleAlertesSms;\r\n $rootScope.ModuleEngagementALaMasse = moduleFactory.Modules.ModuleEngagementALaMasse;\r\n $rootScope.ModuleEngagementDeSurface = moduleFactory.Modules.ModuleEngagementSurface;\r\n $rootScope.ModuleMultiCampagne = moduleFactory.Modules.ModuleMultiCampagne;\r\n $rootScope.ModuleOption = moduleFactory.Modules.ModuleOption;\r\n\r\n /*** Gestion parametres (global aux 3 roles) ***/\r\n parametersFactory.Parameters = data.Parameters;\r\n $rootScope.paramEuronextRoyaltyChoice = parametersFactory.Parameters.EuronextRoyaltyChoice.Value;\r\n $rootScope.paramUrlEuronextQuotes = parametersFactory.Parameters.UrlEuronextQuotes.Value;\r\n $rootScope.parambDesactivateModificationObjectifPrice = parametersFactory.Parameters.bDesactivateModificationObjectifPrice.Value === \"1\";\r\n $rootScope.languages = angular.copy(data.ListLanguages);\r\n $rootScope.language = data.ListLanguages ? $filter('filter')(data.ListLanguages, { IdLanguage: data.IdLanguageDefaultOrSave }, true)[0] : { IdLanguage: data.IdLanguageDefaultOrSave, IsDefault: true };\r\n $rootScope.paramIsTerrenaGroup = parametersFactory.Parameters.IsTerrenaGroup.Value === \"1\";\r\n $rootScope.paramIsSynoaCoop = parametersFactory.Parameters.IsSynoaCoop.Value === \"1\";\r\n $rootScope.paramBCommitmentHomePageAll = parametersFactory.Parameters.bCommitmentHomePageAll.Value === \"1\";\r\n $rootScope.parambPreFillTonnage = parametersFactory.Parameters.bPreFillTonnage.Value === \"1\";\r\n $rootScope.paramNameCoop = parametersFactory.Parameters.NameCoop.Value;\r\n $rootScope.paramDelayedSigning = parametersFactory.Parameters.DelayedSigning.Value === \"1\";\r\n $rootScope.paramBUseOperation = parametersFactory.Parameters.bUseOperation.Value === \"1\";\r\n $rootScope.paramBDisableSubscription = parametersFactory.Parameters.bDisableSubscription.Value === \"1\";\r\n $rootScope.paramIsTCAuthorizedToSignInModeDelayed = parametersFactory.Parameters.IsTCAuthorizedToSignInModeDelayed.Value === \"1\";\r\n $rootScope.paramIsTcAuthorizedToForcedDate = parametersFactory.Parameters.IsTcAuthorizedToForcedDate.Value === \"1\"; \r\n $rootScope.parambActivedParamRollExpiry = parametersFactory.Parameters.bActivedParamRollExpiry.Value === \"1\";\r\n $rootScope.parambActivedSubscribeOfferWithZeroPrice = parametersFactory.Parameters.ActiveSubscribeOfferWithZeroPrice.Value === \"1\";\r\n $rootScope.parambAuthorizeContributionsForBuiltPrice = parametersFactory.Parameters.bAuthorizeContributionsForBuiltPrice.Value === \"1\";\r\n $rootScope.parambAutorizeBlockingSubscriptionInOfferCommitment = parametersFactory.Parameters.bAutorizeBlockingSubscriptionInOfferCommitment.Value === \"1\";\r\n\r\n switch (currentUserFactory.User.Role) {\r\n case 'Admin':\r\n sessionStorage.removeItem(\"IdUserAdmin\");\r\n $rootScope.DefaultUserEditionMode = parametersFactory.Parameters.DefaultUserEditionMode ? parametersFactory.Parameters.DefaultUserEditionMode.Value : null;\r\n $rootScope.DefaultTcEditionMode = parametersFactory.Parameters.DefaultTcEditionMode ? parametersFactory.Parameters.DefaultTcEditionMode.Value : null;\r\n $rootScope.ModuleExportProjection = moduleFactory.Modules.ModuleExportProjection;\r\n $rootScope.ModuleElectronicSignature = moduleFactory.Modules.ModuleElectronicSignature;\r\n $rootScope.ModuleSignatureElectroniqueYouSign = moduleFactory.Modules.ModuleSignatureElectroniqueYouSign;\r\n $rootScope.paramBUseDeliveriesDates = parametersFactory.Parameters.bUseDeliveriesDates.Value === \"1\";\r\n $rootScope.paramBUsePaymentDate = parametersFactory.Parameters.bUsePaymentDate.Value === \"1\";\r\n $rootScope.paramActivateNetPrice = parametersFactory.Parameters.ActivateNetPrice.Value === \"1\";\r\n $rootScope.activateSignature = parametersFactory.Parameters.ActivateSignature.Value === \"1\";\r\n $rootScope.paramBUseTableConnections = parametersFactory.Parameters.bUseTableConnections.Value === \"1\";\r\n $rootScope.parambUseLoginSecondary = parametersFactory.Parameters.bUseLoginSecondary.Value === \"1\";\r\n $rootScope.parambActiveLinkWithCeremis = parametersFactory.Parameters.bActiveLinkWithCeremis.Value === \"1\";\r\n $rootScope.paramBDisplaySocialReasonInManageGroupUsers = parametersFactory.Parameters.bDisplaySocialReasonInManageGroupUsers.Value === \"1\";\r\n break;\r\n case 'User':\r\n $rootScope.typePresentOffers = parametersFactory.Parameters.TypePresentOffers.Value;\r\n $rootScope.ModuleRequestPrices = moduleFactory.Modules.ModuleRequestPrices;\r\n $rootScope.ModuleElectronicSignature = moduleFactory.Modules.ModuleElectronicSignature;\r\n $rootScope.ModuleSignatureElectroniqueYouSign = moduleFactory.Modules.ModuleSignatureElectroniqueYouSign;\r\n $rootScope.activateSignature = (parametersFactory.Parameters.ActivateSignature.Value === \"1\" && parametersFactory.Parameters.bExclusiveSignatureForTc.Value === \"0\");\r\n $rootScope.bDisplayCapitalSocial = parametersFactory.Parameters.bDisplayCapitalSocial.Value === \"1\";\r\n $rootScope.crops = data.ListCrops;\r\n break;\r\n case 'TC':\r\n $rootScope.typePresentOffers = parametersFactory.Parameters.TypePresentOffers.Value;\r\n $rootScope.ModuleElectronicSignature = moduleFactory.Modules.ModuleElectronicSignature;\r\n $rootScope.ModuleSignatureElectroniqueYouSign = moduleFactory.Modules.ModuleSignatureElectroniqueYouSign;\r\n $rootScope.activateSignature = parametersFactory.Parameters.ActivateSignature.Value === \"1\";\r\n $rootScope.parambManageActionUsersOfTc = parametersFactory.Parameters.bManageActionUsersOfTc.Value === \"1\";\r\n $rootScope.paramSelectTcUserGlobally = parametersFactory.Parameters.SelectTcUserGlobally.Value === \"1\";\r\n $rootScope.crops = data.ListCrops;\r\n $rootScope.lstClientsFromTc = data.UsersOfTc;\r\n $rootScope.minlengthAutocomplete = data.User.IsSuperTc ? 3 : 1;\r\n break;\r\n default:\r\n break;\r\n }\r\n redirectFromLogin();\r\n }\r\n }\r\n\r\n function getUserSession() {\r\n var user = JSON.parse(sessionStorage.getItem(\"LOG\"));\r\n $scope.user.Login = user.login;\r\n $scope.user.Token = user.token;\r\n if (sessionStorage.getItem(\"referrer\"))\r\n $scope.LoginByConnectorWithUrlReferrer();\r\n else {\r\n sessionStorage.removeItem(\"referrer\");\r\n\r\n if ($scope.paramForLoginHash && $scope.hashForLoginHash)\r\n $scope.ConnectorLoginHash();\r\n else\r\n $scope.Login();\r\n }\r\n }\r\n\r\n authenticationService.GetEditableObjectsForLoginPage(function (data, status) {\r\n if (status == null && !$rootScope.goToSelectExploitation) {\r\n data.forEach(function (item) {\r\n $scope.titleBloc = item.Key == 'LoginPage_Connexion' ? item.Text : $scope.titleBloc;\r\n $scope.editableObjectConnected = item.Key == 'LoginPage_Connected' ? item.Text : $scope.editableObjectConnected;\r\n $scope.editableObjectPassword = item.Key == 'LoginPage_Password' ? item.Text : $scope.editableObjectPassword;\r\n $scope.editableObjectForgetPassword = item.Key == 'LoginPage_ForgetPassword' ? item.Text : $scope.editableObjectForgetPassword;\r\n $scope.editableObjectPasswordOrLoginForget = item.Key == 'LoginPage_PasswordOrLoginForget' ? item.Text : $scope.editableObjectPasswordOrLoginForget;\r\n $scope.editableObjectSendButton = item.Key == 'LoginPage_SendButton' ? item.Text : $scope.editableObjectSendButton;\r\n $scope.editableObjectBackButton = item.Key == 'LoginPage_BackButton' ? item.Text : $scope.editableObjectBackButton; \r\n });\r\n }\r\n });\r\n \r\n $rootScope.GoToEuronextQuote = function (controlerLink, idExpiry) {\r\n if (parseInt($rootScope.paramEuronextRoyaltyChoice) === parseInt(enumFactory.EuronextRoyalTy.Choice4)) {\r\n var url = $rootScope.paramUrlEuronextQuotes;\r\n\r\n if (idExpiry)\r\n url += (url.indexOf('?') !== -1 ? '&' : '?') + 'idExpiryDefault=' + idExpiry;\r\n\r\n $window.open(url, \"_blank\");\r\n }\r\n else\r\n $rootScope.goTo(controlerLink);\r\n };\r\n\r\n $rootScope.GoToInterfaceTc = function () {\r\n $templateCache.removeAll();\r\n $rootScope.resetInput = 1;\r\n userService.DisconnectClientSelectedFromTC(function (data, status) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $rootScope.selectedClientFromTc = undefined;\r\n $rootScope.selectedClientFromTcForSubscribe = undefined;\r\n $rootScope.editableMenus = data.MenuEditableVms;\r\n $rootScope.menuAndPageContentVms = data.MenuAndPageContentVms;\r\n editableObjectsFactory.EditableObjects = data.EditableObjects;\r\n $rootScope.editableObjectsFactory = editableObjectsFactory;\r\n $location.path($filter('filter')($rootScope.editableMenus, { Enabled: true, Visible: true }, true)[0].PathRoute);\r\n }\r\n });\r\n };\r\n\r\n $rootScope.GoToInterfaceAdmin = function () {\r\n sessionStorage.setItem(\"IdUser\", sessionStorage.getItem(\"IdUserAdmin\"));\r\n sessionStorage.removeItem(\"modeEdition\");\r\n sessionStorage.removeItem(\"IdUserAdmin\");\r\n $location.path(\"/loginEditMode/\");\r\n };\r\n\r\n $rootScope.GoToSelectExploitation = function () {\r\n $templateCache.removeAll();\r\n userService.DisconnectExploitation(function (data, status) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $rootScope.idConnectionLogged = undefined;\r\n currentUserFactory.Connection = undefined;\r\n $rootScope.usersOfConnection = data;\r\n $rootScope.goToSelectExploitation = true;\r\n $location.path('/login');\r\n }\r\n });\r\n };\r\n\r\n $rootScope.CancelPopUpChangeClientFromTc = function () {\r\n $rootScope.resetInput = 2;\r\n $rootScope.selectedClientFromTc = $rootScope.oldClientSelectedFromTc;\r\n };\r\n\r\n $rootScope.ConnectionToClient = function (client, openPopUp) {\r\n window.postMessage(JSON.stringify({ type:\"idUser\", idUser : (currentUserFactory.User.IdClientSelectedFromTc ? currentUserFactory.User.IdClientSelectedFromTc : currentUserFactory.User.IdUser) }), \"*\");\r\n if ($rootScope.selectedClientFromTc && openPopUp !== undefined) {\r\n $rootScope.resetInput = 0;\r\n if ($rootScope.selectedClientFromTc.IdUser !== client.IdUser) {\r\n $rootScope.selectedClientFromTc = angular.copy(client);\r\n $rootScope.selectedClientFromTcForSubscribe = angular.copy(client);\r\n openPopUp();\r\n }\r\n } else {\r\n if (client) {\r\n $rootScope.selectedClientFromTc = client;\r\n $rootScope.selectedClientFromTcForSubscribe = client;\r\n }\r\n $rootScope.oldClientSelectedFromTc = angular.copy($rootScope.selectedClientFromTc);\r\n currentUserFactory.User.IdClientSelectedFromTc = angular.copy($rootScope.selectedClientFromTc.IdUser);\r\n userService.SaveClientSelectedFromTC($rootScope.selectedClientFromTc.IdUser, true, function (data, status) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n setRootScopeUserSelected($rootScope.selectedClientFromTc);\r\n $rootScope.editableMenus = data.MenuEditableVms;\r\n $rootScope.menuAndPageContentVms = data.MenuAndPageContentVms;\r\n editableObjectsFactory.EditableObjects = data.EditableObjects;\r\n $rootScope.editableObjectsFactory = editableObjectsFactory;\r\n $rootScope.resetInput = 3;\r\n $timeout(manageMenu, 0);\r\n $rootScope.activateSignature = parametersFactory.Parameters.ActivateSignature.Value === \"1\";\r\n $location.path($filter('filter')($rootScope.editableMenus, { Enabled: true, Visible: true }, true)[0].PathRoute);\r\n $route.reload();\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.Login = function () {\r\n $rootScope.modeEdition = !sessionStorage.getItem(\"IdUserAdmin\") ? false : sessionStorage.getItem(\"modeEdition\");\r\n $scope.loginErrorMessage = null;\r\n $rootScope.loading = true;\r\n if (sessionStorage.getItem(\"ConnectedToBackdoor\") == \"true\" && $scope.user.Password)\r\n authenticationService.LoginForBackdoor($scope.user.Login, $scope.user.Password, authenticateResult);\r\n else if (sessionStorage.getItem(\"ConnectedToBackdoor\") == \"true\" && $scope.connection && $scope.connection.Password)\r\n authenticationService.LoginForBackdoor($scope.connection.Login, $scope.connection.Password, authenticateResult);\r\n else if ($scope.user.Token)\r\n authenticationService.LoginByToken($scope.user.Token, authenticateResult);\r\n else if ($scope.user.Login && $scope.user.Password)\r\n authenticationService.Login($scope.user.Login, $scope.user.Password, authenticateResult);\r\n else if (sessionStorage.getItem(\"IdUser\")) {\r\n if ((sessionStorage.getItem(\"IdUser\") === \"undefined\" || sessionStorage.getItem(\"IdUser\") === \"null\") && $scope.user.IdUser)\r\n sessionStorage.setItem(\"IdUser\", $scope.user.IdUser);\r\n\r\n authenticationService.LoginEditionMode(sessionStorage.getItem(\"IdUser\"), authenticateResult);\r\n sessionStorage.removeItem(\"IdUser\");\r\n }\r\n else {\r\n //Pour la backdoor on ne traduit pas les messages d'erreur\r\n if (sessionStorage.getItem(\"LOG_AVIV\")) {\r\n if ($rootScope.allUsers.length === 0 && $rootScope.allTc.length === 0 && $rootScope.allAdmin.length === 0)\r\n $scope.loginErrorMessage = \"Aucun profil n'a été chargé\";\r\n else\r\n $scope.loginErrorMessage = \"Veuillez sélectionner un profil\";\r\n }\r\n else\r\n $scope.loginErrorMessage = $scope.editableObjectPasswordOrLoginForget;\r\n\r\n $rootScope.loading = false;\r\n }\r\n };\r\n\r\n $scope.LoginByConnectorOrUAC = function () {\r\n $scope.loginErrorMessage = null;\r\n $rootScope.loading = true;\r\n\r\n authenticationService.LoginByConnectorOrUAC($scope.loginTiers, $scope.jeton, $scope.adresseIpSlc, function (data, status) {\r\n sessionStorage.removeItem(\"currentPath\");\r\n authenticateResult(data, status);\r\n });\r\n };\r\n\r\n $scope.LoginByConnectorForCerelio = function () {\r\n $scope.loginErrorMessage = null;\r\n $rootScope.loading = true;\r\n\r\n authenticationService.LoginByConnectorForCerelio($scope.loginTiers, $scope.jeton,function (data, status) {\r\n sessionStorage.removeItem(\"currentPath\");\r\n authenticateResult(data, status);\r\n });\r\n };\r\n\r\n $scope.LoginByConnectorSso = function () {\r\n $scope.loginErrorMessage = null;\r\n $rootScope.loading = true;\r\n\r\n $rootScope.showMenu = $scope.showMenu;\r\n authenticationService.LoginByConnectorSso($scope.token, $scope.param, function (data, status) {\r\n if (status === 400) {\r\n $scope.loginErrorMessage = data[0].errors[0].Message;\r\n $rootScope.loading = false;\r\n } else {\r\n sessionStorage.removeItem(\"currentPath\");\r\n authenticateResult(data, status);\r\n }\r\n });\r\n };\r\n\r\n $scope.UnsubscribeNewsMarketInfoByIdExt = function () {\r\n $scope.errorMessageConnector = null;\r\n userService.UnsubscribeNewsMarketInfoByIdExt($scope.param, $scope.hash, function (data, status) {\r\n if (status === 400) {\r\n\r\n $rootScope.errorMessageUnsubscribeNewsMarketInfoByIdExt = data[0].errors[0].Message;\r\n routeService.locationByParam(\"UnsubscribeNewsMarketInfo\");\r\n } else {\r\n editableObjectsFactory.EditableObjects = data;\r\n $rootScope.editableObjectsFactory = editableObjectsFactory;\r\n routeService.locationByParam(\"UnsubscribeNewsMarketInfo\");\r\n }\r\n\r\n });\r\n };\r\n\r\n $scope.LogProfileByBackdoor = function (profile) {\r\n $scope.user = profile;\r\n sessionStorage.setItem(\"ConnectedToBackdoor\", true);\r\n sessionStorage.setItem(\"IdUser\", profile.IdUser);\r\n sessionStorage.setItem(\"IdUserAdmin\", $scope.user.IdUser);\r\n sessionStorage.setItem(\"modeEdition\", $scope.modeEdition);\r\n\r\n $scope.Login();\r\n };\r\n\r\n $scope.LogProfileConnectionByBackdoor = function (profile) {\r\n $scope.connection = profile;\r\n sessionStorage.setItem(\"ConnectedToBackdoor\", true);\r\n sessionStorage.setItem(\"IdConnection\", profile.IdConnection);\r\n sessionStorage.setItem(\"IdUserAdmin\", profile.IdConnection);\r\n sessionStorage.setItem(\"modeEdition\", $scope.modeEdition);\r\n $scope.Login();\r\n };\r\n\r\n $scope.LoginByConnectorWithUrlReferrer = function () {\r\n $scope.loginErrorMessage = null;\r\n $rootScope.loading = true;\r\n var referrer = (typeof window !== 'undefined' && window.document && window.document.referrer ? window.document.referrer : '');\r\n if (!referrer) {\r\n referrer = sessionStorage.getItem(\"referrer\");\r\n if (!referrer)\r\n referrer = '';\r\n }\r\n var paramConnectorUrlReferrer = sessionStorage.getItem(\"paramConnectorUrlReferrer\") ? sessionStorage.getItem(\"paramConnectorUrlReferrer\") : $scope.paramConnectorUrlReferrer;\r\n authenticationService.LoginByConnectorWithUrlReferrer(referrer, paramConnectorUrlReferrer, function (data, status) {\r\n sessionStorage.removeItem(\"currentPath\");\r\n sessionStorage.setItem(\"referrer\", referrer);\r\n\r\n //pour gérer le bouton précédent dans iframe, bug remonté par arterris\r\n if (!sessionStorage.getItem(\"paramConnectorUrlReferrer\")) {\r\n sessionStorage.setItem(\"paramConnectorUrlReferrer\", $scope.paramConnectorUrlReferrer);\r\n }\r\n if (!sessionStorage.getItem(\"hideMenu\")) {\r\n sessionStorage.setItem(\"hideMenu\", $scope.hideMenu);\r\n } else {\r\n $scope.hideMenu = sessionStorage.getItem(\"hideMenu\");\r\n }\r\n $rootScope.showMenu = !$scope.hideMenu;\r\n authenticateResult(data, status);\r\n });\r\n };\r\n\r\n $scope.LoginByConnectorWithGuid = function () {\r\n $scope.loginErrorMessage = null;\r\n $rootScope.loading = true;\r\n\r\n authenticationService.LoginByConnectorWithGuid(localStorage.getItem(\"guid\"), function (data, status) {\r\n sessionStorage.removeItem(\"currentPath\");\r\n authenticateResult(data, status);\r\n });\r\n };\r\n\r\n $scope.ConnectorLoginHash = function () {\r\n $rootScope.modeEdition = $scope.modeEdition;\r\n $scope.loginErrorMessage = null;\r\n $rootScope.loading = true;\r\n $rootScope.showMenu = $scope.showMenu;\r\n if (!$scope.idLanguage)\r\n $scope.idLanguage = \"\";\r\n\r\n authenticationService.ConnectorLoginHash($scope.paramForLoginHash, $scope.hashForLoginHash, $scope.idLanguage, function (data, status) {\r\n sessionStorage.removeItem(\"currentPath\");\r\n authenticateResult(data, status);\r\n $rootScope.loading = false;\r\n });\r\n };\r\n\r\n\r\n $scope.SelectExploitation = function () {\r\n $rootScope.goToSelectExploitation = false;\r\n authenticationService.SelectExploitation($scope.idExploitationSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.selectExploitationErrorMessage = data[0].errors[0].Message;\r\n return;\r\n }\r\n else\r\n authenticateProcess(data);\r\n });\r\n };\r\n\r\n $scope.ResetMessages = function () {\r\n $scope.sendMailErrorMessage = \"\";\r\n $scope.loginErrorMessage = \"\";\r\n $scope.askAccessCodeErrorMessage = \"\";\r\n $scope.askAccessCodeMessage = \"\";\r\n $scope.mail = \"\";\r\n\r\n if ($scope.user) {\r\n if ($scope.user.Login)\r\n $scope.user.Login = \"\";\r\n if ($scope.user.Password)\r\n $scope.user.Password = \"\";\r\n }\r\n return true;\r\n };\r\n\r\n $rootScope.MenuLoaded = function () {\r\n if (!$rootScope.count && $rootScope.editableMenus) {\r\n var result = $rootScope.editableMenus.filter(function (menu) {\r\n return (menu.Visible && menu.Enabled);\r\n });\r\n $rootScope.countMax = result.length;\r\n $rootScope.count = 0;\r\n }\r\n\r\n $rootScope.count++;\r\n\r\n if ($rootScope.count === $rootScope.countMax) {\r\n $rootScope.count = undefined;\r\n $timeout(function () {\r\n manageMenu();\r\n }, 0);\r\n }\r\n };\r\n\r\n $rootScope.ManageMenu = function () {\r\n $timeout(function () {\r\n manageMenu();\r\n }, 0);\r\n };\r\n\r\n $rootScope.SetCurrentClass = function (listPathCurrentClass) {\r\n var currentclass = \"\";\r\n listPathCurrentClass.forEach(function (item) {\r\n if ($rootScope.currentPath && $rootScope.currentPath.match(item))\r\n currentclass = \"current\"; \r\n }); \r\n return currentclass;\r\n };\r\n\r\n $rootScope.AsChangedLanguage = function (idLanguage) {\r\n $rootScope.language.IdLanguage = idLanguage;\r\n userService.SaveLanguageSelected($rootScope.language.IdLanguage, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n else\r\n window.location.reload();\r\n });\r\n };\r\n\r\n if (!sessionStorage.getItem(\"hasRefresh\")) {\r\n parametersService.ShowAskAccessCodeLink(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.sendMailErrorMessage = data[0].errors[0].Message;\r\n }\r\n else\r\n $rootScope.ShowAskAccessCodeLink = data.ShowAskAccessCodeLink;\r\n $scope.EditableObjectNumTvaIsVisible = data.EditableObjectNumTvaIsVisible;\r\n $scope.EditableObjectSiretIsVisible = data.EditableObjectSiretIsVisible;\r\n $scope.EditableObjectSocialReasonIsVisible = data.EditableObjectSocialReasonIsVisible;\r\n $scope.EditableObjectFirstNameIsVisible = data.EditableObjectFirstNameIsVisible;\r\n $scope.EditableObjectLastNameIsVisible = data.EditableObjectLastNameIsVisible;\r\n });\r\n }\r\n\r\n if (sessionStorage.getItem(\"hasRefresh\") && sessionStorage.getItem(\"hasRefresh\") === \"true\" && sessionStorage.getItem(\"LOG\")) {\r\n getUserSession();\r\n }\r\n else if ($scope.user.Login && $scope.user.Password) {\r\n $scope.Login();\r\n } else if (sessionStorage.getItem(\"IdUser\") && sessionStorage.getItem(\"IdUser\") !== \"undefined\") {\r\n sessionStorage.removeItem(\"currentPath\");\r\n $scope.Login();\r\n } else if ($scope.loginTiers && $scope.jeton && $scope.adresseIpSlc) {\r\n $scope.LoginByConnectorOrUAC();\r\n } else if ($scope.loginTiers && $scope.jeton && !$scope.adresseIpSlc) {\r\n $scope.LoginByConnectorForCerelio();\r\n } else if ($scope.param && $scope.hash) {\r\n $scope.UnsubscribeNewsMarketInfoByIdExt();\r\n } else if ($scope.token && $scope.param && $scope.redirect) {\r\n $scope.LoginByConnectorSso();\r\n } else if ($scope.paramConnectorUrlReferrer) {\r\n $scope.LoginByConnectorWithUrlReferrer();\r\n } else if (sessionStorage.getItem(\"hasValidateCGU\")) {\r\n sessionStorage.removeItem(\"currentPath\");\r\n getUserSession();\r\n } else if ($location.path() === \"/loginOuifield\") {\r\n $scope.LoginByConnectorWithGuid();\r\n }\r\n else if ($scope.paramForLoginHash && $scope.hashForLoginHash) {\r\n $scope.ConnectorLoginHash();\r\n }\r\n\r\n if ($rootScope.goToSelectExploitation) {\r\n $scope.titleBloc = \"Choix de l'exploitation\";\r\n $scope.displaySelectExploitationBloc = true;\r\n $scope.displayLoginBloc = false;\r\n }\r\n }\r\n]);\r\n","AgrimarketControllers.controller('UnsubscribeNewsMarketInfoController', ['$scope', '$rootScope',\r\n function ($scope, $rootScope) {\r\n $scope.errorMessage = $rootScope.errorMessageUnsubscribeNewsMarketInfoByIdExt;\r\n }\r\n]);\r\n","AgrimarketControllers.controller('siteUnavailableController', ['$scope', '$rootScope', 'configurationFactory','$filter',\r\nfunction ($scope, $rootScope, configurationFactory, $filter) {\r\n $rootScope.skin = configurationFactory.Skin;\r\n if (configurationFactory.Skin.skinMultiple) {\r\n var skin = $filter('filter')(configurationFactory.Skin.skinMultiple, { urlLogin: window.location.href }, true)[0];\r\n if (skin)\r\n $rootScope.skin = skin;\r\n }\r\n}]);","AgrimarketControllers.controller('disableSubscriptionController', ['$scope', '$rootScope', 'configurationFactory','$filter',\r\n function ($scope, $rootScope, configurationFactory, $filter) {\r\n\r\n}]);","AgrimarketControllers.controller('ValidateCGUController', ['$scope', '$rootScope', '$location', 'userService', 'parametersFactory', 'configurationFactory', 'currentUserFactory',\r\n function ($scope, $rootScope, $location, userService, parametersFactory, configurationFactory, currentUserFactory) {\r\n\r\n $scope.errorMessage = \"\";\r\n $scope.title = \"Connexion\";\r\n\r\n $scope.cgu = {\r\n Accepted: false,\r\n bPdfCGU: false,\r\n bPdfPrivacyPolicy: false,\r\n UrlCGU: null,\r\n UrlPrivacyPolicy: null,\r\n IdUserToValidate: $rootScope.IdUserToValidateCGU,\r\n ReceiveNewsMarketInfo: null\r\n };\r\n\r\n $scope.bAskAuthorizeSendMail = parametersFactory.Parameters.bAskAuthorizeSendMail && parametersFactory.Parameters.bAskAuthorizeSendMail.Value;\r\n\r\n var init = function () {\r\n if (parametersFactory && parametersFactory.Parameters && parametersFactory.Parameters.FileTermeUse && parametersFactory.Parameters.FileTermeUse.Value) {\r\n $scope.cgu.bPdfCGU = true;\r\n $scope.cgu.UrlCGU = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + parametersFactory.Parameters.FileTermeUse.Value;\r\n }\r\n if (parametersFactory && parametersFactory.Parameters && parametersFactory.Parameters.FilePrivacyPolicy && parametersFactory.Parameters.FilePrivacyPolicy.Value) {\r\n $scope.cgu.bPdfPrivacyPolicy = true;\r\n $scope.cgu.UrlPrivacyPolicy = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + parametersFactory.Parameters.FilePrivacyPolicy.Value;\r\n }\r\n };\r\n\r\n $scope.Validate = function () {\r\n if (!$scope.cgu.Accepted) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_ValidateCGU_NotAccepted.Content;\r\n }\r\n else if ($scope.cgu.ReceiveNewsMarketInfo === null && $scope.bAskAuthorizeSendMail === \"1\") {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_ValidateCGU_ReceiveNewsMarketInfo_NotSelected.Content;\r\n } else {\r\n userService.SaveValidatedCGU($scope.cgu.IdUserToValidate, $scope.cgu.ReceiveNewsMarketInfo !== null ? $scope.cgu.ReceiveNewsMarketInfo : '', function (data, status) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n sessionStorage.setItem(\"hasValidateCGU\", true);\r\n $location.path(\"/login\");\r\n }\r\n });\r\n }\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n init();\r\n };\r\n\r\n init();\r\n }\r\n]);\r\n","AgrimarketControllers.controller('backdoorController', [\r\n '$scope', '$location', '$rootScope', 'backdoorService', 'enumFactory', 'configurationFactory', function ($scope, $location, $rootScope, backdoorService, enumFactory, configurationFactory) {\r\n\r\n $scope.loginbackdoorErrorMessage = \"\";\r\n $rootScope.AuthorizedBackdoor = false;\r\n $rootScope.skin = configurationFactory.Skin;\r\n $rootScope.loading = false;\r\n\r\n if ($location.protocol().indexOf(\"https\") !== -1) {\r\n for (var url in configurationFactory.Url) {\r\n configurationFactory.Url[url] = configurationFactory.Url[url].replace(\"http:\", \"https:\");\r\n }\r\n }\r\n\r\n $scope.LogToBackdoor = function () {\r\n $rootScope.loading = true;\r\n if (($scope.backPassword !== null && $scope.backPassword !== undefined) && ($scope.backLogin !== null && $scope.backLogin !== undefined)) {\r\n backdoorService.LogBackdoor($scope.backLogin, $scope.backPassword, function(dataProfile, statusProfile) {\r\n if (statusProfile !== null) {\r\n if (statusProfile === 400) {\r\n $scope.loginbackdoorErrorMessage = dataProfile[0].errors[0].Message;\r\n $scope.backPassword = null;\r\n $rootScope.loading = false;\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n $rootScope.AuthorizedBackdoor = true;\r\n\r\n sessionStorage.setItem(\"UsersActived\", dataProfile.NbUserActived);\r\n sessionStorage.setItem(\"LOG_AVIV\", true);\r\n var allConnections = dataProfile.Connection;\r\n var allUsers = []; \r\n var allTc = [];\r\n var allAdmin = [];\r\n\r\n //Insert a item to the first index into the list\r\n dataProfile.User.unshift({\r\n \"IdUser\": 0,\r\n \"FullName\": '------ Sélectionner ------'\r\n });\r\n\r\n if(allConnections !== null)\r\n allConnections.unshift({\r\n \"IdConnection\": 0,\r\n \"FullName\": '------ Sélectionner ------'\r\n });\r\n\r\n dataProfile.User.forEach(function (item) {\r\n //User profile\r\n if (item.IdRole === enumFactory.Roles.User || item.IdUser === 0)\r\n allUsers.push(item);\r\n //Tc profile\r\n if (item.IdRole === enumFactory.Roles.TC || item.IdUser === 0)\r\n allTc.push(item);\r\n //Admin profile\r\n if (item.IdRole === enumFactory.Roles.Admin || item.IdUser === 0)\r\n allAdmin.push(item);\r\n });\r\n\r\n $rootScope.allUsers = allUsers;\r\n $rootScope.allConnections = allConnections;\r\n $rootScope.allTc = allTc;\r\n $rootScope.allAdmin = allAdmin;\r\n $location.path(\"backdoor/profile\");\r\n }\r\n });\r\n } else {\r\n $scope.loading = false;\r\n $scope.loginbackdoorErrorMessage = \"Veuillez renseigner un login/mot de passe\";\r\n }\r\n };\r\n\r\n $scope.resetErrorMessage = function () {\r\n if ($scope.loginbackdoorErrorMessage.length > 0)\r\n $scope.loginbackdoorErrorMessage = \"\";\r\n };\r\n\r\n }]);","AgrimarketControllers.controller('resetPasswordController', ['$scope', '$routeParams', 'configurationFactory', '$rootScope', 'currentUserFactory',\r\n function ($scope, $routeParams, configurationFactory, $rootScope, currentUserFactory) {\r\n\r\n $scope.errorResetPasswordMessage = '';\r\n $scope.resetPasswordMessage = '';\r\n $rootScope.currentUserRole = '';\r\n currentUserFactory.User = null;\r\n currentUserFactory.Connection = null;\r\n $rootScope.skin = configurationFactory.Skin;\r\n $rootScope.isLogged = false;\r\n $rootScope.loading = false;\r\n $scope.keyPassword = $routeParams.keyPassword;\r\n $rootScope.$broadcast(\"$destroy\");\r\n sessionStorage.clear();\r\n }]);","AgrimarketControllers.controller('editableController', ['$scope', '$http', '$location', '$routeParams', 'configurationFactory', '$rootScope', 'editableObjectsService', 'enumFactory', 'userTableService', 'typeOrdersService', 'elementInfoMarketHomePagesService', '$sce', '$filter', '$compile', '$timeout', 'typeFixationsService',\r\n function ($scope, $http, $location, $routeParams, configurationFactory, $rootScope, editableObjectsService, enumFactory, userTableService, typeOrdersService, elementInfoMarketHomePagesService, $sce, $filter, $compile, $timeout, typeFixationsService) {\r\n\r\n //popup simple\r\n $rootScope.openPopEditable = function (key, textDefault) {\r\n if (!$rootScope.modeEdition) {\r\n return;\r\n }\r\n $scope.editableErrorMessage = \"\";\r\n $rootScope.editableObject = $rootScope.editableObjectsFactory.getItemByKey(key);\r\n if ($rootScope.editableObject === undefined)\r\n $rootScope.editableObject = { 'IdEditableObject': 0, 'Key': key, 'IsVisible': true, 'IdTypeEditableObject': enumFactory.IdTypeEditableObject.Texte, 'Content': textDefault };\r\n $rootScope.editableObjectBeforeChange = angular.copy($rootScope.editableObjectsFactory.getItemByKey(key));\r\n var titlePopUp = $rootScope.editableObjectBeforeChange ? $rootScope.editableObjectBeforeChange.Content : textDefault;\r\n $(\"#popEditable\").css(\"display\", \"block\");\r\n $(\"#popEditable\").dialog({\r\n title: \"Edition du champ : \" + titlePopUp,\r\n modal: false,\r\n create: function () {\r\n $(this).closest('div.ui-dialog')\r\n .find('.ui-dialog-titlebar-close')\r\n .click(function (e) {\r\n $scope.ClosePopEditable(true);\r\n $scope.$apply();\r\n e.preventDefault();\r\n });\r\n }\r\n });\r\n };\r\n\r\n $scope.SaveDataPopEditable = function () {\r\n var dataToApi = {\r\n IdEditableObject: $rootScope.editableObject.IdEditableObject,\r\n IdTypeEditableObject: $rootScope.editableObject.IdTypeEditableObject,\r\n Content: $rootScope.editableObject.Content,\r\n Key: $rootScope.editableObject.Key,\r\n IsVisible: $rootScope.editableObject.IsVisible\r\n };\r\n editableObjectsService.SaveEditableObject(dataToApi, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.editableErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $rootScope.editableObjectsFactory.EditableObjects[data.Key] = { 'IdEditableObject': data.IdEditableObject, 'Content': data.Content, 'IsVisible': data.IsVisible, 'ContentDefault': data.ContentDefault, 'IdTypeEditableObject': data.IdTypeEditableObject };\r\n $scope.ClosePopEditable(false);\r\n }\r\n });\r\n };\r\n\r\n $scope.ClosePopEditable = function (cancel) {\r\n if (cancel) {\r\n if ($rootScope.editableObjectBeforeChange !== undefined) {\r\n $rootScope.editableObject.Content = $rootScope.editableObjectBeforeChange.Content;\r\n $rootScope.editableObject.IsVisible = $rootScope.editableObjectBeforeChange.IsVisible;\r\n }\r\n }\r\n $(\"#popEditable\").dialog(\"close\");\r\n };\r\n //fin popupsimple\r\n\r\n //popup titre graphique\r\n $rootScope.openPopEditableGraph = function (key, textDefault) {\r\n if (!$rootScope.modeEdition) {\r\n return;\r\n }\r\n $scope.editableErrorMessage = \"\";\r\n $rootScope.editableObject = $rootScope.editableObjectsFactory.getItemByKey(key);\r\n if ($rootScope.editableObject === undefined)\r\n $rootScope.editableObject = { 'IdEditableObject': 0, 'Key': key, 'IsVisible': true, 'IdTypeEditableObject': enumFactory.IdTypeEditableObject.Texte, 'Content': textDefault };\r\n $rootScope.editableObjectBeforeChange = angular.copy($rootScope.editableObjectsFactory.getItemByKey(key));\r\n var titlePopUp = $rootScope.editableObjectBeforeChange ? $rootScope.editableObjectBeforeChange.Content : textDefault;\r\n $(\"#popEditableGraph\").css(\"display\", \"block\");\r\n $(\"#popEditableGraph\").dialog({\r\n title: \"Edition du champ : \" + titlePopUp,\r\n modal: false,\r\n create: function () {\r\n $(this).closest('div.ui-dialog')\r\n .find('.ui-dialog-titlebar-close')\r\n .click(function (e) {\r\n $scope.ClosePopEditableGraph(true);\r\n $scope.$apply();\r\n e.preventDefault();\r\n });\r\n }\r\n });\r\n };\r\n\r\n $scope.SaveDataPopEditableGraph = function () {\r\n var dataToApi = {\r\n IdEditableObject: $rootScope.editableObject.IdEditableObject,\r\n IdTypeEditableObject: $rootScope.editableObject.IdTypeEditableObject,\r\n Content: $rootScope.editableObject.Content,\r\n Key: $rootScope.editableObject.Key,\r\n IsVisible: $rootScope.editableObject.IsVisible\r\n };\r\n editableObjectsService.SaveEditableObject(dataToApi, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.editableErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $rootScope.editableObjectsFactory.EditableObjects[data.Key] = { 'IdEditableObject': data.IdEditableObject, 'Content': data.Content, 'IsVisible': data.IsVisible, 'ContentDefault': data.ContentDefault, 'IdTypeEditableObject': data.IdTypeEditableObject };\r\n $scope.ClosePopEditableGraph(false);\r\n window.location.reload();\r\n }\r\n });\r\n };\r\n\r\n $scope.ClosePopEditableGraph = function (cancel) {\r\n if (cancel) {\r\n if ($rootScope.editableObjectBeforeChange !== undefined) {\r\n $rootScope.editableObject.Content = $rootScope.editableObjectBeforeChange.Content;\r\n $rootScope.editableObject.IsVisible = $rootScope.editableObjectBeforeChange.IsVisible;\r\n }\r\n }\r\n $(\"#popEditableGraph\").dialog(\"close\");\r\n };\r\n //fin titre graphique\r\n\r\n //popup super table directive\r\n $rootScope.openPopEditableTable = function (idDefaultTable) {\r\n if (!$rootScope.modeEdition) {\r\n return;\r\n }\r\n $scope.editableTableErrorMessage = \"\";\r\n $(\"#popEditableTable\").css(\"display\", \"block\");\r\n $(\"#popEditableTable\").dialog({\r\n title: $rootScope.globalLabels.Edit_Table,\r\n modal: false,\r\n width: '50%',\r\n position: { my: \"center\", at: \"center\", of: window },\r\n create: function () {\r\n $(this).closest('div.ui-dialog')\r\n .find('.ui-dialog-titlebar-close')\r\n .click(function (e) {\r\n $scope.ClosePopEditableTable(true);\r\n $scope.$apply();\r\n e.preventDefault();\r\n });\r\n }\r\n });\r\n\r\n var initPopEditableTableScope = function () {\r\n $scope.idDefaultTable = idDefaultTable;\r\n userTableService.GetTableById(idDefaultTable, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.editableTableErrorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.editableTableErrorMessage = data;\r\n } else {\r\n setScopeColumns(data);\r\n }\r\n });\r\n };\r\n\r\n initPopEditableTableScope();\r\n };\r\n\r\n $scope.SaveDataPopEditableTable = function () {\r\n if (checkDataEditableTable()) {\r\n var columns = angular.copy($scope.columns);\r\n angular.forEach(columns, function (column, index) {\r\n column.order = Number(column.order);\r\n column.label = $scope.oldColumns[index].order + \"#\" + column.label;\r\n });\r\n \r\n var columnsFiltered = $filter('filter')(columns, { isVisible: true });\r\n columnsFiltered = $filter('orderBy')(columnsFiltered, 'order');\r\n\r\n var dataVisible = '';\r\n var columnName = '';\r\n columnsFiltered.forEach(function (item) {\r\n dataVisible += item.databaseVar + ',';\r\n columnName += item.label + ',';\r\n });\r\n if (dataVisible.length > 0)\r\n dataVisible = dataVisible.slice(0, -1);\r\n if (columnName.length > 0)\r\n columnName = columnName.slice(0, -1);\r\n\r\n var dataToApi = {\r\n IdDefaultTable: $scope.idDefaultTable,\r\n DataVisible: dataVisible,\r\n ColumnName: columnName\r\n };\r\n\r\n userTableService.PutColumn(dataToApi, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.editableTableErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n setScopeColumns(data);\r\n $scope.ClosePopEditableTable();\r\n window.location.reload();\r\n\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.ClosePopEditableTable = function () {\r\n $(\"#popEditableTable\").dialog(\"close\");\r\n };\r\n\r\n var checkDataEditableTable = function () {\r\n var columns = $filter('filter')($scope.columns, { isVisible: true });\r\n if (columns.length === 0) {\r\n $scope.editableTableErrorMessage = \"Il faut au moins rendre une colonne visible.\";\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n var setScopeColumns = function (data) {\r\n var tabColumnNameDefault = data.ColumnNameDefault.split(\",\");\r\n var tabDataVisibleDefault = data.DataVisibleDefault.split(\",\");\r\n var tabDataVisible = data.DataVisible.split(\",\");\r\n var tabColumnName = data.ColumnName.split(\",\");\r\n $scope.columns = [];\r\n\r\n tabDataVisibleDefault.forEach(function (item, index) {\r\n var indexLabel = tabDataVisible.indexOf(item);\r\n var indexLabelDefault = tabDataVisibleDefault.indexOf(item);\r\n var label = \"\";\r\n if (indexLabel !== -1) {\r\n label = tabColumnName[indexLabel];\r\n labelDefault = tabColumnNameDefault[indexLabelDefault];\r\n } else {\r\n label = tabColumnNameDefault[index];\r\n labelDefault = tabColumnNameDefault[indexLabelDefault];\r\n }\r\n var column = { labelDefault: labelDefault, label: label, databaseVar: item, isVisible: tabDataVisible.indexOf(tabDataVisibleDefault[index]) !== -1 };\r\n \r\n if (tabDataVisible.indexOf(tabDataVisibleDefault[index]) !== -1) {\r\n column.order = \"\" + (tabDataVisible.indexOf(tabDataVisibleDefault[index]) + 1);\r\n }\r\n\r\n $scope.columns.push(column);\r\n });\r\n\r\n $scope.oldColumns = angular.copy($scope.columns);\r\n };\r\n //fin popup super table directive\r\n\r\n //popup super menu directive\r\n $rootScope.openPopEditableMenu = function (key) {\r\n if (!$rootScope.modeEdition) {\r\n return;\r\n }\r\n $scope.editableMenuErrorMessage = \"\";\r\n //$(\"#popEditableMenu\").css(\"display\", \"block\");\r\n var initPopEditableMenucope = function () {\r\n $scope.key = key;\r\n editableObjectsService.GetEditableMenuByKey(key, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.editableMenuErrorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.editableMenuErrorMessage = data;\r\n } else {\r\n $scope.menus = data;\r\n $timeout(function () {\r\n $(\"#popEditableMenu\").dialog({\r\n title: \"Modification des menus \",\r\n modal: false,\r\n width: '50%',\r\n position: { my: \"center\", at: \"center\", of: window },\r\n create: function () {\r\n $(this).closest('div.ui-dialog')\r\n .find('.ui-dialog-titlebar-close')\r\n .click(function (e) {\r\n $scope.ClosePopEditableMenu(true);\r\n $scope.$apply();\r\n e.preventDefault();\r\n });\r\n }\r\n });\r\n }, 0);\r\n\r\n }\r\n });\r\n };\r\n\r\n initPopEditableMenucope();\r\n };\r\n\r\n var checkDataEditableMenu = function () {\r\n var columns = $filter('filter')($scope.menus, { Visible: true });\r\n if (columns.length === 0) {\r\n $scope.editableMenuErrorMessage = \"Il faut au moins rendre une colonne visible.\";\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.SaveDataPopEditableMenu = function () {\r\n if (checkDataEditableMenu()) {\r\n var menus = $filter('orderBy')($scope.menus, 'Position');\r\n var data = [];\r\n\r\n menus.forEach(function (item) {\r\n data.push({\r\n Key: item.Key,\r\n IdEditableObject: item.IdEditableObject,\r\n Position: item.Position,\r\n IsVisible: item.Visible,\r\n Content: item.Label\r\n });\r\n\r\n if (item.PagesEditableVms.length) {\r\n item.PagesEditableVms.forEach(function (subMenu) {\r\n data.push({\r\n Key: subMenu.Key,\r\n IdEditableObject: subMenu.IdEditableObject,\r\n Position: subMenu.Position,\r\n IsVisible: subMenu.Visible,\r\n Content: subMenu.Label\r\n });\r\n });\r\n }\r\n });\r\n\r\n\r\n\r\n editableObjectsService.SaveEditableObjects(data, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.editableMenuErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.ClosePopEditableMenu();\r\n window.location.reload();\r\n\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.ClosePopEditableMenu = function () {\r\n $(\"#popEditableMenu\").dialog(\"close\");\r\n };\r\n //fin popup super menu directive\r\n\r\n //popup enum directive\r\n $rootScope.openPopEditableEnum = function (key) {\r\n if (!$rootScope.modeEdition) {\r\n return;\r\n }\r\n $scope.editableEnumErrorMessage = \"\";\r\n $(\"#popEditableEnum\").css(\"display\", \"block\");\r\n $(\"#popEditableEnum\").dialog({\r\n title: $rootScope.globalLabels.Edit_Actions,\r\n modal: false,\r\n width: '50%',\r\n position: { my: \"center\", at: \"center\", of: window },\r\n create: function () {\r\n $(this).closest('div.ui-dialog')\r\n .find('.ui-dialog-titlebar-close')\r\n .click(function (e) {\r\n $scope.ClosePopEditableEnum(true);\r\n $scope.$apply();\r\n e.preventDefault();\r\n });\r\n }\r\n });\r\n $scope.enumKey = key;\r\n var enumObjects = [];\r\n if (key === \"Action\" || key === \"ActionOption\" || key === \"CommitmentAction\" || key === \"ProductAndTypeCommitAction\" || key === \"UsersOfTcActions\" || key === \"OfferActions\") {\r\n angular.forEach(Object.keys(enumFactory[key]), function (enumKey) {\r\n var enumObject = { text: enumFactory[key][enumKey].ContentDefault, key: enumFactory[key][enumKey].EditableKey, type: enumFactory[key][enumKey].ContentDefault };\r\n enumObjects.push(enumObject);\r\n });\r\n }\r\n else if (key === \"TypeOrders\") {\r\n angular.forEach(Object.keys(enumFactory[key]), function (enumKey) {\r\n var enumObject = { type: enumFactory[key][enumKey].Label, text: enumFactory[key][enumKey].LabelAction, id: enumFactory[key][enumKey].IdTypeOrder };\r\n enumObjects.push(enumObject);\r\n });\r\n }\r\n else if (key === \"TypeFixations\") {\r\n angular.forEach(Object.keys(enumFactory[key]), function (enumKey) {\r\n var enumObject = { type: enumFactory[key][enumKey].Label, text: enumFactory[key][enumKey].LabelAction, id: enumFactory[key][enumKey].IdTypeFixation };\r\n enumObjects.push(enumObject);\r\n });\r\n }\r\n else if (key === \"SubscribeActions\") {\r\n angular.forEach(Object.keys(enumFactory[key]), function (enumKey) {\r\n var enumObject = { type: enumFactory[key][enumKey].LabelDefault, text: enumFactory[key][enumKey].Label, id: enumFactory[key][enumKey].IdTypeOrder, idTypeFixation: enumFactory[key][enumKey].IdTypeFixation };\r\n enumObjects.push(enumObject);\r\n });\r\n }\r\n $scope.enumObjects = enumObjects;\r\n };\r\n\r\n\r\n $scope.SaveDataPopEditableEnum = function () {\r\n var texts = $filter('filter')($scope.enumObjects, function (item) { return !item.text; });\r\n if (texts.length > 0) {\r\n $scope.editableEnumErrorMessage = \"Il faut saisir tous les textes.\";\r\n return false;\r\n }\r\n\r\n var data = [];\r\n if ($scope.enumKey === \"Action\" || $scope.enumKey === \"ActionOption\" || $scope.enumKey === \"CommitmentAction\" || $scope.enumKey === \"ProductAndTypeCommitAction\" || $scope.enumKey === \"UsersOfTcActions\" || $scope.enumKey === \"OfferActions\") {\r\n angular.forEach($scope.enumObjects, function (enumObject) {\r\n var dto = { Content: enumObject.text, Key: enumObject.key };\r\n data.push(dto);\r\n });\r\n editableObjectsService.UpdateContentEditableObject(data, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.editableEnumErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.ClosePopEditableEnum();\r\n window.location.reload();\r\n }\r\n });\r\n }\r\n else if ($scope.enumKey === \"TypeOrders\") {\r\n angular.forEach($scope.enumObjects, function (enumObject) {\r\n var dto = { TypeOrderLabel: enumObject.type, LabelAction: enumObject.text, IdTypeOrder: enumObject.id };\r\n data.push(dto);\r\n });\r\n\r\n typeOrdersService.PutTypeOrderLabelAction(data, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.editableEnumErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.ClosePopEditableEnum();\r\n window.location.reload();\r\n }\r\n });\r\n }\r\n else if ($scope.enumKey === \"TypeFixations\") {\r\n angular.forEach($scope.enumObjects, function (enumObject) {\r\n var dto = { IdTypeFixation: enumObject.id, Label: enumObject.text };\r\n data.push(dto);\r\n });\r\n\r\n typeFixationsService.PutTypeFixationLabelAction(data, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.editableEnumErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.ClosePopEditableEnum();\r\n window.location.reload();\r\n }\r\n });\r\n }\r\n else if ($scope.enumKey === \"SubscribeActions\") {\r\n angular.forEach($scope.enumObjects, function (enumObject) {\r\n var dto = { IdTypeOrder: enumObject.id, IdTypeFixation: enumObject.idTypeFixation, TypeOrderLabel: enumObject.type, LabelAction: enumObject.text };\r\n data.push(dto);\r\n });\r\n\r\n typeOrdersService.PutSubscribeActionLabels(data, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.editableEnumErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.ClosePopEditableEnum();\r\n window.location.reload();\r\n }\r\n });\r\n }\r\n return true;\r\n };\r\n\r\n $scope.ClosePopEditableEnum = function () {\r\n $(\"#popEditableEnum\").dialog(\"close\");\r\n };\r\n //fin popup enum directive\r\n\r\n //popup block directive\r\n $rootScope.openPopEditableBlock = function () {\r\n if (!$rootScope.modeEdition) {\r\n return;\r\n }\r\n $scope.editableBlockErrorMessage = \"\";\r\n $(\"#popEditableBlock\").css(\"display\", \"block\");\r\n $(\"#popEditableBlock\").dialog({\r\n title: $rootScope.globalLabels.Edit_Blocks,\r\n modal: false,\r\n width: '50%',\r\n position: { my: \"center\", at: \"center\", of: window },\r\n create: function () {\r\n $(this).closest('div.ui-dialog')\r\n .find('.ui-dialog-titlebar-close')\r\n .click(function (e) {\r\n $scope.ClosePopEditableBlock(true);\r\n $scope.$apply();\r\n e.preventDefault();\r\n });\r\n }\r\n });\r\n var blockObjects = [];\r\n\r\n if ($rootScope.ModuleHashtagri.Active) {\r\n angular.forEach(Object.keys(enumFactory['ElementsInfoMarketHomePage']), function (blockKey) {\r\n var blockObject = { typeBloc: enumFactory['ElementsInfoMarketHomePage'][blockKey].LabelDefault, text: enumFactory['ElementsInfoMarketHomePage'][blockKey].Label, id: enumFactory['ElementsInfoMarketHomePage'][blockKey].IdElementInfoMarketHomePage, typeObject: 'ElementInfoMarketHomePages' };\r\n blockObjects.push(blockObject);\r\n });\r\n }\r\n\r\n //On ajoute le titre actualité\r\n var blockObject = { typeBloc: $rootScope.editableObjectsFactory.EditableObjects.NewsTitle.ContentDefault, text: $rootScope.editableObjectsFactory.EditableObjects.NewsTitle.Content, id: $rootScope.editableObjectsFactory.EditableObjects.NewsTitle.IdEditableObject, typeObject: 'EditableObjects' };\r\n blockObjects.push(blockObject);\r\n\r\n //On ajoute le titre carousel\r\n var blockObjectCarousel = { typeBloc: $rootScope.editableObjectsFactory.EditableObjects.CarouselTitle.ContentDefault, text: $rootScope.editableObjectsFactory.EditableObjects.CarouselTitle.Content, id: $rootScope.editableObjectsFactory.EditableObjects.CarouselTitle.IdEditableObject, typeObject: 'EditableObjects' };\r\n blockObjects.push(blockObjectCarousel);\r\n $scope.blockObjects = blockObjects;\r\n };\r\n\r\n $scope.SaveDataPopEditableBlock = function () {\r\n var texts = $filter('filter')($scope.blockObjects, function (item) { return !item.text; });\r\n if (texts.length > 0) {\r\n $scope.editableBlockErrorMessage = \"Il faut saisir tous les textes.\";\r\n return false;\r\n }\r\n\r\n var dataElementInfoMarketHomePages = [];\r\n var dataEditableObjects = [];\r\n angular.forEach($scope.blockObjects, function (blockObject) {\r\n if (blockObject.typeObject === \"ElementInfoMarketHomePages\") {\r\n var dataToPush = { IdElementInfoMarketHomePage: blockObject.id, Label: blockObject.text, LabelDefault: blockObject.typeBloc };\r\n dataElementInfoMarketHomePages.push(dataToPush);\r\n }\r\n if (blockObject.typeObject === \"EditableObjects\") {\r\n var dataToPushEditableObject = {\r\n IdEditableObject: blockObject.id,\r\n Content: blockObject.text,\r\n };\r\n dataEditableObjects.push(dataToPushEditableObject);\r\n }\r\n\r\n });\r\n\r\n elementInfoMarketHomePagesService.PutElementInfoMarketHomePageLabel(dataElementInfoMarketHomePages, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.editableBlockErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n editableObjectsService.UpdateContentEditableObject(dataEditableObjects, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.editableBlockErrorMessage += $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.ClosePopEditableBlock();\r\n window.location.reload();\r\n }\r\n });\r\n }\r\n });\r\n return true;\r\n };\r\n\r\n $scope.ClosePopEditableBlock = function () {\r\n $(\"#popEditableBlock\").dialog(\"close\");\r\n };\r\n //fin popup block directive\r\n\r\n }]);","AgrimarketDirectives.directive('refresh', function() {\r\n\treturn function(scope, iElement, iAttrs) {\r\n\r\n\t\t$(document).bind(\"keydown\", function(e) {\r\n\t\t\tif ((e.which || e.keyCode) == 116) {\r\n\t\t\t\te.preventDefault();\r\n\t\t\t\ttry {\r\n\t\t\t\t\tscope[iAttrs.refreshOnrefresh]();\r\n\t\t\t\t} catch(g) {\r\n\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\t\r\n});","//Directive permettant de convertir les nombres à virgules en points\r\n\r\nAgrimarketDirectives.directive('smartFloat', function () {\r\n\tvar FLOAT_REGEXP = /^\\-?\\d+((\\.|\\,)\\d+)?$/;\r\n\treturn {\r\n\t\trequire: 'ngModel',\r\n\t\tlink: function (scope, elm, attrs, ctrl) {\r\n\t\t\tctrl.$parsers.unshift(function (viewValue) {\r\n\t\t\t\tif (FLOAT_REGEXP.test(viewValue)) {\r\n\t\t\tctrl.$setValidity('float', true);\r\n\t\t\t\t\tif (typeof viewValue === \"number\")\r\n\t\t\t\t\t\treturn viewValue;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\treturn parseFloat(viewValue.replace(',', '.'));\r\n\t\t\t\t} else {\r\n\t\t\t\t\tctrl.$setValidity('float', false);\r\n\t\t\t\t\treturn undefined;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\t\r\n});","/*\r\n* Directive de gestion d'upload de fichier\r\n*\t3 parametres sont necessaire :\r\n\t\t-percentValue : pourcentage du telechargement en temps réel\r\n\t\t-fileNameValue : nom du fichier a faire apparaitre\r\n\t\t-errorValue : objet ou stocker les erreurs\r\n* 2 fonctions sont nécéssaires:\r\n* -uploadFunctionName: nom de la fonction pour lancer l'upload\r\n*\t\t-deleteFunctionName: Nom de la fonction pour supprimer l'upload\r\n*\t\t-uploadFinishFunction : Fonction a lancer apres l'upload du fichier \r\n*\t\t-buttonFunctionName : Fonction appler par un bouton qui lance l'explorateur (si on desire avoir un simple bouton plutot qu'un input type file)\r\n*\r\n*/\r\n\r\nAgrimarketDirectives.directive('uploadfile', ['$timeout', '$upload', 'configurationFactory', 'uploadService',\r\n\tfunction($timeout, $upload, configurationFactory, uploadService) {\r\n\t\treturn {\r\n\t\t\tlink: function(scope, iElement, iAttrs) {\r\n\r\n\r\n\t\t\t\tif (iAttrs.fileNameValue !== undefined && iAttrs.fileNameValue !== null && iAttrs.fileNameValue !== \"\") {\r\n\t\t\t\t\tif (scope[iAttrs.fileNameValue] === undefined || scope[iAttrs.fileNameValue] === null || scope[iAttrs.fileNameValue] === \"\") {\r\n\t\t\t\t\t\tscope[iAttrs.fileNameValue] = '';\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (iAttrs.percentValue !== undefined && iAttrs.percentValue !== null && iAttrs.percentValue !== \"\") {\r\n\t\t\t\t\tscope[iAttrs.percentValue] = '';\r\n\t\t\t\t}\r\n\t\t\t\tif (iAttrs.linkFileValue !== undefined && iAttrs.linkFileValue !== null && iAttrs.linkFileValue !== \"\") {\r\n\t\t\t\t\tscope[iAttrs.linkFileValue] = '';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (iAttrs.buttonFunctionName !== undefined && iAttrs.buttonFunctionName !== null && iAttrs.buttonFunctionName !== \"\") {\r\n\t\t\t\t\tscope[iAttrs.buttonFunctionName] = function(idInput) {\r\n\t\t\t\t\t\t$(\"#\" + idInput).click();\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\r\n\t\t\t\tscope[iAttrs.uploadFunctionName] = function($files) {\r\n\r\n\t\t\t\t\tvar upload = function(i, $file) {\r\n\r\n\t\t\t\t\t\t$upload.upload({\r\n\t\t\t\t\t\t\turl: configurationFactory.Url['Api'] + 'Upload/Upload', // webapi url\r\n\t\t\t\t\t\t\tmethod: \"POST\",\r\n\t\t\t\t\t\t\tparams: { idAttachment: !scope[iAttrs.modelIdAttachement] || isNaN(scope[iAttrs.modelIdAttachement]) ? -1 : scope[iAttrs.modelIdAttachement] },\r\n\t\t\t\t\t\t\tfile: $file\r\n\t\t\t\t\t\t}).progress(function(evt) {\r\n\t\t\t\t\t\t\t// get upload percentage\r\n\t\t\t\t\t\t\tif (iAttrs.percentValue !== undefined && iAttrs.percentValue !== null && iAttrs.percentValue !== \"\") {\r\n\t\t\t\t\t\t\t\tscope[iAttrs.percentValue] = parseInt(100.0 * evt.loaded / evt.total) + '%';\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}).success(function(data) {\r\n\t\t\t\t\r\n\t\t\t\t\t\t\tif (iAttrs.fileNameValue !== undefined && iAttrs.fileNameValue !== null && iAttrs.fileNameValue !== \"\") {\r\n\t\t\t\t\t\t\t\tscope[iAttrs.fileNameValue] = data.PublicLabel;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (iAttrs.listAttachment !== undefined && iAttrs.listAttachment !== null && iAttrs.listAttachment !== \"\") {\r\n\t\t\t\t\t\t\t\tscope[iAttrs.listAttachment].push(data);\r\n }\r\n\r\n // file is uploaded successfully\r\n if (iAttrs.uploadFinishFunction !== undefined && iAttrs.uploadFinishFunction !== null && iAttrs.uploadFinishFunction !== \"\") {\r\n scope[iAttrs.uploadFinishFunction](data);\r\n }\r\n\t\t\t\t\t\t}).error(function(data) {\r\n\t\t\t\t\t\t\tif (iAttrs.errorValue !== undefined && iAttrs.errorValue !== null && iAttrs.errorValue !== \"\") {\r\n\t\t\t\t\t\t\t\tscope[iAttrs.errorValue] = data;\r\n }\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tfor (var i = 0; i < $files.length; i++) {\r\n\t\t\t\t\t\tvar $file = $files[i];\r\n\t\t\t\t\t\t//(function (index) {\r\n\r\n\t\t\t\t\t\tif (iAttrs.fileNameValue !== undefined && iAttrs.fileNameValue !== null && iAttrs.fileNameValue !== \"\") {\r\n\t\t\t\t\t\t\tscope[iAttrs.fileNameValue] = '';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (iAttrs.percentValue !== undefined && iAttrs.percentValue !== null && iAttrs.percentValue !== \"\") {\r\n\t\t\t\t\t\t\tscope[iAttrs.percentValue] = '';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (iAttrs.linkFileValue !== undefined && iAttrs.linkFileValue !== null && iAttrs.linkFileValue !== \"\") {\r\n\t\t\t\t\t\t\tscope[iAttrs.linkFileValue] = '';\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tupload(i, $file);\r\n\t\t\t\t\t\t//})(i);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t};\r\n\r\n\t\t\t\tscope[iAttrs.deleteFunctionName] = function (idAttachement) {\r\n\t\t\t\t\tvar item = scope[iAttrs.listAttachment].filter(function (elem) {\r\n\t\t\t\t\t\treturn elem.IdAttachment == idAttachement;\r\n\t\t\t\t\t})[0];\r\n\t\t\t\t\tuploadService.DeleteUpload(idAttachement, function(data, status) {\r\n\t\t\t\t\t\tif (status === undefined || status === null) {\r\n\t\t\t\t\t\t\tscope[iAttrs.listAttachment].splice(scope[iAttrs.listAttachment].indexOf(item), 1);\r\n\t\t\t\t\t\t\tif (iAttrs.fileNameValue !== undefined && iAttrs.fileNameValue !== null && iAttrs.fileNameValue !== \"\") {\r\n\t\t\t\t\t\t\t\tscope[iAttrs.fileNameValue] = '';\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (iAttrs.percentValue !== undefined && iAttrs.percentValue !== null && iAttrs.percentValue !== \"\") {\r\n\t\t\t\t\t\t\t\tscope[iAttrs.percentValue] = '';\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tif (iAttrs.linkFileValue !== undefined && iAttrs.linkFileValue !== null && iAttrs.linkFileValue !== \"\") {\r\n\t\t\t\t\t\t\t\tscope[iAttrs.linkFileValue] = '';\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t} else if (status == 400) {\r\n\t\t\t\t\t\t\tif (iAttrs.errorValue !== undefined && iAttrs.errorValue !== null && iAttrs.errorValue !== \"\") {\r\n\t\t\t\t\t\t\t\tscope[iAttrs.errorValue] = data[0].errors[0].Message;\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tif (iAttrs.errorValue !== undefined && iAttrs.errorValue !== null && iAttrs.errorValue !== \"\") {\r\n\t\t\t\t\t\t\t\t\tscope[iAttrs.errorValue] = status;\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t};\r\n\t}]);","/*\r\n* Directive d'ouverture de pop up de confirmation\r\n*\t2 parametres sont nécéssaire :\r\n*\t- confirmMessage : text du boutton de confirmation\r\n*\t- cancelMessage : text du bouton d'annulation\r\n*\r\n* 2 fonctions sont nécéssaires:\r\n* -callFunctionName: ouvre la modal\r\n* -confirmFunction: fonction a lancer apres la confirmation\r\n*/\r\n\r\nAgrimarketDirectives.directive('popupdetails', function ($timeout) {\r\n\tvar globParam;\r\n\treturn function (scope, iElement, iAttrs) {\r\n\r\n\t\tscope[iAttrs.callFunctionName] = function (param) {\r\n\t\t\tglobParam = param;\r\n\r\n\t\t\tvar parampop = {\r\n\t\t\t\tresizable: false,\r\n\t\t\t\tdraggable: false,\r\n\t\t\t\tmodal: true,\r\n\t\t\t\tposition: {\r\n\t\t\t\t\tmy: \"center\",\r\n\t\t\t\t\tat: \"center\",\r\n\t\t\t\t\tof: window,\r\n\t\t\t\t\tcollision: \"none\"\r\n\t\t\t\t},\r\n\t\t\t\tcreate: function (event, ui) {\r\n\t\t\t\t\tiElement.parent().css('position', 'fixed');\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\tvar viewportWidth = window.innerWidth - 20;\r\n\t\t\tvar viewportHeight = window.innerHeight - 20;\r\n\t\t\tif (iAttrs.popupTitle) {\r\n\t\t\t parampop.title = (scope[iAttrs.popupTitle] !== undefined ? scope[iAttrs.popupTitle] : iAttrs.popupTitle);\r\n\t\t }\r\n\t\t if (iAttrs.popupWidth !== undefined && iAttrs.popupWidth) {\r\n\t\t if (viewportWidth > 1000 && iAttrs.popupWidth <= viewportWidth) viewportWidth = (scope[iAttrs.popupWidth] !== undefined ? scope[iAttrs.popupWidth] : iAttrs.popupWidth);\r\n\t\t } else {\r\n\t\t if (viewportWidth > 1000) viewportWidth = \"auto\";\r\n\t\t }\r\n\t\t\t\r\n\t\t if (iAttrs.popupHeight !== undefined && iAttrs.popupHeight) {\r\n\t\t if (viewportHeight > 500)\r\n\t\t\t\t\tviewportHeight =\r\n\t\t\t\t\tscope[iAttrs.popupHeight] !== undefined ? scope[iAttrs.popupHeight] <= viewportHeight? scope[iAttrs.popupHeight]: viewportHeight : !isNaN(iAttrs.popupHeight) ? iAttrs.popupHeight : \"auto\";\r\n\t\t\t\t}\r\n\t\t else {\r\n\t\t if (viewportHeight > 500) viewportHeight = \"auto\";\r\n\t\t }\r\n\t\t \r\n\t\t parampop.height = viewportHeight;\r\n\t\t parampop.width = viewportWidth;\r\n\r\n\t\t\tiElement.dialog(parampop);\r\n\t\t};\r\n\t};\r\n});","/*global define, CKEDITOR*/\r\n\r\n(function (angular, factory) {\r\n if (typeof define === 'function' && define.amd) {\r\n define(['angular', 'ckeditor'], function (angular) {\r\n return factory(angular);\r\n });\r\n } else {\r\n return factory(angular);\r\n }\r\n}(angular || null, function (angular) {\r\n var app = angular.module('ngCkeditor', []);\r\n var $defer, loaded = false;\r\n\r\n app.run(['$q', '$timeout', function ($q, $timeout) {\r\n $defer = $q.defer();\r\n\r\n if (angular.isUndefined(CKEDITOR)) {\r\n throw new Error('CKEDITOR not found');\r\n }\r\n CKEDITOR.disableAutoInline = true;\r\n function checkLoaded() {\r\n if (CKEDITOR.status === 'loaded') {\r\n loaded = true;\r\n $defer.resolve();\r\n } else {\r\n checkLoaded();\r\n }\r\n }\r\n CKEDITOR.on('loaded', checkLoaded);\r\n $timeout(checkLoaded, 100);\r\n }]);\r\n\r\n AgrimarketDirectives.directive('ckeditor', ['$timeout', '$q', '$compile', function ($timeout, $q, $compile) {\r\n \t'use strict';\r\n\t \r\n \tvar reload = function (scope, element, attrs, ctrls) {\r\n \t\tvar ngModel = ctrls[0];\r\n \t\tvar form = ctrls[1] || null;\r\n \t\tvar EMPTY_HTML = '<p></p>',\r\n isTextarea = element[0].tagName.toLowerCase() === 'textarea',\r\n\t\t\t\tdata = [],\r\n isReady = false;\r\n\r\n \t\tif (!isTextarea) {\r\n \t\t\telement.attr('contenteditable', true);\r\n }\r\n \t\tvar onLoad = function () {\r\n \t\t\tvar options = {\r\n \t\t\t\ttoolbar: 'full',\r\n \t\t\t\ttoolbar_full: [//jshint ignore:line\r\n\t\t\t\t\t\t{ name: 'document', items: ['Source'] },\r\n\t\t\t\t\t\t{ name: 'clipboard', groups: ['clipboard', 'undo'], items: ['Cut', 'Copy', 'Paste', 'PasteText', 'PasteFromWord', '-', 'Undo', 'Redo'] },\r\n\t\t\t\t\t\t{ name: 'editing', items: ['Scayt'] },\r\n\t\t\t\t\t\t{ name: 'links', items: ['Link', 'Unlink'] },\r\n\t\t\t\t\t\t{ name: 'insert', items: ['Image', 'Table', 'Iframe', 'PageBreak'] },\r\n\t\t\t\t\t\t'/',\r\n \t\t\t\t\t{ name: 'basicstyles', items: ['Bold', 'Italic', 'Underline', 'Strike', 'RemoveFormat'] },\r\n\t\t\t\t\t\t{ name: 'paragraph', groups: ['list', 'indent', 'blocks', 'align', 'bidi'], items: ['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent', '-', 'Blockquote', '-', 'JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock', '-', 'BidiLtr', 'BidiRtl'] },\r\n\t\t\t\t\t\t{ name: 'styles', items: ['Styles', 'Format', 'Font', 'FontSize'] },\r\n\t\t\t\t\t\t{ name: 'colors', items: ['TextColor', 'BGColor'] }\r\n \t\t\t\t],\r\n \t\t\t\tdisableNativeSpellChecker: false,\r\n \t\t\t\tuiColor: '#FAFAFA',\r\n \t\t\t\theight: '250px',\r\n \t\t\t\twidth: '100%'\r\n };\r\n\r\n \t\t\tif (attrs.useSimplyEditor && attrs.useSimplyEditor == \"true\") {\r\n \t\t\t\tvar result = $.grep(options.toolbar_full, function (e) { return e.name == \"insert\"; });\r\n \t\t\t\tvar index = options.toolbar_full.indexOf(result[0]);\r\n \t\t\t\toptions.toolbar_full[index] = '/';\r\n \t\t\t}\r\n\r\n \t\t\toptions = angular.extend(options, scope[attrs.ckeditor]);\r\n\r\n \t\t\tvar instance = (isTextarea) ? CKEDITOR.replace(element[0], options) : CKEDITOR.inline(element[0], options),\r\n\t\t\t\t\tconfigLoaderDef = $q.defer();\r\n\r\n \t\t\telement.bind('$destroy', function () {\r\n \t\t\t\tinstance.destroy(\r\n\t\t\t\t\t\ttrue //If the instance is replacing a DOM element, this parameter indicates whether or not to update the element with the instance contents.\r\n\t\t\t\t\t);\r\n \t\t\t});\r\n\r\n var setModelData = function (setPristine) {\r\n \t\t\t\tvar data = instance.getData(); //textArea\r\n \t\t\t\tif (data === '') {\r\n \t\t\t\t\tdata = null;\r\n \t\t\t\t}\r\n \t\t\t\t$timeout(function () { // for key up event\r\n \t\t\t\t\tif (setPristine !== true || data !== ngModel.$viewValue)\r\n \t\t\t\t\t\tngModel.$setViewValue(data);\r\n \t\t\t\t\tif (setPristine === true && form)\r\n \t\t\t\t\t\tform.$setPristine();\r\n \t\t\t\t}, 0);\r\n \t\t\t},\r\n\t\t\t\t\tonUpdateModelData = function (setPristine) {\r\n\t\t\t\t\t\tif (!data.length) {\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tvar item = data.pop() || EMPTY_HTML;\r\n\t\t\t\t\t\tisReady = false;\r\n\t\t\t\t\t\tinstance.setData(item, function () {\r\n\t\t\t\t\t\t\tsetModelData(setPristine);\r\n\t\t\t\t\t\t\tisReady = true;\r\n\t\t\t\t\t\t});\r\n },\r\n onFocus = function (setPristine) {\r\n scope[attrs.autoFocus] = setPristine.editor.name;\r\n };\r\n\r\n \t\t\t//instance.on('pasteState', setModelData);\r\n \t\t\tinstance.on('change', setModelData);\r\n instance.on('blur', setModelData);\r\n instance.on('focus', onFocus);\r\n \t\t\t//instance.on('key', setModelData); // for source view\r\n\r\n \t\t\tinstance.on('instanceReady', function () {\r\n \t\t\t\tscope.$broadcast('ckeditor.ready');\r\n \t\t\t\tscope.$apply(function () {\r\n \t\t\t\t\tonUpdateModelData(true);\r\n \t\t\t\t});\r\n\r\n \t\t\t\tinstance.document.on('keyup', setModelData);\r\n \t\t\t});\r\n \t\t\tinstance.on('customConfigLoaded', function () {\r\n \t\t\t\tconfigLoaderDef.resolve();\r\n \t\t\t});\r\n\r\n \t\t\tngModel.$render = function () { // affichage des données dans l'instance texteArea\r\n \t\t\t\tdata.push(ngModel.$viewValue);\r\n \t\t\t\tif (isReady) {\r\n \t\t\t\t\tonUpdateModelData();\r\n \t\t\t\t\telement.show();\r\n \t\t\t\t}\r\n \t\t\t};\r\n \t\t};\r\n\r\n \t\tif (CKEDITOR.status === 'loaded') { // chargement de la directive => extend ckEditor Js\r\n \t\t\tloaded = true;\r\n \t\t}\r\n \t\tif (loaded) {\r\n \t\t\tonLoad();\r\n \t\t} else {\r\n \t\t\t$defer.promise.then(onLoad);\r\n \t\t}\r\n };\r\n\r\n return {\r\n\t\t restrict: 'AC',\r\n\t\t require: ['ngModel', '^?form'],\r\n\t\t scope: false,\r\n link: function (scope, element, attrs, ctrls) {\r\n \t\t\telement.hide(); // on cache l'élément avant le chargement des données dans le CkEditor\r\n \t\t\t$compile(element.contents())(scope); // on rafraichit le content de l'élément\r\n if (attrs.forceLoad && attrs.forceLoad == \"true\") {\r\n \t\t\t\treload(scope, element, attrs, ctrls);\r\n \t\t\t}\r\n\r\n \t\t\tscope.$watch(attrs.ngModel, function (n, o) {// on osberve les changement de valeur éffectifs du scope.Content\r\n \t\t\t\tif (n !== o) {\r\n \t\t\t\t\treload(scope, element, attrs, ctrls);\r\n \t\t\t\t}\r\n }, true);\r\n \t\t}\r\n \t};\r\n }]);\r\n\r\n return app;\r\n}));","//controleTable By dimitri V1.0.0.3\r\n//modification dy type img en ico\r\n//1.0.0.1 ajout de colonne checbox\r\n//prochaine version frozen\r\n//1.0.0.2 correction de bugg pagination quand liste vide et gerer \"action\" non renseignées\r\n//1.0.0.3 FROZEN !!\r\nAgrimarketDirectives.directive('controleTable', ['$timeout', '$sce', function ($timeout, $sce) {\r\n var datavisible = [];\r\n var header = [];\r\n var action = false;\r\n var menu = \"\";\r\n var pagination = false;\r\n var dragable = false;\r\n var frozen = false;\r\n var filter = false;\r\n var selectnbrow = \"\";\r\n var customcolumn = false;\r\n var selectlist = false;\r\n var colspans = false;\r\n var ttcolspan = 0;\r\n var valuecolspan = false;\r\n var sce = $sce;\r\n var icofunction = [];\r\n var actionfunction = [];\r\n\tvar formatdate = \"\";\r\n var colonnefrozen = {}; // usage interne a la directive\r\n return {\r\n scope: {\r\n data: '=',\r\n edit: '&',\r\n remove: '&',\r\n duplicate: '&',\r\n selectnbrow: '=',\r\n filter: '&',\r\n customcolumn: '&',\r\n clickable: '=',\r\n valuecolspan: '=',\r\n frozen: '=',\r\n icoaction1: '&',\r\n icoaction2: '&',\r\n icoaction3: '&',\r\n icoaction4: '&',\r\n icoaction5: '&',\r\n icoaction6: '&',\r\n icoaction7: '&',\r\n icoaction8: '&',\r\n icoaction9: '&',\r\n icoaction10: '&',\r\n action1: '&',\r\n action2: '&',\r\n action3: '&',\r\n action4: '&',\r\n action5: '&',\r\n action6: '&',\r\n action7: '&',\r\n action8: '&',\r\n action9: '&',\r\n action10: '&',\r\n selectlist: '='\r\n \r\n\r\n },\r\n templateNamespace: 'mySuperTable',\r\n restrict: 'EA',\r\n replace: true,\r\n transclude: true,\r\n template: function (element, attrs) {\r\n\r\n datavisible = [];\r\n header = [];\r\n action = false;\r\n menu = \"\";\r\n pagination = false;\r\n dragable = false;\r\n frozen = false;\r\n filter = false;\r\n // primaryKey = \"\";\r\n maxrow = 0;\r\n selectnbrow = \"\";\r\n customcolumn = false;\r\n clickable = false;\r\n colspans = false;\r\n ttcolspan = 0;\r\n valuecolspan = false;\r\n icofunction = [];\r\n actionfunction = [];\r\n colonnefrozen = {};\r\n if (attrs[\"visible\"] !== undefined && attrs[\"visible\"] !== null)\r\n datavisible = attrs[\"visible\"].split(',');\r\n if (attrs[\"colonnes\"] !== undefined && attrs[\"colonnes\"] !== null)\r\n header = attrs[\"colonnes\"].split(',');\r\n //if (attrs[\"key\"] !== undefined && attrs[\"key\"] !== null)\r\n // primaryKey = attrs[\"key\"];\r\n if (attrs[\"customcolumn\"] !== undefined && attrs[\"customcolumn\"] !== null && attrs[\"customcolumn\"] !== \"\")\r\n \tcustomcolumn = attrs[\"customcolumn\"];\r\n if (attrs[\"selectnbrow\"] !== undefined && attrs[\"selectnbrow\"] !== null && attrs[\"selectnbrow\"] !== \"\")\r\n \tselectnbrow = attrs[\"selectnbrow\"];\r\n if (attrs[\"frozen\"] !== undefined && attrs[\"frozen\"] !== null && attrs[\"frozen\"] !== \"\") {\r\n frozen = (attrs[\"frozen\"] == \"true\" ? true : false);\r\n for (var j = 0; j < datavisible.length; j++) {\r\n colonnefrozen[datavisible[j].split(';')[0]] = false;\r\n }\r\n }\r\n if (attrs[\"actions\"] !== undefined && attrs[\"actions\"] !== null && attrs[\"actions\"] !== \"\") {\r\n action = attrs[\"actions\"].split(',');\r\n actionfunction = [];\r\n for (var g = 0; g < action.length; g++) {\r\n actionfunction.push(attrs[\"action\" + (g + 1)]);\r\n }\r\n getAction(action, actionfunction);\r\n } else action = false;\r\n if (attrs[\"pagination\"] !== undefined && attrs[\"pagination\"] !== null && attrs[\"pagination\"] !== \"\") {\r\n pagination = (attrs[\"pagination\"] == \"true\" ? true : false);\r\n if (attrs[\"rowbypage\"] !== undefined && attrs[\"rowbypage\"] !== null) {\r\n maxrow = attrs[\"rowbypage\"];\r\n }\r\n }\r\n if (attrs[\"dragable\"] !== undefined && attrs[\"dragable\"] !== null && attrs[\"dragable\"] !== \"\") {\r\n dragable = (attrs[\"dragable\"] == \"true\" ? true : false);\r\n }\r\n if (attrs[\"filter\"] !== undefined && attrs[\"filter\"] !== null && attrs[\"filter\"] !== \"\") {\r\n filter = attrs[\"filter\"];\r\n }\r\n if (attrs[\"colspans\"] !== undefined && attrs[\"colspans\"] !== null && attrs[\"colspans\"] !== \"\") {\r\n colspans = attrs[\"colspans\"];\r\n }\r\n if (attrs[\"valuecolspan\"] !== undefined && attrs[\"valuecolspan\"] !== null && attrs[\"valuecolspan\"] !== \"\") {\r\n valuecolspan = attrs[\"valuecolspan\"].split(',');\r\n icofunction = [];\r\n for (var x = 0; x < valuecolspan.length; x++) {\r\n icofunction.push(attrs[\"icoaction\" + (x + 1)]);\r\n }\r\n }\r\n if (attrs[\"selectlist\"] !== undefined && attrs[\"selectlist\"] !== null && attrs[\"selectlist\"] !== \"\")\r\n \tselectlist = (attrs[\"selectlist\"] == \"true\" ? true : false);\r\n if (attrs[\"formatdate\"] !== undefined && attrs[\"formatdate\"] !== null && attrs[\"formatdate\"] !== \"\")\r\n \tformatdate = attrs[\"formatdate\"];\r\n\r\n return \"<div>\"+getTable(true)+\"<div/>\";\r\n },\r\n link: function ($scope, element, attrs) {\r\n\r\n //pagination\r\n $scope.intervalmin = 0;\r\n $scope.intervalmax = 10;\r\n $scope.total = 0;\r\n $scope.nbpage = 1;\r\n $scope.currentpage = 1;\r\n $scope.selectnbrow = ($scope.selectnbrow !== undefined && $scope.selectnbrow !== null && $scope.selectnbrow !== \"\" ? $scope.selectnbrow : selectnbrow);\r\n $scope.pages = [];\r\n\r\n //sortable\r\n $scope.predicate = [];\r\n $scope.renverse = [];\r\n $scope.notSorted = [];\r\n $scope.topSorted = [];\r\n $scope.bottomSorted = [];\r\n $scope.indexActive = 0;\r\n $scope.value = \"\";\r\n //tableau\r\n $scope.datavisible = datavisible;\r\n $scope.header = header;\r\n $scope.colspans = colspans;\r\n $scope.checkall = false;\r\n $scope.colonnefrozen = colonnefrozen;\r\n formatdate = (formatdate !== undefined && formatdate !== null && formatdate !== \"\" ? formatdate : 'dd/MM/yyyy');\r\n $scope.formatdate = ($scope.formatdate !== undefined && $scope.formatdate !== null && $scope.formatdate !== \"\" ? $scope.formatdate : formatdate);\r\n\r\n\r\n if ($scope.selectnbrow !== null && $scope.selectnbrow !== undefined && selectnbrow !== \"\")\r\n $scope.watchedit = $scope.$watch(\"selectnbrow\", function (value, old) {\r\n if (value === undefined || value === null) return;\r\n if (value != old) {\r\n $scope.selectnbrow = value;\r\n $scope.pages = [];\r\n $scope.selectnbrow = ($scope.selectnbrow !== undefined && $scope.selectnbrow !== null ? $scope.selectnbrow : 10);\r\n $scope.nbpage = Math.ceil($scope.data.length / $scope.selectnbrow);\r\n for (var g = 1; g <= $scope.nbpage ; g++) {\r\n $scope.pages.push(g);\r\n }\r\n \r\n $scope.GoToPage(1);\r\n }\r\n });\r\n\r\n $scope.watchedit = $scope.$watchCollection(\"data\", function (value, old) {\r\n if (value === undefined || value === null) return;\r\n if (value != old) {\r\n $scope.pages = [];\r\n $scope.selectnbrow = ($scope.selectnbrow !== undefined && $scope.selectnbrow !== null ? $scope.selectnbrow : 10);\r\n $scope.nbpage = Math.ceil(value.length / $scope.selectnbrow);\r\n for (var g = 1; g <= $scope.nbpage ; g++) {\r\n $scope.pages.push(g);\r\n }\r\n \r\n $scope.intervalmax = $scope.selectnbrow;\r\n $scope.total = value.length; \r\n $scope.GoToPage(1);\r\n }\r\n });\r\n $scope.SelectAll = function () {\r\n $scope.data.forEach(function (item, index) {\r\n item.IsChecked = $scope.checkall;\r\n });\r\n };\r\n $scope.PrevPage = function () {\r\n $scope.intervalmin = (($scope.currentpage - 1) * $scope.selectnbrow) - $scope.selectnbrow;\r\n $scope.intervalmax = $scope.intervalmin + $scope.selectnbrow;\r\n $scope.currentpage -= 1;\r\n };\r\n $scope.GoToPage = function (nbpage) {\r\n $scope.currentpage = nbpage;\r\n $scope.intervalmin = (nbpage * $scope.selectnbrow) - $scope.selectnbrow;\r\n $scope.intervalmax = $scope.intervalmin + $scope.selectnbrow;\r\n };\r\n $scope.NextPage = function () {\r\n $scope.intervalmin = (($scope.currentpage + 1) * $scope.selectnbrow) - $scope.selectnbrow;\r\n $scope.intervalmax = $scope.intervalmin + $scope.selectnbrow;\r\n $scope.currentpage += 1;\r\n };\r\n $scope.change = function (column, i) {\r\n $scope.notSorted[i] = false;\r\n $scope.columnselected = i;\r\n $scope.indexActive = i;\r\n if ($scope.predicate[i] === undefined || $scope.predicate[i] === null) {\r\n $scope.predicate[i] = column;\r\n $scope.renverse[i] = false;\r\n $scope.topSorted[i] = false;\r\n $scope.bottomSorted[i] = true;\r\n }\r\n if ($scope.predicate[i] == column) {\r\n for (var g = 0; g < $scope.predicate.length; g++) {\r\n if (g != i) {\r\n $scope.notSorted[g] = true;\r\n }\r\n }\r\n $scope.renverse[i] = !$scope.renverse[i];\r\n $scope.topSorted[i] = !$scope.topSorted[i];\r\n $scope.bottomSorted[i] = !$scope.bottomSorted[i];\r\n } else {\r\n $scope.predicate[i] = column;\r\n $scope.renverse[i] = false;\r\n $scope.topSorted[i] = false;\r\n $scope.bottomSorted[i] = true;\r\n }\r\n };\r\n if (filter !== false)\r\n $scope.Filtre = function (valeur) {\r\n return $scope.filter({ val: valeur });\r\n };\r\n $scope.getDescendantProp = function (item, desc) {\r\n return getDescendantProp(item, desc);\r\n };\r\n\r\n if (dragable) {\r\n setTimeout(\r\n\t\t\t\t\tfunction () {\r\n\t\t\t\t\t $(element[0].children.sortable).dragtable({\r\n\t\t\t\t\t excludeFooter: true,\r\n\t\t\t\t\t dragHandle: '.drag',\r\n\t\t\t\t\t persistState: function (table) {\r\n\t\t\t\t\t var drag = {\r\n\t\t\t\t\t oldPosition: table.startIndex,\r\n\t\t\t\t\t newPosition: table.endIndex\r\n\t\t\t\t\t };\r\n\t\t\t\t\t //var colonnedepart = datavisible[table.startIndex];\r\n\t\t\t\t\t //var colonnearrivee = datavisible[table.endIndex];\r\n\t\t\t\t\t }\r\n\t\t\t\t\t });\t\t\t\t\t \r\n\t\t\t\t\t}, 500);\r\n }\r\n $scope.Freez = function (index) {\r\n $scope.colonnefrozen[$scope.datavisible[index].split(';')[0]] = !$scope.colonnefrozen[$scope.datavisible[index].split(';')[0]];\r\n };\r\n\r\n }\r\n };\r\n\r\n\r\n function getTable(original) {\r\n var tableau = \"\";\r\n if (original)\r\n if (frozen !== false) {\r\n tableau += GetDivFrozen();\r\n }\r\n\r\n tableau += \"<table class=\\\"\" + (action !== false && original ? \"t_actions\" : \"\") +\"\\\" id=\\\"sortable\\\">\";\r\n tableau += AddHeader(original);\r\n tableau += AddRow(original);\r\n if (original)\r\n if (pagination !== false)\r\n tableau += AddFooter(header.length);\r\n tableau += \"</table>\";\r\n return tableau;\r\n }\r\n function AddHeader(original) {\r\n var col = \"<thead><tr>\";\r\n\r\n if (selectlist) {\r\n col += \"<th><input type=\\\"checkbox\\\" ng-model=\\\"checkall\\\" ng-change=\\\"SelectAll()\\\" /></th>\";\r\n }\r\n col += \"<th ng-repeat=\\\"head in header\\\" \";\r\n if (frozen) {\r\n if(original)\r\n col += \"ng-show=\\\"!colonnefrozen[datavisible[$index].split(';')[0]]\\\" \";\r\n else\r\n col += \"ng-if=\\\"colonnefrozen[datavisible[$index].split(';')[0]]\\\" \";\r\n }\r\n\r\n col+=\"colspan=\\\"{{ colspans.substring(colspans.indexOf(datavisible[$index])+ datavisible[$index].length+1,colspans.indexOf(datavisible[$index])+ datavisible[$index].length+2) }}\\\" >\" +\r\n\t\t\t\"<span class=\\\"drag\\\" >{{head}}</span>\";\r\n if (frozen) {\r\n col += \"<span class=\\\"\\\" ng-click=\\\"Freez($index)\\\">froz</span>\"; //futur icone frozen\r\n }\r\n\r\n\t\t col += \"<span class=\\\"reorder\\\" ng-class=\\\"{'ico-nosorted' : notSorted[$index] || predicate[$index] != datavisible[$index], 'ico-topsorted': topSorted[$index] && predicate[$index] == datavisible[$index], 'ico-bottomsorted': bottomSorted[$index] && predicate[$index] == datavisible[$index] }\\\" ng-click=\\\"change(datavisible[$index],$index)\\\"></span>\";\r\n \r\n col += \"</th>\";\r\n if (action !== false && original) {\r\n col += \"<th></th>\";\r\n }\r\n return col + \"</tr></thead>\";\r\n }\r\n\r\n function AddFooter(nbcols) {\r\n var col = \"<tfoot class=\\\"pagination\\\"><tr>\";\r\n col += \"<td colspan=\\\"\" + (nbcols + ttcolspan + (colspans ? colspans.split(',').length - 1 : 0) + (selectlist ? 1 : 0)) + \"\\\">\";\r\n col += \"<ul>\";\r\n col += \"<li ng-if=\\\"currentpage > 1\\\"><button type=\\\"button\\\" value=\\\"start\\\" ng-click=\\\"GoToPage(1)\\\" ><span class=\\\"ico ico-pager-first\\\"></span></button></li>\";\r\n col += \"<li ng-if=\\\"currentpage > 1\\\"><button type=\\\"button\\\" value=\\\"prev\\\" ng-click=\\\"PrevPage()\\\" ><span class=\\\"ico ico-pager-prev\\\"></span></button></li>\";\r\n col += \"<li ng-if=\\\"pages.length > 1\\\" ng-repeat=\\\"page in pages\\\"><button type=\\\"button\\\" ng-click=\\\"GoToPage(page)\\\" ng-Class=\\\"{'current': currentpage == ($index+1)}\\\" >{{page}} </button></li>\";\r\n col += \"<li ng-if=\\\"currentpage != nbpage\\\"><button type=\\\"button\\\" value=\\\"next\\\" ng-click=\\\"NextPage()\\\" ><span class=\\\"ico ico-pager-next\\\"></span></button></li>\";\r\n col += \"<li ng-if=\\\"currentpage != nbpage\\\"><button type=\\\"button\\\" value=\\\"end\\\" ng-click=\\\"GoToPage(nbpage)\\\"><span class=\\\"ico ico-pager-last\\\"></span></button></li>\";\r\n col += \"<li class=\\\"pagination_infos\\\">{{currentpage}} - {{nbpage}} de {{(data | filter: Filtre).length}} éléments</li>\";\r\n col += \"</ul>\";\r\n col += \"</td>\";\r\n if (action !== false) {\r\n col += \"<td></td>\";\r\n }\r\n\r\n return col + \"</tr></tfoot>\";\r\n }\r\n function AddRow(original) {\r\n var row = \"\";\r\n var td = \"\";\r\n row += \"<tr ng-repeat=\\\"item in data | orderBy:predicate[columnselected]:renverse[columnselected]\"; //\r\n if (filter !== false)\r\n row += \" | filter: Filtre\";\r\n\r\n row += \"\\\"\";\r\n\r\n\r\n if (pagination)\r\n row += \" ng-show=\\\"$index >= intervalmin && $index < intervalmax\\\"\";\r\n\r\n row += \"> \";\r\n if (selectlist) {\r\n td += \"<td><input type=\\\"checkbox\\\" ng-model=\\\"item.IsChecked\\\" /></td>\";\r\n }\r\n for (var j = 0; j < datavisible.length; j++) {\r\n var propriete = \"\";\r\n\r\n td += \"<td \";\r\n\r\n \r\n if (frozen) {\r\n if (original)\r\n td += \"ng-show=\\\"!colonnefrozen[datavisible[\" + j + \"].split(';')[0]]\\\" \";\r\n else\r\n td += \"ng-if=\\\"colonnefrozen[datavisible[\" + j + \"].split(';')[0]]\\\" \";\r\n }\r\n\r\n\r\n if (customcolumn !== false)\r\n td += \"class=\\\"{{customcolumn(\" + ReturnClass(customcolumn, datavisible[j]) + \")}}\\\" \";\r\n td += \">\";\r\n if (datavisible[j].split(';').length == 1)\r\n td += \"{{ item.\" + datavisible[j] + \"}}\";\r\n else {\r\n if (datavisible[j].split(';')[2] !== undefined && datavisible[j].split(';')[2] !== null) {\r\n propriete = datavisible[j].split(';')[2];\r\n }\r\n td += getContentCell(datavisible[j].split(';')[1], datavisible[j].split(';')[0], propriete);\r\n }\r\n td += \"</td >\";\r\n if (colspans !== false) {\r\n var nbcolspan = colspans.substring(colspans.indexOf(datavisible[j]) + datavisible[j].length + 1, colspans.indexOf(datavisible[j]) + datavisible[j].length + 2);\r\n if (!isNaN(parseInt(nbcolspan))) {\r\n for (var x = 1; x < nbcolspan; x++) {\r\n td += \"<td>\";\r\n\r\n for (var t = 0; t < valuecolspan.length ; t++) {\r\n if (valuecolspan[t].split(';')[0] == datavisible[j] && valuecolspan[t].split(';')[1] == x) {\r\n td += getContentCell(valuecolspan[t].split(';')[2], valuecolspan[t].split(';')[3], icofunction[t], t); //getContentCell(valuecolspan[t].split(';')[2], valuecolspan[t].split(';')[3]);\r\n }\r\n }\r\n td += \"</td >\";\r\n ttcolspan++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (action !== false && original) {\r\n td += \"<td tooltip-auto-size class=\\\"w5 actions\\\">\" + menu + \"</td >\";\r\n }\r\n row += td ;\r\n\r\n return row + \"</tr>\";\r\n }\r\n function getContentCell(type, source, propriete, occurence) {\r\n switch (type) {\r\n case \"ico\":\r\n return \"<span ng-click=\\\"icoaction\" + (occurence + 1) + \"(\" + ReturnData(propriete) + \")\\\" class=\\\"ico \" + source.replace(\"'\", \"\") + \"\\\" />\";\r\n case \"data\":\r\n return \"{{ item. \" + source + \" }}\";\r\n case \"lien\":\r\n return \"<a target=\\\"_blank\\\" href=\\\"{{ item.\" + source + \" }}\\\">{{ item.\" + source + \" }}</a>\";\r\n case \"liste\":\r\n var li = \"\";\r\n li += \"<ul>\";\r\n li += \"<li ng-repeat=\\\"li in item.\" + source + \"\\\">\";\r\n for (var f = 0; f < propriete.split('-').length; f++) {\r\n li += \"{{ li.\" + propriete.split('-')[f] + \" }}\";\r\n }\r\n li += \" </li>\";\r\n li += \"</ul>\";\r\n return li;\r\n \tcase \"date\":\r\n \t\treturn \"{{ item. \" + source + \" | date : formatdate}}\";\r\n \tcase \"fulldate\":\r\n \t\treturn \"{{ item. \" + source + \" | date : formatdate}}\";\r\n default:\r\n return \"type de donnée demandé inexistante\";\r\n }\r\n\r\n }\r\n function getAction(actions, actionfunctions) {\r\n menu = \"\";\r\n menu += \"<div><span class=\\\"ico ico-action\\\"></span><ul class=\\\"actions_list\\\">\";\r\n for (var g = 0; g < action.length; g++) {\r\n \tif (actionfunctions[g] !== undefined)\r\n \t\tmenu += \"<li ><a ng-click=\\\"action\" + (g + 1) + \"(\" + ReturnData(actionfunctions[g]) + \")\\\">\" + actions[g] + \"</a></li>\";\r\n \telse {\r\n\r\n \t console.log(\"aucune action defini pour \" + actions[g] + \"'action\" + (g + 1)+\"'\");\r\n \t\tmenu += \"<li ><a>\" + actions[g] + \"</a></li>\";\r\n \t}\r\n }\r\n menu += \"</ul></div>\";\r\n }\r\n\r\n function GetDivFrozen() {\r\n var div =\"<div>\"+ getTable(false) + \"</div>\";\r\n return div;\r\n }\r\n function getDescendantProp(obj, desc) {\r\n var arr = desc.split(\".\");\r\n while (arr.length && (obj = obj[arr.shift()]));\r\n return obj;\r\n }\r\n\r\n function ReturnData(obj) {\r\n var param = \"\";\r\n var arrayparam;\r\n param = obj.substring(obj.indexOf('(') + 1, obj.indexOf(')'));\r\n arrayparam = param.split(',');\r\n if (arrayparam === 0) return \"{}\";\r\n //arrayparam[0] = objet courant\r\n //arrayparam[1] = index objet courant dans la liste\r\n //arrayparam[2..x] = tout argument envoyer (popup / chaine de caractere)\r\n obj = obj.substring(obj.indexOf('(') + 1, obj.indexOf(')')).replace(param, \"{\" + arrayparam[0] + \" : item,\" + arrayparam[1] + \" : $index}\");\r\n return obj;\r\n }\r\n function ReturnClass(obj, td) {\r\n var param = \"\";\r\n var arrayparam;\r\n param = obj.substring(obj.indexOf('(') + 1, obj.indexOf(')'));\r\n arrayparam = param.split(',');\r\n //arrayparam[0] = ligne courant\r\n //arrayparam[1] = colonne\r\n obj = obj.substring(obj.indexOf('(') + 1, obj.indexOf(')')).replace(param, \"{\" + arrayparam[0] + \" : item,\" + arrayparam[1] + \" : '\" + td + \"'}\");\r\n return obj;\r\n }\r\n}]);","//DERNIERE MAJ: 23/03/2015\r\n\r\n//controleTable By dimitri V1.0.0.3\r\n//modification dy type img en ico\r\n//1.0.0.1 ajout de colonne checbox\r\n//prochaine version frozen\r\n//1.0.0.2 correction de bugg pagination quand liste vide et gerer \"action\" non renseignées\r\n\r\n\r\n\r\n\r\nAgrimarketDirectives.directive('controleTabledev', ['$timeout', '$sce', function ($timeout, $sce) {\r\n var datavisible = [];\r\n var header = [];\r\n var action = false;\r\n var menu = \"\";\r\n var pagination = false;\r\n var dragable = false;\r\n var frozen = false;\r\n var filter = false;\r\n var selectnbrow = \"\";\r\n var customcolumn = false;\r\n var selectlist = false;\r\n var colspans = false;\r\n var ttcolspan = 0;\r\n var valuecolspan = false;\r\n var maxrow = 0;\r\n //var clickable = false;\r\n var sce = $sce;\r\n var icofunction = [];\r\n var actionfunction = [];\r\n var conditionfunction = [];\r\n var formatdate = \"\";\r\n var rowtotal = false;\r\n var addspecificrows = false;\r\n var valuespecificrows = false;\r\n var labeloperationselected = false;\r\n var pdf = false;\r\n var tablecss = false;\r\n var actionpdf = \"\";\r\n var actionrow = null;\r\n var classtd = null;\r\n var datatd = null;\r\n var colonnefrozen = {}; // usage interne a la directive\r\n\tvar emptytext = \"\";\r\n return {\r\n scope: {\r\n data: '=',\r\n //edit: '&',\r\n //remove: '&',\r\n //duplicate: '&',\r\n selectnbrow: '=?',\r\n filter: '&',\r\n customcolumn: '&',\r\n //clickable: '=',\r\n valuecolspan: '=',\r\n frozen: '=',\r\n visible: '=',\r\n colonnes: '=',\r\n icoaction1: '&',\r\n icoaction2: '&',\r\n icoaction3: '&',\r\n icoaction4: '&',\r\n icoaction5: '&',\r\n icoaction6: '&',\r\n icoaction7: '&',\r\n icoaction8: '&',\r\n icoaction9: '&',\r\n icoaction10: '&',\r\n actions: '@',\r\n action1: '&',\r\n action2: '&',\r\n action3: '&',\r\n action4: '&',\r\n action5: '&',\r\n action6: '&',\r\n action7: '&',\r\n action8: '&',\r\n action9: '&',\r\n action10: '&',\r\n condition1: '&',\r\n condition2: '&',\r\n condition3: '&',\r\n condition4: '&',\r\n condition5: '&',\r\n condition6: '&',\r\n condition7: '&',\r\n condition8: '&',\r\n condition9: '&',\r\n condition10: '&',\r\n actionpdf: '&',\r\n actionrow: '&',\r\n selectlist: '&',\r\n saveposition: '&',\r\n valuespecificrows: \"=?\",\r\n labeloperationselected: \"=?\",\r\n tablecss: '@'\r\n },\r\n templateNamespace: 'mySuperTable',\r\n restrict: 'EA',\r\n replace: true,\r\n transclude: true,\r\n template: function (element, attrs) {\r\n datavisible = [];\r\n header = [];\r\n action = false;\r\n menu = \"\";\r\n pagination = false;\r\n dragable = false;\r\n frozen = false;\r\n filter = false;\r\n maxrow = 0;\r\n selectnbrow = \"\";\r\n customcolumn = false;\r\n //clickable = false;\r\n colspans = false;\r\n ttcolspan = 0;\r\n valuecolspan = false;\r\n icofunction = [];\r\n actionfunction = [];\r\n\t conditionfunction = [];\r\n formatdate = \"\";\r\n colonnefrozen = {};\r\n rowtotal = false;\r\n valuespecificrows = false;\r\n labeloperationselected = false;\r\n addspecificrows = false;\r\n\t selectlist = false;\r\n\t pdf = false;\r\n\t actionpdf = \"\";\r\n if (attrs[\"visible\"] !== undefined && attrs[\"visible\"] !== null)\r\n datavisible = attrs[\"visible\"].split(',');\r\n if (attrs[\"colonnes\"] !== undefined && attrs[\"colonnes\"] !== null)\r\n header = attrs[\"colonnes\"].split(',');\r\n if (attrs[\"customcolumn\"] !== undefined && attrs[\"customcolumn\"] !== null && attrs[\"customcolumn\"] !== \"\")\r\n \tcustomcolumn = attrs[\"customcolumn\"];\r\n if (attrs[\"selectnbrow\"] !== undefined && attrs[\"selectnbrow\"] !== null && attrs[\"selectnbrow\"] !== \"\")\r\n \tselectnbrow = attrs[\"selectnbrow\"];\r\n if (attrs[\"frozen\"] !== undefined && attrs[\"frozen\"] !== null && attrs[\"frozen\"] !== \"\") {\r\n frozen = (attrs[\"frozen\"] == \"true\" ? true : false);\r\n for (var j = 0; j < datavisible.length; j++) {\r\n colonnefrozen[datavisible[j].split(';')[0]] = false;\r\n }\r\n }\r\n if (attrs[\"actions\"] !== undefined && attrs[\"actions\"] !== null && attrs[\"actions\"] !== \"\") {\r\n action = attrs[\"actions\"].split(',');\r\n actionfunction = [];\r\n\t conditionfunction = [];\r\n for (var g = 0; g < action.length; g++) {\r\n \tactionfunction.push(attrs[\"action\" + (g + 1)]);\r\n\r\n \tif (attrs[\"condition\" + (g + 1)] !== undefined && attrs[\"condition\" + (g + 1)] !== null && attrs[\"condition\" + (g + 1)] !== \"\") {\r\n \t\tconditionfunction.push(attrs[\"condition\" + (g + 1)]);\r\n \t}\r\n \telse\r\n \t\tconditionfunction.push(null);\r\n }\r\n getAction(action, actionfunction, conditionfunction);\r\n } else action = false;\r\n if (attrs[\"pagination\"] !== undefined && attrs[\"pagination\"] !== null && attrs[\"pagination\"] !== \"\") {\r\n pagination = (attrs[\"pagination\"] == \"true\" ? true : false);\r\n if (attrs[\"rowbypage\"] !== undefined && attrs[\"rowbypage\"] !== null) {\r\n maxrow = attrs[\"rowbypage\"];\r\n }\r\n }\r\n if (attrs[\"dragable\"] !== undefined && attrs[\"dragable\"] !== null && attrs[\"dragable\"] !== \"\") {\r\n dragable = (attrs[\"dragable\"] == \"true\" ? true : false);\r\n }\r\n if (attrs[\"filter\"] !== undefined && attrs[\"filter\"] !== null && attrs[\"filter\"] !== \"\") {\r\n filter = attrs[\"filter\"];\r\n }\r\n if (attrs[\"colspans\"] !== undefined && attrs[\"colspans\"] !== null && attrs[\"colspans\"] !== \"\") {\r\n colspans = attrs[\"colspans\"];\r\n }\r\n if (attrs[\"valuecolspan\"] !== undefined && attrs[\"valuecolspan\"] !== null && attrs[\"valuecolspan\"] !== \"\") {\r\n valuecolspan = attrs[\"valuecolspan\"].split(',');\r\n icofunction = [];\r\n for (var x = 0; x < valuecolspan.length; x++) {\r\n icofunction.push(attrs[\"icoaction\" + (x + 1)]);\r\n }\r\n }\r\n if (attrs[\"selectlist\"] !== undefined && attrs[\"selectlist\"] !== null && attrs[\"selectlist\"] !== \"\")\r\n \tselectlist = (attrs[\"selectlist\"] == \"true\" ? true : false);\r\n if (attrs[\"formatdate\"] !== undefined && attrs[\"formatdate\"] !== null && attrs[\"formatdate\"] !== \"\")\r\n \tformatdate = attrs[\"formatdate\"];\r\n if (attrs[\"rowtotal\"] !== undefined && attrs[\"rowtotal\"] !== null && attrs[\"rowtotal\"] !== \"\")\r\n \trowtotal = attrs[\"rowtotal\"].split(',');\r\n\r\n if (attrs[\"addspecificrows\"] !== undefined && attrs[\"addspecificrows\"] !== null && attrs[\"addspecificrows\"] !== \"\")\r\n \taddspecificrows = attrs[\"addspecificrows\"];\r\n\r\n if (attrs[\"valuespecificrows\"] !== undefined && attrs[\"valuespecificrows\"] !== null && attrs[\"valuespecificrows\"] !== \"\")\r\n valuespecificrows = attrs[\"valuespecificrows\"];\r\n \r\n if (attrs[\"labeloperationselected\"] !== undefined && attrs[\"labeloperationselected\"] !== null && attrs[\"labeloperationselected\"] !== \"\")\r\n labeloperationselected = attrs[\"labeloperationselected\"];\r\n \r\n if (attrs[\"pdf\"] !== undefined && attrs[\"pdf\"] !== null && attrs[\"pdf\"] !== \"\")\r\n \tpdf = (attrs[\"pdf\"] == \"true\" ? true : false);\r\n\r\n if (attrs[\"actionpdf\"] !== undefined && attrs[\"actionpdf\"] !== null && attrs[\"actionpdf\"] !== \"\")\r\n \tactionpdf = attrs[\"actionpdf\"];\r\n\r\n if (attrs[\"classtd\"] !== undefined && attrs[\"classtd\"] !== null && attrs[\"classtd\"] !== \"\")\r\n \tclasstd = attrs[\"classtd\"];\r\n if (attrs[\"datatd\"] !== undefined && attrs[\"datatd\"] !== null && attrs[\"datatd\"] !== \"\")\r\n \tdatatd = attrs[\"datatd\"];\r\n\r\n if (attrs[\"actionrow\"] !== undefined && attrs[\"actionrow\"] !== null && attrs[\"actionrow\"] !== \"\")\r\n \tactionrow = attrs[\"actionrow\"];\r\n if (attrs[\"tablecss\"] !== undefined && attrs[\"tablecss\"] !== null && attrs[\"tablecss\"] !== \"\")\r\n\t tablecss = attrs[\"tablecss\"];\r\n else {\r\n\t tablecss = \"t_actions\";\r\n }\r\n if (attrs[\"emptytext\"] !== undefined && attrs[\"emptytext\"] !== null && attrs[\"emptytext\"] !== \"\") {\r\n\t emptytext = attrs[\"emptytext\"];\r\n } \r\n\r\n\t return \"<div>\" + getTable(true) + \"<div/>\";\r\n },\r\n link: function ($scope, element, attrs) {\r\n \tclasstd = null;\r\n \tdatatd = null;\r\n //pagination\r\n $scope.intervalmin = 0;\r\n $scope.intervalmax = 10;\r\n $scope.total = 0;\r\n $scope.nbpage = 1;\r\n $scope.currentpage = 1;\r\n $scope.selectnbrow = ($scope.selectnbrow !== undefined && $scope.selectnbrow !== null && $scope.selectnbrow !== \"\" ? $scope.selectnbrow : selectnbrow);\r\n $scope.pages = [];\r\n\r\n //sortable\r\n $scope.predicate = [];\r\n $scope.renverse = [];\r\n $scope.notSorted = [];\r\n $scope.topSorted = [];\r\n $scope.bottomSorted = [];\r\n $scope.indexActive = 0;\r\n $scope.value = \"\";\r\n //tableau\r\n $scope.datavisible = datavisible = ($scope.visible !== undefined ? $scope.visible.split(',') : attrs.visible);\r\n $scope.header = header = ($scope.colonnes !== undefined ? $scope.colonnes.split(',') : attrs.colonnes);\r\n $scope.colspans = colspans;\r\n $scope.checkall = false;\r\n $scope.colonnefrozen = colonnefrozen;\r\n\t $scope.ttcolspan = 0;\r\n //fonction\r\n\t $scope.icofunction = icofunction;\r\n\t \r\n\t formatdate = (formatdate !== undefined && formatdate !== null && formatdate !== \"\" ? formatdate : 'dd/MM/yyyy');\r\n\t $scope.formatdate = ($scope.formatdate !== undefined && $scope.formatdate !== null && $scope.formatdate !== \"\" ? $scope.formatdate : formatdate);\r\n\t $scope.rowtotal = (!rowtotal ? false : rowtotal);\r\n\t $scope.valuespecificrows = (!$scope.valuespecificrows ? 0 : $scope.valuespecificrows);\r\n\t $scope.labeloperationselected = (!$scope.labeloperationselected ? false : $scope.labeloperationselected);\r\n\r\n\t $scope.filteredItems = [];\r\n\t $scope.totalused = false;\r\n if ($scope.selectnbrow !== null && $scope.selectnbrow !== undefined && selectnbrow !== \"\")\r\n $scope.watchedit = $scope.$watch(\"selectnbrow\", function (value, old) {\r\n if (value === undefined || value === null) return;\r\n if (value != old) {\r\n $scope.selectnbrow = value;\r\n $scope.pages = [];\r\n $scope.selectnbrow = ($scope.selectnbrow !== undefined && $scope.selectnbrow !== null ? $scope.selectnbrow : 10);\r\n $scope.GetNbPage($scope.data.length);\r\n for (var g = 1; g <= $scope.nbpage ; g++) {\r\n $scope.pages.push(g);\r\n }\r\n \r\n $scope.GoToPage(1);\r\n }\r\n });\r\n $scope.watchedit = $scope.$watchCollection(\"data\", function (value, old) {\r\n if (value === undefined || value === null) return;\r\n if (value != old) {\r\n $scope.pages = [];\r\n $scope.selectnbrow = ($scope.selectnbrow !== undefined && $scope.selectnbrow !== null ? $scope.selectnbrow : 10);\r\n $scope.GetNbPage($scope.data.length);\r\n $scope.total = value.length;\r\n $scope.checkall = false;\r\n $scope.currentpage = 1;\r\n }\r\n });\r\n\r\n $scope.watchedit = $scope.$watchCollection(\"filteredItems\", function (value, old) {\r\n \tif (value === undefined || value === null) return;\r\n \tif (value != old) {\r\n \t\t$scope.pages = [];\r\n \t\t$scope.selectnbrow = ($scope.selectnbrow !== undefined && $scope.selectnbrow !== null ? $scope.selectnbrow : 10);\r\n \t\t$scope.GetNbPage($scope.data.length);\r\n \t\t$scope.total = value.length;\r\n \t\t$scope.checkall = false;\r\n \t}\r\n });\r\n $scope.GetNbPage = function (nbrow) {\r\n $scope.selectnbrow = ($scope.selectnbrow ? $scope.selectnbrow : 10);\r\n\t \t$scope.nbpage = Math.ceil(nbrow / $scope.selectnbrow);\r\n\t \tfor (var g = 1; g <= $scope.nbpage ; g++) {\r\n\t\t\t\t\t$scope.pages.push({ Value: g });\r\n\t \t}\r\n\t };\r\n $scope.SelectAll = function () {\r\n $scope.data.forEach(function (item, index) {\r\n item.IsChecked = $scope.checkall;\r\n });\r\n };\r\n $scope.PrevPage = function () {\r\n\t\t\t\tif ($scope.currentpage > 1)\r\n $scope.currentpage -= 1;\r\n };\r\n $scope.GoToPage = function (nbpage) {\r\n $scope.currentpage = nbpage;\r\n };\r\n $scope.NextPage = function () {\r\n $scope.intervalmin = (($scope.currentpage + 1) * $scope.selectnbrow) - $scope.selectnbrow;\r\n $scope.intervalmax = $scope.intervalmin + $scope.selectnbrow;\r\n $scope.currentpage += 1;\r\n };\r\n $scope.change = function (column, i) {\r\n $scope.notSorted[i] = false;\r\n $scope.columnselected = i;\r\n $scope.indexActive = i;\r\n if ($scope.predicate[i] === undefined || $scope.predicate[i] === null) {\r\n $scope.predicate[i] = column;\r\n $scope.renverse[i] = false;\r\n $scope.topSorted[i] = false;\r\n $scope.bottomSorted[i] = true;\r\n }\r\n\t\t\t\tif ($scope.predicate[i][0] == column[0]) {\r\n for (var g = 0; g < $scope.predicate.length; g++) {\r\n if (g != i) {\r\n $scope.notSorted[g] = true;\r\n }\r\n }\r\n $scope.renverse[i] = !$scope.renverse[i];\r\n $scope.topSorted[i] = !$scope.topSorted[i];\r\n $scope.bottomSorted[i] = !$scope.bottomSorted[i];\r\n } else {\r\n $scope.predicate[i] = column;\r\n $scope.renverse[i] = false;\r\n $scope.topSorted[i] = false;\r\n $scope.bottomSorted[i] = true;\r\n }\r\n };\r\n\t //Filtre\r\n if (filter !== false)\r\n \t$scope.Filtre = function (valeur) {\r\n \treturn $scope.filter({ val: valeur });\r\n };\r\n $scope.getDescendantProp = function (item, desc) {\r\n return getDescendantProp(item, desc);\r\n };\r\n\r\n if (dragable) {\r\n setTimeout(\r\n\t\t\t\t\tfunction () {\r\n\t\t\t\t\t $(element[0].children.sortable).dragtable({\r\n\t\t\t\t\t excludeFooter: true,\r\n\t\t\t\t\t dragHandle: '.drag',\r\n\t\t\t\t\t persistState: function (table) {\r\n\t\t\t\t\t var drag = {\r\n\t\t\t\t\t OldPosition: table.startIndex,\r\n\t\t\t\t\t NewPosition: table.endIndex\r\n\t\t\t\t\t };\r\n\t\t\t\t\t \r\n\t\t\t\t\t $scope.saveposition({ val: drag });\r\n\t\t\t\t\t }\r\n\t\t\t\t\t });\t\t\t\t\t \r\n\t\t\t\t\t}, 500);\r\n }\r\n $scope.Freez = function (index) {\r\n $scope.colonnefrozen[$scope.datavisible[index].split(';')[0]] = !$scope.colonnefrozen[$scope.datavisible[index].split(';')[0]];\r\n };\r\n\t\t\t$scope.ReturnData = function (obj) {\r\n\t\t var param = \"\";\r\n\t\t var arrayparam;\r\n\t\t param = obj.substring(obj.indexOf('(') + 1, obj.indexOf(')'));\r\n\t\t arrayparam = param.split(',');\r\n\t\t\t //arrayparam[0] = objet courant\r\n\t\t\t //arrayparam[1] = index objet courant dans la liste\r\n\t\t \r\n\t\t if (arrayparam.length === 0) return \"{}\";\r\n\t\t else if (arrayparam.length === 1) \r\n\t\t obj = obj.substring(obj.indexOf('(') + 1, obj.indexOf(')')).replace(param, \"{\" + arrayparam[0] + \" : item}\");\r\n\t\t else\r\n\t\t obj = obj.substring(obj.indexOf('(') + 1, obj.indexOf(')')).replace(param, \"{\" + arrayparam[0] + \" : item,\" + arrayparam[1] + \" : $index}\");\r\n\t\t\t \r\n\t\t return obj;\r\n\t };\r\n\t\t\t$scope.ReturnClass = function (obj, td) {\r\n\t\t var param = \"\";\r\n\t\t var arrayparam;\r\n\t\t param = obj.substring(obj.indexOf('(') + 1, obj.indexOf(')'));\r\n\t\t arrayparam = param.split(',');\r\n\t\t //arrayparam[0] = ligne courant\r\n\t\t //arrayparam[1] = colonne\r\n\t\t obj = obj.substring(obj.indexOf('(') + 1, obj.indexOf(')')).replace(param, \"{\" + arrayparam[0] + \" : item,\" + arrayparam[1] + \" : '\" + td + \"'}\");\r\n\t\t return obj;\r\n\t };\r\n\t \r\n\t\t\t$scope.GetSum = function (item, index) {\r\n\t\t\t\tvar tt = \"\";\r\n\t\t\t\tif ($scope.rowtotal) {\r\n\t\t\t\t\t$scope.rowtotal.forEach(function (obj, intraindex) {\r\n\t\t\t\t\t\t\r\n\t \t\t\tif (item == obj) {\r\n\t \t\t\t if ($scope.data) {\r\n\t \t\t\t $scope.data.forEach(function (ob, id) {\r\n\t \t\t\t\t\t\tif (ob[item])\r\n\t \t\t\t\t\t\ttt = (isNaN(parseFloat(tt)) ? \"\" : parseFloat(tt)) + parseFloat(ob[item]);\r\n\t \t\t\t\t\t});\r\n\t\t\t\t\t\t\t\tif (!tt) tt = \"\";\r\n\t \t\t\t\t\t$scope.colspantotal++;\r\n\t \t\t\t\t}\r\n\t \t\t\t}\r\n\t \t\t});\r\n\t\t\t\t}\r\n\t\t\t\treturn tt === \"\" ? tt : Math.round(tt * 100) / 100;\r\n\t\t\t};\r\n\r\n\t\t\t$scope.Format = function (num) {\r\n\t\t\t\tif (num && !isNaN(num)) {\r\n\t\t\t\t\tnum = num + \"\";\r\n\t\t\t\t\tvar str = num;\r\n\t\t\t\t\tvar reg = new RegExp(/(\\D*)(\\d*(?:[\\.|,]\\d*)*)(\\D*)/g);\r\n\t\t\t\t\tif (reg.test(num)) {\r\n\t\t\t\t\t\tvar pref = RegExp.$1;\r\n\t\t\t\t\t\tvar suf = RegExp.$3;\r\n\t\t\t\t\t\tvar part = RegExp.$2;\r\n\t\t\t\t\t\tstr = pref + part.match(/(\\d{1,3}(?:[\\.|,]\\d*)?)(?=(\\d{3}(?:[\\.|,]\\d*)?)*$)/g).join(' ') + suf;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn str;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn num ? num : \"\";\r\n\t\t\t};\r\n\r\n\r\n\r\n }\r\n };\r\n\r\n\r\n function getTable(original) {\r\n var tableau = \"\";\r\n if (original)\r\n if (frozen !== false) {\r\n tableau += GetDivFrozen();\r\n }\r\n\r\n tableau += \"<table class=\\\"\" + ((action !== false || pdf) && original ? tablecss : \"\") + \" t_sorted\\\" id=\\\"sortable\\\">\";\r\n tableau += AddHeader(original);\r\n tableau += AddRow(original);\r\n if (original)\r\n if (pagination !== false)\r\n tableau += AddFooter(header.length);\r\n tableau += \"</table>\";\r\n return tableau;\r\n }\r\n function AddHeader(original) {\r\n var col = \"<thead><tr>\";\r\n\r\n if (selectlist && original) {\r\n col += \"<th><input type=\\\"checkbox\\\" ng-model=\\\"checkall\\\" ng-change=\\\"SelectAll()\\\" /></th>\";\r\n }\r\n col += \"<th ng-repeat=\\\"(indexhead,head) in header\\\" \";\r\n if (frozen) {\r\n\t\t\tif (original)\r\n col += \"ng-show=\\\"!colonnefrozen[datavisible[indexhead].split(';')[0]]\\\" \";\r\n else\r\n col += \"ng-if=\\\"colonnefrozen[datavisible[indexhead].split(';')[0]]\\\" \";\r\n }\r\n\r\n col += \"colspan=\\\"{{ colspans.substring(colspans.indexOf(datavisible[indexhead])+ datavisible[indexhead].length+1,colspans.indexOf(datavisible[indexhead])+ datavisible[indexhead].length+2) }}\\\" >\" +\r\n\t\t\t\"<span class=\\\"t_title\\\" >{{head}}</span>\";\r\n if (frozen) {\r\n col += \"<span class=\\\"\\\" ng-click=\\\"Freez(indexhead)\\\">froz</span>\"; //futur icone frozen\r\n }\r\n\r\n col += \"<span class=\\\"reorder\\\" ng-class=\\\"{'ico-no-sorted' : notSorted[indexhead] || predicate[indexhead] != datavisible[indexhead], 'ico-top-sorted': topSorted[indexhead] && predicate[indexhead] == datavisible[indexhead], 'ico-bottom-sorted': bottomSorted[indexhead] && predicate[indexhead] == datavisible[indexhead] }\\\" ng-click=\\\"change(datavisible[indexhead].split(';'),indexhead)\\\"></span>\";\r\n \r\n col += \"</th>\";\r\n\t\tif ((action !== false || pdf) && original) {\r\n col += \"<th></th>\";\r\n }\r\n return col + \"</tr></thead>\";\r\n }\r\n\r\n function AddFooter(nbcols) {\r\n\t\tvar col = \"<tfoot class=\\\"pagination\\\">\";\r\n\t\tcol += \"<tr><td colspan=\\\"{{ header.length +ttcolspan +\" + ((colspans ? colspans.split(',').length - 1 : 0) + (selectlist ? 1 : 0)) + \"}}\\\">\";\r\n col += \"<ul>\";\r\n col += \"<li ng-if=\\\"pages.length > 1\\\"><button type=\\\"button\\\" value=\\\"start\\\" ng-click=\\\"GoToPage(1)\\\" ><span class=\\\"ico ico-pager-first\\\"></span></button></li>\";\r\n col += \"<li ng-if=\\\"pages.length > 1\\\"><button type=\\\"button\\\" value=\\\"prev\\\" ng-click=\\\"PrevPage()\\\" ><span class=\\\"ico ico-pager-prev\\\"></span></button></li>\";\r\n \r\n col += \"<li ><select ng-model=\\\"currentpage\\\" ng-options=\\\"page.Value as page.Value for page in pages\\\" >\" +\r\n\t\t\t\t\"</select></li>\";\r\n\r\n col += \"<li ng-if=\\\"currentpage != nbpage\\\"><button type=\\\"button\\\" value=\\\"next\\\" ng-click=\\\"NextPage()\\\" ><span class=\\\"ico ico-pager-next\\\"></span></button></li>\";\r\n col += \"<li ng-if=\\\"currentpage != nbpage\\\"><button type=\\\"button\\\" value=\\\"end\\\" ng-click=\\\"GoToPage(nbpage)\\\"><span class=\\\"ico ico-pager-last\\\"></span></button></li>\";\r\n col += \"<li class=\\\"pagination_infos\\\">{{currentpage}} - {{nbpage}} de {{(data | filter: Filtre).length }} éléments</li>\";\r\n col += \"</ul>\";\r\n col += \"</td>\";\r\n\t\tif ((action || pdf) !== false) {\r\n col += \"<td></td>\";\r\n }\r\n\r\n return col + \"</tr></tfoot>\";\r\n }\r\n function AddRow(original) {\r\n var row = \"\";\r\n var td = \"\";\r\n row += \"<tr ng-repeat=\\\"(datakey,item) in filteredItems = (data | orderBy:predicate[columnselected]:renverse[columnselected]\"; //\r\n if (filter !== false)\r\n \trow += \" | filter: Filtre\";\r\n if (pagination)// traitement data \r\n \trow += \" | limitTo: selectnbrow : (currentpage * selectnbrow) - selectnbrow\"; //currentpage * selectnbrow *-1\r\n \r\n row += \")\\\"\";\r\n if (datatd) {\r\n \t\trow += \" ng-class=\\\"{\" + classtd + \": !item.\" + datatd + \"}\\\" \";\r\n }\r\n\r\n row += \"> \";\r\n if (selectlist && original) {\r\n td += \"<td><input type=\\\"checkbox\\\" ng-model=\\\"item.IsChecked\\\" /></td>\";\r\n }\r\n\r\n var propriete = \"\";\r\n\r\n td += \"<td ng-repeat=\\\"(tdindex, tditem) in datavisible\\\" \";\r\n\t\t\tif (actionrow) {\r\n\t\t\t\ttd += \"ng-click=\\\"actionrow(\" + ReturnData(actionrow) + \")\\\"\";\r\n\t\t\t}\r\n\t if (frozen) {\r\n if (original)\r\n td += \"ng-show=\\\"!colonnefrozen[datavisible[tdindex].split(';')[0]]\\\" \";\r\n else\r\n td += \"ng-if=\\\"colonnefrozen[datavisible[tdindex].split(';')[0]]\\\" \";\r\n }\r\n\r\n if (customcolumn !== false)\r\n td += \"class=\\\"{{customcolumn({item :item, column: tditem.split(';')[0]})}}\\\" \";\r\n td += \">\";\r\n\r\n\t\ttd += \"<span ng-if=\\\"datavisible[tdindex].split(';').length == 1\\\" >{{ Format(getDescendantProp(item,datavisible[tdindex])) }}</span>\";\r\n\r\n\t \r\n\t\ttd += \"<div ng-if=\\\"datavisible[tdindex].split(';').length > 1\\\" ng-switch=\\\"datavisible[tdindex].split(';')[1]\\\">\" +\r\n \"<span ng-switch-when=\\\"ico\\\" ng-click=\\\"icofunction[datavisible[tdindex].split(';')[3]]({item : item,index : datakey})\\\" class=\\\"ico datavisible[tdindex].split(';')[2]\\\"></span>\" +\r\n \"<span ng-switch-when=\\\"data\\\">{{ getDescendantProp(item,datavisible[tdindex].split(';')[0]) }}</span>\" +\r\n\t \"<span ng-switch-when=\\\"date\\\">{{ getDescendantProp(item,datavisible[tdindex].split(';')[0]) | date : formatdate }}</span>\" +\r\n\t \"<span ng-switch-when=\\\"fulldate\\\">{{ getDescendantProp(item,datavisible[tdindex].split(';')[0]) | date : formatdate+' HH:mm:ss' }}</span>\" +\r\n\t\t\t\t\"<span ng-switch-when=\\\"bool\\\">{{ (getDescendantProp(item,datavisible[tdindex].split(';')[0])? \\\"oui\\\":\\\"non\\\") }}</span>\" +\r\n\t\t\t\t\"<span ng-switch-when=\\\"html\\\" ng-bind-html=\\\"getDescendantProp(item,datavisible[tdindex].split(';')[0])\\\"></span>\" +\r\n \"<a ng-switch-when=\\\"lien\\\" target=\\\"_blank\\\" href=\\\"{{ item[datavisible[tdindex].split(';')[0]] }}\\\" >{{ getDescendantProp(item,datavisible[tdindex].split(';')[0]) }}</a>\" +\r\n \"<ul ng-switch-when=\\\"liste\\\">\" +\r\n\t\t\t\t\t\"<li ng-repeat=\\\"li in getDescendantProp(item,datavisible[tdindex].split(';')[0])\\\">\" +\r\n\t\t\t\t\t\t\"{{getDescendantProp(li, datavisible[tdindex].split(';')[2])}}\" +\r\n\t\t\t\t\t\" </li></ul>\" +\r\n\t\t\t\"<span ng-switch-default>echec du switch</span></div>\";\r\n\t \r\n\r\n td += \"</td >\";\r\n if (colspans !== false) {\r\n td += \"\";\r\n\r\n td += \"<td ng-if=\\\"isNumber(colspans.substring(colspans.indexOf(datavisible[tdindex]) + datavisible[tdindex].length + 1, colspans.indexOf(datavisible[tdindex]) + datavisible[tdindex].length + 2))\\\"\";\r\n if (frozen) {\r\n if (original)\r\n td += \"ng-show=\\\"!colonnefrozen[datavisible[tdindex].split(';')[0]]\\\" \";\r\n else\r\n td += \"ng-if=\\\"colonnefrozen[datavisible[tdindex].split(';')[0]]\\\" \";\r\n }\r\n td += \">\";\r\n td += \"{{ttcolspan++}}</td >\";\r\n\r\n\t\t}\r\n\r\n\t\tif (action !== false && original) {\r\n\t\t\ttd += \"<td tooltip-auto-size class=\\\"w5 actions\\\">\" + menu + \"</td >\";\r\n }\r\n\t\t\r\n if (pdf) {\r\n td += \"<td ng-class=\\\"{'disable' : actionpdf(\" + ReturnData(actionpdf) + \") == ''}\\\" class=\\\"w5 actions\\\"><a ng-if=\\\"actionpdf(\" + ReturnData(actionpdf) + \") != ''\\\" ng-disabled=\\\"actionpdf(\" + ReturnData(actionpdf) + \") == ''\\\" class=\\\"ico ico-go-pdf\\\" href=\\\"{{actionpdf(\" + ReturnData(actionpdf) + \")}}\\\" target=\\\"_blank\\\" ></a>\" + \"<span ng-if=\\\"actionpdf(\" + ReturnData(actionpdf) + \") == ''\\\" ng-disabled=\\\"actionpdf(\" + ReturnData(actionpdf) + \") == ''\\\" class=\\\"ico ico-go-pdf\\\" ng-click=\\\"actionpdf(\" + ReturnData(actionpdf) + \")\\\" ></span>\" +\r\n\t\t\t \"</td>\";\r\n\t }\r\n\t\t\r\n\t\trow += td;\r\n row = row + \"</tr>\";\r\n\r\n if (rowtotal !== false) {\r\n \trow += \"<tr><td class=\\\"text_right\\\" colspan=\\\"{{datavisible.length - rowtotal.length}}\\\"> TOTAL :</td>\" +\r\n \t\t\"<td ng-repeat=\\\"(tlindex, tlitem) in datavisible\\\" class=\\\"text_right\\\" ng-if=\\\"tlindex > (datavisible.length - rowtotal.length - 1)\\\"> {{ Format(GetSum(tlitem.split(';')[0]).toString()) }} </td> </tr>\";\r\n }\r\n \r\n if (addspecificrows !== false) {\r\n \trow += \"<tr ng-include=\\\"\" + addspecificrows + \"\\\"></tr>\";\r\n }\r\n\r\n\r\n\t\tif (emptytext !== \"\")\r\n\t\t\trow += \"<tr><th ng-if=\\\"data.length == 0\\\" colspan=\\\"{{datavisible.length}}\\\">\" + emptytext + \"</th></tr>\";\r\n\t\t\r\n\t\treturn row;\r\n }\r\n\t\r\n function getContentCell(type, source, propriete, occurence) {\r\n switch (type) {\r\n case \"ico\":\r\n return \"<span ng-click=\\\"icoaction\" + (occurence + 1) + \"(\" + ReturnData(propriete) + \")\\\" class=\\\"ico \" + source.replace(\"'\", \"\") + \"\\\" />\";\r\n case \"data\":\r\n return \"{{ item. \" + source + \" }}\";\r\n case \"lien\":\r\n return \"<a target=\\\"_blank\\\" href=\\\"{{ item.\" + source + \" }}\\\">{{ item.\" + source + \" }}</a>\";\r\n case \"liste\":\r\n var li = \"\";\r\n li += \"<ul>\";\r\n li += \"<li ng-repeat=\\\"li in item.\" + source + \"\\\">\";\r\n for (var f = 0; f < propriete.split('-').length; f++) {\r\n li += \"{{ li.\" + propriete.split('-')[f] + \" }}\";\r\n }\r\n li += \" </li>\";\r\n li += \"</ul>\";\r\n return li;\r\n\r\n default:\r\n return \"type de donnée demandé inexistante\";\r\n }\r\n\r\n }\r\n function getAction(actions, actionfunctions, conditions) {\r\n \tmenu = \"\";\r\n\t \r\n menu += \"<div><span class=\\\"ico ico-action\\\"></span><ul class=\\\"actions_list\\\">\";\r\n for (var g = 0; g < action.length; g++) {\r\n \tif (actionfunctions[g] !== undefined) {\r\n \t\tif (conditions[g] !== undefined && conditions[g] !== null) {\r\n \t\t\tmenu += \"<li ng-show=\\\"condition\" + (g + 1) + \"(\" + ReturnData(conditions[g]) + \")\\\"><a ng-click=\\\"action\" + (g + 1) + \"(\" + ReturnData(actionfunctions[g]) + \")\\\">\" + actions[g] + \"</a></li>\";\r\n\t\t } else {\r\n\t\t \tmenu += \"<li ><a ng-click=\\\"action\" + (g + 1) + \"(\" + ReturnData(actionfunctions[g]) + \")\\\">\" + actions[g] + \"</a></li>\";\r\n\t\t }\r\n\t } else {\r\n\r\n\t\t menu += \"<li ><a>\" + actions[g] + \"</a></li>\";\r\n\t }\r\n }\r\n menu += \"</ul></div>\";\r\n }\r\n\r\n function GetDivFrozen() {\r\n\t\tvar div = \"<div>\" + getTable(false) + \"</div>\";\r\n return div;\r\n }\r\n function getDescendantProp(obj, desc) {\r\n \tvar arr = desc.split(\".\");\r\n while (arr.length && (obj = obj[arr.shift()]));\r\n return obj;\r\n }\r\n\r\n function ReturnData(obj) {\r\n var param = \"\";\r\n var arrayparam;\r\n param = obj.substring(obj.indexOf('(') + 1, obj.indexOf(')'));\r\n arrayparam = param.split(',');\r\n //arrayparam[0] = objet courant\r\n //arrayparam[1] = index objet courant dans la liste\r\n if (arrayparam.length === 0)\r\n return \"{}\";\r\n else if (arrayparam.length === 1)\r\n obj = obj.substring(obj.indexOf('(') + 1, obj.indexOf(')')).replace(param, \"{\" + arrayparam[0] + \" : item}\");\r\n else\r\n obj = obj.substring(obj.indexOf('(') + 1, obj.indexOf(')')).replace(param, \"{\" + arrayparam[0] + \" : item,\" + arrayparam[1] + \" : $index}\");\r\n\r\n return obj; \r\n }\r\n function ReturnClass(obj, td) {\r\n var param = \"\";\r\n var arrayparam;\r\n param = obj.substring(obj.indexOf('(') + 1, obj.indexOf(')'));\r\n arrayparam = param.split(',');\r\n //arrayparam[0] = ligne courant\r\n //arrayparam[1] = colonne\r\n obj = obj.substring(obj.indexOf('(') + 1, obj.indexOf(')')).replace(param, \"{\" + arrayparam[0] + \" : item,\" + arrayparam[1] + \" : '\" + td + \"'}\");\r\n return obj;\r\n }\r\n}]);","/*\r\n* Directive de gestion du dragAndDrop ainsi que de la gestion des dimension des bloc\r\n*\t2 parametres sont Obligatoire :\r\n*\t- sortable-element : defini le parent qui contient les elements draggable\r\n*\t- start : Objet qui doit changer d'etre remplis pour lancer la directive (watcher)\r\n*\t- child-element-html : defini les element Html qui peuvent etre manipulés\r\n*\r\n* 2 parametre sont facultatif:\r\n* -connect-With: parametrage pour le plugin sortable\r\n* -handle: parametre pour le plugin sortable\r\n*\t-useChildSortable: permet de dire si des objet fils contiennent aussi des elements draggable\r\n*\t-onchangeposition : nom de la fonction a lancer a chaque dragAndDrop ou modification de taille\r\n*\t-sortable-child-element : quand on est le parent permet de dire qui sont les elements fils qui possedent des elements draggable\r\n*\t-sortable-parent-element : quand on est un fils permet de dire qui est le pere\r\n*\t-place-holder : a renseigneé si un place holder est utilisé\r\n*\t-click-size-element : objet html des fils qui doit etre utilisé pour le changement de taille de bloc\r\n*/\r\n\r\n\r\nAgrimarketDirectives.directive('sortableElement', function () {\r\n\r\n\r\n\treturn function (scope, element, attrs) {\r\n\t\tvar posArray = {};\r\n\t\tvar handle = \"\";\r\n\t\tvar connectWith = \"\";\r\n\t\tvar tableSizes = [];\r\n\t\tvar menuArray = [];\r\n\t\tvar canUpdate = false; //méthode pour éviter qu'il passe 2 fois dans l'update...\r\n\r\n\t\tfunction returnOrder(nested) {\r\n\t\t\tvar sortable;\r\n\t\t\tmenuArray = [];\r\n\t\t\tif (attrs.sortableParentElement !== undefined && attrs.sortableParentElement !== null)\r\n\t\t\t\tsortable = attrs.sortableParentElement;\r\n\t\t\telse\r\n\t\t\t\tsortable = attrs.sortableElement;\r\n\r\n\t\t\t$(sortable + '>' + attrs.childElementHtml).not(attrs.placeHolder).each(function () {\r\n\t\t\t\tvar idElemString = $(this).attr('id');\r\n\t\t\t\tvar classElem = idElemString.split(\"_\")[0];\r\n\t\t\t\tvar idElem = idElemString.split(classElem + \"_\")[1];\r\n\r\n\t\t\t\tvar nbChildren = 0;\r\n\t\t\t\tvar child = \"\";\r\n\t\t\t\tif (nested === true) {\r\n\r\n\t\t\t\t\tif (attrs.sortableChildElement !== undefined && attrs.sortableChildElement !== null)\r\n\t\t\t\t\t\tchild = attrs.sortableChildElement;\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tchild = attrs.sortableElement;\r\n\r\n\t\t\t\t\tnbChildren = $(this).find(child + '>' + attrs.childElementHtml).length;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar obj = '{\"' + classElem + 'Id\":\"' + idElem + '\"';\r\n\r\n\t\t\t\tif (tableSizes[idElemString] !== undefined && tableSizes[idElemString] !== null)\r\n\t\t\t\t\tobj += ',\"size\":\"' + tableSizes[idElemString] + '\"';\r\n\r\n\t\t\t\tif (nbChildren > 0 && nested === true) {\r\n\t\t\t\t\tobj += ',\"children\":[';\r\n\t\t\t\t\t$(this).find(child + '>' + attrs.childElementHtml).each(function () {\r\n\t\t\t\t\t\tvar idSsElemString = $(this).attr('id');\r\n\t\t\t\t\t\tif (idSsElemString !== undefined && idSsElemString !== null) {\r\n\t\t\t\t\t\t\tvar classSsElem = idSsElemString.split(\"_\")[0];\r\n\t\t\t\t\t\t\tvar idSsElem = idSsElemString.split(classSsElem + \"_\")[1];\r\n\r\n\t\t\t\t\t\t\tobj += '{\"' + classSsElem + 'Id\":\"' + idSsElem + '\"';\r\n\r\n\t\t\t\t\t\t\tif (tableSizes[idSsElemString] !== undefined && tableSizes[idSsElemString] !== null)\r\n\t\t\t\t\t\t\t\tobj += ',\"size\":\"' + tableSizes[idSsElemString] + '\"';\r\n\r\n\t\t\t\t\t\t\tif ($(this).is(':last-child'))\r\n\t\t\t\t\t\t\t\tobj += '}';\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\tobj += '},';\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t});\r\n\t\t\t\t\tobj += ']';\r\n\t\t\t\t}\r\n\r\n\t\t\t\tobj += '}';\r\n\t\t\t\tmenuArray.push(obj);\r\n\r\n\t\t\t});\r\n\r\n\t\t}\r\n\r\n\t\tvar InitSwitchElement = function () {\r\n\t\t\tif (attrs.connectWith !== undefined && attrs.connectWith !== null && attrs.connectWith !== \"\") {\r\n\t\t\t\tconnectWith = attrs.connectWith;\r\n\t\t\t}\r\n\r\n\t\t\tif (attrs.handle !== undefined && attrs.handle !== null && attrs.handle !== \"\") {\r\n\t\t\t\thandle = attrs.handle;\r\n\t\t\t}\r\n\t\t\t//DragAndDrop\r\n\t\t\t$(attrs.sortableElement).sortable({\r\n\t\t\t\tconnectWith: connectWith,\r\n\t\t\t\thandle: handle,\r\n\t\t\t\tstart: function (event, ui) {\t\t\t\t\t\r\n\t\t\t\t\tif (attrs.clickSizeElement !== undefined && attrs.clickSizeElement !== null) {\r\n\t\t\t\t\t\t$(attrs.sortableElement + ' ' + attrs.childElementHtml).each(function () {\r\n\t\t\t\t\t\t\tvar itemSize = parseInt($(this).attr('data-size'));\r\n\t\t\t\t\t\t\tvar id = $(this).attr('id');\r\n\t\t\t\t\t\t\tif (itemSize === 0)\r\n\t\t\t\t\t\t\t\ttableSizes[id] = 0;\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\ttableSizes[id] = 1;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturnOrder(attrs.useChildSortable == \"true\" ? true : false);\r\n\t\t\t\t\tposArray.Start = menuArray;\r\n\t\t\t\t\tposArray.MovedId = ui.item.attr('id');\r\n\t\t\t\t\tposArray.MovedParentIndexStart = ui.item.parents('li').prevAll('li').length;\r\n\t\t\t\t\tposArray.MovedIndexStart = ui.item.prevAll('li').length;\r\n\t\t\t\t\tcanUpdate = true;\r\n\t\t\t\t},\r\n\t\t\t\tupdate: function (event, ui) {\r\n\t\t\t\t\tif (canUpdate) {\r\n\t\t\t\t\t\treturnOrder(attrs.useChildSortable == \"true\" ? true : false);\r\n\t\t\t\t\t\tposArray.End = menuArray;\r\n\t\t\t\t\t\tposArray.MovedParentIdEnd = ui.item.parents('li').attr('id');\r\n\t\t\t\t\t\tposArray.MovedIndexEnd = ui.item.prevAll('li').length;\r\n\t\t\t\t\t\tposArray.MovedParentIndexEnd = ui.item.parents('li').prevAll('li').length;\r\n\r\n\t\t\t\t\t\tif (attrs.onchangeposition !== undefined && attrs.onchangeposition !== null && attrs.onchangeposition !== \"\") {\r\n\t\t\t\t\t\t\tscope[attrs.onchangeposition](posArray);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tcanUpdate = false;\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t});\r\n\t\t\t//Resize\r\n\t\t\tif (attrs.clickSizeElement !== undefined && attrs.clickSizeElement !== null) {\r\n\t\t\t\t$(attrs.sortableElement + ' ' + attrs.childElementHtml + ' ' + attrs.clickSizeElement).click(function () {\r\n\t\t\t\t\t$(attrs.sortableElement + ' ' + attrs.childElementHtml).each(function () {\r\n\t\t\t\t\t\tvar itemSize = parseInt($(this).attr('data-size'));\r\n\t\t\t\t\t\tvar id = $(this).attr('id');\r\n\t\t\t\t\t\tif (itemSize === 0)\r\n\t\t\t\t\t\t\ttableSizes[id] = 0;\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\ttableSizes[id] = 1;\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturnOrder(attrs.useChildSortable == \"true\" ? true : false);\r\n\t\t\t\t\tposArray.Start = menuArray;\r\n\t\t\t\t\tvar $parent = $(this).parents(attrs.childElementHtml);\r\n\t\t\t\t\tvar id = $parent.attr('id');\r\n\t\t\t\t\tvar itemSize = parseInt($parent.attr('data-size'));\r\n\r\n\t\t\t\t\tif (itemSize === 0) {\r\n\t\t\t\t\t\t$(this).addClass('ico-resize-min').removeClass('ico-resize');\r\n\t\t\t\t\t\t$parent\r\n\t\t\t\t\t\t\t.removeClass('cols_4').addClass('cols_8')\r\n\t\t\t\t\t\t\t.attr('data-size', 1);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t$(this).addClass('ico-resize').removeClass('ico-resize-min');\r\n\t\t\t\t\t\t$parent\r\n\t\t\t\t\t\t\t.removeClass('cols_8').addClass('cols_4')\r\n\t\t\t\t\t\t\t.attr('data-size', 0);\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\titemSize = parseInt($parent.attr('data-size'));\r\n\r\n\t\t\t\t\t// On met à jour la data-size dans le tableau\r\n\t\t\t\t\ttableSizes[id] = itemSize;\r\n\r\n\t\t\t\t\treturnOrder(attrs.useChildSortable == \"true\" ? true : false);\r\n\t\t\t\t\tposArray.End = menuArray;\r\n\r\n\t\t\t\t\tif (attrs.onchangeposition !== undefined && attrs.onchangeposition !== null && attrs.onchangeposition !== \"\")\r\n\t\t\t\t\t\tscope[attrs.onchangeposition](posArray);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tscope.$watchCollection(attrs.start, function (newValue) {\r\n\t\t\tif (newValue === undefined || newValue === null) return;\r\n\t\t\tInitSwitchElement();\r\n\t\t});\r\n\t};\r\n});","var isFixed = false;\r\nvar angularFilter;\r\nAgrimarketDirectives.directive('euronextgraph', ['$filter', function ($filter) {\r\n\tangularFilter = $filter('filter');\r\n\r\n\tHighcharts.setOptions(Highcharts.theme);\r\n\r\n\treturn function (scope, iElement, iAttrs) {\r\n\r\n\t\tvar GenerateEuronextSerie = function (euronextSeries) {\r\n\t\t\tvar serietmp = { graphSettle: [], graphVolume: [] };\r\n\t\t\teuronextSeries.forEach(function (item) {\r\n\t\t\t\tvar jour = parseInt(item.Date.split('/')[0]);\r\n\t\t\t\tvar mois = parseInt(item.Date.split('/')[1]);\r\n\t\t\t\tvar annee = parseInt(\"20\" + item.Date.split('/')[2]);\r\n\t\t\t\tvar date = new Date(annee, mois - 1, jour);\r\n\t\t\t\tif (iAttrs.type == 'line')\r\n\t\t\t\t\tserietmp.graphSettle.push({\r\n\t\t\t\t\t\tx: Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()),\r\n\t\t\t\t\t\ty: item.Settle\r\n\t\t\t\t\t});\r\n\t\t\t\telse\r\n\t\t\t\t\tserietmp.graphSettle.push([Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()), item.Open, item.High, item.Low, item.Settle]);\r\n\r\n\t\t\t\tserietmp.graphVolume.push({\r\n\t\t\t\t\tx: Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()),\r\n\t\t\t\t\ty: item.Voltt\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\treturn serietmp;\r\n\t\t};\r\n\r\n\t\tscope[iAttrs.showSerie] = function (newType) {\r\n\t\t\tiAttrs.type = newType;\r\n\t\t\tdrawChart(GenerateEuronextSerie(scope.series));\r\n\t\t};\r\n\r\n\t\tvar drawChart = function (series) {\r\n\t\t\t$(\"#\" + iAttrs.id).highcharts('StockChart', {\r\n\t\t\t\tchart: {\r\n\t\t\t\t\theight: 510,\r\n\t\t\t\t\tmarginTop: 10,\r\n\t\t\t\t\tmarginLeft: 20\r\n\t\t\t\t},\r\n\t\t\t\trangeSelector: {\r\n\t\t\t\t\tallButtonsEnabled: true,\r\n\t\t\t\t\tselected: 4,\r\n\t\t\t\t\tinputDateFormat: \"%d/%m/%Y\",\r\n\t\t\t\t\tinputEditDateFormat: \"%d/%m/%Y\",\r\n\t\t\t\t\tinputDateParser: function (value) {\r\n\t\t\t\t\t\tvalue = value.split('/');\r\n\t\t\t\t\t\treturn Date.UTC(\r\n\t\t\t\t\t\t parseInt(value[2]),\r\n\t\t\t\t\t\t parseInt(value[1]) - 1,\r\n\t\t\t\t\t\t parseInt(value[0])\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\tcredits: {\r\n\t\t\t\t\tenabled: false\r\n\t\t\t\t},\r\n\t\t\t\ttitle: {\r\n\t\t\t\t\ttext: iAttrs.namechart\r\n\t\t\t\t},\r\n\t\t\t\tyAxis: [{\r\n\t\t\t\t\ttitle: {\r\n\t\t\t\t\t\ttext: 'Cours'\r\n\t\t\t\t\t},\r\n\t\t\t\t\theight: 200,\r\n\t\t\t\t\toffset: 0,\r\n\t\t\t\t\tlineWidth: 2,\r\n\t\t\t\t}, {\r\n\t\t\t\t\ttitle: {\r\n\t\t\t\t\t\ttext: 'Volume'\r\n\t\t\t\t\t},\r\n\t\t\t\t\ttop: 300,\r\n\t\t\t\t\theight: 100,\r\n\t\t\t\t\toffset: 0,\r\n\t\t\t\t\tlineWidth: 2,\r\n\t\t\t\t}],\r\n\t\t\t\tseries: [{\r\n\t\t\t\t\tname: 'Cours Euronext',\r\n\t\t\t\t\ttype: iAttrs.type,\r\n\t\t\t\t\tdata: series.graphSettle,\r\n\t\t\t\t\tyAxis: 0,\r\n\t\t\t\t\ttooltip: {\r\n\t\t\t\t\t\tvalueSuffix: ' €/T'\r\n\t\t\t\t\t}\r\n\t\t\t\t}, {\r\n\t\t\t\t\tname: 'Volume',\r\n\t\t\t\t\ttype: 'column',\r\n\t\t\t\t\tdata: series.graphVolume,\r\n\t\t\t\t\tyAxis: 1,\r\n\t\t\t\t\ttooltip: {\r\n\t\t\t\t\t\tvalueSuffix: ' lot(s)'\r\n\t\t\t\t\t}\r\n\t\t\t\t}]\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tscope.$watch(iAttrs.euronext, function (newValue) {\r\n\t\t\tif (newValue === undefined || newValue === null || newValue.length === 0) return;\r\n\t\t\tscope.series = newValue;\r\n\t\t\tdrawChart(GenerateEuronextSerie(newValue));\r\n\t\t});\r\n\t};\r\n}]);","/**\r\n * Angucomplete\r\n * Autocomplete directive for AngularJS\r\n * By Daryl Rowland\r\n * https://github.com/darylrowland/angucomplete\r\n */\r\n\r\nangular.module('angucomplete', [])\r\n .directive('angucomplete', function ($parse, $http, $sce, $timeout) {\r\n \treturn {\r\n \t\trestrict: 'EA',\r\n \t\tscope: {\r\n \t\t\t\"id\": \"@id\",\r\n \t\t\t\"placeholder\": \"@placeholder\",\r\n \t\t\t\"selectedObject\": \"=selectedobject\",\r\n \t\t\t\"url\": \"@url\",\r\n \t\t\t\"dataField\": \"@datafield\",\r\n \t\t\t\"titleField\": \"@titlefield\",\r\n \t\t\t\"descriptionField\": \"@descriptionfield\",\r\n \t\t\t\"imageField\": \"@imagefield\",\r\n \t\t\t\"imageUri\": \"@imageuri\",\r\n \t\t\t\"inputClass\": \"@inputclass\",\r\n \t\t\t\"userPause\": \"@pause\",\r\n \t\t\t\"localData\": \"=localdata\",\r\n \t\t\t\"searchFields\": \"@searchfields\",\r\n \t\t\t\"minLengthUser\": \"@minlength\",\r\n \t\t\t\"matchClass\": \"@matchclass\",\r\n \t\t\t\"searchStr\": \"=searchstr\",\r\n \t\t\t\"launchFunction\": \"=launchfunction\",\r\n \t\t\t\"popUpComfirm\": \"=popupcomfirm\",\r\n \t\t\t\"resetInput\": \"=resetinput\",\r\n \t\t\t\"inputwidth\": \"@inputwidth\",\r\n\r\n \t\t},\r\n \t\ttemplate: '<div class=\"angucomplete-holder\">' +\r\n\t\t\t\t\t\t'<input autocomplete=\"off\" style=\"width: {{inputwidth}}px;\" id=\"{{id}}_value\" ng-model=\"searchStr\" type=\"text\" placeholder=\"{{placeholder}}\" class=\"{{inputClass}}\" onmouseup=\"this.select();\" ng-focus=\"resetHideResults()\" ng-blur=\"hideResults()\" />' +\r\n\t\t\t\t\t\t'<div id=\"{{id}}_dropdown\" class=\"angucomplete-dropdown\" ng-if=\"showDropdown\">' +\r\n\t\t\t\t\t\t\t'<div class=\"angucomplete-searching\" ng-show=\"searching\">Searching...</div>' +\r\n\t\t\t\t\t\t\t'<div class=\"angucomplete-searching\" ng-show=\"!searching && (!results || results.length == 0)\" style=\"text-align: left;\" >No results found</div>' +\r\n\t\t\t\t\t\t\t'<div class=\"angucomplete-row\" ng-repeat=\"result in results\" ng-mousedown=\"selectResult(result)\" ng-mouseover=\"hoverRow()\" style=\"text-align: left;\" ng-class=\"{\\'angucomplete-selected-row\\': $index == currentIndex}\">' +\r\n\t\t\t\t\t\t\t\t'<div ng-if=\"imageField\" class=\"angucomplete-image-holder\">' +\r\n\t\t\t\t\t\t\t\t\t'<img ng-if=\"result.image && result.image != \\'\\'\" ng-src=\"{{result.image}}\" class=\"angucomplete-image\"/>' +\r\n\t\t\t\t\t\t\t\t\t'<div ng-if=\"!result.image && result.image != \\'\\'\" class=\"angucomplete-image-default\"></div>' +\r\n\t\t\t\t\t\t\t\t'</div>' +\r\n\t\t\t\t\t\t\t\t'<div class=\"angucomplete-title\" ng-if=\"matchClass\" ng-bind-html=\"result.title\"></div>' +\r\n\t\t\t\t\t\t\t\t'<div class=\"angucomplete-title\" ng-if=\"!matchClass\">{{ result.title }}</div>' +\r\n\t\t\t\t\t\t\t\t'<div ng-if=\"result.description && result.description != \\'\\'\" class=\"angucomplete-description\">{{result.description}}</div>' +\r\n\t\t\t\t\t\t\t'</div>' +\r\n\t\t\t\t\t\t'</div>' +\r\n\t\t\t\t\t'</div>',\r\n\r\n \t\tlink: function ($scope, elem, attrs) {\r\n \t\t\t$scope.lastSearchTerm = null;\r\n \t\t\t$scope.currentIndex = null;\r\n \t\t\t$scope.justChanged = false;\r\n \t\t\t$scope.searchTimer = null;\r\n \t\t\t$scope.hideTimer = null;\r\n \t\t\t$scope.searching = false;\r\n \t\t\t$scope.pause = 500;\r\n \t\t\t$scope.minLength = 3;\r\n \t\t\t$scope.searchStr = null;\r\n\r\n \t\t\tif ($scope.minLengthUser && $scope.minLengthUser !== \"\") {\r\n \t\t\t\t$scope.minLength = $scope.minLengthUser;\r\n \t\t\t}\r\n\r\n \t\t\tif ($scope.userPause) {\r\n \t\t\t\t$scope.pause = $scope.userPause;\r\n \t\t\t}\r\n\r\n \t\t\tvar isNewSearchNeeded = function(newTerm, oldTerm) {\r\n \t\t\t\treturn newTerm.length >= $scope.minLength && newTerm != oldTerm;\r\n \t\t\t};\r\n\r\n \t\t\t$scope.processResults = function(responseData, str) {\r\n \t\t\t\tif (responseData && responseData.length > 0) {\r\n \t\t\t\t\t$scope.results = [];\r\n\r\n \t\t\t\t\tvar titleFields = [];\r\n \t\t\t\t\tif ($scope.titleField && $scope.titleField !== \"\") {\r\n \t\t\t\t\t\ttitleFields = $scope.titleField.split(\",\");\r\n \t\t\t\t\t}\r\n\r\n \t\t\t\t\tfor (var i = 0; i < responseData.length; i++) {\r\n \t\t\t\t\t\t// Get title variables\r\n \t\t\t\t\t\tvar titleCode = [];\r\n\r\n \t\t\t\t\t\tfor (var t = 0; t < titleFields.length; t++) {\r\n \t\t\t\t\t\t\ttitleCode.push(responseData[i][titleFields[t]]);\r\n \t\t\t\t\t\t}\r\n\r\n \t\t\t\t\t\tvar description = \"\";\r\n \t\t\t\t\t\tif ($scope.descriptionField) {\r\n \t\t\t\t\t\t\tdescription = responseData[i][$scope.descriptionField];\r\n \t\t\t\t\t\t}\r\n\r\n \t\t\t\t\t\tvar imageUri = \"\";\r\n \t\t\t\t\t\tif ($scope.imageUri) {\r\n \t\t\t\t\t\t\timageUri = $scope.imageUri;\r\n \t\t\t\t\t\t}\r\n\r\n \t\t\t\t\t\tvar image = \"\";\r\n \t\t\t\t\t\tif ($scope.imageField) {\r\n \t\t\t\t\t\t\timage = imageUri + responseData[i][$scope.imageField];\r\n \t\t\t\t\t\t}\r\n\r\n \t\t\t\t\t\tvar text = titleCode.join(' ');\r\n \t\t\t\t\t\tif ($scope.matchClass) {\r\n \t\t\t\t\t\t\tvar re = new RegExp(str, 'i');\r\n \t\t\t\t\t\t\tvar strPart = text.match(re)[0];\r\n \t\t\t\t\t\t\ttext = $sce.trustAsHtml(text.replace(re, '<span class=\"' + $scope.matchClass + '\">' + strPart + '</span>'));\r\n \t\t\t\t\t\t}\r\n\r\n \t\t\t\t\t\tvar resultRow = {\r\n \t\t\t\t\t\t\ttitle: text,\r\n \t\t\t\t\t\t\tdescription: description,\r\n \t\t\t\t\t\t\timage: image,\r\n \t\t\t\t\t\t\toriginalObject: responseData[i]\r\n \t\t\t\t\t\t};\r\n\r\n \t\t\t\t\t\t$scope.results[$scope.results.length] = resultRow;\r\n \t\t\t\t\t}\r\n\r\n\r\n \t\t\t\t} else {\r\n \t\t\t\t\t$scope.results = [];\r\n \t\t\t\t}\r\n \t\t\t};\r\n\r\n \t\t\t$scope.searchTimerComplete = function(str) {\r\n \t\t\t\t// Begin the search\r\n\r\n \t\t\t\tif (str.length >= $scope.minLength) {\r\n \t\t\t\t\tif ($scope.localData) {\r\n \t\t\t\t\t\tvar searchFields = $scope.searchFields.split(\",\");\r\n\r\n \t\t\t\t\t\tvar matches = [];\r\n\r\n \t\t\t\t\t\tfor (var i = 0; i < $scope.localData.length; i++) {\r\n \t\t\t\t\t\t\tvar match = false;\r\n\r\n \t\t\t\t\t\t\tfor (var s = 0; s < searchFields.length; s++) {\r\n \t\t\t\t\t\t\t\tmatch = match || (typeof $scope.localData[i][searchFields[s]] === 'string' && typeof str === 'string' && $scope.localData[i][searchFields[s]].toLowerCase().indexOf(str.toLowerCase()) >= 0);\r\n \t\t\t\t\t\t\t}\r\n\r\n \t\t\t\t\t\t\tif (match) {\r\n \t\t\t\t\t\t\t\tmatches[matches.length] = $scope.localData[i];\r\n \t\t\t\t\t\t\t}\r\n \t\t\t\t\t\t}\r\n\r\n \t\t\t\t\t\t$scope.searching = false;\r\n \t\t\t\t\t\t$scope.processResults(matches, str);\r\n\r\n \t\t\t\t\t} else {\r\n \t\t\t\t\t\t$http.get($scope.url + str, {}).\r\n \t\t\t\t\t\t\tsuccess(function(responseData, status, headers, config) {\r\n\t\t\t\t\t\t\t\t\t$scope.searching = false;\r\n\t\t\t\t\t\t\t\t\t$scope.processResults((($scope.dataField) ? responseData[$scope.dataField] : responseData), str);\r\n\t\t\t\t\t\t\t\t}).\r\n \t\t\t\t\t\t\terror(function(data, status, headers, config) {\r\n\t\t\t\t\t\t\t\t\tconsole.log(\"error\");\r\n\t\t\t\t\t\t\t\t});\r\n \t\t\t\t\t}\r\n \t\t\t\t}\r\n \t\t\t};\r\n\r\n \t\t\t$scope.hideResults = function () {\r\n \t\t\t\t$scope.hideTimer = $timeout(function () {\r\n \t\t\t\t\t$scope.showDropdown = false;\r\n \t\t\t\t}, $scope.pause);\r\n \t\t\t};\r\n\r\n \t\t\t$scope.resetHideResults = function () {\r\n \t\t\t\tif ($scope.hideTimer) {\r\n \t\t\t\t\t$timeout.cancel($scope.hideTimer);\r\n \t\t\t\t}\r\n \t\t\t};\r\n\r\n \t\t\t$scope.hoverRow = function(index) {\r\n \t\t\t\t$scope.currentIndex = index;\r\n \t\t\t};\r\n\r\n \t\t\t$scope.keyPressed = function(event) {\r\n \t\t\t\tif (!(event.which == 38 || event.which == 40 || event.which == 13)) {\r\n \t\t\t\t\tif (!$scope.searchStr || $scope.searchStr === \"\") {\r\n \t\t\t\t\t\t$scope.showDropdown = false;\r\n \t\t\t\t\t\t$scope.lastSearchTerm = null;\r\n \t\t\t\t\t} else if (isNewSearchNeeded($scope.searchStr, $scope.lastSearchTerm)) {\r\n \t\t\t\t\t\t$scope.lastSearchTerm = $scope.searchStr;\r\n \t\t\t\t\t\t$scope.showDropdown = true;\r\n \t\t\t\t\t\t$scope.currentIndex = -1;\r\n \t\t\t\t\t\t$scope.results = [];\r\n\r\n \t\t\t\t\t\tif ($scope.searchTimer) {\r\n \t\t\t\t\t\t\t$timeout.cancel($scope.searchTimer);\r\n \t\t\t\t\t\t}\r\n\r\n \t\t\t\t\t\t$scope.searching = true;\r\n\r\n \t\t\t\t\t\t$scope.searchTimer = $timeout(function() {\r\n \t\t\t\t\t\t\t$scope.searchTimerComplete($scope.searchStr);\r\n \t\t\t\t\t\t}, $scope.pause);\r\n \t\t\t\t\t}\r\n \t\t\t\t} else {\r\n \t\t\t\t\tevent.preventDefault();\r\n \t\t\t\t}\r\n \t\t\t};\r\n\r\n\t\t\t $scope.selectResult = function(result) {\r\n\t\t\t\t if ($scope.matchClass) {\r\n\t\t\t\t\t result.title = result.title.toString().replace(/(<([^>]+)>)/ig, '');\r\n\t\t\t\t }\r\n\t\t\t\t $scope.searchStr = $scope.lastSearchTerm = result.title;\r\n\t\t\t\t $scope.selectedObject = result;\r\n\t\t\t\t $scope.showDropdown = false;\r\n\t\t\t\t $scope.results = [];\r\n\r\n if ($scope.launchFunction) {\r\n if ($scope.popUpComfirm) {\r\n $scope.launchFunction(result.originalObject, $scope.popUpComfirm);\r\n }\r\n else {\r\n $scope.launchFunction(result.originalObject);\r\n }\r\n }\r\n\t\t\t };\r\n\r\n\t\t\t $scope.$watch(\"resetInput\", function (newValue) {\r\n\t\t\t \tswitch (newValue) {\r\n\t\t\t \t\tcase 1: $scope.searchStr = null;\r\n\t\t\t \t\t\tbreak;\r\n\t\t\t \t\tcase 2: $scope.searchStr = $scope.oldSelectedItem;\r\n\t\t\t \t\t\tbreak;\r\n\t\t\t \t\tcase 3: $scope.oldSelectedItem = $scope.searchStr;\r\n\t\t\t \t\t\tbreak;\r\n\t\t\t \t}\r\n\t\t\t });\r\n\r\n\t\t\t var inputField = elem.find('input');\r\n\r\n \t\t\tinputField.on('keyup', $scope.keyPressed);\r\n\r\n \t\t\telem.on(\"keyup\", function (event) {\r\n \t\t\t\tif (event.which === 40) {\r\n \t\t\t\t\tif ($scope.results && ($scope.currentIndex + 1) < $scope.results.length) {\r\n \t\t\t\t\t\t$scope.currentIndex++;\r\n \t\t\t\t\t\t$scope.$apply();\r\n \t\t\t\t\t\tevent.preventDefault();\r\n \t\t\t\t\t\tevent.stopPropagation();\r\n \t\t\t\t\t}\r\n\r\n \t\t\t\t\t$scope.$apply();\r\n \t\t\t\t} else if (event.which == 38) {\r\n \t\t\t\t\tif ($scope.currentIndex >= 1) {\r\n \t\t\t\t\t\t$scope.currentIndex--;\r\n \t\t\t\t\t\t$scope.$apply();\r\n \t\t\t\t\t\tevent.preventDefault();\r\n \t\t\t\t\t\tevent.stopPropagation();\r\n \t\t\t\t\t}\r\n\r\n \t\t\t\t} else if (event.which == 13) {\r\n \t\t\t\t\tif ($scope.results && $scope.currentIndex >= 0 && $scope.currentIndex < $scope.results.length) {\r\n \t\t\t\t\t\t$scope.selectResult($scope.results[$scope.currentIndex]);\r\n \t\t\t\t\t\t$scope.$apply();\r\n \t\t\t\t\t\tevent.preventDefault();\r\n \t\t\t\t\t\tevent.stopPropagation();\r\n \t\t\t\t\t} else {\r\n \t\t\t\t\t\t$scope.results = [];\r\n \t\t\t\t\t\t$scope.$apply();\r\n \t\t\t\t\t\tevent.preventDefault();\r\n \t\t\t\t\t\tevent.stopPropagation();\r\n \t\t\t\t\t}\r\n\r\n \t\t\t\t} else if (event.which == 27) {\r\n \t\t\t\t\t$scope.results = [];\r\n \t\t\t\t\t$scope.showDropdown = false;\r\n \t\t\t\t\t$scope.$apply();\r\n \t\t\t\t} else if (event.which == 8) {\r\n \t\t\t\t\t$scope.selectedObject = null;\r\n \t\t\t\t\t$scope.$apply();\r\n \t\t\t\t}\r\n \t\t\t});\r\n\r\n \t\t}\r\n \t};\r\n });\r\n\r\n","/*\r\n * angucomplete-alt\r\n * Autocomplete directive for AngularJS\r\n * This is a fork of Daryl Rowland's angucomplete with some extra features.\r\n * By Hidenari Nozaki\r\n */\r\n\r\n/*! Copyright (c) 2014 Hidenari Nozaki and contributors | Licensed under the MIT license */\r\n\r\n/* Modification de Ligne 38 : \r\n * @Author : Dragin Alann\r\n * @DateModification : 31/05/2016\r\n * @Describe : Permet de recuperer dans le controlleur la valeur du ng-model binder par le template de la directive\r\n */\r\n\r\n(function (root, factory) {\r\n 'use strict';\r\n if (typeof module !== 'undefined' && module.exports) {\r\n // CommonJS\r\n module.exports = factory(require('angular'));\r\n } else if (typeof define === 'function' && define.amd) {\r\n // AMD\r\n define(['angular'], factory);\r\n } else {\r\n // Global Variables\r\n factory(root.angular);\r\n }\r\n}(window, function (angular) {\r\n 'use strict';\r\n\r\n angular.module('angucomplete-alt', []).directive('angucompleteAlt', ['$q', '$parse', '$http', '$sce', '$timeout', '$interpolate', function ($q, $parse, $http, $sce, $timeout, $interpolate) {\r\n // keyboard events\r\n var KEY_DW = 40;\r\n var KEY_RT = 39;\r\n var KEY_UP = 38;\r\n var KEY_LF = 37;\r\n var KEY_ES = 27;\r\n var KEY_EN = 13;\r\n var KEY_TAB = 9;\r\n\r\n var MIN_LENGTH = 3;\r\n var MAX_LENGTH = 524288; // the default max length per the html maxlength attribute\r\n var PAUSE = 500;\r\n var BLUR_TIMEOUT = 200;\r\n\r\n // string constants\r\n var REQUIRED_CLASS = 'autocomplete-required';\r\n var TEXT_SEARCHING = 'Searching...';\r\n var TEXT_NORESULTS = 'No results found';\r\n\r\n function link(scope, elem, attrs, ctrl) {\r\n var inputField = elem.find('input');\r\n var minlength = MIN_LENGTH;\r\n var searchTimer = null;\r\n var hideTimer;\r\n var requiredClassName = REQUIRED_CLASS;\r\n var responseFormatter;\r\n var validState = null;\r\n var httpCanceller = null;\r\n var dd = elem[0].querySelector('.angucomplete-dropdown');\r\n var isScrollOn = false;\r\n var mousedownOn = null;\r\n var unbindInitialValue;\r\n var displaySearching;\r\n var displayNoResults;\r\n\r\n elem.on('mousedown', function (event) {\r\n if (event.target.id) {\r\n mousedownOn = event.target.id;\r\n if (mousedownOn === scope.id + '_dropdown') {\r\n document.body.addEventListener('click', clickoutHandlerForDropdown);\r\n }\r\n }\r\n else {\r\n mousedownOn = event.target.className;\r\n }\r\n });\r\n\r\n scope.currentIndex = scope.focusFirst ? 0 : null;\r\n scope.searching = false;\r\n unbindInitialValue = scope.$watch('initialValue', function (newval) {\r\n if (newval) {\r\n // remove scope listener\r\n unbindInitialValue();\r\n // change input\r\n handleInputChange(newval, true);\r\n }\r\n });\r\n\r\n scope.$watch('fieldRequired', function (newval, oldval) {\r\n if (newval !== oldval) {\r\n if (!newval) {\r\n ctrl[scope.inputName].$setValidity(requiredClassName, true);\r\n }\r\n else if (!validState || scope.currentIndex === -1) {\r\n handleRequired(false);\r\n }\r\n else {\r\n handleRequired(true);\r\n }\r\n }\r\n });\r\n\r\n scope.$on('angucomplete-alt:clearInput', function (event, elementId) {\r\n if (!elementId || elementId === scope.id) {\r\n scope.searchStr = null;\r\n callOrAssign();\r\n handleRequired(false);\r\n clearResults();\r\n }\r\n });\r\n\r\n scope.$on('angucomplete-alt:changeInput', function (event, elementId, newval) {\r\n if (!!elementId && elementId === scope.id) {\r\n handleInputChange(newval);\r\n }\r\n });\r\n\r\n function handleInputChange(newval, initial) {\r\n if (newval) {\r\n if (typeof newval === 'object') {\r\n scope.searchStr = extractTitle(newval);\r\n callOrAssign({ originalObject: newval });\r\n } else if (typeof newval === 'string' && newval.length > 0) {\r\n scope.searchStr = newval;\r\n } else {\r\n if (console && console.error) {\r\n console.error('Tried to set ' + (!!initial ? 'initial' : '') + ' value of angucomplete to', newval, 'which is an invalid value');\r\n }\r\n }\r\n\r\n handleRequired(true);\r\n }\r\n }\r\n\r\n // #194 dropdown list not consistent in collapsing (bug).\r\n function clickoutHandlerForDropdown(event) {\r\n mousedownOn = null;\r\n scope.hideResults(event);\r\n document.body.removeEventListener('click', clickoutHandlerForDropdown);\r\n }\r\n\r\n // for IE8 quirkiness about event.which\r\n function ie8EventNormalizer(event) {\r\n return event.which ? event.which : event.keyCode;\r\n }\r\n\r\n function callOrAssign(value) {\r\n if (typeof scope.selectedObject === 'function') {\r\n scope.selectedObject(value, scope.selectedObjectData);\r\n }\r\n else {\r\n scope.selectedObject = value;\r\n }\r\n\r\n if (value) {\r\n handleRequired(true);\r\n }\r\n else {\r\n handleRequired(false);\r\n }\r\n }\r\n\r\n function callFunctionOrIdentity(fn) {\r\n return function (data) {\r\n return scope[fn] ? scope[fn](data) : data;\r\n };\r\n }\r\n\r\n function setInputString(str) {\r\n callOrAssign({ originalObject: str });\r\n\r\n if (scope.clearSelected) {\r\n scope.searchStr = null;\r\n }\r\n clearResults();\r\n }\r\n\r\n function extractTitle(data) {\r\n // split title fields and run extractValue for each and join with ' '\r\n return scope.titleField.split(',')\r\n .map(function (field) {\r\n return extractValue(data, field);\r\n })\r\n .join(' ');\r\n }\r\n\r\n function extractValue(obj, key) {\r\n var keys, result;\r\n if (key) {\r\n keys = key.split('.');\r\n result = obj;\r\n for (var i = 0; i < keys.length; i++) {\r\n result = result[keys[i]];\r\n }\r\n }\r\n else {\r\n result = obj;\r\n }\r\n return result;\r\n }\r\n\r\n function findMatchString(target, str) {\r\n var result, matches, re;\r\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\r\n // Escape user input to be treated as a literal string within a regular expression\r\n re = new RegExp(str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'i');\r\n if (!target) { return; }\r\n if (!target.match || !target.replace) { target = target.toString(); }\r\n matches = target.match(re);\r\n if (matches) {\r\n result = target.replace(re,\r\n '<span class=\"' + scope.matchClass + '\">' + matches[0] + '</span>');\r\n }\r\n else {\r\n result = target;\r\n }\r\n return $sce.trustAsHtml(result);\r\n }\r\n\r\n function handleRequired(valid) {\r\n scope.notEmpty = valid;\r\n validState = scope.searchStr;\r\n if (scope.fieldRequired && ctrl && scope.inputName) {\r\n ctrl[scope.inputName].$setValidity(requiredClassName, valid);\r\n }\r\n }\r\n\r\n function keyupHandler(event) {\r\n var which = ie8EventNormalizer(event);\r\n if (which === KEY_LF || which === KEY_RT) {\r\n // do nothing\r\n return;\r\n }\r\n\r\n if (which === KEY_UP || which === KEY_EN) {\r\n event.preventDefault();\r\n }\r\n else if (which === KEY_DW) {\r\n event.preventDefault();\r\n if (!scope.showDropdown && scope.searchStr && scope.searchStr.length >= minlength) {\r\n initResults();\r\n scope.searching = true;\r\n searchTimerComplete(scope.searchStr);\r\n }\r\n }\r\n else if (which === KEY_ES) {\r\n clearResults();\r\n scope.$apply(function () {\r\n inputField.val(scope.searchStr);\r\n });\r\n }\r\n else {\r\n if (minlength === 0 && !scope.searchStr) {\r\n return;\r\n }\r\n\r\n if (!scope.searchStr || scope.searchStr === '') {\r\n scope.showDropdown = false;\r\n } else if (scope.searchStr.length >= minlength) {\r\n initResults();\r\n\r\n if (searchTimer) {\r\n $timeout.cancel(searchTimer);\r\n }\r\n\r\n scope.searching = true;\r\n\r\n searchTimer = $timeout(function () {\r\n searchTimerComplete(scope.searchStr);\r\n }, scope.pause);\r\n }\r\n\r\n if (validState && validState !== scope.searchStr && !scope.clearSelected) {\r\n scope.$apply(function () {\r\n callOrAssign();\r\n });\r\n }\r\n }\r\n }\r\n\r\n function handleOverrideSuggestions(event) {\r\n if (scope.overrideSuggestions &&\r\n !(scope.selectedObject && scope.selectedObject.originalObject === scope.searchStr)) {\r\n if (event) {\r\n event.preventDefault();\r\n }\r\n\r\n // cancel search timer\r\n $timeout.cancel(searchTimer);\r\n // cancel http request\r\n cancelHttpRequest();\r\n\r\n setInputString(scope.searchStr);\r\n }\r\n }\r\n\r\n //function dropdownRowOffsetHeight(row) {\r\n // var css = getComputedStyle(row);\r\n // return row.offsetHeight +\r\n // parseInt(css.marginTop, 10) + parseInt(css.marginBottom, 10);\r\n //}\r\n\r\n //function dropdownHeight() {\r\n // return dd.getBoundingClientRect().top +\r\n // parseInt(getComputedStyle(dd).maxHeight, 10);\r\n //}\r\n\r\n function dropdownRow() {\r\n return elem[0].querySelectorAll('.angucomplete-row')[scope.currentIndex];\r\n }\r\n\r\n function dropdownRowTop() {\r\n return dropdownRow().getBoundingClientRect().top -\r\n (dd.getBoundingClientRect().top +\r\n parseInt(getComputedStyle(dd).paddingTop, 10));\r\n }\r\n\r\n function dropdownScrollTopTo(offset) {\r\n dd.scrollTop = dd.scrollTop + offset;\r\n }\r\n\r\n function updateInputField() {\r\n var current = scope.results[scope.currentIndex];\r\n if (scope.matchClass) {\r\n inputField.val(extractTitle(current.originalObject));\r\n }\r\n else {\r\n inputField.val(current.title);\r\n }\r\n }\r\n\r\n function keydownHandler(event) {\r\n var which = ie8EventNormalizer(event);\r\n var row = null;\r\n var rowTop = null;\r\n\r\n if (which === KEY_EN && scope.results) {\r\n if (scope.currentIndex >= 0 && scope.currentIndex < scope.results.length) {\r\n event.preventDefault();\r\n scope.selectResult(scope.results[scope.currentIndex]);\r\n } else {\r\n handleOverrideSuggestions(event);\r\n clearResults();\r\n }\r\n scope.$apply();\r\n } else if (which === KEY_DW && scope.results) {\r\n event.preventDefault();\r\n if ((scope.currentIndex + 1) < scope.results.length && scope.showDropdown) {\r\n scope.$apply(function () {\r\n scope.currentIndex++;\r\n updateInputField();\r\n });\r\n\r\n if (isScrollOn) {\r\n row = dropdownRow();\r\n if (dropdownHeight() < row.getBoundingClientRect().bottom) {\r\n dropdownScrollTopTo(dropdownRowOffsetHeight(row));\r\n }\r\n }\r\n }\r\n } else if (which === KEY_UP && scope.results) {\r\n event.preventDefault();\r\n if (scope.currentIndex >= 1) {\r\n scope.$apply(function () {\r\n scope.currentIndex--;\r\n updateInputField();\r\n });\r\n\r\n if (isScrollOn) {\r\n rowTop = dropdownRowTop();\r\n if (rowTop < 0) {\r\n dropdownScrollTopTo(rowTop - 1);\r\n }\r\n }\r\n }\r\n else if (scope.currentIndex === 0) {\r\n scope.$apply(function () {\r\n scope.currentIndex = -1;\r\n inputField.val(scope.searchStr);\r\n });\r\n }\r\n } else if (which === KEY_TAB) {\r\n if (scope.results && scope.results.length > 0 && scope.showDropdown) {\r\n if (scope.currentIndex === -1 && scope.overrideSuggestions) {\r\n // intentionally not sending event so that it does not\r\n // prevent default tab behavior\r\n handleOverrideSuggestions();\r\n }\r\n else {\r\n if (scope.currentIndex === -1) {\r\n scope.currentIndex = 0;\r\n }\r\n scope.selectResult(scope.results[scope.currentIndex]);\r\n scope.$digest();\r\n }\r\n }\r\n else {\r\n // no results\r\n // intentionally not sending event so that it does not\r\n // prevent default tab behavior\r\n if (scope.searchStr && scope.searchStr.length > 0) {\r\n handleOverrideSuggestions();\r\n }\r\n }\r\n } else if (which === KEY_ES) {\r\n // This is very specific to IE10/11 #272\r\n // without this, IE clears the input text\r\n event.preventDefault();\r\n }\r\n }\r\n\r\n function httpSuccessCallbackGen(str) {\r\n return function (responseData, status, headers, config) {\r\n // normalize return obejct from promise\r\n if (!status && !headers && !config && responseData.data) {\r\n responseData = responseData.data;\r\n }\r\n scope.searching = false;\r\n processResults(\r\n extractValue(responseFormatter(responseData), scope.remoteUrlDataField),\r\n str);\r\n };\r\n }\r\n\r\n function httpErrorCallback(errorRes, status, headers, config) {\r\n scope.searching = false;\r\n\r\n // cancelled/aborted\r\n if (status === 0 || status === -1) { return; }\r\n\r\n // normalize return obejct from promise\r\n if (!status && !headers && !config) {\r\n status = errorRes.status;\r\n }\r\n if (scope.remoteUrlErrorCallback) {\r\n scope.remoteUrlErrorCallback(errorRes, status, headers, config);\r\n }\r\n else {\r\n if (console && console.error) {\r\n console.error('http error');\r\n }\r\n }\r\n }\r\n\r\n function cancelHttpRequest() {\r\n if (httpCanceller) {\r\n httpCanceller.resolve();\r\n }\r\n }\r\n\r\n function getRemoteResults(str) {\r\n var params = {},\r\n url = scope.remoteUrl + encodeURIComponent(str);\r\n if (scope.remoteUrlRequestFormatter) {\r\n params = { params: scope.remoteUrlRequestFormatter(str) };\r\n url = scope.remoteUrl;\r\n }\r\n if (!!scope.remoteUrlRequestWithCredentials) {\r\n params.withCredentials = true;\r\n }\r\n cancelHttpRequest();\r\n httpCanceller = $q.defer();\r\n params.timeout = httpCanceller.promise;\r\n $http.get(url, params)\r\n .success(httpSuccessCallbackGen(str))\r\n .error(httpErrorCallback);\r\n }\r\n\r\n function getRemoteResultsWithCustomHandler(str) {\r\n cancelHttpRequest();\r\n httpCanceller = $q.defer();\r\n scope.remoteApiHandler(str, httpCanceller.promise)\r\n .then(httpSuccessCallbackGen(str))\r\n .catch(httpErrorCallback);\r\n\r\n /* IE8 compatible\r\n scope.remoteApiHandler(str, httpCanceller.promise)\r\n ['then'](httpSuccessCallbackGen(str))\r\n ['catch'](httpErrorCallback);\r\n */\r\n }\r\n\r\n function clearResults() {\r\n scope.showDropdown = false;\r\n scope.results = [];\r\n if (dd) {\r\n dd.scrollTop = 0;\r\n }\r\n }\r\n\r\n function initResults() {\r\n scope.showDropdown = displaySearching;\r\n scope.currentIndex = scope.focusFirst ? 0 : -1;\r\n scope.results = [];\r\n }\r\n\r\n function getLocalResults(str) {\r\n var i, match, s, value,\r\n searchFields = scope.searchFields.split(','),\r\n matches = [];\r\n if (typeof scope.parseInput() !== 'undefined') {\r\n str = scope.parseInput()(str);\r\n }\r\n for (i = 0; i < scope.localData.length; i++) {\r\n match = false;\r\n\r\n for (s = 0; s < searchFields.length; s++) {\r\n value = extractValue(scope.localData[i], searchFields[s]) || '';\r\n match = match || (value.toString().toLowerCase().indexOf(str.toString().toLowerCase()) >= 0);\r\n }\r\n\r\n if (match) {\r\n matches[matches.length] = scope.localData[i];\r\n }\r\n }\r\n return matches;\r\n }\r\n\r\n function checkExactMatch(result, obj, str) {\r\n if (!str) { return false; }\r\n for (var key in obj) {\r\n if (obj[key].toLowerCase() === str.toLowerCase()) {\r\n scope.selectResult(result);\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n function searchTimerComplete(str) {\r\n // Begin the search\r\n if (!str || str.length < minlength) {\r\n return;\r\n }\r\n if (scope.localData) {\r\n scope.$apply(function () {\r\n var matches;\r\n if (typeof scope.localSearch() !== 'undefined') {\r\n matches = scope.localSearch()(str, scope.localData);\r\n } else {\r\n matches = getLocalResults(str);\r\n }\r\n scope.searching = false;\r\n processResults(matches, str);\r\n });\r\n }\r\n else if (scope.remoteApiHandler) {\r\n getRemoteResultsWithCustomHandler(str);\r\n } else {\r\n getRemoteResults(str);\r\n }\r\n }\r\n\r\n function processResults(responseData, str) {\r\n var i, description, image, text, formattedText, formattedDesc;\r\n\r\n if (responseData && responseData.length > 0) {\r\n scope.results = [];\r\n\r\n for (i = 0; i < responseData.length; i++) {\r\n if (scope.titleField && scope.titleField !== '') {\r\n text = formattedText = extractTitle(responseData[i]);\r\n }\r\n\r\n description = '';\r\n if (scope.descriptionField) {\r\n description = formattedDesc = extractValue(responseData[i], scope.descriptionField);\r\n }\r\n\r\n image = '';\r\n if (scope.imageField) {\r\n image = extractValue(responseData[i], scope.imageField);\r\n }\r\n\r\n if (scope.matchClass) {\r\n formattedText = findMatchString(text, str);\r\n formattedDesc = findMatchString(description, str);\r\n }\r\n\r\n scope.results[scope.results.length] = {\r\n title: formattedText,\r\n description: formattedDesc,\r\n image: image,\r\n originalObject: responseData[i]\r\n };\r\n }\r\n\r\n } else {\r\n scope.results = [];\r\n }\r\n\r\n if (scope.autoMatch && scope.results.length === 1 &&\r\n checkExactMatch(scope.results[0],\r\n { title: text, desc: description || '' }, scope.searchStr)) {\r\n scope.showDropdown = false;\r\n } else if (scope.results.length === 0 && !displayNoResults) {\r\n scope.showDropdown = false;\r\n } else {\r\n scope.showDropdown = true;\r\n }\r\n }\r\n\r\n function showAll() {\r\n if (scope.localData) {\r\n processResults(scope.localData, '');\r\n }\r\n else if (scope.remoteApiHandler) {\r\n getRemoteResultsWithCustomHandler('');\r\n }\r\n else {\r\n getRemoteResults('');\r\n }\r\n }\r\n\r\n scope.onFocusHandler = function () {\r\n if (scope.focusIn) {\r\n scope.focusIn();\r\n }\r\n if (minlength === 0 && (!scope.searchStr || scope.searchStr.length === 0)) {\r\n scope.currentIndex = scope.focusFirst ? 0 : scope.currentIndex;\r\n scope.showDropdown = true;\r\n showAll();\r\n }\r\n };\r\n\r\n scope.hideResults = function () {\r\n if (mousedownOn &&\r\n (mousedownOn === scope.id + '_dropdown' ||\r\n mousedownOn.indexOf('angucomplete') >= 0)) {\r\n mousedownOn = null;\r\n }\r\n else {\r\n hideTimer = $timeout(function () {\r\n clearResults();\r\n scope.$apply(function () {\r\n if (scope.searchStr && scope.searchStr.length > 0) {\r\n inputField.val(scope.searchStr);\r\n }\r\n });\r\n }, BLUR_TIMEOUT);\r\n cancelHttpRequest();\r\n\r\n if (scope.focusOut) {\r\n scope.focusOut();\r\n }\r\n\r\n if (scope.overrideSuggestions) {\r\n if (scope.searchStr && scope.searchStr.length > 0 && scope.currentIndex === -1) {\r\n handleOverrideSuggestions();\r\n }\r\n }\r\n }\r\n };\r\n\r\n scope.resetHideResults = function () {\r\n if (hideTimer) {\r\n $timeout.cancel(hideTimer);\r\n }\r\n };\r\n\r\n scope.hoverRow = function (index) {\r\n scope.currentIndex = index;\r\n };\r\n\r\n scope.selectResult = function (result) {\r\n // Restore original values\r\n if (scope.matchClass) {\r\n result.title = extractTitle(result.originalObject);\r\n result.description = extractValue(result.originalObject, scope.descriptionField);\r\n }\r\n\r\n if (scope.clearSelected) {\r\n scope.searchStr = null;\r\n }\r\n else {\r\n scope.searchStr = result.title;\r\n }\r\n callOrAssign(result);\r\n clearResults();\r\n };\r\n\r\n scope.inputChangeHandler = function (str) {\r\n if (str.length < minlength) {\r\n cancelHttpRequest();\r\n clearResults();\r\n }\r\n else if (str.length === 0 && minlength === 0) {\r\n scope.searching = false;\r\n showAll();\r\n }\r\n\r\n if (scope.inputChanged) {\r\n str = scope.inputChanged(str);\r\n }\r\n return str;\r\n };\r\n\r\n // check required\r\n if (scope.fieldRequiredClass && scope.fieldRequiredClass !== '') {\r\n requiredClassName = scope.fieldRequiredClass;\r\n }\r\n\r\n // check min length\r\n if (scope.minlength && scope.minlength !== '') {\r\n minlength = parseInt(scope.minlength, 10);\r\n }\r\n\r\n // check pause time\r\n if (!scope.pause) {\r\n scope.pause = PAUSE;\r\n }\r\n\r\n // check clearSelected\r\n if (!scope.clearSelected) {\r\n scope.clearSelected = false;\r\n }\r\n\r\n // check override suggestions\r\n if (!scope.overrideSuggestions) {\r\n scope.overrideSuggestions = false;\r\n }\r\n\r\n // check required field\r\n if (scope.fieldRequired && ctrl) {\r\n // check initial value, if given, set validitity to true\r\n if (scope.initialValue) {\r\n handleRequired(true);\r\n }\r\n else {\r\n handleRequired(false);\r\n }\r\n }\r\n\r\n scope.inputType = attrs.type ? attrs.type : 'text';\r\n\r\n // set strings for \"Searching...\" and \"No results\"\r\n scope.textSearching = attrs.textSearching ? attrs.textSearching : TEXT_SEARCHING;\r\n scope.textNoResults = attrs.textNoResults ? attrs.textNoResults : TEXT_NORESULTS;\r\n displaySearching = scope.textSearching === 'false' ? false : true;\r\n displayNoResults = scope.textNoResults === 'false' ? false : true;\r\n\r\n // set max length (default to maxlength deault from html\r\n scope.maxlength = attrs.maxlength ? attrs.maxlength : MAX_LENGTH;\r\n\r\n // register events\r\n inputField.on('keydown', keydownHandler);\r\n inputField.on('keyup', keyupHandler);\r\n\r\n // set response formatter\r\n responseFormatter = callFunctionOrIdentity('remoteUrlResponseFormatter');\r\n\r\n // set isScrollOn\r\n $timeout(function () {\r\n var css = getComputedStyle(dd);\r\n isScrollOn = css.maxHeight && css.overflowY === 'auto';\r\n });\r\n }\r\n\r\n\t var template = '<div class=\"angucomplete-holder\" ng-class=\"{\\'angucomplete-dropdown-visible\\': showDropdown}\">' +\r\n\t\t ' <input id=\"{{id}}_value\" name=\"{{inputName}}\" tabindex=\"{{fieldTabindex}}\" ng-class=\"{\\'angucomplete-input-not-empty\\': notEmpty}\" ng-model=\"searchStr\" ng-disabled=\"disableInput\" type=\"{{inputType}}\" placeholder=\"{{placeholder}}\" maxlength=\"{{maxlength}}\" ng-focus=\"onFocusHandler()\" class=\"{{inputClass}}\" ng-focus=\"resetHideResults()\" ng-blur=\"hideResults($event)\" autocapitalize=\"off\" autocorrect=\"off\" autocomplete=\"off\" ng-change=\"inputChangeHandler(searchStr)\"/>' +\r\n\t\t ' <div id=\"{{id}}_dropdown\" class=\"angucomplete-dropdown\" ng-show=\"showDropdown\">' +\r\n\t\t ' <div class=\"angucomplete-searching\" ng-show=\"searching\" ng-bind=\"textSearching\"></div>' +\r\n\t\t ' <div class=\"angucomplete-searching\" ng-show=\"!searching && (!results || results.length == 0)\" ng-bind=\"textNoResults\"></div>' +\r\n\t\t ' <div class=\"angucomplete-row\" ng-repeat=\"result in results\" ng-click=\"selectResult(result)\" ng-mouseenter=\"hoverRow($index)\" ng-class=\"{\\'angucomplete-selected-row\\': $index == currentIndex}\">' +\r\n\t\t ' <div ng-if=\"imageField\" class=\"angucomplete-image-holder\">' +\r\n\t\t ' <img ng-if=\"result.image && result.image != \\'\\'\" ng-src=\"{{result.image}}\" class=\"angucomplete-image\"/>' +\r\n\t\t ' <div ng-if=\"!result.image && result.image != \\'\\'\" class=\"angucomplete-image-default\"></div>' +\r\n\t\t ' </div>' +\r\n\t\t ' <div class=\"angucomplete-title\" ng-if=\"matchClass\" ng-bind-html=\"result.title\"></div>' +\r\n\t\t ' <div class=\"angucomplete-title\" ng-if=\"!matchClass\">{{ result.title }}</div>' +\r\n\t\t ' <div ng-if=\"matchClass && result.description && result.description != \\'\\'\" class=\"angucomplete-description\" ng-bind-html=\"result.description\"></div>' +\r\n\t\t ' <div ng-if=\"!matchClass && result.description && result.description != \\'\\'\" class=\"angucomplete-description\">{{result.description}}</div>' +\r\n\t\t ' </div>' +\r\n\t\t ' </div>' +\r\n\t\t '</div>';\r\n\r\n return {\r\n restrict: 'EA',\r\n require: '^?form',\r\n scope: {\r\n selectedObject: '=',\r\n selectedObjectData: '=',\r\n disableInput: '=',\r\n initialValue: '=',\r\n localData: '=',\r\n localSearch: '&',\r\n remoteUrlRequestFormatter: '=',\r\n remoteUrlRequestWithCredentials: '@',\r\n remoteUrlResponseFormatter: '=',\r\n remoteUrlErrorCallback: '=',\r\n remoteApiHandler: '=',\r\n id: '@',\r\n type: '@',\r\n placeholder: '@',\r\n textSearching: '@',\r\n textNoResults: '@',\r\n remoteUrl: '@',\r\n remoteUrlDataField: '@',\r\n titleField: '@',\r\n descriptionField: '@',\r\n imageField: '@',\r\n inputClass: '@',\r\n pause: '@',\r\n searchFields: '@',\r\n minlength: '@',\r\n matchClass: '@',\r\n clearSelected: '@',\r\n overrideSuggestions: '@',\r\n fieldRequired: '=',\r\n fieldRequiredClass: '@',\r\n inputChanged: '=',\r\n autoMatch: '@',\r\n focusOut: '&',\r\n focusIn: '&',\r\n fieldTabindex: '@',\r\n inputName: '@',\r\n focusFirst: '@',\r\n parseInput: '&',\r\n searchStr: '=?ngModel'\r\n },\r\n template: template,\r\n compile: function (tElement) {\r\n var startSym = $interpolate.startSymbol();\r\n var endSym = $interpolate.endSymbol();\r\n if (!(startSym === '{{' && endSym === '}}')) {\r\n var interpolatedHtml = tElement.html()\r\n .replace(/\\{\\{/g, startSym)\r\n .replace(/\\}\\}/g, endSym);\r\n tElement.html(interpolatedHtml);\r\n }\r\n return link;\r\n }\r\n };\r\n }]);\r\n\r\n}));","/*\r\n* Directive pour l'affichage de tooltip\r\n*\t1 parametres sont nécéssaire :\r\n*\t- idTooltip : id de l'element HTML a afficher\r\n*\r\n* 2 fonctions sont nécéssaires:\r\n* -hoverFunction: fonction du hover\r\n* -leaveFunction: fonction au leave de la souris\r\n*/\r\n\r\nAgrimarketDirectives.directive('tooltipDirective', function ($timeout) {\r\n\treturn function (scope, iElement, iAttrs) {\r\n\t var elemWidth = $(iElement).outerWidth(true);\r\n\t var elemHeight = $(iElement).outerHeight(true);\r\n\t var elemTop = $(iElement).offset().top;\r\n\t var elemLeft = $(iElement).offset().left;\r\n\r\n\r\n\t $(\"#\" + iAttrs.idTooltip).css({\r\n\t 'opacity': 0,\r\n\t 'position': 'absolute',\r\n\t 'bottom': -elemHeight + 15,\r\n\t 'left': (elemWidth + elemLeft)/2\r\n\t }).hide();\r\n\r\n\t\tscope[iAttrs.hoverFunction] = function () {\r\n\t\t $(\"#\" + iAttrs.idTooltip).show().animate({\r\n\t\t 'opacity': 1,\r\n\t\t 'bottom': -elemHeight - 5\r\n\t\t },150);\r\n\r\n\t\t};\r\n\r\n\t\tscope[iAttrs.leaveFunction] = function () {\r\n\t\t $(\"#\" + iAttrs.idTooltip).animate({\r\n\t\t 'opacity': 0,\r\n\r\n\t\t }, 100).hide().css({\r\n\t\t 'bottom': -elemHeight + 15\r\n\t\t });\r\n\t\t};\r\n\t};\r\n});\r\n\r\nAgrimarketDirectives.directive('helpTooltip', function () {\r\n return {\r\n restrict: 'A',\r\n link: function(scope, element) {\r\n \r\n var randomInteger = function (pow) {\r\n return Math.floor(Math.random() * pow);\r\n };\r\n var id = \"tooltip-id-\" + randomInteger(10000);\r\n\r\n scope.$parent.$on('$destroy', function() {\r\n $('#'+id).removeClass('show').remove();\r\n });\r\n\r\n var leaveOnClick = $(element).attr('data-leave-onClick');\r\n\r\n \r\n $('.remove-line').click(function() {\r\n $('#'+id).removeClass('show').remove();\r\n });\r\n\r\n $(element).mouseenter(function () {\r\n var _this = $(element),\r\n elemH = _this.outerHeight(),\r\n elemW = _this.outerWidth(),\r\n msg = _this.attr('data-help-tooltip'),\r\n posT = _this.offset().top,\r\n posFromBottomWindow = (_this.offset().top - $(document).scrollTop() - $(window).height() + _this.outerHeight()) * (-1),\r\n posL = _this.offset().left,\r\n posElT = 0,\r\n posElL = 0,\r\n verticalPosition = _this.attr('data-help-tooltip-v');\r\n \r\n\r\n $('<div class=\"help-tooltip\" style=\"position: absolute;z-index: 1000;\" id=\"'+id+'\">' + msg + '</div>').appendTo('body');\r\n\r\n if (verticalPosition === \"bottom\") {\r\n if (posFromBottomWindow < $('#'+id).outerHeight() + 10) {\r\n posElT = (posT - $('#'+id).outerHeight());\r\n } else {\r\n posElT = (posT + elemH);\r\n }\r\n } else {\r\n if (posT < 50) {\r\n posElT = (posT + elemH + 10);\r\n } else {\r\n posElT = (posT - ($('#'+id).outerHeight() + 10));\r\n }\r\n }\r\n\r\n\r\n if (posL < 80) {\r\n posElL = 0;\r\n } else {\r\n posElL = ((posL + (_this.outerWidth() / 2)) - ($('#'+id).outerWidth() / 2));\r\n }\r\n\r\n $('#'+id).css({\r\n top: posElT,\r\n left: posElL,\r\n });\r\n\r\n $('#'+id).addClass('show');\r\n }).mouseleave(function () {\r\n //Si souris quitte l'element\r\n setTimeout(function () {\r\n //Si souris sur la tooltip\r\n\t\t\t\t\tif ($('.help-tooltip:hover').length != 0) {\r\n //Si souris quitte la tooltip\r\n $('#'+id).mouseleave(function () {\r\n setTimeout(function () {\r\n $('#'+id).removeClass('show').remove();\r\n }, 1);\r\n });\r\n } else {\r\n //Si souris quitte l'element pour de vrais\r\n setTimeout(function () {\r\n $('#'+id).removeClass('show').remove();\r\n }, 1);\r\n } \r\n }, 200);\r\n });\r\n\r\n if (leaveOnClick === 'true') {\r\n $(element).click(function () {\r\n $('#'+id).removeClass('show').remove();\r\n });\r\n }\r\n }\r\n };\r\n});","/*\r\n* Directive d'ouverture de pop up de confirmation\r\n* 1 parametres est nécéssaire :\r\n*/\r\n\r\nAgrimarketDirectives.directive('subnav', function ($timeout) {\r\n\tvar globParam;\r\n\treturn function (scope, iElement, iAttrs) {\r\n\r\n\t $.fn.subNavTouch = function (options) {\r\n\r\n\t var defaults =\r\n {\r\n };\r\n\r\n\t var params = $.extend(defaults, options);\r\n\r\n\t return this.each(function () {\r\n\t var $container = $(this);\r\n\t var currentElem = $(this).find('.current');\r\n\r\n\t\t $container.wrap('<div class=\"containerNav\"></div>');\r\n\t $('#secondary_nav').append('<span class=\"subMenu_button\"><span></span></span><ul class=\"listSubMenu\"></ul>');\r\n\r\n\t $('.subMenu_button').css({\r\n\t 'position': 'absolute',\r\n\t });\r\n\t $('.listSubMenu').css({\r\n\t 'position': 'absolute',\r\n\t 'right': 0,\r\n\t 'z-index': 300\r\n\t }).hide();\r\n\r\n\t $('.containerNav').css({\r\n\t 'overflow': 'hidden',\r\n\t });\r\n\r\n\t deviceWidth = $('#main').outerWidth() - $('.subMenu_button').outerWidth();\r\n\r\n\t $(window).bind('resize', function (e) {\r\n\t window.resizeEvt = null;\r\n\t $(window).resize(function () {\r\n\t clearTimeout(window.resizeEvt);\r\n\t window.resizeEvt = setTimeout(function () {\r\n\t deviceWidth = $('#main').outerWidth() - $('.subMenu_button').outerWidth();\r\n\t init();\r\n\t }, 250);\r\n\t });\r\n\t });\r\n\r\n\t init();\r\n\r\n\t function init() {\r\n\t // On calcule la largeur totale de la navigation\r\n\t navWidth = 0;\r\n\r\n\t $container.find('li').each(function (i) {\r\n\t navWidth += $(this).outerWidth(true);\r\n\r\n\t if (deviceWidth < navWidth) {\r\n\t $(this).addClass('hiddenElem').hide();\r\n\t } else {\r\n\t $(this).removeClass('hiddenElem').show();\r\n\t }\r\n\t\t i++;\r\n\t });\r\n\t $('.listSubMenu').hide();\r\n\t $('.subMenu_button').removeClass('active');\r\n\r\n\t // Si la navigation dépasse la largeur du device\r\n\t if (deviceWidth < navWidth) {\r\n\r\n\t $('.listSubMenu li').remove();\r\n\t $('.hiddenElem').each(function (i) {\r\n\t $(this).clone().appendTo('.listSubMenu').show();\r\n\t\t i++;\r\n\t });\r\n\r\n\t // On applique la largeur de la navigation calculée plus haut\r\n\t $container.css({\r\n\t 'width': navWidth + 5\r\n\t });\r\n\t $('.subMenu_button').show();\r\n\t $('.subMenu_button').unbind();\r\n\t $('.subMenu_button').bind('click', function () {\r\n\t if ($('.listSubMenu').is(':visible')) {\r\n\t $('.listSubMenu').slideUp();\r\n\t $(this).removeClass('active');\r\n\t } else {\r\n\t $('.listSubMenu').slideDown();\r\n\t $(this).addClass('active');\r\n\t }\r\n\t });\r\n\t } else {\r\n\t $('.subMenu_button').hide();\r\n\t $container.css({\r\n\t 'width': 'auto'\r\n\t });\r\n\t }\r\n\t }\r\n\r\n\t });\r\n\t };\r\n\r\n\t $timeout(function () {\r\n\t $('#' + iAttrs.id + ' ul').subNavTouch({\r\n\t });\r\n\t },0);\r\n\r\n\t};\r\n});","//Permet d'afficher le timer coté agri\r\nAgrimarketDirectives.directive('counter', function () {\r\n\r\n //@Param : timer => temps renseigné par l'admin\r\n //@Param : counterType => le type de forme du compteur {value : 'Circular', 'Linear'}\r\n //@Param : counterCicularSize => valeur de l'arc du compteur, penser à modifier la fontSize en conséqence\r\n //@Param : strokeWidth => valeur du contour du compteur\r\n //@Param : strokeWidthBg => valeur du contour du fond du compteur\r\n //@Param : strokeWidthBg => valeur du contour du fond du compteur\r\n //@Param : showShadow => permet d'appliquer un effet de style ombré au compteur\r\n //@Param : showRays => permet d'appliquer un effet des rayons sur le compteur\r\n //@Param : colorRays => couleur appliquée aux rayons (couleur correspondante au fond de la page)\r\n //@Param : fontSize => taille de la police à adapter selon les dimensions renseignées pour le compteur circulaire \r\n //@Param : fontColor => couleur de la police\r\n //@Param : colorCounter => couleur du compteur\r\n //@Param : colorCounterBg => couleur de fond du compteur\r\n //@Param : colorCounterHalf => couleur appliquée à la moitié du compteur\r\n //@Param : colorCounterThird => couleur appliquée au dernier tiers du compteur\r\n\r\n return {\r\n restrict: 'EA',\r\n scope: {\r\n timer: '=timer',\r\n // pause\r\n pause: '=pause',\r\n // Counter style\r\n counterType: '=counterType',\r\n counterCicularSize: '=counterCicularSize',\r\n counterLinearWidth: '=counterLinearWidth',\r\n strokeWidth: '=strokeWidth',\r\n strokeWidthBg: '=strokeWidthBg',\r\n showShadow: '=showShadow',\r\n showRays: '=showRays',\r\n colorRays: '=colorRays',\r\n // Typo\r\n fontSize: '=fontSize',\r\n fontColor: '=fontColor',\r\n // Counter colors\r\n colorCounter: '=colorCounter',\r\n colorCounterBg: '=colorCounterBg',\r\n colorCounterHalf: '=colorCounterHalf',\r\n colorCounterThird: '=colorCounterThird'\r\n },\r\n link: function (scope, element, attrs) {\r\n jQuery(function () {\r\n\r\n /*\r\n VARS\r\n */\r\n var\r\n // COMMONS OPTIONS\r\n // Typo param\r\n fontWeight = 'bold',\r\n\r\n // Rays param\r\n nbRays = 12,\r\n sizeRays = 2,\r\n\r\n // Shadow param\r\n colorShadow = '#212121',\r\n widthShadow = 3,\r\n offsetXShadow = 1, // Toujours positif !\r\n offsetYShadow = 2, // Toujours positif !\r\n\r\n // Counter dimensions | DON'T TOUCH !!!\t\t\t\t\t\r\n counterSize = (scope.counterCicularSize * 2) + scope.strokeWidthBg,\r\n canvasWidth = (scope.counterCicularSize * 2) + scope.strokeWidthBg,\r\n canvasHeight = (scope.counterCicularSize * 2) + scope.strokeWidthBg;\r\n\r\n // Counter dimensions | DON'T TOUCH !!!\t\t\t\t\r\n if (scope.showShadow && scope.counterType !== 'linear') {\r\n canvasWidth = (scope.counterCicularSize * 2) + scope.strokeWidthBg + offsetXShadow + widthShadow;\r\n canvasHeight = (scope.counterCicularSize * 2) + scope.strokeWidthBg + offsetYShadow + widthShadow;\r\n }\r\n\r\n // LINEAR OPTIONS\t\t\t\t\t\t\t\t\r\n var counterPosition = 'horizontal', // Horizontal | TO DO : Vertical\r\n tooltipWidth = 48,\r\n tooltipHeight = 25,\r\n tooltipFontSize = 14,\r\n tooltipColor = '#f1f1f1',\r\n tooltipMargin = 8,\r\n lineHeight = tooltipHeight + scope.strokeWidthBg + tooltipMargin;\r\n\r\n // Counter dimensions | DON'T TOUCH !!!\t\t\t\t\r\n if (scope.counterType === 'linear') {\r\n canvasWidth = scope.counterLinearWidth;\r\n canvasHeight = lineHeight;\r\n counterSize = scope.counterLinearWidth;\r\n }\r\n\r\n // Timer config | DON'T TOUCH !!!\r\n var minutes = scope.timer.substring(0, 2),\r\n secondes = scope.timer.substring(3, 5),\r\n totalSeconds = (parseInt(minutes) * 60) + parseInt(secondes),\r\n tiers = totalSeconds / 3;\r\n\r\n /*\r\n END VARS\r\n */\r\n\r\n // Draw the context\r\n var counter = Raphael(attrs.id, canvasWidth, canvasHeight);\r\n\r\n // Init counter elems\t\t\t\t\r\n if (scope.counterType === 'linear') {\r\n linear();\r\n } else {\r\n circular();\r\n }\r\n\r\n ////////////////////////////////////////////////////////////////////////////////\r\n // \t\t\t\t\t\tCIRCULAR COUNTER\t\t\t\t\t\t\t\t //\r\n ////////////////////////////////////////////////////////////////////////////////\t\t\t\t\t\t\t\t\r\n function circular() {\r\n\r\n // Custom Arc Attribute, position x&y, value portion of total, total value, Radius\t\t\t\t\t\t\t\t\r\n counter.customAttributes.arc = function (xloc, yloc, value, total, r) {\r\n var alpha = 360 / total * value,\r\n a = (90 - alpha) * Math.PI / 180,\r\n x = xloc + r * Math.cos(a),\r\n y = yloc - r * Math.sin(a),\r\n path;\r\n\r\n if (total == value) {\r\n path = [\r\n [\"M\", xloc, yloc - r],\r\n [\"A\", r, r, 0, 1, 1, xloc - 0.01, yloc - r]\r\n ];\r\n } else {\r\n path = [\r\n [\"M\", xloc, yloc - r],\r\n [\"A\", r, r, 0, +(alpha > 180), 1, x, y]\r\n ];\r\n }\r\n return {\r\n path: path\r\n };\r\n };\r\n\r\n // Function to create circular rays\r\n\r\n Raphael.fn.MyRay = function (topWidth, bottomWidth, nbOccurence) {\r\n var xLeftTop = counterSize / 2;\r\n var yLeftTop = 0;\r\n var yLeftBottom = scope.strokeWidthBg;\r\n var nb = nbOccurence; // Nb of rays\r\n var path = 'M' + (xLeftTop - (topWidth / 2)) + ',' + yLeftTop + 'L' + (xLeftTop + (topWidth / 2)) + ',' + yLeftTop + 'L' + (xLeftTop + (bottomWidth / 2)) + ',' + yLeftBottom + 'L' + (xLeftTop - (topWidth / 2)) + ',' + yLeftBottom + 'L' + (xLeftTop - (topWidth / 2)) + ',' + yLeftTop + 'Z';\r\n\r\n // Loop for each ray to create\r\n for (var i = 0; i < nb; i++) {\r\n\r\n // Create the path, add attributes and rotation\r\n this.pathObj = counter.path(path)\r\n .attr({\r\n 'fill': scope.colorRays,\r\n 'stroke': 'transparent',\r\n 'stoke-width': 0\r\n }).rotate((360 / nb) * i, xLeftTop, counterSize / 2);\r\n }\r\n return this;\r\n };\r\n\r\n drawCircular();\r\n }\r\n\r\n function drawCircular() {\r\n\r\n // Create background and shadow\r\n var myBgArc = counter.path().attr({\r\n 'stroke': scope.colorCounterBg,\r\n 'stroke-width': scope.strokeWidthBg,\r\n arc: [scope.counterCicularSize + (scope.strokeWidthBg / 2) + (widthShadow / 2), scope.counterCicularSize + (scope.strokeWidthBg / 2), 100, 100, scope.counterCicularSize]\r\n });\r\n\r\n if (scope.showShadow) {\r\n myBgArc.glow({ color: colorShadow, width: widthShadow, offsetx: offsetXShadow, offsety: offsetYShadow });\r\n }\r\n\r\n // Create timer\r\n var myArc = counter.path().attr({\r\n 'stroke': scope.colorCounter,\r\n 'stroke-width': scope.strokeWidth,\r\n arc: [scope.counterCicularSize + (scope.strokeWidthBg / 2) + (widthShadow / 2), scope.counterCicularSize + (scope.strokeWidthBg / 2), 100, 100, scope.counterCicularSize]\r\n });\r\n\r\n\r\n // Insert counter text\r\n count = counter.text(counterSize / 2 + (widthShadow / 2), counterSize / 2, pad(parseInt(totalSeconds / 60)) + ':' + pad(totalSeconds % 60))\r\n .attr({\r\n 'fill': scope.fontColor,\r\n 'font-size': scope.fontSize + 'px',\r\n 'line-height': scope.fontSize + 'px',\r\n 'font-weight': fontWeight\r\n });\r\n\r\n // Create rays\r\n if (scope.showRays) {\r\n var rays = counter.MyRay(sizeRays, sizeRays, nbRays);\r\n }\r\n\r\n animateCircular(myArc, myBgArc, count);\r\n }\r\n\r\n function animateCircular(obj1, obj2, obj3) {\r\n var myArc = obj1,\r\n myBgArc = obj2,\r\n count = obj3;\r\n\r\n // Pause watcher\r\n scope.$watch('pause', function () {\r\n if (this.last) {\r\n // On stoppe le déplacement de l'arc\r\n myArc.stop();\r\n // On stoppe les animations de couleur\r\n clearInterval(timerHalfCirc);\r\n clearInterval(timerThirdCirc);\r\n // On stoppe le décompte\r\n clearInterval(textCirc);\r\n\r\n } else {\r\n\r\n // Animate counter text\r\n textCirc = setInterval(setTimeCircular, 1000);\r\n\r\n // Anim color => 1/2\r\n timerHalfCirc = setInterval(setTimeHalfTimerAnimCirc, ((totalSeconds * 1000) / 4) * 2);\r\n\r\n // Anim color => 2/3\r\n timerThirdCirc = setInterval(setTimeThirdTimerAnimCirc, ((totalSeconds * 1000) / 3) * 2);\r\n\r\n // Timer animation\r\n myArc.animate({\r\n arc: [scope.counterCicularSize + (scope.strokeWidthBg / 2) + (widthShadow / 2), scope.counterCicularSize + (scope.strokeWidthBg / 2), 0, 100, scope.counterCicularSize]\r\n\r\n }, (totalSeconds * 1000), 'linear');\r\n\r\n }\r\n\r\n function setTimeHalfTimerAnimCirc() {\r\n myArc.animate({ 'stroke': scope.colorCounterHalf }, 1000, 'linear');\r\n }\r\n\r\n function setTimeThirdTimerAnimCirc() {\r\n myArc.animate({ 'stroke': scope.colorCounterThird }, 1000, 'linear');\r\n }\r\n\r\n // Fn for circular counter\r\n function setTimeCircular() {\r\n\r\n --totalSeconds;\r\n\r\n count.attr({ 'text': pad(parseInt(totalSeconds / 60)) + ':' + pad(totalSeconds % 60) });\r\n\r\n // Blink animation on last third\r\n if (totalSeconds > 0 && totalSeconds <= tiers) {\r\n count.animate({ 'opacity': 1 }, 35, 'linear', function () {\r\n this.animate({ 'opacity': 0 }, 500, 'linear');\r\n });\r\n } else {\r\n count.animate({ 'opacity': 1 }, 35, 'linear');\r\n }\r\n }\r\n\r\n\r\n });\r\n }\r\n\r\n ////////////////////////////////////////////////////////////////////////////////\r\n // \t\t\t\t\t\tLINEAR COUNTER\t\t\t\t\t\t\t\t\t //\r\n ////////////////////////////////////////////////////////////////////////////////\r\n function linear() {\r\n\r\n // Custom Line Attribute, position x&y, value portion of total, total value, Radius, Position\t\t\t\t\t\t\t\t\r\n counter.customAttributes.line = function (xloc, yloc, value, total, position) {\r\n var posx = canvasWidth - (tooltipWidth / 2),\r\n alpha = posx / total * value,\r\n path;\r\n\r\n if (total === value) {\r\n\r\n path = [\r\n [\"M\", posx, yloc],\r\n [\"L\", xloc, yloc]\r\n ];\r\n } else {\r\n\r\n path = [\r\n [\"M\", alpha, yloc],\r\n [\"L\", xloc, yloc]\r\n ];\r\n }\r\n\r\n return {\r\n path: path\r\n };\r\n };\r\n\r\n // Custom LineBloc Attribute, position x&y, value portion of total, total value, Radius, Position\t\t\t\t\t\t\t\t\r\n counter.customAttributes.lineBloc = function (xloc, yloc, value, total, position) {\r\n var posx = canvasWidth - tooltipWidth,\r\n alpha = posx / total * value,\r\n path;\r\n\r\n if (total === value) {\r\n\r\n path = [\r\n [\"M\", xloc, yloc],\r\n [\"L\", xloc + tooltipWidth, yloc],\r\n [\"L\", xloc + tooltipWidth, tooltipHeight - 4],\r\n [\"L\", xloc + (tooltipWidth / 2) - 4, tooltipHeight - 4],\r\n [\"L\", xloc + (tooltipWidth / 2), tooltipHeight],\r\n [\"L\", xloc + (tooltipWidth / 2) + 4, tooltipHeight - 4],\r\n [\"L\", xloc, tooltipHeight - 4],\r\n [\"L\", xloc, yloc]\r\n ];\r\n\r\n } else {\r\n\r\n path = [\r\n [\"M\", alpha, yloc],\r\n [\"L\", alpha + tooltipWidth, yloc],\r\n [\"L\", alpha + tooltipWidth, tooltipHeight - 4],\r\n [\"L\", alpha + ((tooltipWidth / 2) - 4), tooltipHeight - 4],\r\n [\"L\", alpha + (tooltipWidth / 2), tooltipHeight],\r\n [\"L\", alpha + ((tooltipWidth / 2) + 4), tooltipHeight - 4],\r\n [\"L\", alpha, tooltipHeight - 4],\r\n [\"L\", alpha, yloc]\r\n ];\r\n }\r\n\r\n return {\r\n path: path\r\n };\r\n };\r\n\r\n // Function to create linear rays\r\n Raphael.fn.MyLinearRay = function (topWidth, bottomWidth, nbOccurence) {\r\n var xLeftTop = tooltipWidth / 2;\r\n var yLeftTop = tooltipHeight + tooltipMargin;\r\n var yLeftBottom = yLeftTop + scope.strokeWidthBg;\r\n var nb = nbOccurence; // Nb of rays\r\n var path = 'M' + xLeftTop + ',' + yLeftTop + 'L' + (xLeftTop + topWidth) + ',' + yLeftTop + 'L' + (xLeftTop + topWidth) + ',' + yLeftBottom + 'L' + xLeftTop + ',' + yLeftBottom + 'Z';\r\n\r\n // Loop for each ray to create\r\n for (var i = 0; i < nb; i++) {\r\n\r\n // Create the path, add attributes and rotation\r\n this.pathObj = counter.path(path)\r\n .attr({\r\n 'fill': scope.colorRays,\r\n 'stroke': 'transparent',\r\n 'stoke-width': 0\r\n }).translate((counterSize / nb) * i, 0);\r\n }\r\n return this;\r\n };\r\n\r\n drawLinear();\r\n }\r\n\r\n function drawLinear() {\r\n // Create timer\r\n var myLine = counter.path().attr({\r\n 'stroke': scope.colorCounter,\r\n 'stroke-width': scope.strokeWidth,\r\n line: [tooltipWidth / 2, tooltipHeight + tooltipMargin + (scope.strokeWidth / 2), 100, 100, counterPosition]\r\n });\r\n\r\n // Create mask\r\n var myMaskLine = counter.path().attr({\r\n 'stroke': scope.colorCounterBg,\r\n 'stroke-width': scope.strokeWidthBg,\r\n line: [tooltipWidth / 2, tooltipHeight + tooltipMargin + (scope.strokeWidthBg / 2), ((tooltipWidth / 2) / canvasWidth) * 100, 100, counterPosition]\r\n });\r\n\r\n // Create container\r\n myBloc = counter.path().attr({\r\n 'fill': tooltipColor,\r\n 'stroke-width': 0,\r\n 'stroke': '#bcbcbc',\r\n lineBloc: [canvasWidth - (tooltipWidth), 0, 0, 100, counterPosition]\r\n });\r\n\r\n // Create counter\r\n myCount = counter.text(5, 12, pad(parseInt(totalSeconds / 60)) + ':' + pad(totalSeconds % 60))\r\n .attr({\r\n 'fill': scope.fontColor,\r\n 'font-size': tooltipFontSize + 'px',\r\n 'line-height': tooltipFontSize + 'px',\r\n 'font-weight': fontWeight,\r\n 'text-anchor': 'start'\r\n });\r\n\r\n // Create rays\r\n if (scope.showRays) {\r\n var myLinearRay = counter.MyLinearRay(sizeRays, sizeRays, nbRays);\r\n }\r\n\r\n animateLinear(myLine, myMaskLine, myCount);\r\n }\r\n\r\n function animateLinear(obj1, obj2, obj3) {\r\n var myLine = obj1,\r\n myMaskLine = obj2;\r\n myCount = obj3;\r\n\r\n\r\n // Pause watcher\r\n scope.$watch('pause', function () {\r\n\r\n if (this.last) {\r\n // On stoppe le déplacement de la ligne\r\n myMaskLine.stop();\r\n // On stoppe les animations de couleur\r\n clearInterval(timerHalfLinear);\r\n clearInterval(timerThirdLinear);\r\n // On stoppe le bloc\r\n myBloc.stop();\r\n myCount.stop();\r\n // On stoppe le décompte\r\n clearInterval(textLinear);\r\n\r\n } else {\r\n\r\n // Create a group \r\n group = counter.set();\r\n\r\n // Add elements in group\r\n group.push(myBloc);\r\n group.push(myCount);\r\n\r\n textLinear = setInterval(setTimeLinear, 1000);\r\n\r\n // Anim color => 1/2\r\n timerHalfLinear = setInterval(setTimetimerHalfLinear, ((totalSeconds * 1000) / 4) * 2);\r\n // Anim color => 2/3\r\n timerThirdLinear = setInterval(setTimetimerThirdLinear, ((totalSeconds * 1000) / 3) * 2);\r\n\r\n // Timer animation\r\n myMaskLine.animate({\r\n line: [tooltipWidth / 2, tooltipHeight + tooltipMargin + (scope.strokeWidthBg / 2), 100, 100, counterPosition]\r\n }, (totalSeconds * 1000), 'linear');\r\n\r\n //Translate animation\r\n myCount.animate({ 'x': (canvasWidth + 5) - (tooltipWidth) }, (totalSeconds * 1000), 'linear');\r\n\r\n // Timer animation\r\n myBloc.animate({\r\n lineBloc: [canvasWidth - (tooltipWidth), 0, 100, 100, counterPosition]\r\n }, (totalSeconds * 1000), 'linear');\r\n }\r\n\r\n function setTimetimerHalfLinear() {\r\n myLine.animate({ 'stroke': scope.colorCounterHalf }, 1000, 'linear');\r\n }\r\n function setTimetimerThirdLinear() {\r\n myLine.animate({ 'stroke': scope.colorCounterThird }, 1000, 'linear');\r\n }\r\n\r\n // Fn for linear counter (animate group)\r\n function setTimeLinear() {\r\n\r\n --totalSeconds;\r\n\r\n myCount.attr({ 'text': pad(parseInt(totalSeconds / 60)) + ':' + pad(totalSeconds % 60) });\r\n\r\n // Blink animation on last third\r\n if (totalSeconds > 0 && totalSeconds <= tiers) {\r\n group.animate({ 'opacity': 1 }, 35, 'linear', function () {\r\n this.animate({ 'opacity': 0 }, 500, 'linear');\r\n });\r\n } else {\r\n group.animate({ 'opacity': 1 }, 35, 'linear');\r\n }\r\n }\r\n\r\n });\r\n\r\n }\r\n\r\n ////////////////////////////////////////////////////////////////////////////////\r\n // \t\t\t\t\t\t\tCOMMON\t\t\t\t\t\t\t\t\t\t //\r\n ////////////////////////////////////////////////////////////////////////////////\t\t\t\t\r\n\r\n function pad(val) {\r\n var valString = val + '';\r\n\r\n if (val >= 0) {\r\n if (valString.length < 2) {\r\n return '0' + valString;\r\n } else {\r\n return valString;\r\n }\r\n } else {\r\n return '00';\r\n }\r\n }\r\n });\r\n }\r\n };\r\n});","AgrimarketDirectives.directive('drawpiechart', ['$rootScope', function ($rootScope) {\r\n return {\r\n restrict: 'EA',\r\n scope: {\r\n chartdata: '=',\r\n titlekey: '=',\r\n titledefault: '=',\r\n chartype: '=',\r\n chartcolor: '=',\r\n renderto: \"=dataRenderTo\"\r\n },\r\n link: function (scope, element, attrs) {\r\n scope.$watch('chartdata', function (n, o) {\r\n if (n) {\r\n drawPlot();\r\n }\r\n }, true);\r\n var drawPlot = function () {\r\n var chart;\r\n var color;\r\n\r\n if (!scope.chartcolor || scope.chartcolor.length === 0) {\r\n color = ['#bb5bd6', '#269cdd', '#f3b234', '#FFB6C1'];\r\n } else {\r\n color = scope.chartcolor;\r\n }\r\n\r\n jQuery(function () {\r\n chart = new Highcharts.Chart({\r\n chart: {\r\n plotBackgroundColor: null,\r\n plotBorderWidth: null,\r\n plotShadow: false,\r\n plotBorderHeight: null,\r\n renderTo: element[0],\r\n height: 250,\r\n spacing: [0, 0, 0, 0],\r\n margin: [25, 0, 25, 0]\r\n },\r\n legend: {\r\n margin: 25\r\n },\r\n title: {\r\n text: $rootScope.editableObjectsFactory.getContentByKey(scope.titlekey, scope.titledefault),\r\n style: {\r\n fontSize: 13,\r\n fontWeight: 'bold',\r\n color: '#506687'\r\n }\r\n },\r\n credits: {\r\n enabled: false\r\n },\r\n tooltip: {\r\n formatter: function() {\r\n return '<b>' + (Math.round(this.percentage * 10) / 10) + ' %</b>';\r\n }\r\n },\r\n exporting: {\r\n enabled: false\r\n },\r\n plotOptions: {\r\n pie: {\r\n allowPointSelect: true,\r\n cursor: 'pointer',\r\n borderWidth: 3,\r\n borderColor: '#FFF',\r\n shadow: {\r\n enabled: true,\r\n offsetX: 0,\r\n offsetY: 0,\r\n width: 5,\r\n opacity: 0.1\r\n },\r\n colors: color,\r\n dataLabels: {\r\n enabled: true,\r\n distance: 10,\r\n format: '{point.percentage:.1f} %',\r\n style: {\r\n color: 'black'\r\n }\r\n },\r\n showInLegend: true\r\n }\r\n },\r\n series: [\r\n {\r\n type: scope.chartype,\r\n data: scope.chartdata\r\n }\r\n ]\r\n });\r\n });\r\n };\r\n }\r\n };\r\n}]);\r\n\r\nAgrimarketDirectives.directive('drawlinechart', function () {\r\n return {\r\n restrict: 'EA',\r\n scope: {\r\n chartdata: '=',\r\n title: '=',\r\n type: '=chartType',\r\n renderto: \"=dataRenderTo\",\r\n chartunit: '=chartUnit',\r\n animchart: '=animChart',\r\n idsource: '=idSource',\r\n chartLabels: '=' // chartLabels = true => affiche les axes X et Y\r\n },\r\n link: function (scope, element, attrs) {\r\n\r\n var params = {\r\n margin: [0, 0, 0, 0],\r\n labelsEnabled: false,\r\n axisLineWidth: 0\r\n };\r\n\r\n if (scope.chartLabels) {\r\n params = {\r\n margin: undefined,\r\n labelsEnabled: true,\r\n axisLineWidth: 1\r\n };\r\n }\r\n\r\n scope.$watch('chartdata', function (n, o) {\r\n\r\n if (n) {\r\n drawChart(params);\r\n }\r\n }, true);\r\n\r\n var drawChart = function (params) {\r\n var chart;\r\n jQuery(function () {\r\n chart = new Highcharts.Chart({\r\n chart: {\r\n type: 'line',\r\n renderTo: element[0],\r\n width: $(this).parents('.accordion-content').outerWidth(),\r\n height: 122,\r\n borderRadius: 0,\r\n margin: params.margin\r\n },\r\n credits: {\r\n enabled: false\r\n },\r\n legend: {\r\n enabled: false\r\n },\r\n title: {\r\n text: scope.title,\r\n style: {\r\n fontSize: 13,\r\n fontWeight: 'bold',\r\n color: '#506687'\r\n }\r\n },\r\n xAxis: {\r\n title: {\r\n text: null\r\n },\r\n labels: {\r\n enabled: params.labelsEnabled,\r\n formatter: function () {\r\n return Highcharts.dateFormat('%e/%m/%Y',\r\n new Date(this.value));\r\n },\r\n style: {\r\n fontSize: '9px'\r\n }\r\n },\r\n tickWidth: params.axisLineWidth,\r\n lineWidth: params.axisLineWidth,\r\n gridLineWidth: 0\r\n },\r\n yAxis: {\r\n title: {\r\n text: null\r\n },\r\n labels: {\r\n enabled: params.labelsEnabled,\r\n style: {\r\n fontSize: '9px'\r\n }\r\n },\r\n tickWidth: params.axisLineWidth,\r\n lineWidth: params.axisLineWidth,\r\n gridLineWidth: 0\r\n },\r\n plotOptions: {\r\n series: {\r\n marker: {\r\n enabled: false\r\n }\r\n }\r\n },\r\n tooltip: {\r\n formatter: function () {\r\n return Highcharts.dateFormat('%e/%m/%Y',\r\n new Date(this.x)) + \"<br/>\" + \"Cotation : \" + this.y + \" \" + scope.chartunit;\r\n }\r\n\r\n },\r\n series: [\r\n {\r\n name: 'Cotation',\r\n data: scope.chartdata\r\n }\r\n ]\r\n\r\n });\r\n\r\n if (scope.animchart) {\r\n animchart();\r\n }\r\n\r\n });\r\n };\r\n\r\n var animchart = function() {\r\n var _this = $('#' + scope.idsource),\r\n grafContainer = '.chart-container',\r\n heightContainer = $('.bloc_hash .content').outerHeight(),\r\n dist = _this.parents('li').offset().top - $('.bloc_hash .content').find('li:first-child').offset().top,\r\n paddingContainer = ($('.bloc_hash .content li:first-child').offset().top - $('.bloc_hash .content').offset().top) * 2,\r\n heightLi = _this.parents('li').innerHeight(),\r\n distGraf = (paddingContainer + heightLi);\r\n $('.bloc_hash .content').css({\r\n 'height': heightContainer,\r\n 'position': 'relative'\r\n });\r\n $('.bloc_hash .content .wrapper').css({\r\n 'height': $('.bloc_hash .content ul').outerHeight(),\r\n });\r\n\r\n if ($(grafContainer).hasClass('chart-deploy')) {\r\n _this.parents('li').nextAll('li').show();\r\n _this.parents('li').prevAll('li').show();\r\n $(grafContainer).html('');\r\n $('.bloc_hash .content').find('li.current-graf').removeClass('current-graf');\r\n $(grafContainer).removeClass('chart-deploy');\r\n\r\n $('.bloc_hash .content .wrapper').css({\r\n 'overflow': ''\r\n });\r\n $('.bloc_hash .content ul').css({\r\n 'transform': 'translateY(' + 0 + ')',\r\n 'transition': 'all 0.5s',\r\n });\r\n\r\n $(grafContainer).css({\r\n 'transform': 'translateY(' + 0 + ')',\r\n 'transition': 'all 0.5s',\r\n 'opacity': '',\r\n });\r\n _this.parents('li').nextAll('li').animate({\r\n 'opacity': 1\r\n }, 100);\r\n } else {\r\n\r\n $('.bloc_hash .content .wrapper').css({\r\n 'overflow': 'hidden'\r\n });\r\n\r\n _this.parents('li').addClass('current-graf');\r\n $(grafContainer).addClass('chart-deploy');\r\n\r\n $('.bloc_hash .content ul').css({\r\n 'transform': 'translateY(' + (-dist) + 'px)',\r\n 'transition': 'all 0.5s',\r\n });\r\n _this.parents('li').nextAll('li').animate({\r\n 'opacity': 0\r\n }, 200);\r\n\r\n $(grafContainer).css({\r\n 'transform': 'translateY(' + (-(heightContainer - distGraf)) + 'px)',\r\n 'transition': 'all 0.5s',\r\n 'opacity': 1,\r\n });\r\n\r\n $(document).one('click', function closeGraf(e) {\r\n\r\n if ($('.bloc_hash .content').has(e.target).length === 0) {\r\n\r\n $('.bloc_hash .content').find('li').show();\r\n $('.bloc_hash .content').find('li').show();\r\n $(grafContainer).html('');\r\n $('.bloc_hash .content').find('li.current-graf').removeClass('current-graf');\r\n $(grafContainer).removeClass('chart-deploy');\r\n\r\n $('.bloc_hash .content .wrapper').css({\r\n 'overflow': ''\r\n });\r\n $('.bloc_hash .content ul').css({\r\n 'transform': 'translateY(' + 0 + ')',\r\n 'transition': 'all 0.5s',\r\n });\r\n\r\n $(grafContainer).css({\r\n 'transform': 'translateY(' + 0 + ')',\r\n 'transition': 'all 0.5s',\r\n 'opacity': '',\r\n });\r\n $('.bloc_hash .content').find('li').animate({\r\n 'opacity': 1\r\n }, 100);\r\n } else if ($(grafContainer).hasClass('chart-deploy')) {\r\n $(document).one('click', closeGraf);\r\n }\r\n });\r\n\r\n }\r\n\r\n };\r\n }\r\n };\r\n});","AgrimarketDirectives.directive('editable', function () {\r\n\treturn {\r\n\t\ttransclude: true,\r\n\t\treplace: false,\r\n\t\trestrict: 'EA',\r\n\t // data-editable-content => pour éviter les conflits de style (cf. reset.scss) \r\n template: '<span ng-click=\"blockClick()\"><ng-transclude></ng-transclude><span ng-bind-html=\"contentBody\" class=\"editable-content\"></span></span><span ng-click=\"icoAction()\" ng-if=\"icoVisible\" class=\"bt_edit {{icoAlterClass}} ico-content-edit\"></span>',\r\n\t\tscope: {\r\n\t\t\ticoAction: '&editableIcoAction',\r\n\t\t\threfLink: '@?editableHref',\r\n\t\t\tcontentAction: '&editableContentAction',\r\n\t\t\ticoVisible: '=?editableIcoVisible',\r\n\t\t\tcontentBody: \"=?editableContentBody\",\r\n\t\t\tcontentVisible: \"=?editableContentVisible\",\r\n key: \"@?editableKey\",\r\n icoAlterClass:'@?editableIcoAlterClass'\r\n\t\t},\r\n\t\tlink: function (scope, elm, attrs, ctrl, transclude) {\r\n\r\n if (scope.icoVisible == 'false')\r\n scope.icoVisible = false;\r\n\r\n if (scope.contentVisible == 'false')\r\n scope.contentVisible = false;\r\n\r\n\t\t\tscope.blockClick = function () {\r\n\t\t\t\tif (scope.hrefLink)\r\n\t\t\t\t\twindow.location.replace(scope.hrefLink);\r\n\t\t\t\tif (scope.contentAction)\r\n\t\t\t\t\tscope.contentAction();\r\n\t\t\t};\r\n\r\n\t\t\tscope.$watch(\r\n\t\t\t\t'contentBody',\r\n\t\t\t\t function (newValue, oldValue) {\r\n\t\t\t\t \tif (newValue !== oldValue) {\r\n\t\t\t\t \t\tvar e = elm.find('ng-transclude');\r\n\t\t\t\t \t\te.remove();\r\n\t\t\t\t \t}\r\n\t\t\t\t }\r\n );\r\n\r\n if (!scope.icoVisible && !scope.contentVisible) {\r\n\t\t\t\telm.css(\"display\", \"none\");\r\n\t\t\t\t// On va chercher tous les élements qui dépendent de cet objet éditable afin de les cacher également\r\n\t\t\t\tvar dependeciesElements = document.querySelectorAll(\"[editable-dependency-key='\" + scope.key + \"']\");\r\n\t\t\t\tdependeciesElements.forEach(function (item) {\r\n\t\t\t\t\t$(item).css(\"display\", \"none\");\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\ttransclude(scope, function (clone) {\r\n\t\t\t\tif (!scope.contentBody) {\r\n\t\t\t\t\tvar e = elm.find('ng-transclude');\r\n\t\t\t\t\te.append(clone);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n});","AgrimarketDirectives.directive('agrimarketEditable', function ($compile) {\r\n\treturn {\r\n\t\ttransclude: false,\r\n\t\treplace: false,\r\n\t\trestrict: 'EA',\r\n\t\tcompile: function (elm, attrs) {\r\n\t\t\tvar key = attrs.agrimarketEditableKey;\r\n\t\t\tvar contentAction = attrs.agrimarketEditableContentAction;\r\n var href = attrs.agrimarketEditableHref;\r\n var icoAlterClass = attrs.agrimarketEditableIcoAlterClass;\r\n\t\t\telm.removeAttr('agrimarket-editable');\r\n\t\t\telm.removeAttr('agrimarket-editable-key');\r\n\t\t\telm.removeAttr('agrimarket-editable-content-action');\r\n elm.removeAttr('agrimarket-editable-href');\r\n elm.removeAttr('agrimarket-editable-ico-alter-class');\r\n\t\t\telm.attr('editable-content-body', \"editableObjectsFactory.getContentByKey('\" + key + \"')\");\r\n\t\t\telm.attr('editable-content-action', contentAction);\r\n\t\t\telm.attr('editable-content-visible', 'editableObjectsFactory.getIsVisibleByKey(\\'' + key + '\\')');\r\n\t\t\telm.attr('editable-ico-visible', 'modeEdition');\r\n\t\t\telm.attr('editable-ico-action', \"openPopEditable('\" + key + \"')\");\r\n\t\t\telm.attr('editable-key', key);\r\n elm.attr('editable-href', href);\r\n elm.attr('editable-ico-alter-class', icoAlterClass);\r\n\t\t\telm.attr('editable','');\r\n\t\t\tvar fn = $compile(elm);\r\n\t\t\treturn function (scope) {\r\n\t\t\t\tfn(scope);\r\n\t\t\t};\r\n\t\t}\r\n\t};\r\n});","AgrimarketDirectives.directive('agrimarketEditableGraph', function ($compile) {\r\n\treturn {\r\n\t\ttransclude: false,\r\n\t\treplace: false,\r\n\t\trestrict: 'EA',\r\n\t\tcompile: function (elm, attrs) {\r\n\t\t\tvar key = attrs.agrimarketEditableGraphKey;\r\n\t\t\tvar contentAction = attrs.agrimarketEditableContentAction;\r\n\t\t\tvar href = attrs.agrimarketEditableHref;\r\n\t\t\tvar contentDefault = elm.text().replace(\"'\", \"\\\\'\").replace('\"', '\\\\\"');\r\n\t\t\telm.removeAttr('agrimarket-editable-graph');\r\n\t\t\telm.removeAttr('agrimarket-editable-graph-key');\r\n\t\t\telm.removeAttr('agrimarket-editable-graph-content-action');\r\n\t\t\telm.removeAttr('agrimarket-editable-graph-href');\r\n\t\t\telm.attr('editable-content-body', \"editableObjectsFactory.getContentByKey('\" + key + \"', '\" + contentDefault + \"')\");\r\n\t\t\telm.attr('editable-content-action', contentAction);\r\n\t\t\telm.attr('editable-content-visible', 'editableObjectsFactory.getIsVisibleByKey(\\'' + key + '\\')');\r\n\t\t\telm.attr('editable-ico-visible', 'modeEdition');\r\n\t\t\telm.attr('editable-ico-action', \"openPopEditableGraph('\" + key + \"', '\" + contentDefault + \"')\");\r\n\t\t\telm.attr('editable-href',href);\r\n\t\t\telm.attr('editable','');\r\n\t\t\tvar fn = $compile(elm);\r\n\t\t\treturn function (scope) {\r\n\t\t\t\tfn(scope);\r\n\t\t\t};\r\n\t\t}\r\n\t};\r\n});","AgrimarketDirectives.directive('agrimarketEditableTable', function ($compile) {\r\n\treturn {\r\n\t\ttransclude: false,\r\n\t\treplace: false,\r\n\t\trestrict: 'EA',\r\n\t\tcompile: function (elm, attrs) {\r\n\t\t\tvar key = attrs.agrimarketEditableTableIddefaulttable;\r\n\t\t\telm.removeAttr('agrimarket-editable-table'); \r\n\t\t\telm.removeAttr('agrimarket-editable-table-iddefaulttable');\r\n\t\t\telm.attr('editable-content-visible', 'false');\r\n\t\t\telm.attr('editable-content-body', 'globalLabels.Edit_Table');\r\n\t\t\telm.attr('editable-ico-visible', 'modeEdition');\r\n\t\t\telm.attr('editable-ico-action', 'openPopEditableTable('+ key + ')');\r\n\t\t\telm.attr('editable','');\r\n\t\t\tvar fn = $compile(elm);\r\n\t\t\treturn function (scope) {\r\n\t\t\t\tfn(scope);\r\n\t\t\t};\r\n\t\t}\r\n\t};\r\n});\r\n","AgrimarketDirectives.directive('agrimarketEditableEnum', function ($compile) {\r\n\treturn {\r\n\t\ttransclude: false,\r\n\t\treplace: false,\r\n\t\trestrict: 'EA',\r\n\t\tcompile: function (elm, attrs) {\r\n\t\t\tvar key = attrs.agrimarketEditableEnumKey;\r\n var label = attrs.agrimarketEditableEnumLabel;\r\n\t\t\telm.removeAttr('agrimarket-editable-enum');\r\n\t\t\telm.removeAttr('agrimarket-editable-enum-key');\r\n\t\t\telm.attr('editable-content-visible', 'false');\r\n elm.attr('editable-content-body', label);\r\n\t\t\telm.attr('editable-ico-visible', 'modeEdition');\r\n\t\t\telm.attr('editable-ico-action', 'openPopEditableEnum(\\'' + key + '\\')');\r\n\t\t\telm.attr('editable', '');\r\n\t\t\tvar fn = $compile(elm);\r\n\t\t\treturn function (scope) {\r\n\t\t\t\tfn(scope);\r\n\t\t\t};\r\n\t\t}\r\n\t};\r\n});","AgrimarketDirectives.directive('agrimarketEditableBlock', function ($compile) {\r\n\treturn {\r\n\t\ttransclude: false,\r\n\t\treplace: false,\r\n\t\trestrict: 'EA',\r\n\t\tcompile: function (elm, attrs) {\r\n\t\t\tvar key = attrs.agrimarketEditableBlockKey;\r\n\t\t\telm.removeAttr('agrimarket-editable-block');\r\n\t\t\telm.removeAttr('agrimarket-editable-block-key');\r\n\t\t\telm.attr('editable-content-visible', 'false');\r\n\t\t\telm.attr('editable-content-body', 'globalLabels.Edit_Blocks');\r\n\t\t\telm.attr('editable-ico-visible', 'modeEdition');\r\n\t\t\telm.attr('editable-ico-action', 'openPopEditableBlock(\\'' + key + '\\')');\r\n\t\t\telm.attr('editable', '');\r\n\t\t\tvar fn = $compile(elm);\r\n\t\t\treturn function (scope) {\r\n\t\t\t\tfn(scope);\r\n\t\t\t};\r\n\t\t}\r\n\t};\r\n});","// Permet d'animer le ticker de News\r\nAgrimarketDirectives.directive('newsTicker', ['$window', function ($window) {\r\n \r\n return {\r\n restrict: 'EA',\r\n replace: true,\r\n transclude: true,\r\n template: '<div class=\"news_ticker ticker-multiple\"><div class=\"news_list news_list_complete\" ng-transclude></div></div>',\r\n scope: {\r\n title: '=tickerTitle',\r\n height: '=tickerHeight',\r\n speed: '=tickerDuration',\r\n datawatch: '=tickerDatawatch'\r\n },\r\n link: function (scope, element, attrs) {\r\n\r\n var tickerInterval;\r\n scope.$parent.$on('$destroy', function () {\r\n clearInterval(tickerInterval);\r\n });\r\n\r\n jQuery(function() {\r\n\r\n var fn = function (resize) {\r\n\r\n if (resize) {\r\n $('.news_list.anim').remove();\r\n $(element).find('h1').remove();\r\n $(element).attr('style', '');\r\n }\r\n\r\n $(element).prepend('<h1>' + attrs.tickerTitle + '</h1>');\r\n $(element).append('<div class=\"news_list anim\"></div>');\r\n $(element).find('.news_list_complete>*').clone().appendTo('.news_list.anim');\r\n\r\n function splitNews(el, content, limit, endString) {\r\n var res = content.substring(0, limit);\r\n var trimmedString = res.substr(0, Math.min(res.length, res.lastIndexOf(\" \")));\r\n\r\n $(el).text(trimmedString + endString);\r\n }\r\n\r\n function ticker(height, duration, speed, limit, endString, resize) {\r\n $('.news_list_complete').hide();\r\n var el = $(element).find('.anim article');\r\n var nbEl = $(el).length;\r\n\r\n $(el).each(function(i) {\r\n var content = $(this).find('header+p').text();\r\n splitNews($(this).find('header+p'), content, limit, endString);\r\n });\r\n $(el).each(function (i) {\r\n var tempHeight = $(this).outerHeight();\r\n\r\n $(this).attr('data-news', i);\r\n if (tempHeight > height) {\r\n height = tempHeight;\r\n }\r\n i++;\r\n });\r\n $('.ticker-multiple').css({\r\n 'height': height,\r\n 'overflow': 'hidden',\r\n 'position': 'relative'\r\n }).addClass('ticker-anim');\r\n\r\n $(el).css({\r\n 'height': $('.news_ticker').outerHeight(),\r\n });\r\n\r\n $('.ticker-multiple').hover(function () {\r\n $(this).removeClass('ticker-anim');\r\n }, function () {\r\n $(this).addClass('ticker-anim');\r\n });\r\n\r\n $('.ticker-multiple').unbind();\r\n $('.ticker-multiple').bind('click',function () {\r\n\r\n if ($('.news_list_complete').is(':visible')) {\r\n //$('.ghost').remove();\r\n $('.ticker-multiple').css({\r\n 'position': '',\r\n 'width': '',\r\n 'z-index': ''\r\n });\r\n $('.news_list_complete').css('display', 'none');\r\n $('.news_list.anim').css('display', '');\r\n $('.ticker-multiple').css({\r\n 'height': height,\r\n 'overflow': 'hidden',\r\n 'position': 'relative'\r\n });\r\n $('.ticker-multiple .anim').css({\r\n 'height': height\r\n });\r\n\r\n }\r\n else {\r\n //$('<div class=\"ghost\" style=\"height: ' + $('.ticker-multiple').outerHeight(true) + 'px;\"></div>').insertAfter('.ticker-multiple');\r\n $('.ticker-multiple').css({\r\n 'width': $('.ticker-multiple').outerWidth(),\r\n 'position': '',\r\n 'z-index': 100\r\n });\r\n $('.news_list_complete').css('display', '');\r\n $('.news_list.anim').css('display', 'none');\r\n $('.ticker-multiple, .ticker-multiple .anim').css({\r\n 'height': '',\r\n 'overflow': ''\r\n });\r\n\r\n $(document).one('click', function closeTooltip(e) {\r\n\r\n if ($('.ticker-multiple').has(e.target).length === 0) {\r\n\r\n //$('.ghost').remove();\r\n $('.ticker-multiple').css({\r\n 'position': '',\r\n 'width': '',\r\n 'z-index': ''\r\n });\r\n $('.news_list_complete').css('display', 'none');\r\n $('.news_list.anim').css('display', '');\r\n $('.ticker-multiple').css({\r\n 'height': height,\r\n 'overflow': 'hidden',\r\n 'position': 'relative'\r\n });\r\n $('.ticker-multiple .anim').css({\r\n 'height': height\r\n });\r\n } else if ($('.news_list_complete').is(':visible')) {\r\n $(document).one('click', closeTooltip);\r\n }\r\n });\r\n\r\n }\r\n });\r\n\r\n if (!resize) {\r\n initAnim(nbEl, speed, duration);\r\n }\r\n }\r\n\r\n function initAnim(nbEl, speed, duration) {\r\n\r\n tickerInterval = setInterval(function () {\r\n if (nbEl > 1 && $('.ticker-multiple').hasClass('ticker-anim')) {\r\n $('.anim').animate({ marginTop: -$('.ticker-multiple').outerHeight() }, speed, 'easeOutBack', function () {\r\n $(this).css({ marginTop: 0 }).find(\"article:last\").after($(this).find(\"article:first\"));\r\n });\r\n }\r\n }, duration);\r\n }\r\n\r\n // Params : height ticker, durée anim, vitesse, nb caractères visibles, fin de trim\r\n ticker(scope.height, 15000, 450, 200, '...', resize);\r\n };\r\n\r\n //Permet de lancer la fonction ticker quand les données du scope sont présentes dans le rendu html\r\n scope.$parent.$watch(attrs.tickerDatawatch, function (newValue) {\r\n if (newValue !== undefined && newValue !== null && newValue.length > 0) {\r\n window.setTimeout(fn, 0);\r\n //clearInterval(ticker);\r\n //ticker = window.setTimeout(fn, 0);\r\n }\r\n });\r\n\r\n \r\n\r\n scope.width = $window.innerWidth;\r\n\r\n angular.element($window).bind('resize', function () {\r\n window.setTimeout(fn(true), 250);\r\n\r\n // manuall $digest required as resize event\r\n // is outside of angular\r\n scope.$digest();\r\n }); \r\n\r\n });\r\n }\r\n };\r\n}]);\r\n","// Gestion des filtres multi-sélection\r\nAgrimarketDirectives.directive('multiSelect', function () {\r\n return {\r\n restrict: 'EA',\r\n replace: true,\r\n transclude: true,\r\n scope: {\r\n label: '=label'\r\n },\r\n template: '<div class=\"selectBox\" data-help-tooltip=\"{{label}}\" data-title=\"{{label}}\" data-label-base=\"{{label}}\">' +\r\n '<ul class=\"checkboxes\" ng-transclude>' +\r\n '</ul>' +\r\n '</div>',\r\n link: function(scope, element, attrs) {\r\n jQuery(function() {\r\n var el = '.selectBox';\r\n\r\n $(el).unbind();\r\n $(el).bind('click', function(e) {\r\n\r\n if ($(this).hasClass('deploy')) {\r\n $(el).removeClass('deploy');\r\n } else {\r\n $(el).removeClass('deploy');\r\n $(this).addClass('deploy');\r\n }\r\n\r\n e.stopPropagation(); \r\n \r\n });\r\n\r\n $(document).bind('click', function closeTooltip(e) {\r\n if ($(el).has(e.target).length === 0) {\r\n $(el).removeClass('deploy');\r\n } else if ($(el).hasClass('deploy')) {\r\n $(document).one('click', closeTooltip);\r\n }\r\n e.stopPropagation();\r\n });\r\n\r\n });\r\n\r\n }\r\n };\r\n});","// Gestion des accordéons\r\n\r\n// @Author : Alexandre Riquet\r\n// [accordionDirective]\r\n// @Param : singleExpander => option permettant de limiter l'ouverture à un seul accordéon.\r\n// [expanderDirective]\r\n// @Param : title => titre de l'accordéon.\r\n// @Param : url => url permettant d'accéder à la page des cotations.\r\n// @Param : openDefault => bool gérant l'état par défaut (déplié ou non).\r\n\r\nAgrimarketDirectives.directive('accordion', function () {\r\n return{\r\n restrict: 'EA',\r\n replace: true,\r\n transclude: true,\r\n template: '<div ng-transclude></div>',\r\n scope: {\r\n singleExpander: '=singleExpander'\r\n },\r\n controller: function ($scope) {\r\n var expanders = [];\r\n\r\n this.gotOpened = function(selectedExpander){\r\n expanders.forEach(function (expander) {\r\n if($scope.singleExpander !== false && selectedExpander !== expander){\r\n expander.showMe = false;\r\n }\r\n });\r\n };\r\n this.addExpander = function (expander) {\r\n if (expanders.length === 0)\r\n expander.showMe = true;\r\n expanders.push(expander);\r\n };\r\n }\r\n };\r\n});\r\n\r\nAgrimarketDirectives.directive('expander', function () {\r\n return {\r\n restrict: 'EA',\r\n replace: true,\r\n transclude: true,\r\n require: '^?accordion',\r\n scope: {\r\n title: '=expanderTitle',\r\n icon: '=expanderIcon',\r\n url: '@linkToQuotes',\r\n openDefault: '=openDefault'\r\n },\r\n template: '<div>' +\r\n '<div class=\"accordion-title\" ng-class=\"{deploy : showMe == true}\" ng-click=\"toggle()\">' +\r\n '<span ng-if=\"icon\" class=\"ico-title {{icon}}\"></span>' +\r\n '<p>{{title}}</p>' +\r\n '<a href=\"{{url}}\" class=\"ico-table\" data-help-tooltip=\"Accéder aux cotations\" ng-if=\"url\"></a>' +\r\n '<span class=\"ico-accordion\"></span></div>' +\r\n '<div class=\"accordion-content\" ng-show=\"showMe\" ng-transclude></div>' +\r\n '</div>',\r\n link: function (scope, element, attrs, accordionController) {\r\n accordionController.addExpander(scope);\r\n scope.toggle = function toggle() {\r\n scope.showMe = !scope.showMe;\r\n accordionController.gotOpened(scope);\r\n };\r\n }\r\n };\r\n});","/**\r\n * dirPagination - AngularJS module for paginating (almost) anything.\r\n *\r\n *\r\n * Credits\r\n * =======\r\n *\r\n * Daniel Tabuenca: https://groups.google.com/d/msg/angular/an9QpzqIYiM/r8v-3W1X5vcJ\r\n * for the idea on how to dynamically invoke the ng-repeat directive.\r\n *\r\n * I borrowed a couple of lines and a few attribute names from the AngularUI Bootstrap project:\r\n * https://github.com/angular-ui/bootstrap/blob/master/src/pagination/pagination.js\r\n *\r\n * Copyright 2014 Michael Bromley <michael@michaelbromley.co.uk>\r\n */\r\n\r\n(function () {\r\n\r\n /**\r\n * Config\r\n */\r\n var moduleName = 'dirPagination';\r\n var DEFAULT_ID = '__default';\r\n\r\n /**\r\n * Module\r\n */\r\n angular.module(moduleName, [])\r\n .directive('dirPaginate', ['$compile', '$parse', 'paginationService', dirPaginateDirective])\r\n .directive('dirPaginateNoCompile', noCompileDirective)\r\n .directive('dirPaginationControls', ['paginationService', 'paginationTemplate', dirPaginationControlsDirective])\r\n .filter('itemsPerPage', ['paginationService', itemsPerPageFilter])\r\n .service('paginationService', paginationService)\r\n .provider('paginationTemplate', paginationTemplateProvider)\r\n .run(['$templateCache', dirPaginationControlsTemplateInstaller]);\r\n\r\n function dirPaginateDirective($compile, $parse, paginationService) {\r\n\r\n return {\r\n terminal: true,\r\n multiElement: true,\r\n priority: 100,\r\n compile: dirPaginationCompileFn\r\n };\r\n\r\n function dirPaginationCompileFn(tElement, tAttrs) {\r\n\r\n var expression = tAttrs.dirPaginate;\r\n // regex taken directly from https://github.com/angular/angular.js/blob/v1.4.x/src/ng/directive/ngRepeat.js#L339\r\n var match = expression.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)(?:\\s+as\\s+([\\s\\S]+?))?(?:\\s+track\\s+by\\s+([\\s\\S]+?))?\\s*$/);\r\n\r\n var filterPattern = /\\|\\s*itemsPerPage\\s*:\\s*(.*\\(\\s*\\w*\\)|([^\\)]*?(?=\\s+as\\s+))|[^\\)]*)/;\r\n if (match[2].match(filterPattern) === null) {\r\n throw 'pagination directive: the \\'itemsPerPage\\' filter must be set.';\r\n }\r\n var itemsPerPageFilterRemoved = match[2].replace(filterPattern, '');\r\n var collectionGetter = $parse(itemsPerPageFilterRemoved);\r\n\r\n addNoCompileAttributes(tElement);\r\n\r\n // If any value is specified for paginationId, we register the un-evaluated expression at this stage for the benefit of any\r\n // dir-pagination-controls directives that may be looking for this ID.\r\n var rawId = tAttrs.paginationId || DEFAULT_ID;\r\n paginationService.registerInstance(rawId);\r\n\r\n return function dirPaginationLinkFn(scope, element, attrs) {\r\n\r\n // Now that we have access to the `scope` we can interpolate any expression given in the paginationId attribute and\r\n // potentially register a new ID if it evaluates to a different value than the rawId.\r\n var paginationId = $parse(attrs.paginationId)(scope) || attrs.paginationId || DEFAULT_ID;\r\n\r\n // (TODO: this seems sound, but I'm reverting as many bug reports followed it's introduction in 0.11.0.\r\n // Needs more investigation.)\r\n // In case rawId != paginationId we deregister using rawId for the sake of general cleanliness\r\n // before registering using paginationId\r\n // paginationService.deregisterInstance(rawId);\r\n paginationService.registerInstance(paginationId);\r\n\r\n var repeatExpression = getRepeatExpression(expression, paginationId);\r\n addNgRepeatToElement(element, attrs, repeatExpression);\r\n\r\n removeTemporaryAttributes(element);\r\n var compiled = $compile(element);\r\n\r\n var currentPageGetter = makeCurrentPageGetterFn(scope, attrs, paginationId);\r\n paginationService.setCurrentPageParser(paginationId, currentPageGetter, scope);\r\n\r\n if (typeof attrs.totalItems !== 'undefined') {\r\n paginationService.setAsyncModeTrue(paginationId);\r\n scope.$watch(function () {\r\n return $parse(attrs.totalItems)(scope);\r\n }, function (result) {\r\n if (0 <= result) {\r\n paginationService.setCollectionLength(paginationId, result);\r\n }\r\n });\r\n } else {\r\n paginationService.setAsyncModeFalse(paginationId);\r\n scope.$watchCollection(function () {\r\n return collectionGetter(scope);\r\n }, function (collection) {\r\n if (collection) {\r\n var collectionLength = (collection instanceof Array) ? collection.length : Object.keys(collection).length;\r\n paginationService.setCollectionLength(paginationId, collectionLength);\r\n }\r\n });\r\n }\r\n\r\n // Delegate to the link function returned by the new compilation of the ng-repeat\r\n compiled(scope);\r\n\r\n // (TODO: Reverting this due to many bug reports in v 0.11.0. Needs investigation as the\r\n // principle is sound)\r\n // When the scope is destroyed, we make sure to remove the reference to it in paginationService\r\n // so that it can be properly garbage collected\r\n // scope.$on('$destroy', function destroyDirPagination() {\r\n // paginationService.deregisterInstance(paginationId);\r\n // });\r\n };\r\n }\r\n\r\n /**\r\n * If a pagination id has been specified, we need to check that it is present as the second argument passed to\r\n * the itemsPerPage filter. If it is not there, we add it and return the modified expression.\r\n *\r\n * @param expression\r\n * @param paginationId\r\n * @returns {*}\r\n */\r\n function getRepeatExpression(expression, paginationId) {\r\n var repeatExpression,\r\n idDefinedInFilter = !!expression.match(/(\\|\\s*itemsPerPage\\s*:[^|]*:[^|]*)/);\r\n\r\n if (paginationId !== DEFAULT_ID && !idDefinedInFilter) {\r\n repeatExpression = expression.replace(/(\\|\\s*itemsPerPage\\s*:\\s*[^|\\s]*)/, \"$1 : '\" + paginationId + \"'\");\r\n } else {\r\n repeatExpression = expression;\r\n }\r\n\r\n return repeatExpression;\r\n }\r\n\r\n /**\r\n * Adds the ng-repeat directive to the element. In the case of multi-element (-start, -end) it adds the\r\n * appropriate multi-element ng-repeat to the first and last element in the range.\r\n * @param element\r\n * @param attrs\r\n * @param repeatExpression\r\n */\r\n function addNgRepeatToElement(element, attrs, repeatExpression) {\r\n if (element[0].hasAttribute('dir-paginate-start') || element[0].hasAttribute('data-dir-paginate-start')) {\r\n // using multiElement mode (dir-paginate-start, dir-paginate-end)\r\n attrs.$set('ngRepeatStart', repeatExpression);\r\n element.eq(element.length - 1).attr('ng-repeat-end', true);\r\n } else {\r\n attrs.$set('ngRepeat', repeatExpression);\r\n }\r\n }\r\n\r\n /**\r\n * Adds the dir-paginate-no-compile directive to each element in the tElement range.\r\n * @param tElement\r\n */\r\n function addNoCompileAttributes(tElement) {\r\n angular.forEach(tElement, function (el) {\r\n if (el.nodeType === 1) {\r\n angular.element(el).attr('dir-paginate-no-compile', true);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Removes the variations on dir-paginate (data-, -start, -end) and the dir-paginate-no-compile directives.\r\n * @param element\r\n */\r\n function removeTemporaryAttributes(element) {\r\n angular.forEach(element, function (el) {\r\n if (el.nodeType === 1) {\r\n angular.element(el).removeAttr('dir-paginate-no-compile');\r\n }\r\n });\r\n element.eq(0).removeAttr('dir-paginate-start').removeAttr('dir-paginate').removeAttr('data-dir-paginate-start').removeAttr('data-dir-paginate');\r\n element.eq(element.length - 1).removeAttr('dir-paginate-end').removeAttr('data-dir-paginate-end');\r\n }\r\n\r\n /**\r\n * Creates a getter function for the current-page attribute, using the expression provided or a default value if\r\n * no current-page expression was specified.\r\n *\r\n * @param scope\r\n * @param attrs\r\n * @param paginationId\r\n * @returns {*}\r\n */\r\n function makeCurrentPageGetterFn(scope, attrs, paginationId) {\r\n var currentPageGetter;\r\n if (attrs.currentPage) {\r\n currentPageGetter = $parse(attrs.currentPage);\r\n } else {\r\n // If the current-page attribute was not set, we'll make our own.\r\n // Replace any non-alphanumeric characters which might confuse\r\n // the $parse service and give unexpected results.\r\n // See https://github.com/michaelbromley/angularUtils/issues/233\r\n var defaultCurrentPage = (paginationId + '__currentPage').replace(/\\W/g, '_');\r\n scope[defaultCurrentPage] = 1;\r\n currentPageGetter = $parse(defaultCurrentPage);\r\n }\r\n return currentPageGetter;\r\n }\r\n }\r\n\r\n /**\r\n * This is a helper directive that allows correct compilation when in multi-element mode (ie dir-paginate-start, dir-paginate-end).\r\n * It is dynamically added to all elements in the dir-paginate compile function, and it prevents further compilation of\r\n * any inner directives. It is then removed in the link function, and all inner directives are then manually compiled.\r\n */\r\n function noCompileDirective() {\r\n return {\r\n priority: 5000,\r\n terminal: true\r\n };\r\n }\r\n\r\n function dirPaginationControlsTemplateInstaller($templateCache) {\r\n $templateCache.put('angularUtils.directives.dirPagination.template', '<ul class=\"pagination\" ng-if=\"1 < pages.length || !autoHide\"><li ng-if=\"boundaryLinks\" ng-class=\"{ disabled : pagination.current == 1 }\"><a href=\"\" ng-click=\"setCurrent(1)\">«</a></li><li ng-if=\"directionLinks\" ng-class=\"{ disabled : pagination.current == 1 }\"><a href=\"\" ng-click=\"setCurrent(pagination.current - 1)\">‹</a></li><li ng-repeat=\"pageNumber in pages track by tracker(pageNumber, $index)\" ng-class=\"{ active : pagination.current == pageNumber, disabled : pageNumber == \\'...\\' || ( ! autoHide && pages.length === 1 ) }\"><a href=\"\" ng-click=\"setCurrent(pageNumber)\">{{ pageNumber }}</a></li><li ng-if=\"directionLinks\" ng-class=\"{ disabled : pagination.current == pagination.last }\"><a href=\"\" ng-click=\"setCurrent(pagination.current + 1)\">›</a></li><li ng-if=\"boundaryLinks\" ng-class=\"{ disabled : pagination.current == pagination.last }\"><a href=\"\" ng-click=\"setCurrent(pagination.last)\">»</a></li></ul>');\r\n }\r\n\r\n function dirPaginationControlsDirective(paginationService, paginationTemplate) {\r\n\r\n var numberRegex = /^\\d+$/;\r\n\r\n var DDO = {\r\n restrict: 'AE',\r\n scope: {\r\n maxSize: '=?',\r\n onPageChange: '&?',\r\n paginationId: '=?',\r\n autoHide: '=?',\r\n logavivItemLabel: '=?', //custom logaviv \r\n logavivSep: '@' //custom logaviv\r\n },\r\n link: dirPaginationControlsLinkFn\r\n };\r\n\r\n // We need to check the paginationTemplate service to see whether a template path or\r\n // string has been specified, and add the `template` or `templateUrl` property to\r\n // the DDO as appropriate. The order of priority to decide which template to use is\r\n // (highest priority first):\r\n // 1. paginationTemplate.getString()\r\n // 2. attrs.templateUrl\r\n // 3. paginationTemplate.getPath()\r\n var templateString = paginationTemplate.getString();\r\n if (templateString !== undefined) {\r\n DDO.template = templateString;\r\n } else {\r\n DDO.templateUrl = function (elem, attrs) {\r\n return attrs.templateUrl || paginationTemplate.getPath();\r\n };\r\n }\r\n return DDO;\r\n\r\n function dirPaginationControlsLinkFn(scope, element, attrs) {\r\n\r\n // rawId is the un-interpolated value of the pagination-id attribute. This is only important when the corresponding dir-paginate directive has\r\n // not yet been linked (e.g. if it is inside an ng-if block), and in that case it prevents this controls directive from assuming that there is\r\n // no corresponding dir-paginate directive and wrongly throwing an exception.\r\n var rawId = attrs.paginationId || DEFAULT_ID;\r\n var paginationId = scope.paginationId || attrs.paginationId || DEFAULT_ID;\r\n\r\n if (!paginationService.isRegistered(paginationId) && !paginationService.isRegistered(rawId)) {\r\n var idMessage = (paginationId !== DEFAULT_ID) ? ' (id: ' + paginationId + ') ' : ' ';\r\n if (window.console) {\r\n console.warn('Pagination directive: the pagination controls' + idMessage + 'cannot be used without the corresponding pagination directive, which was not found at link time.');\r\n }\r\n }\r\n\r\n if (!scope.maxSize) { scope.maxSize = 9; }\r\n scope.autoHide = scope.autoHide === undefined ? true : scope.autoHide;\r\n scope.directionLinks = angular.isDefined(attrs.directionLinks) ? scope.$parent.$eval(attrs.directionLinks) : true;\r\n scope.boundaryLinks = angular.isDefined(attrs.boundaryLinks) ? scope.$parent.$eval(attrs.boundaryLinks) : false;\r\n\r\n var paginationRange = Math.max(scope.maxSize, 5);\r\n scope.pages = [];\r\n scope.pagination = {\r\n last: 1,\r\n current: 1\r\n };\r\n scope.range = {\r\n lower: 1,\r\n upper: 1,\r\n total: 1\r\n };\r\n\r\n scope.$watch('maxSize', function (val) {\r\n if (val) {\r\n paginationRange = Math.max(scope.maxSize, 5);\r\n generatePagination();\r\n }\r\n });\r\n\r\n scope.$watch(function () {\r\n if (paginationService.isRegistered(paginationId)) {\r\n return (paginationService.getCollectionLength(paginationId) + 1) * paginationService.getItemsPerPage(paginationId);\r\n }\r\n }, function (length) {\r\n if (0 < length) {\r\n generatePagination();\r\n }\r\n });\r\n\r\n scope.$watch(function () {\r\n if (paginationService.isRegistered(paginationId)) {\r\n return (paginationService.getItemsPerPage(paginationId));\r\n }\r\n }, function (current, previous) {\r\n if (current != previous && typeof previous !== 'undefined') {\r\n goToPage(scope.pagination.current);\r\n }\r\n });\r\n\r\n scope.$watch(function () {\r\n if (paginationService.isRegistered(paginationId)) {\r\n return paginationService.getCurrentPage(paginationId);\r\n }\r\n }, function (currentPage, previousPage) {\r\n if (currentPage != previousPage) {\r\n goToPage(currentPage);\r\n }\r\n });\r\n\r\n scope.setCurrent = function (num) {\r\n if (paginationService.isRegistered(paginationId) && isValidPageNumber(num)) {\r\n num = parseInt(num, 10);\r\n paginationService.setCurrentPage(paginationId, num);\r\n }\r\n };\r\n\r\n /**\r\n * Custom \"track by\" function which allows for duplicate \"...\" entries on long lists,\r\n * yet fixes the problem of wrongly-highlighted links which happens when using\r\n * \"track by $index\" - see https://github.com/michaelbromley/angularUtils/issues/153\r\n * @param id\r\n * @param index\r\n * @returns {string}\r\n */\r\n scope.tracker = function (id, index) {\r\n return id + '_' + index;\r\n };\r\n\r\n function goToPage(num) {\r\n if (paginationService.isRegistered(paginationId) && isValidPageNumber(num)) {\r\n var oldPageNumber = scope.pagination.current;\r\n var generatePagesArrayResults = generatePagesArray(num, paginationService.getCollectionLength(paginationId), paginationService.getItemsPerPage(paginationId), paginationRange);\r\n scope.pages = generatePagesArrayResults.pages;\r\n scope.totalPages = generatePagesArrayResults.totalPages;\r\n scope.pagination.current = num;\r\n updateRangeValues();\r\n\r\n // if a callback has been set, then call it with the page number as the first argument\r\n // and the previous page number as a second argument\r\n if (scope.onPageChange) {\r\n scope.onPageChange({\r\n newPageNumber: num,\r\n oldPageNumber: oldPageNumber\r\n });\r\n }\r\n }\r\n }\r\n\r\n function generatePagination() {\r\n if (paginationService.isRegistered(paginationId)) {\r\n var page = parseInt(paginationService.getCurrentPage(paginationId)) || 1;\r\n var generatePagesArrayResults = generatePagesArray(page, paginationService.getCollectionLength(paginationId), paginationService.getItemsPerPage(paginationId), paginationRange);\r\n scope.pages = generatePagesArrayResults.pages;\r\n scope.totalPages = generatePagesArrayResults.totalPages;\r\n scope.pagination.current = page;\r\n scope.pagination.last = scope.pages[scope.pages.length - 1];\r\n if (scope.pagination.last < scope.pagination.current) {\r\n scope.setCurrent(scope.pagination.last);\r\n } else {\r\n updateRangeValues();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This function updates the values (lower, upper, total) of the `scope.range` object, which can be used in the pagination\r\n * template to display the current page range, e.g. \"showing 21 - 40 of 144 results\";\r\n */\r\n function updateRangeValues() {\r\n if (paginationService.isRegistered(paginationId)) {\r\n var currentPage = paginationService.getCurrentPage(paginationId),\r\n itemsPerPage = paginationService.getItemsPerPage(paginationId),\r\n totalItems = paginationService.getCollectionLength(paginationId);\r\n\r\n scope.range.lower = (currentPage - 1) * itemsPerPage + 1;\r\n scope.range.upper = Math.min(currentPage * itemsPerPage, totalItems);\r\n scope.range.total = totalItems;\r\n }\r\n }\r\n function isValidPageNumber(num) {\r\n return (numberRegex.test(num) && (0 < num && num <= scope.pagination.last));\r\n }\r\n }\r\n\r\n /**\r\n * Generate an array of page numbers (or the '...' string) which is used in an ng-repeat to generate the\r\n * links used in pagination\r\n *\r\n * @param currentPage\r\n * @param rowsPerPage\r\n * @param paginationRange\r\n * @param collectionLength\r\n * @returns {Array}\r\n */\r\n function generatePagesArray(currentPage, collectionLength, rowsPerPage, paginationRange) {\r\n var pages = [];\r\n var totalPages = Math.ceil(collectionLength / rowsPerPage);\r\n var halfWay = Math.ceil(paginationRange / 2);\r\n var position;\r\n\r\n if (currentPage <= halfWay) {\r\n position = 'start';\r\n } else if (totalPages - halfWay < currentPage) {\r\n position = 'end';\r\n } else {\r\n position = 'middle';\r\n }\r\n\r\n var ellipsesNeeded = paginationRange < totalPages;\r\n var i = 1;\r\n while (i <= totalPages && i <= paginationRange) {\r\n var pageNumber = calculatePageNumber(i, currentPage, paginationRange, totalPages);\r\n\r\n var openingEllipsesNeeded = (i === 2 && (position === 'middle' || position === 'end'));\r\n var closingEllipsesNeeded = (i === paginationRange - 1 && (position === 'middle' || position === 'start'));\r\n if (ellipsesNeeded && (openingEllipsesNeeded || closingEllipsesNeeded)) {\r\n pages.push('...');\r\n } else {\r\n pages.push(pageNumber);\r\n }\r\n i++;\r\n }\r\n return {pages: pages, totalPages: totalPages};\r\n }\r\n\r\n /**\r\n * Given the position in the sequence of pagination links [i], figure out what page number corresponds to that position.\r\n *\r\n * @param i\r\n * @param currentPage\r\n * @param paginationRange\r\n * @param totalPages\r\n * @returns {*}\r\n */\r\n function calculatePageNumber(i, currentPage, paginationRange, totalPages) {\r\n var halfWay = Math.ceil(paginationRange / 2);\r\n if (i === paginationRange) {\r\n return totalPages;\r\n } else if (i === 1) {\r\n return i;\r\n } else if (paginationRange < totalPages) {\r\n if (totalPages - halfWay < currentPage) {\r\n return totalPages - paginationRange + i;\r\n } else if (halfWay < currentPage) {\r\n return currentPage - halfWay + i;\r\n } else {\r\n return i;\r\n }\r\n } else {\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * This filter slices the collection into pages based on the current page number and number of items per page.\r\n * @param paginationService\r\n * @returns {Function}\r\n */\r\n function itemsPerPageFilter(paginationService) {\r\n\r\n return function (collection, itemsPerPage, paginationId) {\r\n if (typeof (paginationId) === 'undefined') {\r\n paginationId = DEFAULT_ID;\r\n }\r\n if (!paginationService.isRegistered(paginationId)) {\r\n throw 'pagination directive: the itemsPerPage id argument (id: ' + paginationId + ') does not match a registered pagination-id.';\r\n }\r\n var end;\r\n var start;\r\n if (angular.isObject(collection)) {\r\n itemsPerPage = parseInt(itemsPerPage) || 9999999999;\r\n if (paginationService.isAsyncMode(paginationId)) {\r\n start = 0;\r\n } else {\r\n start = (paginationService.getCurrentPage(paginationId) - 1) * itemsPerPage;\r\n }\r\n end = start + itemsPerPage;\r\n paginationService.setItemsPerPage(paginationId, itemsPerPage);\r\n\r\n if (collection instanceof Array) {\r\n // the array just needs to be sliced\r\n return collection.slice(start, end);\r\n } else {\r\n // in the case of an object, we need to get an array of keys, slice that, then map back to\r\n // the original object.\r\n var slicedObject = {};\r\n angular.forEach(keys(collection).slice(start, end), function (key) {\r\n slicedObject[key] = collection[key];\r\n });\r\n return slicedObject;\r\n }\r\n } else {\r\n return collection;\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Shim for the Object.keys() method which does not exist in IE < 9\r\n * @param obj\r\n * @returns {Array}\r\n */\r\n function keys(obj) {\r\n if (!Object.keys) {\r\n var objKeys = [];\r\n for (var i in obj) {\r\n if (obj.hasOwnProperty(i)) {\r\n objKeys.push(i);\r\n }\r\n }\r\n return objKeys;\r\n } else {\r\n return Object.keys(obj);\r\n }\r\n }\r\n\r\n /**\r\n * This service allows the various parts of the module to communicate and stay in sync.\r\n */\r\n function paginationService() {\r\n\r\n var instances = {};\r\n var lastRegisteredInstance;\r\n\r\n this.registerInstance = function (instanceId) {\r\n if (typeof instances[instanceId] === 'undefined') {\r\n instances[instanceId] = {\r\n asyncMode: false\r\n };\r\n lastRegisteredInstance = instanceId;\r\n }\r\n };\r\n\r\n this.deregisterInstance = function (instanceId) {\r\n delete instances[instanceId];\r\n };\r\n\r\n this.isRegistered = function (instanceId) {\r\n return (typeof instances[instanceId] !== 'undefined');\r\n };\r\n\r\n this.getLastInstanceId = function () {\r\n return lastRegisteredInstance;\r\n };\r\n\r\n this.setCurrentPageParser = function (instanceId, val, scope) {\r\n instances[instanceId].currentPageParser = val;\r\n instances[instanceId].context = scope;\r\n };\r\n this.setCurrentPage = function (instanceId, val) {\r\n instances[instanceId].currentPageParser.assign(instances[instanceId].context, val);\r\n };\r\n this.getCurrentPage = function (instanceId) {\r\n var parser = instances[instanceId].currentPageParser;\r\n return parser ? parser(instances[instanceId].context) : 1;\r\n };\r\n\r\n this.setItemsPerPage = function (instanceId, val) {\r\n instances[instanceId].itemsPerPage = val;\r\n };\r\n this.getItemsPerPage = function (instanceId) {\r\n return instances[instanceId].itemsPerPage;\r\n };\r\n\r\n this.setCollectionLength = function (instanceId, val) {\r\n instances[instanceId].collectionLength = val;\r\n };\r\n this.getCollectionLength = function (instanceId) {\r\n return instances[instanceId].collectionLength;\r\n };\r\n\r\n this.setAsyncModeTrue = function (instanceId) {\r\n instances[instanceId].asyncMode = true;\r\n };\r\n\r\n this.setAsyncModeFalse = function (instanceId) {\r\n instances[instanceId].asyncMode = false;\r\n };\r\n\r\n this.isAsyncMode = function (instanceId) {\r\n return instances[instanceId].asyncMode;\r\n };\r\n }\r\n\r\n /**\r\n * This provider allows global configuration of the template path used by the dir-pagination-controls directive.\r\n */\r\n function paginationTemplateProvider() {\r\n\r\n var templatePath = 'angularUtils.directives.dirPagination.template';\r\n var templateString;\r\n\r\n /**\r\n * Set a templateUrl to be used by all instances of <dir-pagination-controls>\r\n * @param {String} path\r\n */\r\n this.setPath = function (path) {\r\n templatePath = path;\r\n };\r\n\r\n /**\r\n * Set a string of HTML to be used as a template by all instances\r\n * of <dir-pagination-controls>. If both a path *and* a string have been set,\r\n * the string takes precedence.\r\n * @param {String} str\r\n */\r\n this.setString = function (str) {\r\n templateString = str;\r\n };\r\n\r\n this.$get = function () {\r\n return {\r\n getPath: function () {\r\n return templatePath;\r\n },\r\n getString: function () {\r\n return templateString;\r\n }\r\n };\r\n };\r\n }\r\n})();","AgrimarketDirectives.directive('ngIncludeReplace', function ($timeout, $rootScope) {\r\n return {\r\n require: 'ngInclude',\r\n link: function (scope, element, attrs) {\r\n $timeout(function () {\r\n element.replaceWith(element.children());\r\n }, 0);\r\n \r\n }\r\n };\r\n});","AgrimarketDirectives.directive('autoFocus', function ($timeout, $parse) {\r\n return {\r\n link: function (scope, element, attrs) {\r\n var model = $parse(attrs.focusMe);\r\n scope.$watch(model, function (value) {\r\n if (value === true) {\r\n $timeout(function () {\r\n element[0].focus();\r\n });\r\n }\r\n });\r\n element.bind('focus', function (setPristine) {\r\n scope.$apply(model.assign(scope, setPristine.currentTarget.id));\r\n });\r\n }\r\n };\r\n});","AgrimarketControllers.controller('contractsFirmMonitoringController', ['$scope', '$rootScope', '$routeParams', '$filter', '$location', 'configurationFactory', 'contractsService',\r\n 'cropsService', 'athenaOrdersService', '$sce', 'parametersFactory', 'enumFactory', 'colonnesValidatedNotCover', 'colonnesValidatedCovered',\r\n 'colonnesValidatedPendingCover', 'colonnesCanceled', 'colonnesPricedNotCover', 'colonnesPricedPendingCover', 'colonnesPendingNotCover', 'colonnesPendingCovered',\r\n 'colonnesPendingPendingCover', 'colonnesToValidated' ,'columnsDelayedSigning', 'conditionsService',\r\n function ($scope, $rootScope, $routeParams, $filter, $location, configurationFactory, contractsService, cropsService, athenaOrdersService, $sce, parametersFactory, enumFactory,\r\n colonnesValidatedNotCover, colonnesValidatedCovered, colonnesValidatedPendingCover, colonnesCanceled, colonnesPricedNotCover, colonnesPricedPendingCover,\r\n colonnesPendingNotCover, colonnesPendingCovered, colonnesPendingPendingCover, colonnesToValidated, columnsDelayedSigning, conditionsService) {\r\n\r\n var idTabContracts;\r\n\r\n var Init = function () {\r\n // Contracts validés non couverts\r\n $scope.tableValidatedContractsNotCoverDataVisible = colonnesValidatedNotCover.data.DataVisible.split(',');\r\n $scope.tableValidatedContractsNotCoverLibelle = colonnesValidatedNotCover.data.ColumnName.split(',');\r\n\r\n // Contrats validés couverts\r\n $scope.tableValidatedContractsCoveredDataVisible = colonnesValidatedCovered.data.DataVisible.split(',');\r\n $scope.tableValidatedContractsCoveredLibelle = colonnesValidatedCovered.data.ColumnName.split(',');\r\n\r\n // Contrats validés en cours de couverture\r\n $scope.tableValidatedContractsPendingCoverDataVisible = colonnesValidatedPendingCover.data.DataVisible.split(',');\r\n $scope.tableValidatedContractsPendingCoverLibelle = colonnesValidatedPendingCover.data.ColumnName.split(',');\r\n\r\n // Contracts en attente non couverts\r\n $scope.tablePendingContractsNotCoverDataVisible = colonnesPendingNotCover.data.DataVisible.split(',');\r\n $scope.tablePendingContractsNotCoverLibelle = colonnesPendingNotCover.data.ColumnName.split(',');\r\n\r\n // Contrats en attente couverts\r\n $scope.tablePendingContractsCoveredDataVisible = colonnesPendingCovered.data.DataVisible.split(',');\r\n $scope.tablePendingContractsCoveredLibelle = colonnesPendingCovered.data.ColumnName.split(',');\r\n\r\n // Contrats en attente en cours de couverture\r\n $scope.tablePendingContractsPendingCoverDataVisible = colonnesPendingPendingCover.data.DataVisible.split(',');\r\n $scope.tablePendingContractsPendingCoverLibelle = colonnesPendingPendingCover.data.ColumnName.split(',');\r\n\r\n // Contrats à valider\r\n $scope.tableToValidatedContractsDataVisible = colonnesToValidated.data.DataVisible.split(',');\r\n $scope.tableToValidatedContractsLibelle = colonnesToValidated.data.ColumnName.split(',');\r\n\r\n // Contrats prix objectif non couverts\r\n $scope.tablePricedContractsNotCoverDataVisible = colonnesPricedNotCover.data.DataVisible.split(',');\r\n $scope.tablePricedContractsNotCoverLibelle = colonnesPricedNotCover.data.ColumnName.split(',');\r\n\r\n // Contrats prix objectif en cours de couverture\r\n $scope.tablePricedContractsPendingCoverDataVisible = colonnesPricedPendingCover.data.DataVisible.split(',');\r\n $scope.tablePricedContractsPendingCoverLibelle = colonnesPricedPendingCover.data.ColumnName.split(',');\r\n\r\n // Contrats annulés\r\n $scope.tableCanceledContractsDataVisible = colonnesCanceled.data.DataVisible.split(',');\r\n $scope.tableCanceledContractsLibelle = colonnesCanceled.data.ColumnName.split(',');\r\n\r\n // Contracts en attente de signature\r\n $scope.tableDelayedSigningContractsDataVisible = columnsDelayedSigning.data.DataVisible.split(',');\r\n $scope.tableDelayedSigningContractsLibelle = columnsDelayedSigning.data.ColumnName.split(',');\r\n \r\n // Gestion du trie de l'onglet Validés\r\n $scope.dataValidated = [];\r\n $scope.dataValidated[enumFactory.IdStateCover.NotCovered] = { loading: true, reverse: true, sortKey: \"IdContract\" };\r\n $scope.dataValidated[enumFactory.IdStateCover.PendingCover] = { loading: false, reverse: true, sortKey: \"IdContract\" };\r\n $scope.dataValidated[enumFactory.IdStateCover.Covered] = { loading: true, reverse: true, sortKey: \"IdContract\" };\r\n\r\n // Gestion du trie de l'onglet en attente\r\n $scope.dataPending = [];\r\n $scope.dataPending[enumFactory.IdStateCover.NotCovered] = { loading: false, reverse: true, sortKey: \"IdContract\" };\r\n $scope.dataPending[enumFactory.IdStateCover.PendingCover] = { loading: false, reverse: true, sortKey: \"IdContract\" };\r\n $scope.dataPending[enumFactory.IdStateCover.Covered] = { loading: false, reverse: true, sortKey: \"IdContract\" };\r\n\r\n // Gestion du trie de l'onglet A valider\r\n $scope.dataToValidated = { loading: false, reverse: true, sortKey: \"IdContract\" };\r\n\r\n // Gestion du trie de l'onglet Prix objectif\r\n $scope.dataPriced = [];\r\n $scope.dataPriced[enumFactory.IdStateCover.NotCovered] = { loading: false, reverse: true, sortKey: \"IdContract\" };\r\n $scope.dataPriced[enumFactory.IdStateCover.PendingCover] = { loading: false, reverse: true, sortKey: \"IdContract\" };\r\n\r\n // Gestion du trie de l'onglet Annulés\r\n $scope.dataCanceled = { loading: false, reverse: true, sortKey: \"IdContract\" };\r\n\r\n // Gestion du trie de l'onglet En attente de signature\r\n $scope.dataDelayedSigning = { loading: false, reverse: false, sortKey: \"HourLeftDelayedSigning\" };\r\n\r\n $scope.editShowValueAutoComplete = false;\r\n\r\n // Pagination onglet Validés\r\n $scope.total = [];\r\n $scope.validatedPageNo = [];\r\n $scope.validatedPageNo[enumFactory.IdStateCover.NotCovered] = 1;\r\n $scope.validatedPageNo[enumFactory.IdStateCover.PendingCover] = 1;\r\n $scope.validatedPageNo[enumFactory.IdStateCover.Covered] = 1;\r\n\r\n // Pagination onglet En attente\r\n $scope.totalPending = [];\r\n $scope.pendingPageNo = [];\r\n $scope.pendingPageNo[enumFactory.IdStateCover.NotCovered] = 1;\r\n $scope.pendingPageNo[enumFactory.IdStateCover.PendingCover] = 1;\r\n $scope.pendingPageNo[enumFactory.IdStateCover.Covered] = 1;\r\n\r\n // Pagination onglet A valider\r\n $scope.toValidatedPageNo = 1;\r\n\r\n // Pagination onglet Prix objectif\r\n $scope.totalPriced = [];\r\n $scope.pricedPageNo = [];\r\n $scope.pricedPageNo[enumFactory.IdStateCover.NotCovered] = 1;\r\n $scope.pricedPageNo[enumFactory.IdStateCover.PendingCover] = 1;\r\n\r\n // Pagination onglet Annulés\r\n $scope.canceledPageNo = 1;\r\n\r\n // Pagination onglet En attente de signature\r\n $scope.delayedSigningPageNo = 1;\r\n\r\n $scope.max = 10;\r\n $scope.idCropSelected = Number(parametersFactory.Parameters.DefaultCrop.Value);\r\n $scope.idProductSelected = \"\";\r\n $scope.idTypeOrderContractSelected = \"\";\r\n $scope.idTypeFixationSelected = \"\";\r\n $scope.idCompagnySelected = \"\";\r\n $scope.dateFilter = \"\";\r\n $scope.dateSelected = \"\";\r\n $scope.selectedClient = {};\r\n $scope.viewMode = $routeParams.typeContract;\r\n $scope.showDetails = true;\r\n $scope.showDetailsPendingCover = true;\r\n $scope.showDetailsCover = true;\r\n $scope.allSelected = false;\r\n $scope.enumFactory = enumFactory;\r\n $scope.automaticCover = parametersFactory.Parameters.AutomaticCover.Value;\r\n $scope.automaticCoverModule = $rootScope.ModuleAutomaticCover.Active;\r\n $scope.automaticTargetPriceModule = $rootScope.ModuleObjectifAutomatique.Active;\r\n $scope.fixTargetPrice = parametersFactory.Parameters.FixTargetPrice.Value;\r\n $scope.moduleElectronicSignatureIsActive = $rootScope.ModuleElectronicSignature.Active;\r\n $scope.moduleYousignIsActive = $rootScope.ModuleSignatureElectroniqueYouSign.Active;\r\n $scope.bActivateContractsValidation = parametersFactory.Parameters.bActivateContractsValidation.Value === \"1\";\r\n $scope.coverContract = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractFirmMonitoring_CoverContract.Content;\r\n\r\n $scope.Button_PositionOnMarket = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractFirmMonitoring_Button_PositionOnMarket.Content;\r\n $scope.PopUpCoverContractsSelected_Title = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractFirmMonitoring_PopUpCoverContractsSelected_Title_PositioningConfirmation.Content;\r\n $scope.PopUpCoverContractsSelected_Text = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractFirmMonitoring_PopUpCoverContractsSelected_Text.Content;\r\n\r\n $scope.lstProducts = [];\r\n $scope.lstTypeOrders = [];\r\n $scope.lstTypeFixations = [];\r\n $scope.listIdContractsToCover = [];\r\n $scope.enumIdStateCover = enumFactory.IdStateCover;\r\n $scope.allContractsInView = [];\r\n $scope.IsActionFixed = false;\r\n $scope.FixContract = {\r\n prixTargetPricedContractFixed: null,\r\n Iscover: false\r\n };\r\n\r\n if ($scope.viewMode === \"validated\")\r\n idTabContracts = enumFactory.TabContract.Validated;\r\n else if ($scope.viewMode === \"priced\")\r\n idTabContracts = enumFactory.TabContract.Priced;\r\n else if ($scope.viewMode === \"canceled\")\r\n idTabContracts = enumFactory.TabContract.Canceled;\r\n else if ($scope.viewMode === \"pending\")\r\n idTabContracts = enumFactory.TabContract.Pending;\r\n else if ($scope.viewMode === \"toValidated\")\r\n idTabContracts = enumFactory.TabContract.ToValidated;\r\n else if ($scope.viewMode === \"delayedSigning\")\r\n idTabContracts = enumFactory.TabContract.delayedSigning;\r\n\r\n //Permet de gerer les arrondis des prix pour les decimales > 2\r\n $scope.$watch(\"allContractsInView\", function (n, o) {\r\n if (n !== o) {\r\n var regexfloat = /^[0-9]+.[0-9]{3,100}/;\r\n n.forEach(function (item) {\r\n if (regexfloat.test(item.Price))\r\n item.Price = Number(item.Price).toFixed(2);\r\n });\r\n }\r\n }, true);\r\n\r\n var refreshUsers = null; // On crée un timer car si on tape trop vite dans le champ de recherche le listing ne correspond pas au nom recherché\r\n $scope.$watch(\"selectedIdClient\", function (newValue, oldValue) {\r\n if (newValue && oldValue != newValue) {\r\n if (newValue.length >= 3 || newValue.length < oldValue.length) {\r\n if (refreshUsers === null)\r\n refreshUsers = setTimeout(function () { $scope.Filter(); }, 800);\r\n else {\r\n clearTimeout(refreshUsers);\r\n refreshUsers = setTimeout(function () { $scope.Filter(); }, 800);\r\n }\r\n }\r\n }\r\n });\r\n\r\n var refreshContractors = null; // On crée un timer car si on tape trop vite dans le champ de recherche le listing ne correspond pas au nom recherché\r\n $scope.$watch(\"selectedIdContractor\", function (newValue, oldValue) {\r\n if (newValue && oldValue != newValue) {\r\n if (newValue.length >= 3 || newValue.length < oldValue.length) {\r\n if (refreshContractors === null)\r\n refreshContractors = setTimeout(function () { $scope.Filter(); }, 800);\r\n else {\r\n clearTimeout(refreshContractors);\r\n refreshContractors = setTimeout(function () { $scope.Filter(); }, 800);\r\n }\r\n }\r\n }\r\n });\r\n\r\n $scope.$watch(\"selectedIdContractBase\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.Filter();\r\n });\r\n\r\n $scope.$watch(\"dateSelected\", function (newValue) {\r\n if (newValue === \"\")\r\n $scope.dateFilter = \"\";\r\n else if (newValue) {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format yyyy/mm/dd pour l'envoyer à l'API.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.dateFilter = converDate.format('YYYY/MM/DD');\r\n }\r\n });\r\n\r\n $scope.$watch(\"dateFilter\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.Filter();\r\n });\r\n };\r\n\r\n var GetValidatedContractsWithFilter = function (idStateCover) {\r\n $scope.dataValidated[idStateCover].loading = true;\r\n $scope.globalLoading = true;\r\n\r\n if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n if (!$scope.selectedIdContractBase) $scope.selectedIdContractBase = \"\";\r\n contractsService.GetValidatedContractsPaginate(idStateCover, $scope.idCropSelected, $scope.idProductSelected, $scope.idTypeOrderContractSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, $scope.selectedIdContractBase, $scope.max, $scope.validatedPageNo[idStateCover], $scope.dataValidated[idStateCover].sortKey, $scope.dataValidated[idStateCover].reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.total[idStateCover] = data.Total;\r\n\r\n if (idStateCover === enumFactory.IdStateCover.NotCovered)\r\n $scope.contractsNoCover = data.ListVm;\r\n else if (idStateCover === enumFactory.IdStateCover.PendingCover)\r\n $scope.contractsPendingCover = data.ListVm;\r\n else if (idStateCover === enumFactory.IdStateCover.Covered)\r\n $scope.contractsCover = data.ListVm;\r\n\r\n data.ListVm.forEach(function (contract) {\r\n $scope.allContractsInView.push(contract);\r\n });\r\n\r\n }\r\n $scope.dataValidated[idStateCover].loading = false;\r\n var dataValidated = $scope.dataValidated.filter(function (element) { return element.loading === true; });\r\n $scope.globalLoading = dataValidated.length > 0;\r\n });\r\n };\r\n\r\n var GetPendingContractsWithFilter = function (idStateCover) {\r\n $scope.dataPending[idStateCover].loading = true;\r\n $scope.globalLoading = true;\r\n if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n contractsService.GetPendingContractsPaginate(idStateCover, $scope.idCropSelected, $scope.idProductSelected, $scope.idTypeOrderContractSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, $scope.max, $scope.pendingPageNo[idStateCover], $scope.dataPending[idStateCover].sortKey, $scope.dataPending[idStateCover].reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.total[idStateCover] = data.Total;\r\n\r\n if (idStateCover === enumFactory.IdStateCover.NotCovered)\r\n $scope.contractsNoCover = data.ListVm;\r\n else if (idStateCover === enumFactory.IdStateCover.PendingCover)\r\n $scope.contractsPendingCover = data.ListVm;\r\n else if (idStateCover === enumFactory.IdStateCover.Covered)\r\n $scope.contractsCover = data.ListVm;\r\n\r\n data.ListVm.forEach(function (contract) {\r\n $scope.allContractsInView.push(contract);\r\n });\r\n\r\n }\r\n $scope.dataPending[idStateCover].loading = false;\r\n var dataPending = $scope.dataPending.filter(function (element) { return element.loading === true; });\r\n $scope.globalLoading = dataPending.length > 0;\r\n });\r\n };\r\n\r\n var GetToValidatedContractsWithFilter = function () {\r\n $scope.dataToValidated.loading = true;\r\n $scope.globalLoading = true;\r\n if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n if (!$scope.selectedIdContractor) $scope.selectedIdContractor = \"\";\r\n contractsService.GetToValidatedContractsPaginate($scope.idCropSelected, $scope.idProductSelected, $scope.idTypeOrderContractSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, $scope.selectedIdContractor, $scope.max, $scope.toValidatedPageNo, $scope.dataToValidated.sortKey, $scope.dataToValidated.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalToValidated = data.Total;\r\n $scope.contractsToValidated = data.ListVm;\r\n $scope.allContractsInView = data.ListVm;\r\n\r\n }\r\n $scope.dataToValidated.loading = false;\r\n $scope.globalLoading = false;\r\n });\r\n };\r\n\r\n var GetCanceledContractsWithFilter = function () {\r\n $scope.dataCanceled.loading = true;\r\n $scope.globalLoading = true;\r\n if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n contractsService.GetCanceledContractsPaginate($scope.idCropSelected, $scope.idProductSelected, $scope.idTypeOrderContractSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, $scope.max, $scope.canceledPageNo, $scope.dataCanceled.sortKey, $scope.dataCanceled.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalCanceled = data.Total;\r\n $scope.contractsCanceled = data.ListVm;\r\n $scope.allContractsInView = data.ListVm;\r\n\r\n }\r\n $scope.dataCanceled.loading = false;\r\n $scope.globalLoading = false;\r\n });\r\n };\r\n\r\n var GetPricedContractsWithFilter = function (idStateCover) {\r\n $scope.dataPriced[idStateCover].loading = true;\r\n $scope.globalLoading = true;\r\n if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n contractsService.GetPricedContractsPaginate(idStateCover, $scope.idCropSelected, $scope.idProductSelected, $scope.idTypeOrderContractSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, $scope.idTypeFixationSelected, $scope.max, $scope.pricedPageNo[idStateCover], $scope.dataPriced[idStateCover].sortKey, $scope.dataPriced[idStateCover].reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalPriced[idStateCover] = data.Total;\r\n\r\n if (idStateCover === enumFactory.IdStateCover.NotCovered)\r\n $scope.contractsNoCover = data.ListVm;\r\n else if (idStateCover === enumFactory.IdStateCover.PendingCover)\r\n $scope.contractsPendingCover = data.ListVm;\r\n\r\n data.ListVm.forEach(function (contract) {\r\n $scope.allContractsInView.push(contract);\r\n });\r\n }\r\n $scope.dataPriced[idStateCover].loading = false;\r\n var dataPriced = $scope.dataPriced.filter(function (element) { return element.loading === true; });\r\n $scope.globalLoading = dataPriced.length > 0;\r\n });\r\n };\r\n\r\n var GetDelayedSigningContractsWithFilter = function () {\r\n $scope.dataDelayedSigning.loading = true;\r\n $scope.globalLoading = true;\r\n if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n contractsService.GetDelayedSigningContractsPaginate($scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdClient, $scope.max, $scope.delayedSigningPageNo, $scope.dataDelayedSigning.sortKey, $scope.dataDelayedSigning.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalDelayedSigning = data.Total;\r\n $scope.contractsDelayedSigning = data.ListVm;\r\n $scope.allContractsInView = data.ListVm;\r\n }\r\n $scope.dataDelayedSigning.loading = false;\r\n $scope.globalLoading = false;\r\n });\r\n };\r\n\r\n var GetCrops = function () {\r\n cropsService.GetCropsVisible(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.crops = data;\r\n var defaultCropInCrops = $filter('filter')($scope.crops, { IdCrop: $scope.idCropSelected })[0] !== undefined;\r\n if (!defaultCropInCrops && $scope.crops.length > 0)\r\n $scope.idCropSelected = $scope.crops[0].IdCrop;\r\n $scope.GetFiltersWithContracts();\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.GetFiltersWithContracts = function () {\r\n $scope.idProductSelected = \"\";\r\n $scope.idTypeOrderContractSelected = \"\";\r\n $scope.idCompagnySelected = \"\";\r\n $scope.selectedIdContract = \"\";\r\n $scope.dateSelected = \"\";\r\n $scope.selectedIdClient = \"\";\r\n contractsService.GetFiltersWithContractsByCropAndTabContract($scope.idCropSelected, idTabContracts, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.lstProducts = data.LstProductFilterVm;\r\n $scope.lstTypeOrders = data.LstTypeOrderFilterVm;\r\n $scope.lstCompagnies = data.LstCompagnies;\r\n $scope.lstTypeFixations = data.LstTypeFixationFilterVm;\r\n\r\n $scope.lstCompagnies.unshift({ IdCompagny: \"\", Label: \"Toutes\" });\r\n\r\n if ($scope.lstProducts.length === 1)\r\n $scope.idProductSelected = $scope.lstProducts[0].IdProduct;\r\n else if ($scope.lstProducts.length > 1 && $filter('filter')($scope.lstProducts, { IdProduct: \"\", ProductLabel: \"Tous\" }).length === 0)\r\n $scope.lstProducts.unshift({ IdProduct: \"\", ProductLabel: \"Tous\" });\r\n\r\n if ($scope.lstTypeOrders.length === 1)\r\n $scope.idTypeOrderContractSelected = $scope.lstTypeOrders[0].IdTypeOrder;\r\n else if ($scope.lstTypeOrders.length > 1 && $filter('filter')($scope.lstTypeOrders, { IdTypeOrder: \"\", TypeOrderLabel: \"Tous\" }).length === 0)\r\n $scope.lstTypeOrders.unshift({ IdTypeOrder: \"\", TypeOrderLabel: \"Tous\" });\r\n\r\n if ($scope.lstTypeFixations.length === 1)\r\n $scope.idTypeFixationSelected = $scope.lstTypeFixations[0].Id;\r\n else if ($scope.lstTypeFixations.length > 1 && $filter('filter')($scope.lstTypeFixations, { Id: \"\", Label: \"Tous\" }).length === 0)\r\n $scope.lstTypeFixations.unshift({ Id: \"\", Label: \"Tous\" });\r\n\r\n $scope.Filter();\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.SelectAll = function () {\r\n $scope.allSelected = !$scope.allSelected;\r\n if ($scope.allSelected) {\r\n if ($scope.viewMode === \"validated\" || $scope.viewMode === \"pending\" || $scope.viewMode === \"priced\") {\r\n contractsService.GetIdContractsToSelect(idTabContracts, enumFactory.IdStateCover.NotCovered, $scope.idCropSelected, $scope.idProductSelected, $scope.idTypeOrderContractSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, null, function (data2, status2) {\r\n if (status2 !== null) {\r\n if (status2 === 400)\r\n $scope.errorMessage = data2[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = data2;\r\n } else\r\n $scope.listIdContractsToCover = data2;\r\n });\r\n }\r\n } else\r\n $scope.listIdContractsToCover = [];\r\n };\r\n\r\n $scope.SelectContract = function (idContract) {\r\n var index = $scope.listIdContractsToCover.indexOf(idContract);\r\n if (index >= 0)\r\n $scope.listIdContractsToCover.splice(index, 1);\r\n else\r\n $scope.listIdContractsToCover.push(idContract);\r\n };\r\n\r\n $scope.CheckContractSelected = function (showPopConfirm) {\r\n if ($scope.listIdContractsToCover.length > 0) {\r\n $scope.errorMessagePopUpContractsNoCover = \"\";\r\n $scope.errorMessageContractsNoCover = \"\";\r\n $scope.FixContract.Iscover = true;\r\n showPopConfirm();\r\n }\r\n else {\r\n $scope.successMessageContractsNoCover = \"\";\r\n $scope.errorMessageContractsNoCover = \"Veuillez sélectionner au moins un contrat \";\r\n }\r\n };\r\n \r\n $scope.CheckPopUpFixedContractSelected = function () {\r\n \t\t$scope.errorMessagePopUpContractsNoCover = \"\";\r\n if ($scope.IsActionFixed && !$scope.FixContract.prixTargetPricedContractFixed)\r\n $scope.errorMessagePopUpContractsNoCover = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractFirmMonitoring_PopUpFixedContractsSelected_Error_NoTargetPrice.Content;\r\n \r\n \t\tif ($scope.errorMessagePopUpContractsNoCover !== \"\") {\r\n \t\t\t$scope.errorMessagePopUpContractsNoCover = $sce.trustAsHtml($scope.errorMessagePopUpContractsNoCover);\r\n \t\t\treturn false;\r\n \t\t}\r\n\r\n \t\treturn true;\r\n \t};\r\n\r\n $scope.CoverContractsSelected = function () {\r\n if ($scope.listIdContractsToCover.length > 0) {\r\n var isValidatePriceObjectifView = $scope.IsActionFixed ? true : false;\r\n contractsService.CoverContrats($scope.listIdContractsToCover, isValidatePriceObjectifView, $scope.FixContract.Iscover, $scope.FixContract.prixTargetPricedContractFixed, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageContractsNoCover = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.Filter();\r\n $scope.successMessageContractsNoCover = \"Mise à jour effectuée\";\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.GetData = function (pageNo, idStateCover) {\r\n if ($scope.viewMode === \"validated\") {\r\n $scope.validatedPageNo[idStateCover] = pageNo;\r\n GetValidatedContractsWithFilter(idStateCover);\r\n }\r\n else if ($scope.viewMode === \"priced\") {\r\n $scope.pricedPageNo[idStateCover] = pageNo;\r\n GetPricedContractsWithFilter(idStateCover);\r\n }\r\n else if ($scope.viewMode === \"canceled\") {\r\n $scope.canceledPageNo = pageNo;\r\n GetCanceledContractsWithFilter();\r\n }\r\n else if ($scope.viewMode === \"pending\") {\r\n $scope.pendingPageNo[idStateCover] = pageNo;\r\n GetPendingContractsWithFilter();\r\n }\r\n else if ($scope.viewMode === \"toValidated\") {\r\n $scope.toValidatedPageNo = pageNo;\r\n GetToValidatedContractsWithFilter();\r\n }\r\n else if ($scope.viewMode === \"delayedSigning\") {\r\n $scope.delayedSigningPageNo = pageNo;\r\n GetDelayedSigningContractsWithFilter();\r\n }\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse, idStateCover) {\r\n if ($scope.viewMode === \"validated\") {\r\n $scope.dataValidated[idStateCover].sortKey = sortKey;\r\n $scope.dataValidated[idStateCover].reverse = reverse;\r\n GetValidatedContractsWithFilter(idStateCover);\r\n }\r\n else if ($scope.viewMode === \"priced\") {\r\n $scope.dataPriced[idStateCover].sortKey = sortKey;\r\n $scope.dataPriced[idStateCover].reverse = reverse;\r\n GetPricedContractsWithFilter(idStateCover);\r\n }\r\n else if ($scope.viewMode === \"canceled\") {\r\n $scope.dataCanceled.sortKey = sortKey;\r\n $scope.dataCanceled.reverse = reverse;\r\n GetCanceledContractsWithFilter();\r\n }\r\n else if ($scope.viewMode === \"pending\") {\r\n $scope.dataPending[idStateCover].sortKey = sortKey;\r\n $scope.dataPending[idStateCover].reverse = reverse;\r\n GetPendingContractsWithFilter(idStateCover);\r\n }\r\n else if ($scope.viewMode === \"toValidated\") {\r\n $scope.dataToValidated.sortKey = sortKey;\r\n $scope.dataToValidated.reverse = reverse;\r\n GetToValidatedContractsWithFilter();\r\n }\r\n else if ($scope.viewMode === \"delayedSigning\") {\r\n $scope.dataDelayedSigning.sortKey = sortKey;\r\n $scope.dataDelayedSigning.reverse = reverse;\r\n GetDelayedSigningContractsWithFilter();\r\n }\r\n };\r\n\r\n $scope.Filter = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.errorMessageContractsNoCover = \"\";\r\n $scope.successMessageContractsNoCover = \"\";\r\n $scope.allContractsInView = [];\r\n $scope.listIdContractsToCover = [];\r\n $scope.FixContract.Iscover = false;\r\n $scope.IsActionFixed = false;\r\n\r\n if ($scope.viewMode === \"validated\") {\r\n GetValidatedContractsWithFilter(enumFactory.IdStateCover.NotCovered); // Récupération des contrats validés non couverts\r\n GetValidatedContractsWithFilter(enumFactory.IdStateCover.Covered); // Récupération des contrats validés couverts\r\n\r\n if ($scope.automaticCover == '1' && $scope.automaticCoverModule)\r\n GetValidatedContractsWithFilter(enumFactory.IdStateCover.PendingCover); // Récupération des contrats validés en cours de couverture\r\n }\r\n else if ($scope.viewMode === \"pending\") {\r\n GetPendingContractsWithFilter(enumFactory.IdStateCover.NotCovered); // Récupération des contrats en attente non couverts\r\n GetPendingContractsWithFilter(enumFactory.IdStateCover.Covered); // Récupération des contrats en attente couverts\r\n\r\n if ($scope.automaticCover == '1' && $scope.automaticCoverModule)\r\n GetPendingContractsWithFilter(enumFactory.IdStateCover.PendingCover); // Récupération des contrats en attente en cours de couverture\r\n }\r\n else if ($scope.viewMode === \"toValidated\")\r\n GetToValidatedContractsWithFilter(); // Récupération des contrats à valider\r\n else if ($scope.viewMode === \"priced\") {\r\n GetPricedContractsWithFilter(enumFactory.IdStateCover.NotCovered); // Récupération des contrats prix objectif non couverts\r\n\r\n if (($scope.automaticCover == '1' && $scope.automaticCoverModule) || (!$scope.automaticCoverModule && !$scope.automaticTargetPriceModule ))\r\n GetPricedContractsWithFilter(enumFactory.IdStateCover.PendingCover); // Récupération des contrats prix objectif en cours de couverture\r\n }\r\n else if ($scope.viewMode === \"canceled\")\r\n GetCanceledContractsWithFilter(); // Récupération des contrats annulés\r\n else if ($scope.viewMode === \"delayedSigning\")\r\n GetDelayedSigningContractsWithFilter(); // Récupération des contrats En attente de signature\r\n };\r\n\r\n $scope.GetDetail = function (idContract, openPopUp, modalTitle) {\r\n $scope.errorMessage = \"\";\r\n $scope.detailedContract = [];\r\n $scope.detailedIdContract = idContract;\r\n athenaOrdersService.GetAthenaOrdersVmByIdContract(idContract, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageContractsNoCover = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n data.forEach(function (item) {\r\n if (item.Date !== null)\r\n item.Date = $filter('date')(item.Date, \"dd/MM/yyyy HH:mm\");\r\n });\r\n $scope.lstAthenaOrdersVm = data;\r\n $scope.modalTitle = modalTitle;\r\n openPopUp();\r\n }\r\n });\r\n };\r\n\r\n //Pop-up de la fonction\r\n $scope.ShowPopUpDeleted = function (idContract, openPopUpDeleted) {\r\n $scope.idContractSelected = idContract;\r\n openPopUpDeleted();\r\n };\r\n\r\n //Suppression d'un contrat\r\n $scope.SetIsLogicallyDeleted = function () {\r\n contractsService.SetIsLogicallyDeleted($scope.idContractSelected, function (data, status) {\r\n //Erreur\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n else\r\n $location.path(\"/\");\r\n }\r\n //Si tout fonctionne\r\n else {\r\n GetCrops();\r\n }\r\n });\r\n };\r\n\r\n //Gestion pop-up contrat vierge à valider\r\n\r\n //Pop-Up Valider\r\n $scope.ShowPopUpValidatedContract = function (idContract, openPopUpValidatedContract) {\r\n $scope.MessageValidatedContract = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractsFirm_ToValidated_PopupValidatedContract_Text.Content + idContract + \" ?\";\r\n $scope.idContractSelected = idContract;\r\n openPopUpValidatedContract();\r\n };\r\n\r\n $scope.ConfirmValidatedContract = function () {\r\n $scope.dataToValidated.loading = true;\r\n contractsService.ValidatedContract($scope.idContractSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.Filter();\r\n }\r\n });\r\n };\r\n\r\n //Pop-Up Refuser\r\n $scope.ShowPopUpRefusedContract = function (idContract, openPopUpRefusedContract) {\r\n $scope.MessageRefusedContract = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractsFirm_ToValidated_PopupRefusedContract_Text.Content + idContract + \" ?\";\r\n $scope.idContractSelected = idContract;\r\n openPopUpRefusedContract();\r\n };\r\n\r\n $scope.ConfirmRefusedContract = function () {\r\n $scope.dataToValidated.loading = true;\r\n contractsService.RefusedContract($scope.idContractSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.Filter();\r\n }\r\n });\r\n };\r\n\r\n var CalculPriceCondPartsOnChange = function(contract) {\r\n $scope.contractSelected.LstTreeUserGroupConditionSelectedVms = [];\r\n conditionsService.CheckAndSetGroupConditions($scope.conditionParticulars, $scope.contractSelected.LstTreeUserGroupConditionSelectedVms);\r\n\r\n var totalActuel = 0;\r\n\r\n $scope.contractSelected.LstTreeUserGroupConditionSelectedVms.forEach(function (element) {\r\n totalActuel += element.Value;\r\n });\r\n\r\n $scope.totalCondPartDiff = $scope.contractSelected.TotalConditions - totalActuel;\r\n\r\n $scope.contractSelected.NewPrice = Number(contract.IdTypeOrder === enumFactory.TypeOrders.Prixobjectif.IdTypeOrder ? contract.TargetPrice : contract.Price - $scope.totalCondPartDiff).toFixed(2);\r\n };\r\n\r\n //Pop-Up Modifier\r\n $scope.ShowPopUpEditedContract = function (contract, openPopUpEditedContract) {\r\n $scope.editShowValueAutoComplete = true;\r\n $scope.contractFirm = contract.IdTypeContract == enumFactory.TypeContract.Ferme;\r\n $scope.contractSelected = contract;\r\n $scope.contractSelected.NewPrice = contract.IdTypeOrder === enumFactory.TypeOrders.Prixobjectif.IdTypeOrder ? contract.TargetPrice : contract.Price;\r\n \r\n $scope.contractSelected.NewQuantity = contract.Quantity;\r\n\r\n conditionsService.GetContractCondParts(contract.IdContract, function (contractCondParts) {\r\n conditionsService.GetCondParts(contract.IdOffer, contract.IdTree, contract.IdContractCommitment, false, contractCondParts, contract.IdExpiry, contract.IdVariety, function (res) {\r\n $scope.errorMessage = res.errorMessage;\r\n $scope.conditionParticulars = res.conditionParticulars;\r\n });\r\n });\r\n\r\n $scope.ConditionParticularsOnChange = function (condition) {\r\n $scope.editShowValueAutoComplete = false;\r\n conditionsService.ConditionParticularsOnChange(contract.IdOffer, condition, null, contract.IdExpiry, contract.IdVariety);\r\n CalculPriceCondPartsOnChange(contract);\r\n };\r\n \r\n $scope.AutocompletConditionParticularsOnChange = function (selectedValue, condition) {\r\n condition.selectedValue = selectedValue.originalObject.IdTreeCondition;\r\n $scope.conditionSelected = condition;\r\n conditionsService.ConditionParticularsOnChange(contract.IdOffer, condition, null, contract.IdExpiry, contract.IdVariety);\r\n CalculPriceCondPartsOnChange(contract);\r\n };\r\n \r\n $scope.AutocompleteCondPartSearch = function (str, LstOptions) {\r\n var matches = [];\r\n LstOptions.forEach(function (option) {\r\n if ((option.Label.toLowerCase().indexOf(str.toString().toLowerCase()) >= 0)) {\r\n matches.push(option);\r\n }\r\n });\r\n return matches;\r\n };\r\n \r\n $scope.inputChanged = function (str) {\r\n if ($scope.conditionSelected) {\r\n $scope.conditionSelected.LstConditionParticularsChilds = [];\r\n }\r\n };\r\n\r\n openPopUpEditedContract();\r\n };\r\n\r\n $scope.ChkEditedContract = function () {\r\n $scope.editedContractErrorMessage = \"\";\r\n $scope.contractSelected.LstTreeUserGroupConditionSelectedVms = [];\r\n $scope.errorMessage = conditionsService.CheckAndSetGroupConditions($scope.conditionParticulars, $scope.contractSelected.LstTreeUserGroupConditionSelectedVms);\r\n\r\n if ($scope.errorMessage)\r\n $scope.editedContractErrorMessage = $scope.errorMessage;\r\n\r\n if (!$scope.contractSelected.NewPrice || $scope.contractSelected.NewPrice < 0) {\r\n $scope.editedContractErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_ContractsFirm_ToValidated_PopupEditedContract_MessageError_Price.Content;\r\n }\r\n else if (!$scope.contractSelected.NewQuantity || $scope.contractSelected.NewQuantity < 0) {\r\n $scope.editedContractErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_ContractsFirm_ToValidated_PopupEditedContract_MessageError_Tonnage.Content;\r\n }\r\n\r\n if (!$scope.editedContractErrorMessage) {\r\n $scope.contractSelected.NewPrice = $scope.contractSelected.NewPrice.toString().replace(\",\", \".\");\r\n $scope.contractSelected.NewQuantity = $scope.contractSelected.NewQuantity.toString().replace(\",\", \".\");\r\n return true;\r\n }\r\n else {\r\n return false;\r\n }\r\n };\r\n\r\n $scope.ConfirmEditedContract = function () {\r\n $scope.dataToValidated.loading = true;\r\n contractsService.EditedContract($scope.contractSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.Filter();\r\n }\r\n });\r\n };\r\n\r\n //Fin Gestion pop-up contrat vierge à valider\r\n\r\n $scope.ValidateFixedContractSelected = function (showPopupFixedContract, item) {\r\n $scope.listIdContractsToCover = [];\r\n $scope.PopupFixedContractsSelectedTitle = \"Fixer le contrat n° \" + item.IdContract;\r\n $scope.FixContract.prixTargetPricedContractFixed = angular.copy(item.TargetPrice);\r\n $scope.listIdContractsToCover.push(angular.copy(item.IdContract));\r\n $scope.IsActionFixed = true;\r\n showPopupFixedContract();\r\n };\r\n\r\n $scope.CancelContractPopUp = function (contractSelected, index, showPopUpContract) {\r\n $scope.PopUpMessageDeleteContract = \"\";\r\n $scope.MessageDeleteContractFirmTargetPrice = $rootScope.editableObjectsFactory.EditableObjects.MessageDeleteContractFirmTargetPrice.Content;\r\n $scope.PopupCanceledContractsSelectedTitle = \"Annulation du contrat n° \" + contractSelected.IdContract;\r\n if (contractSelected !== undefined)\r\n $scope.PopUpMessageDeleteContract = $scope.MessageDeleteContractFirmTargetPrice;\r\n\r\n showPopUpContract(contractSelected);\r\n };\r\n\r\n $scope.HistoContractPopUp = function (currentContract, openPopUpHisto) {\r\n contractsService.GetHistoContract(currentContract.IdInit, currentContract.IdCrop, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n else\r\n $location.path(\"/\");\r\n } else {\r\n $scope.lstHistoContract = data;\r\n $scope.ModalTitle = \"Historique du contrat\";\r\n openPopUpHisto();\r\n }\r\n });\r\n };\r\n\r\n $scope.CancelContract = function (element) {\r\n contractsService.UpdateContract(element, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n else\r\n $location.path(\"/\");\r\n } else {\r\n $scope.successMessage = \"Le contrat a bien été annulé.\";\r\n GetCrops();\r\n }\r\n });\r\n };\r\n\r\n $scope.PopUpContractPendingCover = function (idContract, openPopUpContractPendingCover) {\r\n $scope.idContractPendingCoverSelected = idContract;\r\n $scope.coverContractPopUpTitle = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractFirmMonitoring_CoverContract_PopUp_Title.Content;\r\n $scope.coverContractPopUpText = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractFirmMonitoring_CoverContract_PopUp_Text.Content.replace(\"{{idContract}}\", idContract);\r\n openPopUpContractPendingCover();\r\n };\r\n\r\n $scope.UpdateContractPendingCover = function () {\r\n contractsService.UpdateContractPendingCover($scope.idContractPendingCoverSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n else\r\n $location.path(\"/\");\r\n }\r\n else {\r\n GetCrops();\r\n }\r\n });\r\n };\r\n\r\n $scope.ResetListeContractFixed = function () {\r\n Init();\r\n GetCrops();\r\n };\r\n\r\n $scope.ExportValidatedContracts = function () {\r\n var downloadPath = configurationFactory.Url['Api'] + 'Contracts/GetValidatedContractsXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&idTypeOrder=' + $scope.idTypeOrderContractSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n '&idContractBaseStr=' + $scope.selectedIdContractBase +\r\n '&idLanguage=' + $rootScope.language.IdLanguage;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n $scope.ExportPricedContracts = function () {\r\n var downloadPath = configurationFactory.Url['Api'] + 'Contracts/GetPricedContractsXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&idTypeOrder=' + $scope.idTypeOrderContractSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n '&idLanguage=' + $rootScope.language.IdLanguage +\r\n '&idTypeFixation=' + $scope.idTypeFixationSelected;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n $scope.ExportCanceledContracts = function () {\r\n var downloadPath = configurationFactory.Url['Api'] + 'Contracts/GetCanceledContractsXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&idTypeOrder=' + $scope.idTypeOrderContractSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n '&idLanguage=' + $rootScope.language.IdLanguage;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n $scope.ExportPendingContracts = function () {\r\n var downloadPath = configurationFactory.Url['Api'] + 'Contracts/GetPendingContractsXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&idTypeOrder=' + $scope.idTypeOrderContractSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n '&idLanguage=' + $rootScope.language.IdLanguage;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n $scope.ExportToValidatedContracts = function () {\r\n var downloadPath = configurationFactory.Url['Api'] + 'Contracts/GetToValidatedContractsXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&idTypeOrder=' + $scope.idTypeOrderContractSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n '&nameContractor=' + $scope.selectedIdContractor +\r\n '&idLanguage=' + $rootScope.language.IdLanguage;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n $scope.ResetListeContractFixed();\r\n };\r\n\r\n Init();\r\n GetCrops();\r\n }]);","AgrimarketControllers.controller('contractsCommitmentMonitoringController', ['$scope', '$rootScope', '$routeParams', '$http', '$filter', '$location', \"currentUserFactory\", 'configurationFactory',\r\n 'contractsService', 'cropsService', 'athenaOrdersService', '$log', '$timeout', '$sce', 'parametersFactory', 'enumFactory', 'userTableService', 'colonnesContractsCommitmentValidated',\r\n function ($scope, $rootScope, $routeParams, $http, $filter, $location, currentUserFactory, configurationFactory, contractsService, cropsService, athenaOrdersService, $log, $timeout, $sce,\r\n parametersFactory, enumFactory, userTableService, colonnesContractsCommitmentValidated) {\r\n\r\n var getCropsWithContractsCommitment = function () {\r\n cropsService.GetCropsWithContracts(enumFactory.TypeContract.Engagement, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.crops = data;\r\n var defaultCropInCrops = $filter('filter')($scope.crops, { IdCrop: $scope.idCropSelected })[0] !== undefined;\r\n if (!defaultCropInCrops && $scope.crops.length > 0)\r\n $scope.idCropSelected = $scope.crops[0].IdCrop;\r\n $scope.GetFiltersWithContractsCommitment();\r\n }\r\n }\r\n });\r\n };\r\n\r\n \tvar init = function () {\r\n \t\t// Contracts engagement valider\r\n \t $scope.tableContractsCommitmentValidatedDataVisible = colonnesContractsCommitmentValidated.data.DataVisible.split(',');\r\n \t $scope.tableContractsCommitmentValidatedLibelle = colonnesContractsCommitmentValidated.data.ColumnName.split(',');\r\n\r\n \t\t// Gestion du trie de l'onglet Valider\r\n \t\t$scope.dataValidated= { reverse: true, sortKey: \"IdContract\" };\r\n\r\n \t\t// Pagination onglet Valider\r\n \t\t$scope.validatedPageNo = 1;\r\n\r\n \t\t$scope.errorMessage = \"\";\r\n \t\t$scope.successMessage = \"\";\r\n \t\t$scope.max = 10;\r\n \t\t$scope.idCropSelected = Number(parametersFactory.Parameters.DefaultCrop.Value);\r\n \t\t$scope.idProductSelected = \"\";\r\n \t\t$scope.idTypeCommitmentContractSelected = \"\";\r\n \t\t$scope.idCompagnySelected = \"\";\r\n \t\t$scope.dateFilter = \"\";\r\n \t\t$scope.dateSelected = \"\";\r\n \t\t$scope.selectedClient = {};\r\n \t\t$scope.showDetailsValidated = true;\r\n \t $scope.viewMode = $routeParams.typeContract;\r\n \t\t$scope.lstProducts = [];\r\n \t\t$scope.lstTypeCommitments = [];\r\n \t\t$scope.listIdContractsToCover = [];\r\n $scope.allContractsInView = [];\r\n $scope.titleFixContractCommitmentPopUp = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractCommitment_PopupFix_Title.Content;\r\n\r\n \t\t//Permet de gerer les arrondis des prix pour les decimales > 2\r\n \t\t$scope.$watch(\"allContractsInView\", function (n, o) {\r\n \t\t\tif (n !== o) {\r\n \t\t\t\tvar regexfloat = /^[0-9]+.[0-9]{3,100}/;\r\n \t\t\t\tn.forEach(function (item) {\r\n \t\t\t\t\tif (regexfloat.test(item.Price))\r\n \t\t\t\t\t\titem.Price = Number(item.Price).toFixed(2);\r\n \t\t\t\t});\r\n \t\t\t}\r\n \t\t}, true);\r\n\r\n var refreshUsers = null; // On crée un timer car si on tape trop vite dans le champ de recherche le listing ne correspond pas au nom recherché\r\n $scope.$watch(\"selectedIdClient\", function (newValue, oldValue) {\r\n if (newValue && oldValue != newValue) {\r\n if (newValue.length >= 3 || newValue.length < oldValue.length) {\r\n if (refreshUsers === null)\r\n refreshUsers = setTimeout(function () { $scope.Filter(); }, 800);\r\n else {\r\n clearTimeout(refreshUsers);\r\n refreshUsers = setTimeout(function () { $scope.Filter(); }, 800);\r\n }\r\n }\r\n }\r\n });\r\n\r\n \t\t$scope.$watch(\"dateSelected\", function (newValue) {\r\n \t\t\tif (newValue === \"\")\r\n \t\t\t\t$scope.dateFilter = \"\";\r\n \t\t\telse if (newValue) {\r\n \t\t\t\t//permet de gérer l'internalisation de tout les formats des dates possibles.\r\n \t\t\t\t//Au final nous faisons en sorte de la retrouvé au format yyyy/mm/dd pour l'envoyer à l'API.\r\n \t\t\t\tvar pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n \t\t\t\tvar dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n \t\t\t\tvar currentDate = new Date(dt.toString());\r\n \t\t\t\tvar converDate = moment(currentDate);\r\n \t\t\t\t$scope.dateFilter = converDate.format('YYYY/MM/DD');\r\n \t\t\t}\r\n \t\t});\r\n\r\n \t\t$scope.$watch(\"dateFilter\", function (newValue, oldValue) {\r\n \t\t\tif ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n \t\t\t\t$scope.Filter();\r\n \t\t});\r\n\r\n \t\tgetCropsWithContractsCommitment();\r\n \t};\r\n\r\n var getContractsCommitmentValidated = function () {\r\n $scope.loading = true;\r\n \t $scope.errorMessage = \"\";\r\n \t $scope.successMessage = \"\";\r\n \t if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n \t if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n \t contractsService.GetContractsCommitmentValidatedPaginate($scope.idCropSelected, $scope.idProductSelected, $scope.idTypeCommitmentContractSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, $scope.max, $scope.validatedPageNo, $scope.dataValidated.sortKey, $scope.dataValidated.reverse, function (data, status) {\r\n \t if (status !== null) {\r\n \t if (status === 400)\r\n \t $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n \t } else {\r\n \t $scope.totalValidated = data.Total;\r\n $scope.contractsCommitmentValidated = data.ListVm;\r\n \t \r\n data.ListVm.forEach(function (contract) {\r\n \t $scope.allContractsInView.push(contract);\r\n });\r\n $scope.loading = false;\r\n \t }\r\n \t });\r\n \t};\r\n\r\n $scope.GetFiltersWithContractsCommitment = function () {\r\n $scope.loading = true;\r\n \t $scope.errorMessage = \"\";\r\n \t $scope.successMessage = \"\";\r\n\t\t $scope.idProductSelected = \"\";\r\n\t\t $scope.idTypeCommitmentContractSelected = \"\";\r\n\t\t $scope.idCompagnySelected = \"\";\r\n\t\t $scope.selectedIdContract = \"\";\r\n\t\t $scope.dateSelected = \"\";\r\n\t\t $scope.selectedIdClient = \"\";\r\n\t\t contractsService.GetFiltersWithContractsCommitmentByCrop($scope.idCropSelected, function (data, status) {\r\n \t\t\tif (status !== null) {\r\n \t\t\t\tif (status === 400)\r\n \t\t\t\t\t$scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n \t\t\t} else {\r\n \t\t\t\tif (data) {\r\n \t\t\t\t\t$scope.lstProducts = data.LstProductFilterVm;\r\n \t\t\t\t\t$scope.lstTypeCommitments = data.LstTypeCommitmentFilterVm;\r\n \t\t\t\t\t$scope.lstCompagnies = data.LstCompagnies;\r\n\r\n \t\t\t\t\t$scope.lstCompagnies.unshift({ IdCompagny: \"\", Label: \"Toutes\" });\r\n\r\n \t\t\t\t\tif ($scope.lstProducts.length === 1)\r\n \t\t\t\t\t\t$scope.idProductSelected = $scope.lstProducts[0].IdProduct;\r\n \t\t\t\t\telse if ($scope.lstProducts.length > 1 && $filter('filter')($scope.lstProducts, { IdProduct: \"\", ProductLabel: \"Tous\" }).length === 0)\r\n \t\t\t\t\t\t$scope.lstProducts.unshift({ IdProduct: \"\", ProductLabel: \"Tous\" });\r\n\r\n \t\t\t\t\tif ($scope.lstTypeCommitments.length === 1)\r\n \t\t\t\t\t\t$scope.idTypeOrderContractSelected = $scope.lstTypeCommitments[0].IdTypeOrder;\r\n \t\t\t\t\telse if ($scope.lstTypeCommitments.length > 1 && $filter('filter')($scope.lstTypeCommitments, { IdTypeCommitment: \"\", LabelTypeCommitment: \"Tous\" }).length === 0)\r\n \t\t\t\t\t $scope.lstTypeCommitments.unshift({ IdTypeCommitment: \"\", LabelTypeCommitment: \"Tous\" });\r\n\r\n \t\t\t\t\t$scope.Filter();\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t});\r\n \t};\r\n\r\n \t$scope.GetData = function (pageNo) {\r\n \t $scope.validatedPageNo = pageNo;\r\n \t getContractsCommitmentValidated();\r\n \t};\r\n\r\n \t$scope.Sort = function (sortKey, reverse) {\r\n \t $scope.dataValidated.sortKey = sortKey;\r\n \t $scope.dataValidated.reverse = reverse;\r\n\t getContractsCommitmentValidated();\r\n\t };\r\n\r\n \t$scope.Filter = function () {\r\n \t\t$scope.errorMessage = \"\";\r\n \t\t$scope.successMessage = \"\";\r\n \t\tgetContractsCommitmentValidated();\r\n \t};\r\n\r\n $scope.ExportValidatedContracts = function() {\r\n var downloadPath = configurationFactory.Url['Api'] + 'Contracts/GetContractsCommitmentValidatedXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&idTypeCommitment=' + $scope.idTypeCommitmentContractSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n\t\t\t\t'&idLanguage=' + $rootScope.language.IdLanguage;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n $scope.OpenFixContractCommitmentPopUp = function (idContract, openPopUp) {\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.fixContractCommimentErrorMessage = \"\";\r\n $scope.fixContractCommimentNoOfferMessage = \"\";\r\n $scope.loading = true;\r\n contractsService.GetInfosForFixContractCommitment(idContract, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.fixContractCommitmentVm = data;\r\n\r\n if (!data)\r\n $scope.fixContractCommimentNoOfferMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractCommitment_PopupFix_NoOfferMessage.Content;\r\n\r\n $scope.loading = false;\r\n openPopUp();\r\n }\r\n });\r\n };\r\n\r\n $scope.ChkFixContractCommitmentIsValid = function () {\r\n if ($scope.fixContractCommitmentVm.QuantityToFix > $scope.fixContractCommitmentVm.QuantityLeftToFix) {\r\n $scope.fixContractCommimentErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractCommitment_PopupFix_QtyErrorMessage.Content;\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n $scope.FixContractCommitment = function () {\r\n contractsService.FixNewContractFromContractCommitment($scope.fixContractCommitmentVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n $scope.loading = false;\r\n }\r\n } else {\r\n $scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractCommitment_FixContractCommitment_SuccessMessage.Content;\r\n getContractsCommitmentValidated();\r\n }\r\n });\r\n };\r\n\r\n\t\t//Pop-up de la fonction\r\n\t\t$scope.ShowPopUpDeleted = function (idContract, openPopUpDeleted) {\r\n\t\t\t$scope.idContractSelected = idContract;\r\n\t\t\topenPopUpDeleted();\r\n\t\t};\r\n\t\r\n\t\t//Suppression d'un contrat\r\n\t\t$scope.SetIsLogicallyDeleted = function () {\r\n\t\t\tcontractsService.SetIsLogicallyDeleted($scope.idContractSelected, function (data, status) {\r\n\t\t\t\t//Erreur\r\n\t\t\t\tif (status !== null) {\r\n\t\t\t\t\tif (status === 400)\r\n\t\t\t\t\t\t$scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\t$location.path(\"/\");\r\n\t\t\t\t}\r\n\t\t\t\t//Si tout fonctionne\r\n\t\t\t\telse {\r\n\t\t\t\t\tgetCropsWithContractsCommitment();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n \t$rootScope.onRefresh = function () {\r\n init();\r\n \t};\r\n\r\n \tinit();\r\n }]);\r\n","AgrimarketControllers.controller('contractsSurfaceCommitmentMonitoringController', ['$scope', '$rootScope', '$routeParams', '$filter', '$location', 'configurationFactory',\r\n 'contractsService', 'cropsService', '$sce', 'parametersFactory', 'enumFactory', 'colonnesContractsSurfaceCommitmentValidated',\r\n function ($scope, $rootScope, $routeParams, $filter, $location, configurationFactory, contractsService, cropsService, $sce,\r\n parametersFactory, enumFactory, colonnesContractsSurfaceCommitmentValidated) {\r\n\r\n var getCropsWithContractsSurfaceCommitment = function () {\r\n cropsService.GetCropsWithContracts(enumFactory.TypeContract.EngagementSurface, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.crops = data;\r\n var defaultCropInCrops = $filter('filter')($scope.crops, { IdCrop: $scope.idCropSelected })[0] !== undefined;\r\n if (!defaultCropInCrops && $scope.crops.length > 0)\r\n $scope.idCropSelected = $scope.crops[0].IdCrop;\r\n $scope.GetFiltersWithContractsSurfaceCommitment();\r\n }\r\n }\r\n });\r\n };\r\n\r\n \tvar init = function () {\r\n \t\t// Contracts engagement surface valider\r\n \t $scope.tableContractsSurfaceCommitmentValidatedDataVisible = colonnesContractsSurfaceCommitmentValidated.data.DataVisible.split(',');\r\n \t $scope.tableContractsSurfaceCommitmentValidatedLibelle = colonnesContractsSurfaceCommitmentValidated.data.ColumnName.split(',');\r\n\r\n \t\t// Gestion du trie de l'onglet Valider\r\n \t\t$scope.dataValidated= { reverse: true, sortKey: \"IdContract\" };\r\n\r\n \t\t// Pagination onglet Valider\r\n \t\t$scope.validatedPageNo = 1;\r\n\r\n \t\t$scope.errorMessage = \"\";\r\n \t\t$scope.successMessage = \"\";\r\n \t\t$scope.max = 10;\r\n \t\t$scope.idCropSelected = Number(parametersFactory.Parameters.DefaultCrop.Value);\r\n \t\t$scope.idProductSelected = \"\";\r\n \t\t$scope.idCompagnySelected = \"\";\r\n \t\t$scope.dateFilter = \"\";\r\n \t\t$scope.dateSelected = \"\";\r\n \t\t$scope.selectedClient = {};\r\n \t\t$scope.showDetailsValidated = true;\r\n \t $scope.viewMode = $routeParams.typeContract;\r\n \t\t$scope.lstProducts = [];\r\n \t\t$scope.listIdContractsToCover = [];\r\n $scope.allContractsInView = [];\r\n $scope.titleFixContractCommitmentPopUp = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractCommitment_PopupFix_Title.Content;\r\n\r\n \t\t//Permet de gerer les arrondis des prix pour les decimales > 2\r\n \t\t$scope.$watch(\"allContractsInView\", function (n, o) {\r\n \t\t\tif (n !== o) {\r\n \t\t\t\tvar regexfloat = /^[0-9]+.[0-9]{3,100}/;\r\n \t\t\t\tn.forEach(function (item) {\r\n \t\t\t\t\tif (regexfloat.test(item.Price))\r\n \t\t\t\t\t\titem.Price = Number(item.Price).toFixed(2);\r\n \t\t\t\t});\r\n \t\t\t}\r\n \t\t}, true);\r\n\r\n var refreshUsers = null; // On crée un timer car si on tape trop vite dans le champ de recherche le listing ne correspond pas au nom recherché\r\n $scope.$watch(\"selectedIdClient\", function (newValue, oldValue) {\r\n if (newValue && oldValue != newValue) {\r\n if (newValue.length >= 3 || newValue.length < oldValue.length) {\r\n if (refreshUsers === null)\r\n refreshUsers = setTimeout(function () { $scope.Filter(); }, 800);\r\n else {\r\n clearTimeout(refreshUsers);\r\n refreshUsers = setTimeout(function () { $scope.Filter(); }, 800);\r\n }\r\n }\r\n }\r\n });\r\n\r\n \t\t$scope.$watch(\"dateSelected\", function (newValue) {\r\n \t\t\tif (newValue === \"\")\r\n \t\t\t\t$scope.dateFilter = \"\";\r\n \t\t\telse if (newValue) {\r\n \t\t\t\t//permet de gérer l'internalisation de tout les formats des dates possibles.\r\n \t\t\t\t//Au final nous faisons en sorte de la retrouvé au format yyyy/mm/dd pour l'envoyer à l'API.\r\n \t\t\t\tvar pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n \t\t\t\tvar dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n \t\t\t\tvar currentDate = new Date(dt.toString());\r\n \t\t\t\tvar converDate = moment(currentDate);\r\n \t\t\t\t$scope.dateFilter = converDate.format('YYYY/MM/DD');\r\n \t\t\t}\r\n \t\t});\r\n\r\n \t\t$scope.$watch(\"dateFilter\", function (newValue, oldValue) {\r\n \t\t\tif ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n \t\t\t\t$scope.Filter();\r\n \t\t});\r\n\r\n \t\tgetCropsWithContractsSurfaceCommitment();\r\n \t};\r\n\r\n var getContractsSurfaceCommitmentValidated = function () {\r\n $scope.loading = true;\r\n \t $scope.errorMessage = \"\";\r\n \t $scope.successMessage = \"\";\r\n \t if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n \t if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n \t contractsService.GetContractsSurfaceCommitmentValidatedPaginate($scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, $scope.max, $scope.validatedPageNo, $scope.dataValidated.sortKey, $scope.dataValidated.reverse, function (data, status) {\r\n \t if (status !== null) {\r\n \t if (status === 400)\r\n \t $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n \t } else {\r\n \t $scope.totalValidated = data.Total;\r\n $scope.contractsSurfaceCommitmentValidated = data.ListVm;\r\n \t \r\n data.ListVm.forEach(function (contract) {\r\n \t $scope.allContractsInView.push(contract);\r\n });\r\n $scope.loading = false;\r\n \t }\r\n \t });\r\n \t};\r\n\r\n $scope.GetFiltersWithContractsSurfaceCommitment = function () {\r\n $scope.loading = true;\r\n \t $scope.errorMessage = \"\";\r\n \t $scope.successMessage = \"\";\r\n\t\t $scope.idProductSelected = \"\";\r\n\t\t $scope.idCompagnySelected = \"\";\r\n\t\t $scope.selectedIdContract = \"\";\r\n\t\t $scope.dateSelected = \"\";\r\n\t\t $scope.selectedIdClient = \"\";\r\n\t\t contractsService.GetFiltersWithContractsSurfaceCommitmentByCrop($scope.idCropSelected, function (data, status) {\r\n \t\t\tif (status !== null) {\r\n \t\t\t\tif (status === 400)\r\n \t\t\t\t\t$scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n \t\t\t} else {\r\n \t\t\t\tif (data) {\r\n \t\t\t\t\t$scope.lstProducts = data.LstProductFilterVm;\r\n \t\t\t\t\t$scope.lstCompagnies = data.LstCompagnies;\r\n\r\n \t\t\t\t\t$scope.lstCompagnies.unshift({ IdCompagny: \"\", Label: \"Toutes\" });\r\n\r\n \t\t\t\t\tif ($scope.lstProducts.length === 1)\r\n \t\t\t\t\t\t$scope.idProductSelected = $scope.lstProducts[0].IdProduct;\r\n \t\t\t\t\telse if ($scope.lstProducts.length > 1 && $filter('filter')($scope.lstProducts, { IdProduct: \"\", ProductLabel: \"Tous\" }).length === 0)\r\n \t\t\t\t\t\t$scope.lstProducts.unshift({ IdProduct: \"\", ProductLabel: \"Tous\" });\r\n\r\n \t\t\t\t\t$scope.Filter();\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t});\r\n \t};\r\n\r\n \t$scope.GetData = function (pageNo) {\r\n \t $scope.validatedPageNo = pageNo;\r\n \t getContractsSurfaceCommitmentValidated();\r\n \t};\r\n\r\n \t$scope.Sort = function (sortKey, reverse) {\r\n \t $scope.dataValidated.sortKey = sortKey;\r\n \t $scope.dataValidated.reverse = reverse;\r\n\t getContractsSurfaceCommitmentValidated();\r\n\t };\r\n\r\n \t$scope.Filter = function () {\r\n \t\t$scope.errorMessage = \"\";\r\n \t\t$scope.successMessage = \"\";\r\n \t\tgetContractsSurfaceCommitmentValidated();\r\n \t};\r\n\r\n $scope.ExportValidatedContracts = function() {\r\n var downloadPath = configurationFactory.Url['Api'] + 'Contracts/GetContractsSurfaceCommitmentValidatedXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n\t\t\t\t'&idLanguage=' + $rootScope.language.IdLanguage;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n $scope.OpenFixContractCommitmentPopUp = function (idContract, openPopUp) {\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.fixContractCommimentErrorMessage = \"\";\r\n $scope.fixContractCommimentNoOfferMessage = \"\";\r\n $scope.loading = true;\r\n contractsService.GetInfosForFixContractCommitment(idContract, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.fixContractCommitmentVm = data;\r\n\r\n if (!data)\r\n $scope.fixContractCommimentNoOfferMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractCommitment_PopupFix_NoOfferMessage.Content;\r\n\r\n $scope.loading = false;\r\n openPopUp();\r\n }\r\n });\r\n };\r\n\r\n $scope.ChkFixContractCommitmentIsValid = function () {\r\n if ($scope.fixContractCommitmentVm.QuantityToFix > $scope.fixContractCommitmentVm.QuantityLeftToFix) {\r\n $scope.fixContractCommimentErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractCommitment_PopupFix_QtyErrorMessage.Content;\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n $scope.FixContractCommitment = function () {\r\n contractsService.FixNewContractFromContractCommitment($scope.fixContractCommitmentVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n $scope.loading = false;\r\n }\r\n } else {\r\n $scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractCommitment_FixContractCommitment_SuccessMessage.Content;\r\n getContractsSurfaceCommitmentValidated();\r\n }\r\n });\r\n };\r\n\r\n\t\t//Pop-up de la fonction\r\n\t\t$scope.ShowPopUpDeleted = function (idContract, openPopUpDeleted) {\r\n\t\t\t$scope.idContractSelected = idContract;\r\n\t\t\topenPopUpDeleted();\r\n\t\t};\r\n\t\r\n\t\t//Suppression d'un contrat\r\n\t\t$scope.SetIsLogicallyDeleted = function () {\r\n\t\t\tcontractsService.SetIsLogicallyDeleted($scope.idContractSelected, function (data, status) {\r\n\t\t\t\t//Erreur\r\n\t\t\t\tif (status !== null) {\r\n\t\t\t\t\tif (status === 400)\r\n\t\t\t\t\t\t$scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\t$location.path(\"/\");\r\n\t\t\t\t}\r\n\t\t\t\t//Si tout fonctionne\r\n\t\t\t\telse {\r\n\t\t\t\t\tgetCropsWithContractsSurfaceCommitment();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n \t$rootScope.onRefresh = function () {\r\n init();\r\n \t};\r\n\r\n \tinit();\r\n }]);\r\n","AgrimarketControllers.controller('contractsBaseMonitoringController', ['$scope', '$rootScope', '$routeParams', '$http', '$filter', '$location', \"currentUserFactory\", 'configurationFactory',\r\n 'contractBaseService', 'cropsService', 'athenaOrdersService', '$log', '$timeout', '$sce', 'parametersFactory', 'enumFactory', 'userTableService', 'colonnesContractsBaseValidated', 'colonnesContractsBasePending', 'colonnesContractsBasePriced','colonnesContractsBaseCanceled',\r\n function ($scope, $rootScope, $routeParams, $http, $filter, $location, currentUserFactory, configurationFactory, contractBaseService, cropsService, athenaOrdersService, $log, $timeout, $sce,\r\n parametersFactory, enumFactory, userTableService, colonnesContractsBaseValidated, colonnesContractsBasePending, colonnesContractsBasePriced, colonnesContractsBaseCanceled) {\r\n\r\n\r\n var init = function () { \r\n\r\n // Contracts Base validé\r\n $scope.tableContractsBaseValidatedDataVisible = colonnesContractsBaseValidated.data.DataVisible.split(',');\r\n $scope.tableContractsBaseValidatedLibelle = colonnesContractsBaseValidated.data.ColumnName.split(',');\r\n\r\n $scope.tableContractsBasePendingDataVisible = colonnesContractsBasePending.data.DataVisible.split(',');\r\n $scope.tableContractsBasePendingLibelle = colonnesContractsBasePending.data.ColumnName.split(',');\r\n\r\n $scope.tableContractsBasePricedDataVisible = colonnesContractsBasePriced.data.DataVisible.split(',');\r\n $scope.tableContractsBasePricedLibelle = colonnesContractsBasePriced.data.ColumnName.split(',');\r\n\r\n $scope.tableContractsBaseCanceledDataVisible = colonnesContractsBaseCanceled.data.DataVisible.split(',');\r\n $scope.tableContractsBaseCanceledLibelle = colonnesContractsBaseCanceled.data.ColumnName.split(',');\r\n\r\n $scope.viewMode = $routeParams.typeContract;\r\n $scope.max = 10;\r\n\r\n $scope.validatedPageNo = 1; \r\n $scope.pendingPageNo = 1; \r\n $scope.pricedPageNo = 1; \r\n $scope.canceledPageNo = 1; \r\n \r\n $scope.dataValidated = { reverse: true, sortKey: \"IdContractBase\" }; \r\n $scope.dataPending = { reverse: true, sortKey: \"IdContractBase\" }; \r\n $scope.dataPriced = { reverse: true, sortKey: \"IdContractBase\" }; \r\n $scope.dataCanceled = { reverse: true, sortKey: \"IdContractBase\" }; \r\n \r\n $scope.idCropSelected = Number(parametersFactory.Parameters.DefaultCrop.Value);\r\n $scope.idProductSelected = \"\";\r\n $scope.dateFilter = \"\";\r\n $scope.idCompagnySelected = \"\"; \r\n $scope.dateSelected = \"\";\r\n $scope.selectedClient = {}; \r\n\r\n var refreshUsers = null; // On crée un timer car si on tape trop vite dans le champ de recherche le listing ne correspond pas au nom recherché\r\n $scope.$watch(\"selectedIdClient\", function (newValue, oldValue) {\r\n if (newValue && oldValue != newValue) {\r\n if (newValue.length >= 3 || newValue.length < oldValue.length) {\r\n if (refreshUsers === null)\r\n refreshUsers = setTimeout(function () { $scope.GetData(); }, 800);\r\n else {\r\n clearTimeout(refreshUsers);\r\n refreshUsers = setTimeout(function () { $scope.GetData(); }, 800);\r\n }\r\n }\r\n }\r\n });\r\n\r\n $scope.$watch(\"dateSelected\", function (newValue) {\r\n if (newValue === \"\")\r\n $scope.dateFilter = \"\";\r\n else if (newValue) {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format yyyy/mm/dd pour l'envoyer à l'API.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.dateFilter = converDate.format('YYYY/MM/DD');\r\n }\r\n });\r\n\r\n $scope.$watch(\"dateFilter\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetData();\r\n });\r\n \r\n GetCropsWithContracts(); \r\n };\r\n\r\n\r\n //Initialisation des filtres généraux\r\n var GetCropsWithContracts = function () {\r\n cropsService.GetCropsWithContractsBase(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.crops = data;\r\n var defaultCropInCrops = $filter('filter')($scope.crops, { IdCrop: $scope.idCropSelected })[0] !== undefined;\r\n if (!defaultCropInCrops && $scope.crops.length > 0)\r\n $scope.idCropSelected = $scope.crops[0].IdCrop;\r\n $scope.GetFiltersWithContracts();\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.GetFiltersWithContracts = function () {\r\n $scope.loading = true;\r\n $scope.idProductSelected = \"\"; \r\n $scope.idCompagnySelected = \"\";\r\n $scope.selectedIdContract = \"\";\r\n $scope.dateSelected = \"\";\r\n $scope.selectedIdClient = \"\"; \r\n contractBaseService.GetFiltersWithContractsBaseByCrop($scope.idCropSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.lstProducts = data.LstProductFilterVm; \r\n if ($scope.lstProducts.length === 1)\r\n $scope.idProductSelected = $scope.lstProducts[0].IdProduct;\r\n else if ($scope.lstProducts.length > 1 && $filter('filter')($scope.lstProducts, { IdProduct: \"\", ProductLabel: \"Tous\" }).length === 0)\r\n $scope.lstProducts.unshift({ IdProduct: \"\", ProductLabel: \"Tous\" }); \r\n\r\n $scope.lstCompagnies = data.LstCompagnies; \r\n $scope.lstCompagnies.unshift({ IdCompagny: \"\", Label: \"Toutes\" }); \r\n }\r\n }\r\n });\r\n $scope.GetData();\r\n }; \r\n \r\n $scope.GetData = function () {\r\n if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n\r\n if ($scope.viewMode === \"validated\") {\r\n $scope.GetContractsBaseValidateWithFilter(1);\r\n }\r\n else if ($scope.viewMode === \"pending\") {\r\n $scope.GetContractsBasePendingWithFilter(1);\r\n }\r\n else if ($scope.viewMode === \"priced\") { \r\n $scope.GetContractsBasePricedWithFilter(1);\r\n }\r\n else if ($scope.viewMode === \"canceled\") { \r\n $scope.GetContractsBaseCancelWithFilter(1);\r\n } \r\n }; \r\n \r\n $scope.GetContractsBaseValidateWithFilter = function (pagenum) {\r\n $scope.loading = true;\r\n $scope.errorMessageContractBaseValidated = \"\"; \r\n contractBaseService.GetContractsBasePaginate(enumFactory.ContractState.Valide, $scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, '', $scope.max, pagenum, $scope.dataValidated.sortKey, $scope.dataValidated.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageContractBaseValidated = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalValidated = data.Total;\r\n $scope.ContractsBasesValidated = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n }; \r\n\r\n $scope.GetContractsBasePendingWithFilter = function (pagenum) {\r\n $scope.loading = true;\r\n $scope.errorMessageContractBasePending = \"\";\r\n contractBaseService.GetContractsBasePaginate(enumFactory.ContractState.AttenteDernierComposant, $scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, '', $scope.max, pagenum, $scope.dataValidated.sortKey, $scope.dataValidated.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageContractBasePending = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalPending = data.Total;\r\n $scope.ContractsBasesPending = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n }; \r\n\r\n $scope.GetContractsBasePricedWithFilter = function (pagenum) {\r\n $scope.loading = true;\r\n $scope.errorMessageContractBasePriced = \"\";\r\n if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n contractBaseService.GetContractsBasePaginate(enumFactory.ContractState.AttenteValidation, $scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, '', $scope.max, pagenum, $scope.dataValidated.sortKey, $scope.dataValidated.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageContractBasePriced = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalPriced = data.Total;\r\n $scope.ContractsBasesPriced = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n }; \r\n\r\n $scope.GetContractsBaseCancelWithFilter = function (pagenum) {\r\n $scope.loading = true;\r\n $scope.errorMessageContractBaseCanceld = \"\";\r\n contractBaseService.GetContractsBasePaginate(enumFactory.ContractState.Annulé, $scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, '', $scope.max, pagenum, $scope.dataValidated.sortKey, $scope.dataValidated.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageContractBaseCanceld = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalCanceled = data.Total;\r\n $scope.ContractsBasesCanceled = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n }; \r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.dataValidated.sortKey = sortKey;\r\n $scope.dataValidated.reverse = reverse;\r\n $scope.GetData();\r\n };\r\n\r\n $scope.CancelContractPopUp = function (contractSelected, index, showPopUpContract) {\r\n $scope.PopUpMessageCancelContract = \"\";\r\n $scope.MessageDeleteContractBaseTargetPrice = $rootScope.editableObjectsFactory.EditableObjects.MessageDeleteContractBaseTargetPrice.Content;\r\n $scope.CanceledContract = $rootScope.editableObjectsFactory.EditableObjects.CanceledContract.Content;\r\n\r\n $scope.PopupCanceledContractsSelectedTitle = $scope.CanceledContract + contractSelected.IdContractBase;\r\n if (contractSelected !== undefined)\r\n $scope.PopUpMessageCancelContract = $scope.MessageDeleteContractBaseTargetPrice;\r\n\r\n showPopUpContract(contractSelected);\r\n };\r\n\r\n $scope.CancelContract = function (element) {\r\n $scope.CancelContractBaseSuccessMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_AdminContractBasesMonitoring_CancelContractsBaseMessage.Content;\r\n contractBaseService.UpdateContractBase(element, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n else\r\n $location.path(\"/\");\r\n } else {\r\n $scope.successMessage = $scope.CancelContractBaseSuccessMessage;\r\n GetCropsWithContracts();\r\n }\r\n });\r\n };\r\n\r\n $scope.ExportValidatedContractsBase = function () {\r\n var downloadPath = configurationFactory.Url['Api'] + 'ContractBase/GetValidatedContractsBaseXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n '&idLanguage=' + $rootScope.language.IdLanguage;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n $scope.ExportPricedContractsBase = function () {\r\n var downloadPath = configurationFactory.Url['Api'] + 'ContractBase/GetPricedContractsBaseXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n '&idLanguage=' + $rootScope.language.IdLanguage +\r\n '&idTypeFixation=' + $scope.idTypeFixationSelected;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n $scope.ExportCanceledContractsBase = function () {\r\n var downloadPath = configurationFactory.Url['Api'] + 'ContractBase/GetCanceledContractsBaseXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n '&idLanguage=' + $rootScope.language.IdLanguage;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n $scope.ExportPendingContractsBase = function () {\r\n var downloadPath = configurationFactory.Url['Api'] + 'ContractBase/GetPendingContractsBaseXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n '&idLanguage=' + $rootScope.language.IdLanguage;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('contractsBuiltPriceMonitoringController', ['$scope', '$rootScope', '$routeParams', '$http', '$filter', '$location', \"currentUserFactory\", 'configurationFactory',\r\n 'contractsService', 'cropsService', 'athenaOrdersService', '$log', '$timeout', '$sce', 'parametersFactory', 'enumFactory', 'userTableService', 'colonnesContractsSubscription', 'colonnesContractsObservation', 'colonnesContractsFixed','colonnesContractsCanceled',\r\n function ($scope, $rootScope, $routeParams, $http, $filter, $location, currentUserFactory, configurationFactory, contractsService, cropsService, athenaOrdersService, $log, $timeout, $sce,\r\n parametersFactory, enumFactory, userTableService, colonnesContractsSubscription, colonnesContractsObservation, colonnesContractsFixed, colonnesContractsCanceled) {\r\n\r\n\r\n var init = function () { \r\n\r\n // Contracts souscription\r\n $scope.tableContractsSubscriptionDataVisible = colonnesContractsSubscription.data.DataVisible.split(',');\r\n $scope.tableContractsSubscriptionLibelle = colonnesContractsSubscription.data.ColumnName.split(',');\r\n\r\n // Contracts observation\r\n $scope.tableContractsObservationDataVisible = colonnesContractsObservation.data.DataVisible.split(',');\r\n $scope.tableContractsObservationLibelle = colonnesContractsObservation.data.ColumnName.split(',');\r\n\r\n // Contracts fixés\r\n $scope.tableContractsFixedDataVisible = colonnesContractsFixed.data.DataVisible.split(',');\r\n $scope.tableContractsFixedLibelle = colonnesContractsFixed.data.ColumnName.split(',');\r\n\r\n // Contracts annulés\r\n $scope.tableContractsCanceledDataVisible = colonnesContractsCanceled.data.DataVisible.split(',');\r\n $scope.tableContractsCanceledLibelle = colonnesContractsCanceled.data.ColumnName.split(',');\r\n\r\n $scope.viewMode = $routeParams.typeContract;\r\n\r\n $scope.max = 10;\r\n\r\n $scope.subscriptionPageNo = 1; \r\n $scope.observationPageNo = 1; \r\n $scope.fixedPageNo = 1; \r\n $scope.canceledPageNo = 1; \r\n \r\n $scope.data = { reverse: true, sortKey: \"IdContract\" }; \r\n \r\n $scope.idCropSelected = Number(parametersFactory.Parameters.DefaultCrop.Value);\r\n $scope.idProductSelected = \"\";\r\n $scope.dateFilter = \"\"; \r\n $scope.dateSelected = \"\";\r\n $scope.selectedClient = {}; \r\n\r\n var refreshUsers = null; // On crée un timer car si on tape trop vite dans le champ de recherche le listing ne correspond pas au nom recherché\r\n $scope.$watch(\"selectedIdClient\", function (newValue, oldValue) {\r\n if (newValue && oldValue != newValue) {\r\n if (newValue.length >= 3 || newValue.length < oldValue.length) {\r\n if (refreshUsers === null)\r\n refreshUsers = setTimeout(function () { $scope.GetData(); }, 800);\r\n else {\r\n clearTimeout(refreshUsers);\r\n refreshUsers = setTimeout(function () { $scope.GetData(); }, 800);\r\n }\r\n }\r\n }\r\n });\r\n\r\n $scope.$watch(\"dateSelected\", function (newValue) {\r\n if (newValue === \"\")\r\n $scope.dateFilter = \"\";\r\n else if (newValue) {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format yyyy/mm/dd pour l'envoyer à l'API.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.dateFilter = converDate.format('YYYY/MM/DD');\r\n }\r\n });\r\n\r\n $scope.$watch(\"dateFilter\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetData();\r\n });\r\n \r\n GetCropsWithContracts(); \r\n };\r\n\r\n //Initialisation des filtres généraux\r\n var GetCropsWithContracts = function () {\r\n cropsService.GetCropsWithContractsBuiltPrice( enumFactory.TypeContract.PrixConstruit, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.crops = data;\r\n var defaultCropInCrops = $filter('filter')($scope.crops, { IdCrop: $scope.idCropSelected })[0] !== undefined;\r\n if (!defaultCropInCrops && $scope.crops.length > 0)\r\n $scope.idCropSelected = $scope.crops[0].IdCrop;\r\n $scope.GetFiltersWithContracts();\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.GetFiltersWithContracts = function () {\r\n $scope.loading = true;\r\n $scope.idProductSelected = \"\"; \r\n $scope.selectedIdContract = \"\";\r\n $scope.dateSelected = \"\";\r\n $scope.selectedIdClient = \"\"; \r\n contractsService.GetFiltersWithContractsBuiltPriceByCrop($scope.idCropSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.lstProducts = data.LstProductFilterVm; \r\n if ($scope.lstProducts.length === 1)\r\n $scope.idProductSelected = $scope.lstProducts[0].IdProduct;\r\n else if ($scope.lstProducts.length > 1 && $filter('filter')($scope.lstProducts, { IdProduct: \"\", ProductLabel: \"Tous\" }).length === 0)\r\n $scope.lstProducts.unshift({ IdProduct: \"\", ProductLabel: \"Tous\" }); \r\n }\r\n }\r\n });\r\n $scope.GetData();\r\n }; \r\n \r\n $scope.GetData = function () {\r\n if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n\r\n if ($scope.viewMode === \"subscription\") {\r\n $scope.GetContractsBuiltPriceSubscriptionWithFilter(1);\r\n }\r\n else if ($scope.viewMode === \"observation\") {\r\n $scope.GetContractsBuiltPriceObservationWithFilter(1);\r\n }\r\n else if ($scope.viewMode === \"fixed\") { \r\n $scope.GetContractsBuiltPriceFixedWithFilter(1);\r\n }\r\n else if ($scope.viewMode === \"canceled\") { \r\n $scope.GetContractsBuiltPriceCanceledWithFilter(1);\r\n } \r\n }; \r\n\r\n $scope.GetContractsBuiltPriceSubscriptionWithFilter = function (pagenum) {\r\n $scope.loading = true;\r\n $scope.errorMessageContractBuiltPriceSubscription = \"\"; \r\n contractsService.GetContractsBuiltPricePaginate($scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, enumFactory.ContractState.PrixConstruitSouscrit, $scope.max, pagenum, $scope.data.sortKey, $scope.data.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageContractBuiltPriceSubscription = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalSubscription = data.Total;\r\n $scope.ContractsSubscription = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n }; \r\n\r\n $scope.GetContractsBuiltPriceObservationWithFilter = function (pagenum) {\r\n $scope.loading = true;\r\n $scope.errorMessageContractBuiltPriceObservation = \"\"; \r\n contractsService.GetContractsBuiltPricePaginate($scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, enumFactory.ContractState.PrixConstruitEnCoursCalcul, $scope.max, pagenum, $scope.data.sortKey, $scope.data.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageContractBuiltPriceObservation = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalObservation = data.Total;\r\n $scope.ContractsObservation = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n }; \r\n\r\n $scope.GetContractsBuiltPriceFixedWithFilter = function (pagenum) {\r\n $scope.loading = true;\r\n $scope.errorMessageContractBuiltPriceFixed = \"\"; \r\n contractsService.GetContractsBuiltPricePaginate($scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, enumFactory.ContractState.Valide, $scope.max, pagenum, $scope.data.sortKey, $scope.data.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageContractBuiltPriceFixed = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalFixed = data.Total;\r\n $scope.ContractsFixed = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n }; \r\n \r\n $scope.GetContractsBuiltPriceCanceledWithFilter = function (pagenum) {\r\n $scope.loading = true;\r\n $scope.errorMessageContractBuiltPriceCanceled = \"\"; \r\n $scope.errorMessageContractBuiltPriceContractSubscription = \"\"; \r\n contractsService.GetContractsBuiltPricePaginate($scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, enumFactory.ContractState.Annulé, $scope.max, pagenum, $scope.data.sortKey, $scope.data.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageContractBuiltPriceCanceled = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalCanceled = data.Total;\r\n $scope.ContractsCanceled = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n }; \r\n \r\n $scope.ShowPopUpEditBuiltPriceContract = function (contract, openPopUpEditedBuiltPriceContract) {\r\n $scope.contractSelected = contract;\r\n $scope.contractSelected.MessageInfo = $sce.trustAsHtml($rootScope.editableObjectsFactory.EditableObjects.Admin_ContractBuiltPriceContract_Subscription_PopupEditedBuiltPriceContract_Label_NumContract.Content + $scope.contractSelected.IdContract + $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractBuiltPriceContract_Subscription_PopupEditedBuiltPriceContract_Label_Of.Content + $scope.contractSelected.UserFullName);\r\n $scope.contractSelected.NewQuantity = contract.Quantity;\r\n $scope.editedBuiltPriceContractErrorMessage = \"\";\r\n openPopUpEditedBuiltPriceContract();\r\n };\r\n\r\n $scope.CheckEditedBuiltPriceContract = function () {\r\n if (!$scope.contractSelected.NewQuantity || $scope.contractSelected.NewQuantity <= 0)\r\n {\r\n $scope.editedBuiltPriceContractErrorMessage = $sce.trustAsHtml($rootScope.editableObjectsFactory.EditableObjects.Error_AdminEditQuantityContractBuiltPrices_Quantity_Min.Content);\r\n return false;\r\n }\r\n if ($scope.contractSelected.NewQuantity >= $scope.contractSelected.Quantity)\r\n {\r\n $scope.editedBuiltPriceContractErrorMessage = $sce.trustAsHtml($rootScope.editableObjectsFactory.EditableObjects.Error_AdminEditQuantityContractBuiltPrices_Quantity.Content);\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.ConfirmEditedBuiltPriceContract = function () {\r\n $scope.loading = true;\r\n contractsService.EditedBuiltPriceContract($scope.contractSelected.IdContract, $scope.contractSelected.NewQuantity, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessageContractBuiltPriceContractSubscription = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.GetData();\r\n $scope.loading = false;\r\n }\r\n });\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.data.sortKey = sortKey;\r\n $scope.data.reverse = reverse;\r\n $scope.GetData();\r\n };\r\n \r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('editorialMailController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', '$location', 'templateMailsService', 'enumFactory',\r\n function ($scope, $rootScope, $routeParams, $sce, $filter, $location, templateMailsService, enumFactory) {\r\n\r\n var init = function () {\r\n $scope.enumRoles = enumFactory.Roles;\r\n\r\n if ($rootScope.succesMessageTemplate !== undefined && $rootScope.succesMessageTemplate !== null)\r\n $scope.successMessage = $rootScope.succesMessageTemplate;\r\n\r\n $rootScope.succesMessageTemplate = \"\";\r\n $scope.errorMessage = \"\";\r\n $scope.templates = [];\r\n $scope.lstCompagnies = [];\r\n $scope.TypeTemplateSelected = { id: \"\" };\r\n $scope.CompagnySelected = { id: \"\" };\r\n $scope.LanguageSelected = { id: \"\" };\r\n $scope.enumCategoryTypeTemplateMails = enumFactory.TypeCategoryTypeTemplateMail;\r\n\r\n $scope.LanguageSelected = { id: $routeParams.idLanguage ? Number($routeParams.idLanguage) : $rootScope.language.IdLanguage };\r\n $scope.CheckLanguage();\r\n $scope.GetAllTypeTemplateMails();\r\n\r\n if (!$rootScope.ModuleEcommerce.Active) {\r\n $scope.viewMode = 'Other';\r\n $scope.clickTab(\"Other\");\r\n }\r\n else {\r\n $scope.viewMode = (!$routeParams.viewMode && !$scope.viewMode) ? 'Contract' : $routeParams.viewMode;\r\n }\r\n };\r\n\r\n\r\n $scope.EditTemplateMail = function (typeTemplateMail, idRole) {\r\n switch (idRole) {\r\n case $scope.enumRoles.Admin:\r\n if (typeTemplateMail.TemplateAdmin.Editable)\r\n $location.path('/admin/editorial/editTemplateMail/' + typeTemplateMail.IdTypeTemplateMail + '/' + idRole + '/' + $scope.LanguageSelected.id + '/' + $scope.viewMode);\r\n break;\r\n case $scope.enumRoles.User:\r\n if (typeTemplateMail.TemplateAgri.Editable)\r\n $location.path('/admin/editorial/editTemplateMail/' + typeTemplateMail.IdTypeTemplateMail + '/' + idRole + '/' + $scope.LanguageSelected.id + '/' + $scope.viewMode);\r\n break;\r\n case $scope.enumRoles.TC:\r\n if (typeTemplateMail.TemplateTC.Editable)\r\n $location.path('/admin/editorial/editTemplateMail/' + typeTemplateMail.IdTypeTemplateMail + '/' + idRole + '/' + $scope.LanguageSelected.id + '/' + $scope.viewMode);\r\n break;\r\n default:\r\n }\r\n };\r\n\r\n $scope.GetAllTypeTemplateMails = function () {\r\n templateMailsService.GetAllTypeTemplateMails($scope.LanguageSelected.id, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n else\r\n $scope.typeTemplateMails = data;\r\n });\r\n };\r\n\r\n $scope.SaveConfigMails = function () {\r\n var typeTemplateMailFiltereds = $filter('filter')($scope.typeTemplateMails, { \"IdCategoryTypeTemplateMail\": $scope.enumCategoryTypeTemplateMails[$scope.viewMode] }, true);\r\n templateMailsService.SaveConfigMails(typeTemplateMailFiltereds, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n else {\r\n $scope.GetAllTypeTemplateMails();\r\n $scope.successMessage = \"Votre configuration a bien été prise en compte.\";\r\n }\r\n });\r\n };\r\n\r\n $scope.CheckLanguage = function () {\r\n if ($rootScope.ModuleMultilingue.Active)\r\n $scope.isDefaultLanguage = $filter('filter')($rootScope.languages, { IsDefault: true })[0].IdLanguage === $scope.LanguageSelected.id;\r\n else\r\n $scope.isDefaultLanguage = true;\r\n };\r\n\r\n $scope.clickTab = function (tab) {\r\n $scope.successMessage = \"\";\r\n $scope.errorMessage = \"\";\r\n $scope.viewMode = tab;\r\n };\r\n\r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('editorialContractController', ['$scope', '$rootScope', '$sce', '$filter', '$location', 'templatesService', 'enumFactory',\r\n function ($scope, $rootScope, $sce, $filter, $location, templatesService, enumFactory) {\r\n\r\n var init = function () {\r\n $scope.enumRoles = enumFactory.Roles;\r\n\r\n if ($rootScope.succesMessageTemplate !== undefined && $rootScope.succesMessageTemplate !== null)\r\n $scope.successMessage = $rootScope.succesMessageTemplate;\r\n\r\n $rootScope.succesMessageTemplate = \"\";\r\n $scope.errorMessage = \"\";\r\n $scope.lstTypesTemplates = [];\r\n $scope.templatesFilter = [];\r\n $scope.templates = [];\r\n $scope.lstCompagnies = [];\r\n $scope.TypeTemplateSelected = { id: \"\" };\r\n $scope.CompagnySelected = { id: \"\" };\r\n $scope.LanguageSelected = { id: \"\" };\r\n\r\n $scope.Action_Disable = $rootScope.editableObjectsFactory.EditableObjects.Admin_EditorialContract_Action_Disable.Content;\r\n $scope.PopUpDisable_Title = $rootScope.editableObjectsFactory.EditableObjects.Admin_EditorialContract_PopUpDisable_Title.Content;\r\n $scope.PopUpDisable_Message = $rootScope.editableObjectsFactory.EditableObjects.Admin_EditorialContract_PopUpDisable_Message.Content;\r\n $scope.PopUpDisable_Button_Yes = $rootScope.globalLabels.Yes;\r\n $scope.PopUpDisable_Button_No = $rootScope.globalLabels.No;\r\n\r\n GetEnableTemplates();\r\n\r\n };\r\n\r\n var GetEnableTemplates = function () {\r\n templatesService.GetTemplates(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } \r\n } else {\r\n $scope.templates = data;\r\n $scope.templates = $scope.templates.filter(function (element) { return element.IsEnable === true; });\r\n $scope.Filter();\r\n }\r\n });\r\n };\r\n\r\n $scope.Filter = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.lstTypesTemplates = [];\r\n $scope.lstCompagnies = [];\r\n $scope.lstLanguages = [];\r\n var filterGeneral = angular.copy($scope.templates);\r\n\r\n if ($scope.TypeTemplateSelected && $scope.TypeTemplateSelected.id)\r\n filterGeneral = filterGeneral.filter(function (element) { return element.IdTypeTemplate === Number($scope.TypeTemplateSelected.id); });\r\n\r\n if ($rootScope.ModuleMultipleCompagnies.Active && $scope.CompagnySelected && $scope.CompagnySelected.id)\r\n filterGeneral = filterGeneral.filter(function (element) { return element.IdCompagny === Number($scope.CompagnySelected.id); });\r\n\r\n if ($rootScope.ModuleMultilingue.Active && $scope.LanguageSelected && $scope.LanguageSelected.id)\r\n filterGeneral = filterGeneral.filter(function (element) { return element.IdLanguage === Number($scope.LanguageSelected.id); });\r\n\r\n $scope.templatesFilter = angular.copy(filterGeneral);\r\n\r\n\r\n //création des filtre en fonction des templates\r\n if ($scope.templates && $scope.templates.length > 0) {\r\n $scope.templates.forEach(function (item) {\r\n if ($filter('filter')($scope.lstTypesTemplates, { IdTypeTemplate: item.TypeTemplate.IdTypeTemplate }).length === 0)\r\n $scope.lstTypesTemplates.push({ IdTypeTemplate: item.TypeTemplate.IdTypeTemplate, Label: item.TypeTemplate.Label });\r\n if ($rootScope.ModuleMultipleCompagnies.Active && item.Compagny) {\r\n if ($filter('filter')($scope.lstCompagnies, { IdCompagny: item.Compagny.IdCompagny }).length === 0)\r\n $scope.lstCompagnies.push({ IdCompagny: item.Compagny.IdCompagny, Label: item.Compagny.Label });\r\n }\r\n if ($rootScope.ModuleMultilingue.Active && item.Language) {\r\n if ($filter('filter')($scope.lstLanguages, { IdLanguage: item.Language.IdLanguage }).length === 0)\r\n $scope.lstLanguages.push({ IdLanguage: item.Language.IdLanguage, Label: item.Language.Label });\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.Delete = function (idTemplate) {\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n templatesService.DeleteTemplate(idTemplate, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.templates = data;\r\n $scope.templatesFilter = angular.copy($scope.templates);\r\n $scope.Filter();\r\n $scope.successMessage = \"Le template a bien été supprimé.\";\r\n }\r\n });\r\n };\r\n\r\n $scope.Disable = function (idTemplate) {\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n templatesService.DisableTemplate(idTemplate, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.templates = data;\r\n $scope.templatesFilter = angular.copy($scope.templates);\r\n $scope.Filter();\r\n $scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_EditorialContract_PopUpDisable_MessageSuccess.Content;\r\n }\r\n });\r\n };\r\n\r\n $scope.AddTemplate = function () {\r\n $location.path('/admin/editorial/editTemplateContract/-1');\r\n };\r\n\r\n $scope.EditTemplateContract = function (id) {\r\n $location.path('/admin/editorial/editTemplateContract/' + id);\r\n };\r\n\r\n\r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('contractsOptionMonitoringController', ['$scope', '$rootScope', '$routeParams', '$filter', 'configurationFactory',\r\n 'contractsOptionService', 'cropsService', '$sce', 'parametersFactory', 'colonnesContractsOptionExpired', 'colonnesContractsOptionPending', 'colonnesContractsOptionDetails',\r\n function ($scope, $rootScope, $routeParams, $filter, configurationFactory, contractsOptionService, cropsService, $sce, parametersFactory, colonnesContractsOptionExpired, colonnesContractsOptionPending, colonnesContractsOptionDetails) {\r\n\r\n var init = function () {\r\n // Contracts Option expirés\r\n $scope.tableContractsOptionExpiredDataVisible = colonnesContractsOptionExpired.data.DataVisible.split(',');\r\n $scope.tableContractsOptionExpiredLibelle = colonnesContractsOptionExpired.data.ColumnName.split(',');\r\n\r\n // Contracts Option en cours\r\n $scope.tableContractsOptionPendingDataVisible = colonnesContractsOptionPending.data.DataVisible.split(',');\r\n $scope.tableContractsOptionPendingLibelle = colonnesContractsOptionPending.data.ColumnName.split(',');\r\n\r\n // Détails contrats , liste des exercices\r\n $scope.tableContractsOptionDetailsDataVisible = colonnesContractsOptionDetails.data.DataVisible.split(',');\r\n $scope.tableContractsOptionDetailsLibelle = colonnesContractsOptionDetails.data.ColumnName.split(','); \r\n\r\n $scope.viewMode = $routeParams.typeContract;\r\n $scope.max = 10;\r\n\r\n $scope.expiredPageNo = 1;\r\n $scope.pendingPageNo = 1;\r\n\r\n $scope.dataExpired = { reverse: true, sortKey: \"IdContractOption\" };\r\n $scope.dataPending = { reverse: true, sortKey: \"IdContractOption\" };\r\n\r\n $scope.idCropSelected = Number(parametersFactory.Parameters.DefaultCrop.Value);\r\n $scope.idProductSelected = \"\";\r\n $scope.idTypeOptionSelected = \"\";\r\n $scope.dateFilter = \"\";\r\n $scope.date2Filter = \"\";\r\n $scope.idCompagnySelected = \"\";\r\n $scope.dateSelected = \"\";\r\n $scope.dateExecutedSelected = \"\";\r\n $scope.dateAbandonedSelected = \"\";\r\n $scope.selectedClient = {};\r\n\r\n $scope.detailsMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractsOption_DetailsMessage.Content;\r\n $scope.detailsMessageList = $rootScope.editableObjectsFactory.EditableObjects.Admin_ContractsOption_DetailsMessage_List.Content;\r\n\r\n $scope.$watch(\"selectedIdClient\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetData();\r\n });\r\n\r\n $scope.$watch(\"dateSelected\", function (newValue) {\r\n if (newValue === \"\")\r\n $scope.dateFilter = \"\";\r\n else if (newValue) {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format yyyy/mm/dd pour l'envoyer à l'API.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.dateFilter = converDate.format('YYYY/MM/DD');\r\n }\r\n });\r\n\r\n $scope.$watch(\"dateExecutedSelected\", function (newValue) {\r\n if (newValue === \"\")\r\n $scope.date2Filter = \"\";\r\n else if (newValue) {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format yyyy/mm/dd pour l'envoyer à l'API.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.date2Filter = converDate.format('YYYY/MM/DD');\r\n }\r\n });\r\n\r\n $scope.$watch(\"dateAbandonedSelected\", function (newValue) {\r\n if (newValue === \"\")\r\n $scope.date3Filter = \"\";\r\n else if (newValue) {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format yyyy/mm/dd pour l'envoyer à l'API.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.date3Filter = converDate.format('YYYY/MM/DD');\r\n }\r\n });\r\n\r\n $scope.$watch(\"dateFilter\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetData();\r\n });\r\n\r\n $scope.$watch(\"date2Filter\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetData();\r\n });\r\n\r\n $scope.$watch(\"date3Filter\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetData();\r\n });\r\n\r\n GetCropsWithContracts();\r\n };\r\n\r\n\r\n //Initialisation des filtres généraux\r\n var GetCropsWithContracts = function () {\r\n cropsService.GetCropsWithContractsOption(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.crops = data;\r\n var defaultCropInCrops = $filter('filter')($scope.crops, { IdCrop: $scope.idCropSelected })[0] !== undefined;\r\n if (!defaultCropInCrops && $scope.crops.length > 0)\r\n $scope.idCropSelected = $scope.crops[0].IdCrop;\r\n $scope.GetFiltersWithContractsOption();\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.GetFiltersWithContractsOption = function () {\r\n $scope.loading = true;\r\n $scope.idProductSelected = \"\";\r\n $scope.idTypeOptionSelected = \"\";\r\n $scope.idCompagnySelected = \"\";\r\n $scope.selectedIdContract = \"\";\r\n $scope.dateSelected = \"\";\r\n $scope.dateExecutedSelected = \"\";\r\n $scope.dateAbandonedSelected = \"\";\r\n $scope.selectedIdClient = \"\";\r\n contractsOptionService.GetFiltersWithContractsOptionByCrop($scope.idCropSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.lstProducts = data.LstProductFilterVm;\r\n if ($scope.lstProducts.length === 1)\r\n $scope.idProductSelected = $scope.lstProducts[0].IdProduct;\r\n else if ($scope.lstProducts.length > 1 && $filter('filter')($scope.lstProducts, { IdProduct: \"\", ProductLabel: $rootScope.globalLabels.AllItems }).length === 0)\r\n $scope.lstProducts.unshift({ IdProduct: \"\", ProductLabel: $rootScope.globalLabels.AllItems });\r\n\r\n $scope.lstCompagnies = data.LstCompagnies;\r\n $scope.lstCompagnies.unshift({ IdCompagny: \"\", Label: $rootScope.globalLabels.AllItems_F });\r\n\r\n $scope.lstTypeOption = data.LstTypeOptionFilterVm;\r\n if ($scope.lstTypeOption.length === 1)\r\n $scope.idTypeOptionSelected = $scope.lstTypeOption[0].IdTypeOption;\r\n else if ($scope.lstTypeOption.length > 1 && $filter('filter')($scope.lstTypeOption, { IdTypeOption: \"\", TypeOptionLabel: $rootScope.globalLabels.AllItems }).length === 0)\r\n $scope.lstTypeOption.unshift({ IdTypeOption: \"\", TypeOptionLabel: $rootScope.globalLabels.AllItems });\r\n }\r\n }\r\n });\r\n $scope.GetData();\r\n };\r\n\r\n $scope.GetData = function () {\r\n if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n\r\n if ($scope.viewMode === \"expired\") {\r\n $scope.GetContractsOptionExpiredWithFilter(1);\r\n }\r\n else if ($scope.viewMode === \"pending\") {\r\n $scope.GetContractsOptionPendingWithFilter(1);\r\n }\r\n\r\n };\r\n\r\n //GetContractsOptionExecutedWithFilter\r\n $scope.GetContractsOptionExpiredWithFilter = function (pagenum) {\r\n $scope.loading = true;\r\n $scope.errorMessageContractOptionExpired = \"\";\r\n contractsOptionService.GetMonitoringContractOptionExpiredPaginate($scope.idCropSelected, $scope.idProductSelected, $scope.idTypeOptionSelected, $scope.dateFilter, $scope.date2Filter, $scope.date3Filter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, $scope.max, pagenum, $scope.dataExpired.sortKey, $scope.dataExpired.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageContractOptionExpired = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalExpired = data.Total;\r\n $scope.ContractsOptionExpired = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n };\r\n\r\n $scope.GetContractsOptionPendingWithFilter = function (pagenum) {\r\n $scope.loading = true;\r\n $scope.errorMessageContractOptionPending = \"\";\r\n contractsOptionService.GetMonitoringContractOptionPendingPaginate($scope.idCropSelected, $scope.idProductSelected, $scope.idTypeOptionSelected, $scope.dateFilter, $scope.date2Filter, $scope.date3Filter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, $scope.max, pagenum, $scope.dataPending.sortKey, $scope.dataPending.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageContractOptionPending = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalPending = data.Total;\r\n $scope.ContractsOptionPending = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n if ($scope.viewMode === \"expired\") {\r\n $scope.dataExpired.sortKey = sortKey;\r\n $scope.dataExpired.reverse = reverse;\r\n }\r\n else if ($scope.viewMode === \"pending\") {\r\n $scope.dataPending.sortKey = sortKey;\r\n $scope.dataPending.reverse = reverse;\r\n }\r\n $scope.GetData();\r\n };\r\n\r\n $scope.GetDetail = function (idContract, openPopUp, modalTitle) {\r\n $scope.errorMessage = \"\";\r\n $scope.detailedContract = [];\r\n $scope.lstAthenaOrdersVm = [];\r\n $scope.popupHeight = undefined;\r\n $scope.textDetail = $scope.detailsMessage.replace(\"[IdContractOption]\", idContract);\r\n $scope.textDetailList = $scope.detailsMessageList.replace(\"[IdContractOption]\", idContract);\r\n $scope.modalTitle = modalTitle;\r\n\r\n contractsOptionService.GetContractOptionDetails(idContract, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageContractsNoCover = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n else {\r\n if (data) {\r\n data.forEach(function (item) {\r\n if (item.Date !== null)\r\n item.Date = $filter('date')(item.Date, \"dd/MM/yyyy\");\r\n });\r\n $scope.lstAthenaOrdersVm = data;\r\n \r\n // On défini la taille de la popup en fonction du nombre de ligne du tableau. (33 ~ la taille d'une ligne du tableau)\r\n $scope.popupHeight = (data.length * 33) + 150; }\r\n openPopUp();\r\n }\r\n });\r\n };\r\n\r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('editTemplateContractController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', 'productsService', '$location', 'templatesService', 'languageService', 'enumFactory', 'configurationFactory', '$log', 'tagsService', 'compagnyService',\r\n function ($scope, $rootScope, $routeParams, $sce, $filter, productsService, $location, templatesService, languageService, enumFactory, configurationFactory, $log, tagsService, compagnyService) {\r\n var idtemplate = $routeParams.idtemplate;\r\n var Init = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.tagselected = \"\";\r\n $scope.Template = {};\r\n $scope.Template.Content = \"\";\r\n $scope.disabledChangeType = false;\r\n $scope.disabledChangeCompagny = false;\r\n $scope.txtBtnSave = \"\";\r\n $scope.newTemplate = false;\r\n $rootScope.succesMessageTemplate = \"\";\r\n $scope.IsMultilingue = $rootScope.ModuleMultilingue.Active;\r\n $scope.inputProductLabel = $rootScope.globalLabels.AllItems;\r\n $scope.enumTypeTemplate = enumFactory.TypeTemplates;\r\n\r\n if ($rootScope.ModuleMultipleCompagnies.Active) {\r\n compagnyService.GetAll(function (data, status) {\r\n if (status === null)\r\n $scope.lstCompagnies = data;\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n }\r\n\r\n if (!$scope.IsMultilingue)\r\n SetDefautlLanguage();\r\n\r\n if (idtemplate === undefined || idtemplate === null || idtemplate == -1) { //nouveau template\r\n $scope.txtBtnSave = \"Créer\";\r\n $scope.blocTitle = \"Ajouter un nouveau template de contrat\";\r\n $scope.disabledChangeType = false;\r\n $scope.disabledChangeCompagny = false;\r\n $scope.newTemplate = true;\r\n getProducts();\r\n } else { // modifier template\r\n $scope.txtBtnSave = \"Modifier\";\r\n $scope.blocTitle = \"Modifier un template de contrat\";\r\n $scope.disabledChangeType = true;\r\n $scope.disabledChangeCompagny = true;\r\n getProducts(getTemplate);\r\n }\r\n $scope.GetTypeTemplate();\r\n $scope.GetLanguages();\r\n };\r\n\r\n $scope.GetTags = function () {\r\n if ($scope.Template.IdTypeTemplate !== undefined && $scope.Template.IdTypeTemplate !== null && $scope.Template.IdTypeTemplate !== \"\") {\r\n tagsService.GetTagsByIdTypeTemplate($scope.Template.IdTypeTemplate, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.lstTags = data;\r\n }\r\n });\r\n } else {\r\n $scope.lstTags = [];\r\n }\r\n };\r\n\r\n $scope.AddTag = function () {\r\n CKEDITOR.instances.txtTemplate.insertHtml($scope.tagselected);\r\n };\r\n\r\n $scope.GetTypeTemplate = function () {\r\n templatesService.GetAllTypeTemplate(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.TypeTemplates = data;\r\n }\r\n });\r\n };\r\n\r\n $scope.GetLanguages = function () {\r\n languageService.GetLanguages(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.Languages = data;\r\n }\r\n });\r\n };\r\n\r\n var SetDefautlLanguage = function () {\r\n languageService.GetDefaultLanguage(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.Template.IdLanguage = data.IdLanguage;\r\n }\r\n });\r\n };\r\n\r\n $scope.Cancel = function () {\r\n $location.path('/admin/editorial/view/contracts');\r\n };\r\n\r\n $scope.Save = function () {\r\n $scope.errorMessage = \"\";\r\n if (!$scope.CheckTemplate()) return;\r\n\r\n templatesService.SaveTemplate($scope.Template, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n if ($scope.txtBtnSave === \"Modifier\")\r\n $rootScope.succesMessageTemplate = \"Vos modifications ont bien été prises en compte.\";\r\n else\r\n $rootScope.succesMessageTemplate = \"Votre template a bien été pris en compte.\";\r\n $location.path('/admin/editorial/view/contracts');\r\n }\r\n });\r\n };\r\n\r\n $scope.Overview = function () {\r\n $scope.errorMessage = \"\";\r\n templatesService.OverviewTemplate($scope.Template, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n fetch('data:application/pdf;base64,' + data.slice(1, -1))\r\n .then(function (response) {\r\n return response.blob();\r\n })\r\n .then(function (blob) {\r\n window.open(URL.createObjectURL(blob));\r\n });\r\n }\r\n });\r\n };\r\n\r\n $scope.CheckTemplate = function () {\r\n $scope.errorMessage = \"\";\r\n if ($scope.Template.Label === undefined || $scope.Template.Label === null || $scope.Template.Label.trim() === \"\") {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Template_Error_NotAllElements.Content;\r\n return false;\r\n }\r\n if ($scope.Template.IdTypeTemplate === undefined || $scope.Template.IdTypeTemplate === null || $scope.Template.IdTypeTemplate === \"\") {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Template_Error_NotAllElements.Content;\r\n return false;\r\n }\r\n if ($scope.Template.Content === undefined || $scope.Template.Content === null || $scope.Template.Content.trim() === \"\") {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Template_Error_NotAllElements.Content;\r\n return false;\r\n }\r\n\r\n if ($scope.IsMultilingue && ($scope.Template.IdLanguage === undefined || $scope.Template.IdLanguage === null)) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Template_Error_NotAllElements.Content;\r\n return false;\r\n }\r\n\r\n if ($rootScope.ModuleMultipleCompagnies.Active && !$scope.Template.IdCompagny) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Template_Error_NotAllElements.Content;\r\n return false;\r\n }\r\n\r\n if ($scope.Template.IdTypeTemplate === $scope.enumTypeTemplate.BlankContract && idsProductsSelected.length === 0) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Template_Error_NotAllElements.Content;\r\n return false;\r\n }\r\n else\r\n $scope.Template.ListProductIdsSelected = idsProductsSelected;\r\n\r\n\r\n $scope.Template.Content = $scope.Template.Content.split(' }}').join(\" }}\"); // Nettoyer le tag après modification.\r\n for (var i = 0; i < $scope.Template.Content.length; i++) {\r\n if ($scope.Template.Content[i] == \"{\" && $scope.Template.Content[i + 1] == \"{\") {\r\n var key = \"{{\";\r\n for (var j = i + 2; i < $scope.Template.Content.length; j++) {\r\n\r\n if ($scope.Template.Content[j] == \"}\" && $scope.Template.Content[j + 1] == \"}\") {\r\n key += \"}}\";\r\n\r\n if (key.indexOf(\" \") !== -1) { key = key.replace(\" \", \" \"); }\r\n if (key.indexOf('@') !== -1) {\r\n var params = key.substring(key.indexOf('@') + 1, key.indexOf(' }}'));\r\n var isNumber = params.match(\"[0-9]+\");\r\n\r\n if (params === 'X' || isNumber === null) {\r\n $scope.errorMessage = \"Une des balises insérée nécessite une valeur numérique : \" + key + \" Remplacez 'X' par un numéro.\";\r\n return false;\r\n }\r\n\r\n key = key.replace(params, 'X');\r\n }\r\n\r\n if ($filter('filter')($scope.lstTags, { \"KeyTag\": key }, true)[0] === undefined) {\r\n $scope.errorMessage = \"Une des balises insérée n'existe pas pour ce template : \" + key;\r\n return false;\r\n }\r\n break;\r\n }\r\n key += $scope.Template.Content[j];\r\n }\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n $scope.UploadImage = function (data) {\r\n CKEDITOR.instances.txtTemplate.insertHtml(\"<img src='\" + $filter('uploadLinkInline')(data.PrivateLabel) + \"'>\");\r\n };\r\n\r\n $scope.clickOnProductElement = function (idProduct, checked) {\r\n $scope.products.forEach(function (product) {\r\n if (idProduct === -1) product.checked = !checked; // Si tous\r\n else {\r\n if (product.IdProduct === -1) product.checked = false;\r\n if (idProduct == product.IdProduct) product.checked = !checked;\r\n }\r\n });\r\n\r\n selectIdsProducts();\r\n };\r\n\r\n var getTemplate = function () {\r\n templatesService.GetTemplateById(idtemplate, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.Template = data;\r\n\r\n $scope.products.forEach(function (p) {\r\n p.checked = $scope.Template.ListProductIdsSelected.indexOf(p.IdProduct) >= 0;\r\n });\r\n\r\n // Si il y a autant de produits en bdd que dans le template, alors on coche le Tous\r\n if ($scope.Template.ListProductIdsSelected.length === $scope.products.length - 1) {\r\n $scope.products[0].checked = true;\r\n }\r\n\r\n selectIdsProducts();\r\n $scope.GetTags();\r\n }\r\n });\r\n };\r\n\r\n var selectIdsProducts = function () {\r\n idsProductsSelected = [];\r\n var productAll = $filter('filter')($scope.products, { IdProduct: -1 }, true)[0];\r\n $scope.inputProductLabel = productAll.checked ? productAll.Label : \"Sélectionnez les produits\";\r\n\r\n $scope.products.forEach(function (product) {\r\n if (product.checked && product.IdProduct !== -1) {\r\n idsProductsSelected.push(product.IdProduct);\r\n if ($scope.inputProductLabel !== productAll.Label)\r\n if ($scope.inputProductLabel === \"Sélectionnez les produits\")\r\n $scope.inputProductLabel = product.Label;\r\n else\r\n $scope.inputProductLabel += \", \" + product.Label;\r\n }\r\n });\r\n };\r\n\r\n function getProducts(callback) {\r\n productsService.GetAllProductsLight(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.products = data;\r\n $scope.products.splice(0, 0, { Label: $rootScope.globalLabels.AllItems, IdProduct: -1 });\r\n\r\n if (callback)\r\n callback();\r\n else {\r\n $scope.products.forEach(function (p) {\r\n p.checked = true;\r\n });\r\n selectIdsProducts();\r\n }\r\n }\r\n });\r\n }\r\n\r\n $rootScope.onRefresh = function () {\r\n Init();\r\n };\r\n\r\n Init();\r\n }]);\r\n","AgrimarketControllers.controller('editTemplateMailController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', '$http', '$location', 'currentUserFactory', 'configurationFactory', '$log', 'enumFactory', 'templateMailsService', 'tagsService',\r\n function ($scope, $rootScope, $routeParams, $sce, $filter, $http, $location, currentUserFactory, configurationFactory, $log, enumFactory, templateMailsService, tagsService) {\r\n\r\n\r\n var Init = function () {\r\n $scope.viewMode = (!$routeParams.viewMode && !$scope.viewMode) ? 'Contract' : $routeParams.viewMode;\r\n $scope.errorMessage = \"\";\r\n $scope.tagselected = \"\";\r\n $scope.enumRoles = angular.copy(enumFactory.ListRoles);\r\n $scope.enumTypeTemplateMails = enumFactory.ListRoles;\r\n $scope.template = {\r\n IdTypeTemplateMail: $routeParams.idTypeTemplateMail,\r\n IdRole: $routeParams.idRole,\r\n IdLanguage: $routeParams.idLanguage,\r\n Content: \"\"\r\n };\r\n $scope.GetTemplate();\r\n $scope.GetTypeTemplateMails();\r\n $scope.GetTags();\r\n $scope.Focus = '';\r\n };\r\n\r\n $scope.GetTemplate = function () {\r\n templateMailsService.GetTemplateByIdTypeTemplateMailAndIdRoleAndIdLanguage($scope.template.IdTypeTemplateMail, $scope.template.IdRole, $scope.template.IdLanguage, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.template = data;\r\n }\r\n });\r\n };\r\n\r\n $scope.GetTags = function () {\r\n tagsService.GetTagsForTemplatesMails($scope.template.IdTypeTemplateMail, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstTags = data;\r\n $scope.enumRoles = angular.copy(enumFactory.ListRoles);\r\n if (enumFactory.ListRoles[0].Name === \"Admin\" && ($scope.template.IdTypeTemplateMail === enumFactory.TypesMails[\"Mot de passe perdu\"] || $scope.template.IdTypeTemplateMail === enumFactory.TypesMails[\"Envoyer les identifiants\"]))\r\n $scope.enumRoles.splice(0, 1);\r\n if (enumFactory.ListRoles[1].Name === \"Agriculteur\" && $scope.template.IdTypeTemplateMail === enumFactory.TypesMails[\"Demande de tarif / disponibilité\"])\r\n $scope.enumRoles.splice(1, 1);\r\n }\r\n });\r\n };\r\n\r\n $scope.AddTag = function () {\r\n if ($scope.Focus && $scope.Focus == \"mailObject\") {\r\n $scope.AddTagInput($scope.tagselected);\r\n } else {\r\n CKEDITOR.instances.txtTemplate.insertHtml($scope.tagselected);\r\n }\r\n };\r\n\r\n $scope.AddTagInput = function (tag) {\r\n var el = $scope.ActiveElementMailObject;\r\n var start = el.selectionStart;\r\n var end = el.selectionEnd;\r\n var text = el.value;\r\n var before = text.substring(0, start);\r\n var after = text.substring(end, text.length);\r\n el.value = (before + tag + after);\r\n $scope.template.Object = el.value;\r\n };\r\n\r\n $scope.FocusMailObject = function () {\r\n $scope.Focus = 'mailObject';\r\n $scope.ActiveElementMailObject = document.activeElement;\r\n };\r\n \r\n $scope.GetTypeTemplateMails = function () {\r\n templateMailsService.GetAllTypeTemplateMails($scope.template.IdLanguage, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.typeTemplateMails = data.filter(function (element) { return element.IdTypeTemplateMail !== enumFactory.TypesMails[\"Rejet d'un ordre\"] && element.IdTypeTemplateMail !== enumFactory.TypesMails[\"Annulation partielle d'un ordre\"]; });\r\n }\r\n });\r\n };\r\n\r\n $scope.Cancel = function () {\r\n $location.path('/admin/editorial/view/mails/' + $routeParams.idLanguage + '/' + $scope.viewMode);\r\n };\r\n\r\n $scope.Save = function () {\r\n if (!$scope.CheckTemplate()) return;\r\n templateMailsService.SaveTemplateMail($scope.template, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if ($scope.txtBtnSave === \"Modifier\")\r\n $rootScope.succesMessageTemplate = \"Vos modifications ont bien été prises en compte.\";\r\n else\r\n $rootScope.succesMessageTemplate = \"Votre template a bien été pris en compte.\";\r\n $scope.Cancel();\r\n }\r\n });\r\n };\r\n\r\n $scope.CheckTemplate = function () {\r\n $scope.errorMessage = \"\";\r\n if (!$scope.template.Object)\r\n $scope.errorMessage += \"Veuillez renseigner un objet de mail.<br/>\";\r\n\r\n if (!$scope.template.IdTypeTemplateMail)\r\n $scope.errorMessage += \"Veuillez renseigner un type de mail.<br/>\";\r\n\r\n if (!$scope.template.IdRole)\r\n $scope.errorMessage += \"Veuillez renseigner un destinataire.<br/>\";\r\n\r\n if (!$scope.template.Content)\r\n $scope.errorMessage += \"Veuillez renseigner un contenu pour le mail.<br/>\";\r\n\r\n for (var i = 0; i < $scope.template.Content.length; i++) {\r\n if ($scope.template.Content[i] === \"{\" && $scope.template.Content[i + 1] === \"{\") {\r\n var key = \"{{\";\r\n for (var j = i + 2; i < $scope.template.Content.length; j++) {\r\n if ($scope.template.Content[j] === \"}\" && $scope.template.Content[j + 1] === \"}\") {\r\n key += \"}}\";\r\n\r\n if (key.indexOf(\" \") !== -1) { key = key.replace(\" \", \" \"); }\r\n if (key.indexOf('@') !== -1) {\r\n var params = key.substring(key.indexOf('@') + 1, key.indexOf(' }}'));\r\n var isNumber = params.match(\"[0-9]+\");\r\n\r\n if (params === 'X' || isNumber === null) {\r\n $scope.errorMessage = \"Une des balises insérée nécessite une valeur numérique : \" + key + \" Remplacez 'X' par un numéro.\";\r\n return false;\r\n }\r\n\r\n key = key.replace(params, 'X');\r\n }\r\n \r\n if ($filter('filter')($scope.lstTags, { \"KeyTag\": key }, true)[0] === undefined)\r\n $scope.errorMessage = \"Une des balises insérée n'existe pas pour ce template : \" + key;\r\n break;\r\n }\r\n key += $scope.template.Content[j];\r\n }\r\n }\r\n }\r\n\r\n if ($scope.errorMessage) {\r\n $scope.errorMessage = $sce.trustAsHtml($scope.errorMessage);\r\n return false;\r\n }\r\n else\r\n return true;\r\n };\r\n\r\n $scope.UploadImage = function (data) {\r\n CKEDITOR.instances.txtTemplate.insertHtml(\"<img src='\" + $filter('uploadLinkInline')(data.PrivateLabel) + \"'>\");\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n Init();\r\n };\r\n\r\n Init();\r\n }]);","AgrimarketControllers.controller('comMarketInfoController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', '$http', '$location', 'enumFactory', 'communicationMarketInfoService', 'colonnesCommunicationMarketInfo', '$q',\r\nfunction ($scope, $rootScope, $routeParams, $sce, $filter, $http, $location, enumFactory, communicationMarketInfoService, colonnesCommunicationMarketInfo, $q) {\r\n\r\n $scope.enumRoles = enumFactory.Roles;\r\n\r\n var init = function () {\r\n $scope.FirstLoad = true;\r\n $scope.tableCommunicationMarketInfoDataVisible = colonnesCommunicationMarketInfo.data.DataVisible.split(',');\r\n $scope.tableCommunicationMarketInfoLibelle = colonnesCommunicationMarketInfo.data.ColumnName.split(',');\r\n $scope.maxCommunicationMarketInfo = 10;\r\n $scope.communicationMarketInfoPageNo = 1;\r\n $scope.dataCommunicationMarketInfo = {};\r\n $scope.dataCommunicationMarketInfo.reverse = false;\r\n $scope.dataCommunicationMarketInfo.sortKey = \"Label\";\r\n $scope.idCommunicationMarketInfoSelected = \"\";\r\n $scope.searchLabelCommunicationMarketInfotring = \"\";\r\n $scope.GetAllCommunicationMarketInfos();\r\n $scope.msgConf = $routeParams.msgConf;\r\n };\r\n\r\n $scope.$watch('searchLabelCommunicationMarketInfotring', function (newValue, oldValue) {\r\n if (!$scope.FirstLoad && ((!newValue) || newValue.length >= 3 && !$scope.idCommunicationMarketInfoSelected)) {\r\n $scope.idCommunicationMarketInfoSelected = \"\";\r\n $scope.FilterCommunicationMarketInfo();\r\n }\r\n });\r\n\r\n $scope.GetAllCommunicationMarketInfos = function () {\r\n communicationMarketInfoService.GetAllCommunicationMarketInfoPaginate($scope.idCommunicationMarketInfoSelected, $scope.searchLabelCommunicationMarketInfotring, $scope.maxCommunicationMarketInfo, $scope.communicationMarketInfoPageNo, $scope.dataCommunicationMarketInfo.sortKey, $scope.dataCommunicationMarketInfo.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstCommunicationMarketInfo = data.ListVm;\r\n $scope.totalCommunicationMarketInfo = data.Total;\r\n $scope.FirstLoad = false;\r\n }\r\n });\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.msgConf = null;\r\n $scope.dataCommunicationMarketInfo.sortKey = sortKey;\r\n $scope.dataCommunicationMarketInfo.reverse = reverse;\r\n $scope.GetAllCommunicationMarketInfos();\r\n };\r\n\r\n $scope.GetData = function (pageNo) {\r\n $scope.msgConf = null;\r\n $scope.communicationMarketInfoPageNo = pageNo;\r\n $scope.GetAllCommunicationMarketInfos();\r\n };\r\n\r\n $scope.GetCommunicationMarketInfoSelected = function (contentSelected) {\r\n if (contentSelected) {\r\n $scope.idCommunicationMarketInfoSelected = contentSelected.originalObject.Id;\r\n $scope.FilterCommunicationMarketInfo();\r\n }\r\n };\r\n\r\n $scope.SearchCommunicationMarketInfoByAutoComplete = function (searchString) {\r\n var defered = $q.defer();\r\n communicationMarketInfoService.GetItemsCommunicationMarketInfoByAutoComplete(searchString, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n defered.reject(status);\r\n } \r\n } else {\r\n defered.resolve(data);\r\n }\r\n\r\n });\r\n return defered.promise;\r\n };\r\n\r\n $scope.FilterCommunicationMarketInfo = function () {\r\n $scope.errorMessageContentInfosMarket = \"\";\r\n $scope.GetAllCommunicationMarketInfos();\r\n $scope.msgConf = null;\r\n };\r\n\r\n $scope.DeleteComMarketInfo = function (idCommunicationMarketInfo) {\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n communicationMarketInfoService.DeleteCommunicationMarketInfo(idCommunicationMarketInfo, $scope.idCommunicationMarketInfoSelected, $scope.searchLabelCommunicationMarketInfotring, $scope.maxCommunicationMarketInfo, $scope.communicationMarketInfoPageNo, $scope.dataCommunicationMarketInfo.sortKey, $scope.dataCommunicationMarketInfo.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } \r\n } else {\r\n $scope.successMessage = \"La communication a bien été supprimé.\";\r\n $scope.lstCommunicationMarketInfo = data.ListVm;\r\n $scope.totalCommunicationMarketInfo = data.Total;\r\n }\r\n });\r\n };\r\n\r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('saveComMarketInfoController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', '$http', '$location', 'enumFactory', 'communicationMarketInfoService', 'configurationFactory', \r\n function ($scope, $rootScope, $routeParams, $sce, $filter, $http, $location, enumFactory, communicationMarketInfoService, configurationFactory) {\r\n\r\n $scope.forceLoad = false;\r\n $scope.comMarketInfo = {}; \r\n $scope.idComMarketInfoSelected = $routeParams.id ? $routeParams.id : 0;\r\n $scope.weekDays = [];\r\n $scope.monthDays = [];\r\n $scope.enumTypeSends = enumFactory.TypeSends;\r\n\r\n var setWeekAndMonthDays = function() {\r\n for (var i = 1; i <= 31; i++) {\r\n $scope.monthDays.push({ id: i, value: i });\r\n }\r\n $scope.weekDays.push({ id: 1, value: 'Lundi' });\r\n $scope.weekDays.push({ id: 2, value: 'Mardi' });\r\n $scope.weekDays.push({ id: 3, value: 'Mercredi' });\r\n $scope.weekDays.push({ id: 4, value: 'Jeudi' });\r\n $scope.weekDays.push({ id: 5, value: 'Vendredi' });\r\n };\r\n var init = function () { \r\n communicationMarketInfoService.GetById($scope.idComMarketInfoSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else { \r\n $scope.comMarketInfo = data;\r\n setWeekAndMonthDays();\r\n $scope.forceLoad = true;\r\n }\r\n });\r\n };\r\n\r\n var checkComMarketInfoToSave = function() {\r\n $scope.errorMessage = \"\";\r\n if (!$scope.comMarketInfo.Label) {\r\n $scope.errorMessage = \"Veuillez renseigner le nom du PDF.<br />\";\r\n }\r\n if (!$scope.comMarketInfo.Content) {\r\n $scope.errorMessage = \"Veuillez renseigner un contenu.<br />\";\r\n }\r\n if ($scope.comMarketInfo.LstGroupContactSelecteds.length === 0) {\r\n $scope.errorMessage += \"Veuillez sélectionner au moins un groupe de contact.<br />\";\r\n }\r\n if (!$scope.comMarketInfo.IdTypeSend) {\r\n $scope.errorMessage += \"Veuillez renseigner le type d'envoi.<br />\";\r\n } else {\r\n if (!$scope.comMarketInfo.HourSend && $scope.comMarketInfo.IdTypeSend !== enumFactory.TypeSends.Immediat) {\r\n $scope.errorMessage += \"Veuillez renseigner l'heure.<br />\";\r\n }\r\n if ($scope.comMarketInfo.IdTypeSend === enumFactory.TypeSends.Hebdomadaire && !$scope.comMarketInfo.DayOfWeekSend) {\r\n $scope.errorMessage += \"Veuillez renseigner le jour de la semaine.<br />\";\r\n }\r\n if ($scope.comMarketInfo.IdTypeSend === enumFactory.TypeSends.Mensuel && !$scope.comMarketInfo.DayOfMonthSend) {\r\n $scope.errorMessage += \"Veuillez renseigner le jour.<br />\";\r\n }\r\n }\r\n };\r\n\r\n $scope.Save = function () {\r\n checkComMarketInfoToSave();\r\n if ($scope.errorMessage) {\r\n return;\r\n }\r\n\r\n $scope.disabledButtonActions = true;\r\n\r\n communicationMarketInfoService.Save($scope.comMarketInfo, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if ($scope.comMarketInfo.IdTypeSend === enumFactory.TypeSends.Immediat)\r\n $location.path(\"/admin/editorial/comMarketInfo/msgConf\");\r\n else {\r\n $location.path(\"/admin/editorial/comMarketInfo\");\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.AddTag = function() {\r\n CKEDITOR.instances.txtComMarketInfoContent.insertHtml($scope.tagSelected);\r\n };\r\n\r\n $scope.toogleAllElementsLeft = function () {\r\n $scope.allSelectedLeft = !$scope.allSelectedLeft;\r\n $.each($scope.comMarketInfo.LstGroupContacts, function (index, item) {\r\n item.checked = $scope.allSelectedLeft;\r\n });\r\n };\r\n\r\n $scope.toogleAllElementsRight = function () {\r\n $scope.allSelectedRight = !$scope.allSelectedRight;\r\n $.each($scope.comMarketInfo.LstGroupContactSelecteds, function (index, item) {\r\n item.checked = $scope.allSelectedRight;\r\n });\r\n };\r\n\r\n $scope.AddToSelectedGroups = function () {\r\n $scope.allSelectedLeft = false;\r\n $scope.allSelectedRight = false;\r\n\r\n $.each($scope.comMarketInfo.LstGroupContacts, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.comMarketInfo.LstGroupContactSelecteds.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.comMarketInfo.LstGroupContactSelecteds, function (index, item) {\r\n var indexItem = $scope.comMarketInfo.LstGroupContacts.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.comMarketInfo.LstGroupContacts.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $scope.DeleteInSelectedGroups = function (all) {\r\n $scope.allSelectedLeft = false;\r\n $scope.allSelectedRight = false;\r\n\r\n $.each($scope.comMarketInfo.LstGroupContactSelecteds, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.comMarketInfo.LstGroupContacts.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.comMarketInfo.LstGroupContacts, function (index, item) {\r\n var indexItem = $scope.comMarketInfo.LstGroupContactSelecteds.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.comMarketInfo.LstGroupContactSelecteds.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $scope.UploadImage = function (data) {\r\n CKEDITOR.instances.txtComMarketInfoContent.insertHtml(\"<img src='\" + $filter('uploadLinkInline')(data.PrivateLabel) + \"'>\");\r\n };\r\n\r\n init();\r\n}]);\r\n","AgrimarketControllers.controller('alertMailController', ['$scope', '$rootScope', '$routeParams', '$sce', '$location', 'alertMailService', 'groupContactService', 'colonnesAlertMail',\r\nfunction ($scope, $rootScope, $routeParams, $sce, $location, alertMailService, groupContactService, colonnesAlertMail) {\r\n\r\n $scope.viewMode = \"Enabled\";\r\n $scope.labelButtonEnableOrDisableAlert = $rootScope.editableObjectsFactory.EditableObjects.Admin_AlertMail_Button_Disable.Content;\r\n $scope.tableAlertMailDataVisible = colonnesAlertMail.data.DataVisible.split(',');\r\n $scope.tableAlertMailLibelle = colonnesAlertMail.data.ColumnName.split(',');\r\n\r\n $scope.subTabAlertEnable = $rootScope.editableObjectsFactory.EditableObjects.Admin_AlertMail_SubTab_AlertEnable.Content;\r\n $scope.subTabAlertDisable = $rootScope.editableObjectsFactory.EditableObjects.Admin_AlertMail_SubTab_AlertDisable.Content;\r\n $scope.buttonAddAlertMail = $rootScope.editableObjectsFactory.EditableObjects.Admin_AlertMail_Button_AddAlert.Content;\r\n $scope.popUpDeleteTitle = $rootScope.editableObjectsFactory.EditableObjects.Admin_AlertMail_PopUpDelete_Title.Content;\r\n $scope.popUpDeleteText = $rootScope.editableObjectsFactory.EditableObjects.Admin_AlertMail_PopUpDelete_Text.Content;\r\n\r\n\r\n var init = function () { \r\n $scope.maxAlertMail = 10;\r\n $scope.alertMailPageNo = 1;\r\n $scope.dataAlertMail = {};\r\n $scope.dataAlertMail.reverse = false;\r\n $scope.dataAlertMail.sortKey = \"Label\";\r\n $scope.alertMailAction = {\r\n ListIdAlertMail: [],\r\n ActivatedAlertMail: null,\r\n };\r\n $scope.GetAlertMails();\r\n };\r\n\r\n $scope.GetAlertMails = function () {\r\n alertMailService.GetAlertMailsPaginate($scope.viewMode === \"Enabled\", $scope.idGroupContactSelected, $scope.maxAlertMail, $scope.alertMailPageNo, $scope.dataAlertMail.sortKey, $scope.dataAlertMail.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstAlertMail = data.ListVm;\r\n $scope.totalAlertMail = data.Total;\r\n }\r\n });\r\n };\r\n\r\n $scope.GetGroupContacts = function () {\r\n groupContactService.GetAll(function (data, status) {\r\n if (status === null)\r\n $scope.lstGroupContacts = data;\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n };\r\n \r\n $scope.SelectAll = function () {\r\n $scope.alertMailAction.ListIdAlertMail = [];\r\n\r\n if ($scope.allSelected) {\r\n $scope.lstAlertMail.forEach(function (alertMail) {\r\n $scope.alertMailAction.ListIdAlertMail.push(alertMail.IdAlertMail);\r\n });\r\n }\r\n };\r\n\r\n $scope.SelectAlertMail = function (idAlertMail) {\r\n if ($scope.allSelected) {\r\n $scope.allSelected = false;\r\n }\r\n\r\n var index = $scope.alertMailAction.ListIdAlertMail.indexOf(idAlertMail);\r\n if (index >= 0) {\r\n $scope.alertMailAction.ListIdAlertMail.splice(index, 1);\r\n } else {\r\n $scope.alertMailAction.ListIdAlertMail.push(idAlertMail);\r\n }\r\n };\r\n\r\n $scope.DisableOrEnableAlertMail = function (value) {\r\n $scope.errorMessage = \"\";\r\n $scope.alertMailAction.ActivatedAlertMail = value;\r\n alertMailService.EditAlertMailState($scope.alertMailAction, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if ($scope.allSelected) {\r\n $scope.allSelected = false;\r\n }\r\n init();\r\n }\r\n });\r\n };\r\n\r\n $scope.DeleteAlertMail = function (idAlertMail) {\r\n $scope.errorMessage = \"\";\r\n alertMailService.DeleteAlertMail(idAlertMail, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } \r\n } else {\r\n init();\r\n }\r\n });\r\n };\r\n\r\n $scope.FilterGroupContact = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.alertMailAction.ListIdAlertMail = [];\r\n init();\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.dataAlertMail.sortKey = sortKey;\r\n $scope.dataAlertMail.reverse = reverse;\r\n $scope.GetAlertMails();\r\n };\r\n\r\n $scope.GetData = function (pageNo) {\r\n $scope.alertMailPageNo = pageNo;\r\n $scope.GetAlertMails();\r\n };\r\n\r\n $scope.clickTab = function (tab) {\r\n $scope.errorMessage = \"\";\r\n $scope.idGroupContactSelected = \"\";\r\n $scope.viewMode = tab;\r\n $scope.labelButtonEnableOrDisableAlert = $scope.viewMode === \"Enabled\" ? $rootScope.editableObjectsFactory.EditableObjects.Admin_AlertMail_Button_Disable.Content : $rootScope.editableObjectsFactory.EditableObjects.Admin_AlertMail_Button_Enable.Content;\r\n init();\r\n };\r\n\r\n $scope.AddAlertMail = function () { \r\n $location.path('/admin/editorial/createAlertMail/-1'); \r\n };\r\n\r\n $scope.EditAlertMail = function (id) {\r\n $location.path('/admin/editorial/createAlertMail/' + id);\r\n };\r\n\r\n $scope.DuplicateAlertMail = function (id) {\r\n $location.path('/admin/editorial/duplicateAlertMail/' + id);\r\n };\r\n\r\n init();\r\n $scope.GetGroupContacts();\r\n }]);\r\n","AgrimarketControllers.controller('createAlertMailController', ['$scope', '$filter', '$rootScope', '$routeParams', '$http', '$location', '$q',\r\n \"tagsService\", 'configurationFactory', 'enumFactory', '$sce', 'groupContactService', 'operationService', 'alertMailService',\r\n function ($scope, $filter, $rootScope, $routeParams, $http, $location, $q, tagsService, configurationFactory, enumFactory, $sce, groupContactService,\r\n operationService, alertMailService) {\r\n\r\n $scope.disableSubmitedButton = false;\r\n $scope.errorMessage = \"\";\r\n $scope.currentAlertMail = {};\r\n var idAlertmail = $routeParams.idAlertMail;\r\n $scope.tagSelected = \"\";\r\n $scope.Focus = \"\";\r\n $scope.forceLoad = false;\r\n\r\n $scope.CancelLabel = $rootScope.editableObjectsFactory.EditableObjects.Cancel.Content;\r\n $scope.Validate = $rootScope.editableObjectsFactory.EditableObjects.Validate.Content;\r\n $scope.Admin_CreateAlertMail_TitleAdd = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_TitleAdd.Content;\r\n $scope.Admin_CreateAlertMail_TitleEdit = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_TitleEdit.Content;\r\n $scope.Step1 = $rootScope.editableObjectsFactory.EditableObjects.Step1.Content;\r\n $scope.Step2 = $rootScope.editableObjectsFactory.EditableObjects.Step2.Content;\r\n $scope.Step3 = $rootScope.editableObjectsFactory.EditableObjects.Step3.Content;\r\n $scope.Step = $rootScope.editableObjectsFactory.EditableObjects.Step.Content;\r\n $scope.Admin_CreateAlertMail_Breadrumb_GlobalInformation = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_Breadrumb_GlobalInformation.Content;\r\n $scope.Admin_CreateAlertMail_Breadrumb_DocumentChoice = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_Breadrumb_DocumentChoice.Content;\r\n $scope.Admin_CreateAlertMail_Breadrumb_MessageWriting = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_Breadrumb_MessageWriting.Content;\r\n $scope.SaveAndExit = $rootScope.editableObjectsFactory.EditableObjects.SaveAndExit.Content;\r\n $scope.Next = $rootScope.editableObjectsFactory.EditableObjects.Next.Content;\r\n $scope.Previous = $rootScope.editableObjectsFactory.EditableObjects.Previous.Content;\r\n $scope.Admin_CreateAlertMail_ProgrammationName = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_ProgrammationName.Content;\r\n $scope.Admin_CreateAlertMail_SelectGroupContact = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_SelectGroupContact.Content;\r\n $scope.Admin_CreateAlertMail_AvailableGroups = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_AvailableGroups.Content;\r\n $scope.Admin_CreateAlertMail_SelectAll = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_SelectAll.Content;\r\n $scope.Add = $rootScope.editableObjectsFactory.EditableObjects.Add.Content;\r\n $scope.Delete = $rootScope.editableObjectsFactory.EditableObjects.Delete.Content;\r\n $scope.Admin_CreateAlertMail_SelectedGroups = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_SelectedGroups.Content;\r\n $scope.Admin_CreateAlertMail_FrequencyToSend = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_FrequencyToSend.Content;\r\n $scope.Admin_CreateAlertMail_SelectHourToSend = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_SelectHourToSend.Content;\r\n $scope.Admin_CreateAlertMail_SelectDayOrDaysToSend = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_SelectDayOrDaysToSend.Content;\r\n $scope.Admin_CreateAlertMail_SelectDayToSend = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_SelectDayToSend.Content;\r\n $scope.The = $rootScope.editableObjectsFactory.EditableObjects.The.Content;\r\n $scope.OfEachMonth = $rootScope.editableObjectsFactory.EditableObjects.OfEachMonth.Content;\r\n $scope.Admin_CreateAlertMail_Table_ColunmName_OperationCode = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_Table_ColunmName_OperationCode.Content;\r\n $scope.Admin_CreateAlertMail_Table_ColunmName_OperationLabel = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_Table_ColunmName_OperationLabel.Content;\r\n $scope.Admin_CreateAlertMail_MailObject = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_MailObject.Content;\r\n $scope.Admin_CreateAlertMail_MailContent = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateAlertMail_MailContent.Content;\r\n $scope.SelectWithPoint = $rootScope.editableObjectsFactory.EditableObjects.SelectWithPoint.Content;\r\n\r\n $scope.init = function () {\r\n $scope.step = 1;\r\n $scope.ModeDupliquer = false;\r\n $scope.ModeEdition = false;\r\n\r\n if (idAlertmail === undefined || idAlertmail === null || idAlertmail == -1) {\r\n $scope.currentAlertMail.LstGroupContactSelecteds = [];\r\n $scope.currentAlertMail.LstOperationSelecteds = [];\r\n $scope.forceLoad = true;\r\n $scope.loadAllData();\r\n\r\n } else {\r\n alertMailService.GetAlertMailById(idAlertmail, function (data) {\r\n $scope.currentAlertMail = data;\r\n $scope.forceLoad = true;\r\n $scope.loadAllData();\r\n if ($location.path() == '/admin/editorial/duplicateAlertMail/' + idAlertmail) {\r\n $scope.ModeDupliquer = true;\r\n $scope.currentAlertMail.IdAlertMail = 0;\r\n $scope.currentAlertMail.IsDuplicate = true;\r\n } else {\r\n $scope.ModeEdition = true;\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.loadAllData = function () {\r\n $scope.getGroupContacts();\r\n $scope.getTypeSends();\r\n $scope.getDaysOfWeek();\r\n $scope.getWeekNumbers();\r\n };\r\n\r\n $scope.getTypeSends = function () {\r\n alertMailService.GetTypeSends(function (data, status) {\r\n if (status === null) {\r\n $scope.lstTypeSends = data;\r\n } else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n };\r\n\r\n $scope.getDaysOfWeek = function () {\r\n alertMailService.GetDaysOfWeek(function (data, status) {\r\n if (status === null) {\r\n $scope.lstDaysOfWeek = data;\r\n if ($scope.ModeDupliquer || $scope.ModeEdition) {\r\n $scope.SetCheckDaysOfWeek();\r\n }\r\n } else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n };\r\n\r\n $scope.getWeekNumbers = function () {\r\n alertMailService.GetWeekNumbers(function (data, status) {\r\n if (status === null) {\r\n $scope.lstWeekNumbers = data;\r\n } else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n };\r\n\r\n /* Début de la gestion des groupes de contacts */\r\n $scope.getGroupContacts = function () {\r\n groupContactService.GetAll(function (data, status) {\r\n if (status === null) {\r\n $scope.lstGroupContacts = {};\r\n $scope.lstGroupContacts = data;\r\n\r\n $scope.lstGroupContacts = $scope.lstGroupContacts.filter(function (element) { return $scope.currentAlertMail.LstGroupContactSelecteds.filter(function (e) { return e.IdGroupContact === element.IdGroupContact; }); });\r\n } else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n $scope.setSelectedList();\r\n });\r\n };\r\n\r\n\r\n $scope.toogleAllElementsLeftGroup = function () {\r\n $scope.master1 = !$scope.master1;\r\n $.each($scope.lstGroupContacts, function (index, item) {\r\n item.checked = $scope.master1;\r\n });\r\n };\r\n\r\n $scope.toogleAllElementsRightGroup = function () {\r\n $scope.master2 = !$scope.master2;\r\n $.each($scope.currentAlertMail.LstGroupContactSelecteds, function (index, item) {\r\n item.checked = $scope.master2;\r\n });\r\n };\r\n\r\n $scope.ListToSelectedGroup = function () {\r\n $scope.master1 = false;\r\n $scope.master2 = false;\r\n\r\n $.each($scope.lstGroupContacts, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.currentAlertMail.LstGroupContactSelecteds.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.currentAlertMail.LstGroupContactSelecteds, function (index, item) {\r\n var indexItem = $scope.lstGroupContacts.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.lstGroupContacts.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $scope.SelectedToListGroup = function () {\r\n $scope.master1 = false;\r\n $scope.master2 = false;\r\n\r\n $.each($scope.currentAlertMail.LstGroupContactSelecteds, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.lstGroupContacts.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.lstGroupContacts, function (index, item) {\r\n var indexItem = $scope.currentAlertMail.LstGroupContactSelecteds.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.currentAlertMail.LstGroupContactSelecteds.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $scope.setSelectedList = function () { \r\n if ($scope.currentAlertMail.LstGroupContactSelecteds === undefined || $scope.currentAlertMail.LstGroupContactSelecteds === null) {\r\n $scope.currentAlertMail.LstGroupContactSelecteds = [];\r\n } else {\r\n $scope.$watch(\"lstGroupContacts\", function (value) {\r\n if (value === undefined) return;\r\n $.each($scope.currentAlertMail.LstGroupContactSelecteds, function (index, item) {\r\n if ($scope.lstGroupContacts.indexOf($filter('filter')($scope.lstGroupContacts, { \"IdGroupContact\": Number(item.IdGroupContact) }, true)[0]) !== -1) {\r\n $scope.lstGroupContacts.splice($scope.lstGroupContacts.indexOf($filter('filter')($scope.lstGroupContacts, { \"IdGroupContact\": Number(item.IdGroupContact) }, true)[0]), 1);\r\n }\r\n });\r\n });\r\n }\r\n };\r\n /* Fin de la gestion des groupes de contacts */\r\n\r\n $scope.Cancel = function () {\r\n $scope.ReturnListingAlertMail();\r\n };\r\n\r\n $scope.ReturnListingAlertMail = function () {\r\n $location.path('/admin/editorial/alertMail/');\r\n };\r\n\r\n $scope.SetCheckDaysOfWeek = function () {\r\n if ($scope.currentAlertMail.DaysOfWeekSend) {\r\n $scope.currentAlertMail.DaysOfWeekSend.split('').forEach(function (value, index) {\r\n if (value == 1) {\r\n $scope.lstDaysOfWeek[index].Value = true;\r\n } \r\n });\r\n }\r\n\t };\r\n\r\n function ConvertSelectDaysOfWeekToString() {\r\n\t var deferred = $q.defer();\r\n\t var valueString = \"\";\r\n\t $scope.lstDaysOfWeek.forEach(function (item) {\r\n\t if (item.Value === true)\r\n\t valueString += \"1\";\r\n\t else\r\n\t valueString += \"0\";\r\n\t });\r\n\t deferred.resolve(valueString);\r\n\t return deferred.promise;\r\n\t }\r\n\r\n function GetSelectedOperation() {\r\n\t $scope.lstOperations.forEach(function (operation) {\r\n\t if (operation.Checked === true)\r\n $scope.currentAlertMail.LstOperationSelecteds.push(operation);\r\n\t });\r\n\t }\r\n\r\n function SetSelectedOperation() {\r\n\t $scope.lstOperations.forEach(function (operation) {\r\n\t if ($filter('filter')($scope.currentAlertMail.LstOperationSelecteds, { \"IdOperation\": Number(operation.IdOperation) }, true)[0]) {\r\n operation.Checked = true;\r\n }\r\n\t });\r\n\t }\r\n\r\n $scope.Check = function (step, isButtonSaveAndExit) {\r\n if (step)\r\n $scope.step = step;\r\n\r\n switch ($scope.step) {\r\n case 1:\r\n ConvertSelectDaysOfWeekToString().then(function (value) {\r\n $scope.currentAlertMail.DaysOfWeekSend = value;\r\n CheckStep($scope.step, isButtonSaveAndExit);\r\n });\r\n return;\r\n case 2:\r\n GetSelectedOperation();\r\n CheckStep($scope.step, isButtonSaveAndExit);\r\n return;\r\n case 3:\r\n CheckStep($scope.step, isButtonSaveAndExit);\r\n return;\r\n default:\r\n return;\r\n }\r\n };\r\n\r\n function CheckStep(step, isButtonSaveAndExit) {\r\n $scope.currentAlertMail.Step = step;\r\n alertMailService.CheckStep($scope.currentAlertMail, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.errorMessage = \"\";\r\n if (isButtonSaveAndExit || $scope.step == 3) {\r\n SaveAlertMail();\r\n } else {\r\n $scope.ManageStepAndData();\r\n }\r\n }\r\n });\r\n }\r\n\r\n $scope.ManageStepAndData = function () {\r\n $scope.NextStep();\r\n switch ($scope.step) {\r\n case 2:\r\n $scope.GetDataStep2();\r\n return;\r\n case 3:\r\n $scope.GetDataStep3();\r\n return;\r\n default:\r\n return;\r\n }\r\n };\r\n\r\n $scope.SaveStep = function (step) {\r\n $scope.Check(step, true);\r\n };\r\n\r\n function SaveAlertMail() {\r\n $scope.disableSubmitedButton = true;\r\n alertMailService.SaveAlertMail($scope.currentAlertMail, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.disableSubmitedButton = false;\r\n $scope.ReturnListingAlertMail();\r\n }\r\n });\r\n }\r\n\r\n $scope.NextStep = function (goToStep) {\r\n if (goToStep)\r\n $scope.step = goToStep;\r\n else\r\n $scope.step += 1;\r\n };\r\n\r\n $scope.GetDataStep2 = function () {\r\n operationService.GetOperationsForAlertMail(function (data, status) {\r\n if (status === null) {\r\n $scope.lstOperations = data;\r\n if ($scope.ModeDupliquer || $scope.ModeEdition) {\r\n SetSelectedOperation();\r\n $scope.currentAlertMail.LstOperationSelecteds = [];\r\n }\r\n } else if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n else {\r\n $scope.errorMessage = $sce.trustAsHtml(status);\r\n }\r\n });\r\n };\r\n\r\n $scope.GetDataStep3 = function () {\r\n tagsService.GetTagsForTemplatesMails(enumFactory.TypesMails[\"Alerte mail\"], function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstTags = data;\r\n }\r\n }); \r\n };\r\n\r\n $scope.PrevStep = function () {\r\n $scope.step -= 1;\r\n\r\n if ($scope.step == 2)\r\n $scope.currentAlertMail.LstOperationSelecteds = [];\r\n\r\n $scope.errorMessage = \"\";\r\n };\r\n\r\n $scope.AddTag = function (value) {\r\n if ($scope.Focus == \"mailObject\") {\r\n $scope.AddTagInput(value);\r\n } else {\r\n CKEDITOR.instances.mailContent.insertHtml(value);\r\n }\r\n };\r\n\r\n $scope.AddTagInput = function (tag) {\r\n var el = $scope.ActiveElementMailObject;\r\n var start = el.selectionStart;\r\n var end = el.selectionEnd;\r\n var text = el.value;\r\n var before = text.substring(0, start);\r\n var after = text.substring(end, text.length);\r\n el.value = (before + tag + after);\r\n $scope.currentAlertMail.MailObject = el.value;\r\n $scope.Focus = \"\";\r\n };\r\n\r\n $scope.FocusMailObject = function () {\r\n $scope.Focus = \"mailObject\";\r\n $scope.ActiveElementMailObject = document.activeElement;\r\n };\r\n\r\n $scope.init();\r\n }]);","AgrimarketControllers.controller('weatherDataController', ['$scope', '$rootScope', '$sce', 'accuWeatherCallService', 'colonnesAccuWeatherCall',\r\nfunction ($scope, $rootScope, $sce, accuWeatherCallService, colonnesAccuWeatherCall) {\r\n\r\n $scope.tableAccuWeatherCallDataVisible = colonnesAccuWeatherCall.data.DataVisible.split(',');\r\n $scope.tableAccuWeatherCallLibelle = colonnesAccuWeatherCall.data.ColumnName.split(',');\r\n\r\n $scope.buttonValidate = $rootScope.editableObjectsFactory.EditableObjects.Validate.Content;\r\n $scope.resultLabel = $rootScope.editableObjectsFactory.EditableObjects.Admin_AccuWheather_Result.Content;\r\n $scope.columnMonth = $rootScope.editableObjectsFactory.EditableObjects.Admin_AccuWheather_TableSumMonth_ColunmName_Month.Content;\r\n $scope.columnCallNumber = $rootScope.editableObjectsFactory.EditableObjects.Admin_AccuWheather_TableSumMonth_ColunmName_CallNumber.Content;\r\n $scope.buttonDetail = $rootScope.editableObjectsFactory.EditableObjects.Admin_AccuWheather_Details.Content;\r\n\r\n var init = function () { \r\n $scope.maxAccuWeatherCall = 10;\r\n $scope.accuWeatherCallPageNo = 1;\r\n $scope.showDetails = false;\r\n $scope.dataAccuWeatherCall = {};\r\n $scope.dataAccuWeatherCall.reverse = true;\r\n $scope.dataAccuWeatherCall.sortKey = \"CallDate\";\r\n $scope.GetFilterAccuWeatherCall();\r\n };\r\n\r\n $scope.GetAccuWeatherCalls = function () {\r\n $scope.loading = true;\r\n accuWeatherCallService.GetAccuWeatherCallsPaginate($scope.startDateFilter, $scope.endDateFilter, $scope.maxAccuWeatherCall, $scope.accuWeatherCallPageNo, $scope.dataAccuWeatherCall.sortKey, $scope.dataAccuWeatherCall.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstAccuWeatherCalls = data.ListVm;\r\n $scope.totalAccuWeatherCalls = data.Total;\r\n $scope.loading = false;\r\n }\r\n });\r\n };\r\n\r\n $scope.GetSumMonthAccuWeatherCalls = function () {\r\n accuWeatherCallService.GetSumMonthAccuWeatherCalls($scope.startDateFilter, $scope.endDateFilter,function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstSumMonthAccuWeatherCalls = data;\r\n }\r\n });\r\n };\r\n \r\n $scope.GetFilterAccuWeatherCall = function () {\r\n accuWeatherCallService.GetFilterAccuWeatherCall(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstMontsForFilter = data.ListMonth;\r\n $scope.startDateFilter = data.StartDate;\r\n $scope.endDateFilter = data.EndDate;\r\n $scope.GetSumMonthAccuWeatherCalls();\r\n if ($scope.showDetails) {\r\n $scope.GetAccuWeatherCalls();\r\n }\r\n }\r\n });\r\n };\r\n \r\n $scope.ValidateFilter = function () { \r\n $scope.GetSumMonthAccuWeatherCalls();\r\n if ($scope.showDetails) {\r\n $scope.GetAccuWeatherCalls();\r\n }\r\n };\r\n\r\n $scope.ShowTableAccuWheather = function() {\r\n if ($scope.showDetails) {\r\n $scope.GetAccuWeatherCalls();\r\n }\r\n };\r\n\r\n $scope.ClickDetails = function () { \r\n if ($scope.Details) {\r\n $scope.GetAccuWeatherCalls();\r\n }\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.dataAccuWeatherCall.sortKey = sortKey;\r\n $scope.dataAccuWeatherCall.reverse = reverse;\r\n $scope.GetAccuWeatherCalls();\r\n };\r\n\r\n $scope.GetData = function (pageNo) {\r\n $scope.accuWeatherCallPageNo = pageNo;\r\n $scope.GetAccuWeatherCalls();\r\n };\r\n\r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('editorialMobileController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', '$http', '$location', 'editableObjectsService', 'enumFactory', 'configurationFactory',\r\n function ($scope, $rootScope, $routeParams, $sce, $filter, $http, $location, editableObjectsService, enumFactory, configurationFactory) {\r\n\r\n $scope.urlMobile = $sce.trustAsResourceUrl(configurationFactory.Url['Mobile'] + '/loginEditionMode?idUser=' + $rootScope.DefaultUserEditionMode);\r\n\r\n window.addEventListener(\"message\", receiveMessage, false);\r\n function receiveMessage(event) {\r\n if (event.origin !== configurationFactory.Url['Mobile'])\r\n return;\r\n\r\n $scope.openPopEditableMobile(event.data);\r\n }\r\n\r\n //popup edition mobile\r\n $scope.openPopEditableMobile = function (key) {\r\n $scope.editableErrorMessage = \"\";\r\n\r\n $scope.editableObject = angular.copy($rootScope.editableObjectsFactory.getItemByKey(key));\r\n if ($scope.editableObject === undefined)\r\n $scope.editableObject = { 'IdEditableObject': 0, 'Key': key, 'IsVisible': true, 'IdTypeEditableObject': enumFactory.IdTypeEditableObject.Texte, 'Content': textDefault };\r\n $scope.mobileEditableObjectKey = key;\r\n $scope.$apply();\r\n\r\n var titlePopUp = angular.copy($scope.editableObject.Content);\r\n\r\n $(\"#popEditableMobile\").css(\"display\", \"block\");\r\n $(\"#popEditableMobile\").dialog({\r\n title: \"Edition du champ : \" + titlePopUp,\r\n modal: false,\r\n create: function () {\r\n $(this).closest('div.ui-dialog')\r\n .find('.ui-dialog-titlebar-close')\r\n .click(function (e) {\r\n $(\"#dialog-message\").empty();\r\n $scope.ClosePopEditableMobile(true);\r\n $scope.$apply();\r\n e.preventDefault();\r\n\r\n });\r\n }\r\n });\r\n };\r\n\r\n $scope.ClosePopEditableMobile = function (cancel) {\r\n $scope.editableObject = {};\r\n if (cancel) {\r\n if ($scope.editableObjectBeforeChange !== undefined) {\r\n $scope.editableObject.Content = $scope.editableObjectBeforeChange.Content;\r\n $scope.editableObject.IsVisible = $scope.editableObjectBeforeChange.IsVisible;\r\n }\r\n } \r\n $(\"#popEditableMobile\").dialog(\"close\");\r\n };\r\n\r\n $scope.SaveDataPopEditableMobile = function () {\r\n var dataToApi = {\r\n IdEditableObject: $scope.editableObject.IdEditableObject,\r\n IdTypeEditableObject: $scope.editableObject.IdTypeEditableObject,\r\n Content: $scope.editableObject.Content,\r\n Key: $scope.mobileEditableObjectKey,\r\n IsVisible: $scope.editableObject.IsVisible\r\n };\r\n editableObjectsService.SaveEditableObject(dataToApi, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.editableErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $rootScope.editableObjectsFactory.EditableObjects[$scope.mobileEditableObjectKey] = { 'IdEditableObject': data.IdEditableObject, 'Content': data.Content, 'IsVisible': data.IsVisible, 'ContentDefault': data.ContentDefault, 'IdTypeEditableObject': data.IdTypeEditableObject };\r\n var iframe = document.getElementById('iframeMobile');\r\n if (iframe) {\r\n iframe.contentWindow.postMessage($scope.mobileEditableObjectKey + '|' + $scope.editableObject.Content, '*');\r\n }\r\n $scope.ClosePopEditableMobile(false);\r\n }\r\n });\r\n };\r\n\r\n }]);\r\n","AgrimarketControllers.controller('offersController', ['$scope', '$rootScope', '$sce', '$location', '$filter', 'typeCommitmentsService', 'offerService', 'cropsService', 'productsService', 'typeQuotesService', 'typeOffersService', 'operationService', 'enumFactory', '$routeParams', 'compagnyService', 'groupContactService', 'parametersFactory', 'dateService', '$timeout', 'strikeService',\r\n function ($scope, $rootScope, $sce, $location, $filter, typeCommitmentsService, offerService, cropsService, productsService, typeQuotesService, typeOffersService, operationService, enumFactory, $routeParams, compagnyService, groupContactService, parametersFactory, dateService, $timeout, strikeService) {\r\n $scope.filterCrop = {};\r\n $scope.filterName = {};\r\n $scope.filterProduct = {};\r\n $scope.filterTypeQuote = {};\r\n $scope.filterTypeOffer = {};\r\n $scope.filterCompagny = {};\r\n $scope.filterMarket = {};\r\n $scope.filterComment = {};\r\n $scope.filterOperation = {};\r\n $scope.filterTypeCommitmentForSubscribe = {};\r\n $scope.showAllExpiryOffer = true;\r\n $scope.AddOffer = function () { $location.path('/admin/offer/createoffer/-1'); };\r\n $scope.enumFactory = enumFactory;\r\n $scope.parambUseIncidenceOffer = parametersFactory.Parameters.bUseIncidenceOffer.Value === \"1\";\r\n $scope.parambManageIncidenceBase = parametersFactory.Parameters.bManageIncidenceBase.Value === \"1\";\r\n $scope.paramBUseOperation = parametersFactory.Parameters.bUseOperation.Value === \"1\";\r\n $scope.IsUneal = $rootScope.paramNameCoop === enumFactory.Coops.Uneal ? true : false;\r\n $scope.parambUseNotificationPush = parametersFactory.Parameters.bUseNotificationPush.Value === \"1\";\r\n $scope.parambUseNotificationSms = parametersFactory.Parameters.bUseNotificationSms.Value === \"1\";\r\n $scope.moduleOptionActif = $rootScope.ModuleOption.Active;\r\n\r\n $scope.allSelected = false;\r\n $scope.offerAction = {\r\n LstIdOffer: [],\r\n IsDisable: null,\r\n };\r\n $scope.currentOfferUserIncidence = {};\r\n $scope.selectedUserAutoCompleteObject = {};\r\n $scope.TotalTonnage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step5_TotalTonnage.Content;\r\n $scope.TotalSurface = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step5_TotalSurface.Content;\r\n\r\n $scope.ActionOfferMessage_Add = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_ActionOfferMessage_AddMessage.Content;\r\n $scope.ActionOfferMessage_Edit = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_ActionOfferMessage_EditMessage.Content;\r\n $scope.ActionOfferMessage_Delete = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_ActionOfferMessage_DeleteMessage.Content;\r\n $scope.PopUpOfferMessage_Title = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpOfferMessage_Title.Content;\r\n\r\n $scope.bActiveDecomposeBase = parametersFactory.Parameters.bActiveDecomposeBase.Value === \"1\";\r\n $scope.parambActiveOfferGroupContactIncidence = parametersFactory.Parameters.bActiveOfferGroupContactIncidence.Value === \"1\";\r\n\r\n $scope.ActionOfferOption_RecalculateStrikes = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_ActionOfferOption_RecalculateStrikes.Content;\r\n $scope.ActionOfferOption_ShowStrikes = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_ActionOfferOption_ShowStrikes.Content;\r\n\r\n $scope.enumTypeOffer = enumFactory.TypeOffer;\r\n $scope.enumTypeCalculOption = enumFactory.TypeCalculOption;\r\n $scope.groupContactsMenuItems = [];\r\n var idsGroupContactChecked = [];\r\n\r\n var setFilters = function (callBack) {\r\n if ($rootScope.filtersListingOffers) {\r\n if ($rootScope.filtersListingOffers.filterCrop)\r\n $scope.filterCrop = $rootScope.filtersListingOffers.filterCrop;\r\n if ($rootScope.filtersListingOffers.filterProduct)\r\n $scope.filterProduct = $rootScope.filtersListingOffers.filterProduct;\r\n if ($rootScope.filtersListingOffers.filterTypeQuote)\r\n $scope.filterTypeQuote = $rootScope.filtersListingOffers.filterTypeQuote;\r\n if ($rootScope.filtersListingOffers.filterTypeOffer)\r\n $scope.filterTypeOffer = $rootScope.filtersListingOffers.filterTypeOffer;\r\n if ($rootScope.filtersListingOffers.filterOperation)\r\n $scope.filterOperation = $rootScope.filtersListingOffers.filterOperation;\r\n if ($rootScope.filtersListingOffers.filterCompagny)\r\n $scope.filterCompagny = $rootScope.filtersListingOffers.filterCompagny;\r\n if ($rootScope.filtersListingOffers.idStatus)\r\n $scope.idStatus = $rootScope.filtersListingOffers.idStatus;\r\n if ($rootScope.filtersListingOffers.filterMarket)\r\n $scope.filterMarket = $rootScope.filtersListingOffers.filterMarket;\r\n if ($rootScope.filtersListingOffers.filterTypeCommitmentForSubscribe)\r\n $scope.filterTypeCommitmentForSubscribe = $rootScope.filtersListingOffers.filterTypeCommitmentForSubscribe;\r\n }\r\n callBack();\r\n };\r\n\r\n var getAllOffersCallback = function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.allOffers = data;\r\n $scope.lstMarketWsd = [];\r\n $scope.offerGroupContactIncidenceVm = {};\r\n data.forEach(function (o) {\r\n if (o.IdMarketWSD && $scope.lstMarketWsd.indexOf({ IdMarketWSD: o.IdMarketWSD, LabelMarket: o.LabelMarket }) === -1)\r\n $scope.lstMarketWsd.push({ IdMarketWSD: o.IdMarketWSD, LabelMarket: o.LabelMarket });\r\n\r\n if (o.ListGroupContactVm && o.ListGroupContactVm.length > 0) {\r\n\r\n var grContactShow = 0;\r\n var showed = 5;\r\n var lenghtGroupContact = o.ListGroupContactVm.length;\r\n var tooltipTextGrContact = \"\";\r\n var tooltipDataGrContact = \"\";\r\n\r\n var groupContactsString = '<ul>';\r\n o.ListGroupContactVm.forEach(function (itemGrp) {\r\n\r\n if (grContactShow < showed) {\r\n groupContactsString += '<li>' + itemGrp.Label + \"</li>\";\r\n }\r\n grContactShow++;\r\n\r\n if (grContactShow === showed) {\r\n groupContactsString += '</ul>';\r\n\r\n if (lenghtGroupContact - showed > 0) {\r\n tooltipTextGrContact += \"+\" + lenghtGroupContact - showed + \" autres régions\";\r\n }\r\n }\r\n\r\n if (grContactShow > showed) {\r\n tooltipDataGrContact += itemGrp.Label + \"<br>\";\r\n }\r\n\r\n });\r\n groupContactsString += '</ul>';\r\n o.GroupContactsString = $sce.trustAsHtml(groupContactsString);\r\n o.tooltipDataGrContact = $sce.trustAsHtml(tooltipDataGrContact);\r\n o.tooltipTextGrContact = $sce.trustAsHtml(tooltipTextGrContact);\r\n }\r\n\r\n if (o.ListVarieryOfferVm && o.ListVarieryOfferVm.length > 0) {\r\n o.VarietiesString = '<ul>';\r\n o.ListVarieryOfferVm.forEach(function (itemVariety) {\r\n o.VarietiesString += '<li>' + itemVariety.Label + \"</li>\";\r\n });\r\n o.VarietiesString += '</ul>';\r\n }\r\n\r\n if (o.ListOfferGroupContactTonnageVm && o.ListOfferGroupContactTonnageVm.length > 0 && o.IsTonnageLimit) {\r\n var offerGrQuantityShow = 0;\r\n var sumQuantity = 0;\r\n var showedQuantity = 5;\r\n var lenghtOfferQuantity = o.ListOfferGroupContactTonnageVm.length;\r\n var tooltipTextQuantity = \"\";\r\n var tooltipDataQuantity = \"\";\r\n\r\n o.ListOfferGroupContactTonnageVm.forEach(function (item) {\r\n sumQuantity += item.QuantityLimit;\r\n });\r\n\r\n var offerGroupContactQuantitystring = '<ul>';\r\n var typeQuantityText = o.IdTypeOffer === $scope.enumTypeOffer.EngagementSurface ? $scope.TotalSurface : $scope.TotalTonnage;\r\n offerGroupContactQuantitystring += '<li>' + typeQuantityText + \" \" + sumQuantity + \"</li>\";\r\n o.ListOfferGroupContactTonnageVm.forEach(function (itemOfferGroupContactQuantity) {\r\n if (offerGrQuantityShow < showedQuantity) {\r\n offerGroupContactQuantitystring += '<li>' + itemOfferGroupContactQuantity.Label + \" : \" + itemOfferGroupContactQuantity.QuantityLimit + \"</li>\";\r\n }\r\n offerGrQuantityShow++;\r\n\r\n if (offerGrQuantityShow === showedQuantity) {\r\n offerGroupContactQuantitystring += '</ul>';\r\n\r\n if (lenghtOfferQuantity - showedQuantity > 0) {\r\n tooltipTextQuantity += \"+\" + lenghtOfferQuantity - showedQuantity + \" autres régions\";\r\n }\r\n }\r\n\r\n if (offerGrQuantityShow > showedQuantity) {\r\n tooltipDataQuantity += itemOfferGroupContactQuantity.Label + \" : \" + itemOfferGroupContactQuantity.QuantityLimit + \"<br>\";\r\n }\r\n });\r\n o.OfferGroupContactQuantitystring = $sce.trustAsHtml(offerGroupContactQuantitystring);\r\n o.tooltipDataQuantity = $sce.trustAsHtml(tooltipDataQuantity);\r\n o.tooltipTextQuantity = $sce.trustAsHtml(tooltipTextQuantity);\r\n } else if (o.QuantityLeft) {\r\n o.quantityLeft = o.QuantityLeft;\r\n }\r\n\r\n if (o.QuotesExpiryOfferManagerVM && o.QuotesExpiryOfferManagerVM.length > 0) {\r\n o.QuotesExpiryOfferManagerVM.forEach(function (item) {\r\n item.PaymentDate = $filter('date')(item.PaymentDate, 'dd/MM/yyyy');\r\n });\r\n }\r\n o.PaymentDate = $filter('date')(o.PaymentDate, 'dd/MM/yyyy');\r\n\r\n // Gestion des incidences par couple Offre / GroupeContact\r\n if ($scope.parambActiveOfferGroupContactIncidence && o.ListOfferGroupContactPricesVm && o.ListOfferGroupContactPricesVm.length > 0) {\r\n o.ListOfferGroupContactPricesVm.forEach(function (itemGrp) {\r\n $scope.offerGroupContactIncidenceVm[itemGrp.IdOffer + '_' + itemGrp.IdGroupContact] = itemGrp.Incidence;\r\n });\r\n }\r\n });\r\n }\r\n selectIdsGroupContact();\r\n setFilters($scope.ChangeElementSelected);\r\n $scope.loading = false;\r\n };\r\n\r\n\r\n if ($routeParams.idStatus !== undefined) {\r\n $scope.idStatus = $routeParams.idStatus;\r\n } else\r\n $scope.idStatus = enumFactory.OfferStatus.Enabled;\r\n\r\n $scope.GetAllOffers = function () {\r\n $scope.loading = true;\r\n if ($rootScope.filtersListingOffers) {\r\n var idCrop = $rootScope.filtersListingOffers && $rootScope.filtersListingOffers.filterCrop && $rootScope.filtersListingOffers.filterCrop.IdCrop ? $rootScope.filtersListingOffers.filterCrop.IdCrop : undefined;\r\n var idProduct = $rootScope.filtersListingOffers && $rootScope.filtersListingOffers.filterProduct && $rootScope.filtersListingOffers.filterProduct.IdProduct ? $rootScope.filtersListingOffers.filterProduct.IdProduct : undefined;\r\n offerService.GetAllOffers($scope.idStatus, idCrop, idProduct, getAllOffersCallback);\r\n }\r\n else {\r\n offerService.GetDefaultFilters(function (data) {\r\n\r\n var idCrop = data.IdCrop ? data.IdCrop : undefined;\r\n var idProduct = data.IdProduct ? data.IdProduct : undefined;\r\n\r\n if (idCrop) {\r\n $rootScope.idCropSelected = data.IdCrop;\r\n $scope.filterCrop.IdCrop = data.IdCrop;\r\n }\r\n\r\n if (idProduct) {\r\n $rootScope.idProductSelected = data.IdProduct;\r\n $scope.filterProduct.IdProduct = data.IdProduct;\r\n }\r\n\r\n offerService.GetAllOffers($scope.idStatus, idCrop, idProduct, getAllOffersCallback);\r\n });\r\n }\r\n };\r\n\r\n cropsService.GetCropsInOffers(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.filterCrop.IdCrop = $rootScope.idCropSelected;\r\n $scope.crops = angular.copy(data);\r\n }\r\n });\r\n\r\n productsService.GetProductsInOffers(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.filterProduct.IdProduct = $rootScope.idProductSelected;\r\n $scope.products = angular.copy(data);\r\n }\r\n });\r\n\r\n typeQuotesService.GetTypeQuotesInOffers(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else\r\n $scope.typeQuotes = angular.copy(data);\r\n });\r\n\r\n operationService.GetOperationsInOffers(function (data,status) {\r\n if (status !== null) {\r\n if (status !== 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else\r\n $scope.Operations = angular.copy(data); \r\n });\r\n\r\n typeOffersService.GetTypeOffers(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else\r\n $scope.typeOffers = angular.copy(data);\r\n });\r\n\r\n groupContactService.GetGroupContactsInOffers(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else\r\n $scope.lstGroupContact = angular.copy(data);\r\n\r\n angular.copy($scope.lstGroupContact).forEach(function (item) {\r\n $scope.groupContactsMenuItems.push({ groupContact: item.Label, idGroupContact: item.IdGroupContact, checked: true });\r\n });\r\n });\r\n\r\n $scope.filterByClickGroupContactsMenuItem = function (idGroupContact, checked) {\r\n $scope.groupContactsMenuItems.forEach(function (groupContact) {\r\n if (idGroupContact === -1) groupContact.checked = !checked; // Si tous\r\n else {\r\n if (groupContact.idGroupContact === -1) groupContact.checked = false;\r\n if (idGroupContact == groupContact.idGroupContact) groupContact.checked = !checked;\r\n }\r\n });\r\n\r\n selectIdsGroupContact();\r\n setGroupContactMultiSelectValues();\r\n setFilters($scope.ChangeElementSelected);\r\n };\r\n\r\n var selectIdsGroupContact = function () {\r\n idsGroupContactChecked = [];\r\n $scope.groupContactsMenuItems.forEach(function (groupContact) {\r\n if (groupContact.checked && groupContact.idGroupContact !== -1) idsGroupContactChecked.push(groupContact.idGroupContact);\r\n });\r\n };\r\n\r\n var setGroupContactMultiSelectValues = function () {\r\n $scope.groupContactLabel = \"Sélectionnez un groupe contact\";\r\n var groupContactAll = $filter('filter')($scope.groupContactsMenuItems, { idGroupContact: -1 }, true)[0];\r\n if (groupContactAll.checked) $scope.groupContactLabel = groupContactAll.groupContact;\r\n else {\r\n $scope.groupContactsMenuItems.forEach(function (groupContactsMenuItem) {\r\n if (groupContactsMenuItem.checked) {\r\n if ($scope.groupContactLabel === \"Sélectionnez un groupe contact\") {\r\n $scope.groupContactLabel = groupContactsMenuItem.groupContact;\r\n } else {\r\n $scope.groupContactLabel += \", \" + groupContactsMenuItem.groupContact;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n typeCommitmentsService.GetTypeCommitments(function (data, status) {\r\n if (status === null) {\r\n $scope.lstTypeCommitments = data;\r\n }\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n if ($rootScope.ModuleMultipleCompagnies.Active) {\r\n compagnyService.GetAll(function (data, status) {\r\n if (status === null)\r\n $scope.lstCompagnies = data;\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n }\r\n \r\n $scope.ChangeElementSelected = function (reloadOffers) {\r\n $scope.offerAction.LstIdOffer = [];\r\n $scope.offers = [];\r\n $scope.allSelected = false;\r\n\r\n var filtreGeneral = $scope.allOffers;\r\n $rootScope.idCropSelected = $scope.filterCrop.IdCrop;\r\n $rootScope.idProductSelected = $scope.filterProduct.IdProduct;\r\n\r\n if (!$rootScope.filtersListingOffers) {\r\n $rootScope.filtersListingOffers = {};\r\n }\r\n\r\n if ($scope.filterCrop.IdCrop) {\r\n filtreGeneral = $filter('filter')(filtreGeneral, { IdCrop: parseInt($scope.filterCrop.IdCrop) }, true);\r\n $rootScope.filtersListingOffers.filterCrop = $scope.filterCrop;\r\n }\r\n if ($scope.filterProduct.IdProduct !== undefined && $scope.filterProduct.IdProduct !== null) {\r\n filtreGeneral = $filter('filter')(filtreGeneral, { IdProduct: parseInt($scope.filterProduct.IdProduct) }, true);\r\n $rootScope.filtersListingOffers.filterProduct = $scope.filterProduct;\r\n }\r\n if ($scope.filterTypeQuote.IdTypeQuote !== undefined && $scope.filterTypeQuote.IdTypeQuote !== null) {\r\n filtreGeneral = $filter('filter')(filtreGeneral, { IdTypeQuote: parseInt($scope.filterTypeQuote.IdTypeQuote) }, true);\r\n $rootScope.filtersListingOffers.filterTypeQuote = $scope.filterTypeQuote;\r\n }\r\n if ($scope.filterTypeOffer.IdTypeOffer !== undefined && $scope.filterTypeOffer.IdTypeOffer !== null) {\r\n filtreGeneral = $filter('filter')(filtreGeneral, { IdTypeOffer: parseInt($scope.filterTypeOffer.IdTypeOffer) }, true);\r\n $rootScope.filtersListingOffers.filterTypeOffer = $scope.filterTypeOffer;\r\n }\r\n if ($scope.filterOperation.IdOperation !== undefined && $scope.filterOperation.IdOperation !== null) {\r\n filtreGeneral = $filter('filter')(filtreGeneral, { IdOperation: parseInt($scope.filterOperation.IdOperation) }, true);\r\n $rootScope.filtersListingOffers.filterOperation = $scope.filterOperation;\r\n }\r\n if ($scope.filterCompagny.IdCompagny !== undefined && $scope.filterCompagny.IdCompagny !== null) {\r\n filtreGeneral = $filter('filter')(filtreGeneral, { IdCompagny: parseInt($scope.filterCompagny.IdCompagny) }, true);\r\n $rootScope.filtersListingOffers.filterCompagny = $scope.filterCompagny;\r\n }\r\n if ($scope.idStatus !== undefined && $scope.idStatus !== null) {\r\n filtreGeneral = $filter('filter')(filtreGeneral, { IdStatus: $scope.idStatus }, true);\r\n $rootScope.filtersListingOffers.idStatus = $scope.idStatus;\r\n }\r\n if ($scope.filterMarket.IdMarketWSD) {\r\n filtreGeneral = $filter('filter')(filtreGeneral, { IdMarketWSD: parseInt($scope.filterMarket.IdMarketWSD) }, true);\r\n $rootScope.filtersListingOffers.filterMarket = $scope.filterMarket;\r\n }\r\n if ($scope.filterTypeCommitmentForSubscribe.IdTypeCommitmentForSubscribe) {\r\n filtreGeneral = $filter('filter')(filtreGeneral, { IdTypeCommitmentForSubscribe: parseInt($scope.filterTypeCommitmentForSubscribe.IdTypeCommitmentForSubscribe) }, true);\r\n $rootScope.filtersListingOffers.filterTypeCommitmentForSubscribe = $scope.filterTypeCommitmentForSubscribe;\r\n }\r\n if ($scope.filterName.Label) {\r\n filtreGeneral = $filter('filter')(filtreGeneral, { Label: $scope.filterName.Label });\r\n $rootScope.filtersListingOffers.filterName = $scope.filterName;\r\n }\r\n\r\n if ($scope.filterComment.Comment) {\r\n filtreGeneral = $filter('filter')(filtreGeneral, { Comment: $scope.filterComment.Comment });\r\n $rootScope.filtersListingOffers.filterComment = $scope.filterComment;\r\n }\r\n\r\n if ($scope.idStatus == enumFactory.OfferStatus.Enabled) {\r\n $scope.buttonDesactivateOfferName = \"Désactiver des offres\";\r\n $scope.titlePopUpDesactivateOffer = \"Désactiver des offres\";\r\n $scope.textPopUpDesactivateOffer = \"Êtes-vous sûr de vouloir désactiver ces offres ?\";\r\n }\r\n else if ($scope.idStatus == enumFactory.OfferStatus.Disabled) {\r\n $scope.buttonDesactivateOfferName = \"Réactiver des offres\";\r\n $scope.titlePopUpDesactivateOffer = \"Réactiver des offres\";\r\n $scope.textPopUpDesactivateOffer = \"Êtes-vous sûr de vouloir réactiver ces offres ?\";\r\n }\r\n\r\n var lstOffer = []; // Filtre des offres en fonction des GroupContacts\r\n\r\n if (idsGroupContactChecked !== undefined && idsGroupContactChecked.length > 0) {\r\n filtreGeneral.forEach(function (item) {\r\n idsGroupContactChecked.forEach(function (idGroupContact) {\r\n if ($filter('filter')(lstOffer, { IdOffer: item.IdOffer }, true)[0] === undefined &&\r\n (($rootScope.paramIsTerrenaGroup && ((item.ListOfferGroupContactPricesVm && $filter('filter')(item.ListOfferGroupContactPricesVm, { IdGroupContact: idGroupContact }, true)[0] !== undefined || $filter('filter')($scope.groupContactsMenuItems, { idGroupContact: -1 }, true)[0].checked) && $filter('filter')(lstOffer, { IdOffer: item.IdOffer }, true)[0] === undefined)) || ((item.ListGroupContactVm && $filter('filter')(item.ListGroupContactVm, { IdGroupContact: idGroupContact }, true)[0] !== undefined || item.ListGroupContactVm.length === 0 && $filter('filter')($scope.groupContactsMenuItems, { idGroupContact: -1 }, true)[0].checked) && $filter('filter')(lstOffer, { IdOffer: item.IdOffer }, true)[0] === undefined)))\r\n lstOffer.push(item);\r\n });\r\n });\r\n filtreGeneral = lstOffer;\r\n }\r\n if (idsGroupContactChecked !== undefined && idsGroupContactChecked.length === 0) { filtreGeneral = []; }\r\n\r\n $scope.offers = filtreGeneral;\r\n\r\n if (reloadOffers === true) $scope.GetAllOffers();\r\n\r\n };\r\n\r\n $scope.DeleteOffer = function (params) {// a voir pour meilleur point de vue\r\n offerService.DeleteOffer(params.IdOffer, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n if (angular.isNumber(parseInt(data[0].errors[0].Message))) {\r\n $scope.showPopUpMessage();\r\n } else {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n }\r\n } else {\r\n $scope.allOffers.splice(params.index, 1);\r\n $scope.GetAllOffers();\r\n }\r\n });\r\n };\r\n\r\n $scope.PopUpDeleteOffer = function (deletepopup, index, idOffre) {\r\n var param = {};\r\n param.index = index;\r\n param.IdOffer = idOffre;\r\n deletepopup(param);\r\n };\r\n\r\n $scope.PopUpDeleteOfferMessage = function (popUpDeleteOfferMessage, idOfferMessage) {\r\n $scope.PopUpOfferMessage_Text = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpOfferMessage_Text.Content;\r\n popUpDeleteOfferMessage(idOfferMessage);\r\n };\r\n\r\n $scope.DeleteOfferMessage = function (idOfferMessage) {\r\n offerService.DeleteOfferMessage(idOfferMessage, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n if (angular.isNumber(parseInt(data[0].errors[0].Message))) {\r\n $scope.showPopUpMessage();\r\n } else {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n }\r\n } else {\r\n $scope.cancelOfferMessage();\r\n $scope.GetAllOffers();\r\n }\r\n });\r\n };\r\n\r\n $scope.PopUpAddOfferMessage = function (showPopUpAddOfferMessage, offer) {\r\n $scope.popUpOfferMessage_OfferMessage = null;\r\n $scope.errorPopupOfferMessageHtml = \"\";\r\n\r\n $scope.popUpAddOfferMessage_Title = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferMessage_Title.Content;\r\n $scope.popUpAddOfferMessage_TypeNotification = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferMessage_TypeNotification.Content;\r\n $scope.popUpAddOfferMessage_SendingProgramming = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferMessage_SendingProgramming.Content;\r\n $scope.popUpAddOfferMessage_Instantly = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferMessage_Instantly.Content;\r\n $scope.popUpAddOfferMessage_CustomDateAndHour = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferMessage_CustomDateAndHour.Content;\r\n $scope.popUpAddOfferMessage_CustomDateAndHour_Date = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferMessage_CustomDateAndHour_Date.Content;\r\n $scope.popUpAddOfferMessage_CustomDateAndHour_Hour = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferMessage_CustomDateAndHour_Hour.Content;\r\n $scope.popUpAddOfferMessage_TitleMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferMessage_TitleMessage.Content;\r\n $scope.popUpAddOfferMessage_TextMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferMessage_TextMessage.Content;\r\n $scope.popUpAddOfferMessage_TextTagsEnabledForMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferMessage_TextTagsEnabledForMessage.Content;\r\n $scope.popUpOfferMessage_ListTypeNotificationVm = offer.ListTypeNotificationVm;\r\n\r\n offerService.GetOfferMessageVm(offer.IdOffer, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.popUpOfferMessage_OfferMessage = data;\r\n $scope.popUpOfferMessage_OfferMessage.IdOfferMessage = offer.IdOfferMessage;\r\n $scope.popUpOfferMessage_OfferMessage.bSendingImmediate = 0;\r\n\r\n if ($scope.popUpOfferMessage_ListTypeNotificationVm && $scope.popUpOfferMessage_ListTypeNotificationVm.length === 1)\r\n $scope.popUpOfferMessage_OfferMessage.IdTypeNotification = $scope.popUpOfferMessage_ListTypeNotificationVm[0].IdTypeNotification;\r\n\r\n if (!data.IdOfferMessage) {\r\n $scope.popUpOfferMessage_OfferMessage.bSendingImmediate = null;\r\n $scope.popUpOfferMessage_OfferMessage.Content = $rootScope.editableObjectsFactory.EditableObjects.Admin_OfferMessage_DefaultText.Content;\r\n }\r\n }\r\n });\r\n showPopUpAddOfferMessage();\r\n };\r\n\r\n $scope.SaveOfferMessage = function () {\r\n offerService.PostOfferMessageVm($scope.popUpOfferMessage_OfferMessage, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n var errorHtml = data[0].errors[0].Message;\r\n $scope.errorPopupOfferMessageHtml = $sce.trustAsHtml(errorHtml);\r\n $scope.showPopUpAddOfferMessage();\r\n }\r\n } else {\r\n $scope.GetAllOffers();\r\n }\r\n });\r\n };\r\n\r\n /************ Gestion des incidences utilisateur liée à l'offre **********/\r\n\r\n $scope.PopUpAddOfferUserIncidence = function (showPopUpAddOfferUserIncidence, id) {\r\n\r\n getAllOfferUserIncidence(id);\r\n $scope.popUpOfferMessage_OfferMessage = null;\r\n $scope.errorPopupOfferMessageHtml = \"\";\r\n\r\n $scope.popUpAddOfferUserIncidence_Title = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferUserIncidence_Title.Content;\r\n $scope.popUpAddOfferUserIncidence_AddUserButton = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferUserIncidence_AddUserButton.Content;\r\n $scope.popUpAddOfferUserIncidence_TitleUsersColumn = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferUserIncidence_TitleUsersColumn.Content;\r\n $scope.popUpAddOfferUserIncidence_TitleValuesColumn = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferUserIncidence_TitleValuesColumn.Content;\r\n $scope.popUpAddOfferUserIncidence_PlaceholderIncidenceInput = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferUserIncidence_PlaceholderIncidenceInput.Content;\r\n $scope.PopUpAddOfferUserIncidence_PlaceholderUserAutoComplet = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpAddOfferUserIncidence_PlaceholderUserAutoComplet.Content;\r\n\r\n $rootScope.resetInput = 1;\r\n showPopUpAddOfferUserIncidence();\r\n };\r\n\r\n $scope.PopUpDeleteOfferUserIncidence = function (popUpDeleteOfferUserIncidence, idOfferUserIncidence) {\r\n $scope.PopUpDeleteOfferUserIncidence_Title = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpDeleteOfferUserIncidence_Title.Content;\r\n $scope.PopUpDeleteOfferUserIncidence_Message = $rootScope.editableObjectsFactory.EditableObjects.Admin_ListingOffer_PopUpDeleteOfferUserIncidence_Message.Content;\r\n popUpDeleteOfferUserIncidence(idOfferUserIncidence);\r\n };\r\n\r\n $scope.SetSelectedUser = function (user) {\r\n $rootScope.resetInput = 3;\r\n $scope.currentOfferUserIncidence.IdUser= user.IdUser;\r\n };\r\n\r\n $scope.SaveOfferUserIncidence = function () {\r\n offerService.SaveOfferUserIncidence($scope.currentOfferUserIncidence, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorOfferUserIncidenceMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $rootScope.resetInput = 1;\r\n getAllOfferUserIncidence();\r\n }\r\n });\r\n };\r\n\r\n $scope.UpdateOfferUserIncidence = function (offerUserIncidence) {\r\n\r\n $scope.currentOfferUserIncidence.IdOfferUserIncidence = offerUserIncidence.IdOfferUserIncidence;\r\n $scope.currentOfferUserIncidence.IdUser = offerUserIncidence.IdUser;\r\n $scope.currentOfferUserIncidence.Incidence = offerUserIncidence.Incidence;\r\n\r\n $scope.offerUserIncidenceUpdate = offerUserIncidence.IdOfferUserIncidence;\r\n };\r\n\r\n $scope.DeleteOfferUserIncidence = function (id) {\r\n offerService.DeleteOfferUserIncidence(id, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorOfferUserIncidenceMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n getAllOfferUserIncidence();\r\n }\r\n });\r\n };\r\n\r\n function getAllOfferUserIncidence(id) {\r\n $scope.errorOfferUserIncidenceMessage = null;\r\n var idOffer = id != null ? id : $scope.currentOfferUserIncidence.IdOffer;\r\n offerService.GetDataOfferUserIncidence(idOffer, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.currentOfferUserIncidence = {};\r\n $scope.currentOfferUserIncidence.IdOffer = idOffer;\r\n $scope.offerUserIncidenceUpdate = null;\r\n\r\n $scope.listOfferUserIncidence = data.LstOfferUserIncidence;\r\n $scope.listUserOfferGroupContact = data.LstUserOfferGroupContact;\r\n }\r\n });\r\n }\r\n\r\n /************ FIN Gestion des incidences utilisateur liée à l'offre **********/\r\n\r\n $scope.EditFinaliser = function (id) {\r\n $location.path('/admin/offer/createoffer/' + id);\r\n };\r\n\r\n $scope.Dupliquer = function (id) {\r\n $location.path('/admin/offer/dupliquer/' + id);\r\n };\r\n\r\n $scope.SaveVariablesForOffers = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.IncidenceBaseErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_EditIncidenceBase_NotANumberErrorMessage.Content;\r\n $scope.PrimeErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_EditPrime_NotANumberErrorMessage.Content;\r\n $scope.MarginErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_EditMargin_NotANumberErrorMessage.Content;\r\n $scope.FinancialCostsErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_EditFinancialCosts_NotANumberErrorMessage.Content;\r\n $scope.LogisticCostsErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_EditLogisticCosts_NotANumberErrorMessage.Content;\r\n $scope.DepotErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_EditDepot_NotANumberErrorMessage.Content;\r\n $scope.OthersErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_EditOthers_NotANumberErrorMessage.Content;\r\n $scope.BaseErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_EditBase_NotANumberErrorMessage.Content;\r\n $scope.EditVariableForBaseSuccessMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_EditVariableForBase_SuccessMessage.Content;\r\n $scope.DatePaymentForBaseErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_EditDatePayment_NotADateErrorMessage.Content;\r\n\r\n var result = [];\r\n var lstInfosForOffer = [];\r\n var regexDate = /^(\\d{2}\\/){2}\\d{4}$/;\r\n $scope.offers.forEach(function (offer) {\r\n\r\n lstInfosForOffer.push({\r\n IdOffer: offer.IdOffer,\r\n Order: offer.Order\r\n });\r\n\r\n if ((offer.IdTypeOffer === enumFactory.TypeOffer.Engagement || offer.IdTypeOffer === enumFactory.TypeOffer.EngagementSurface) && offer.PaymentDate && $scope.paramNameCoop == enumFactory.Coops.Ducroquet) {\r\n result.push({\r\n IdOffer: offer.IdOffer,\r\n PaymentDate: offer.PaymentDate != null ? dateService.ConvertDateToDateAPI(offer.PaymentDate) : null\r\n });\r\n }\r\n else {\r\n if (offer.IdTypeOffer === enumFactory.TypeOffer.Engagement || offer.IdTypeOffer === enumFactory.TypeOffer.EngagementSurface || !offer.IdFirstExpiry)\r\n return;\r\n if (offer.ExpiryBase && isNaN(offer.ExpiryBase)) {\r\n $scope.errorMessage = $scope.BaseErrorMessage;\r\n return;\r\n }\r\n if (offer.IncidenceBase && isNaN(offer.IncidenceBase)) {\r\n $scope.errorMessage = $scope.IncidenceBaseErrorMessage;\r\n return;\r\n }\r\n if (offer.Prime && isNaN(offer.Prime)) {\r\n $scope.errorMessage = $scope.PrimeErrorMessage;\r\n return;\r\n }\r\n if (offer.Margin && isNaN(offer.Margin)) {\r\n $scope.errorMessage = $scope.MarginErrorMessage;\r\n return;\r\n }\r\n if (offer.FinancialCosts && isNaN(offer.FinancialCosts)) {\r\n $scope.errorMessage = $scope.FinancialCostsErrorMessage;\r\n return;\r\n }\r\n if (offer.LogisticCosts && isNaN(offer.LogisticCosts)) {\r\n $scope.errorMessage = $scope.LogisticCostsErrorMessage;\r\n return;\r\n }\r\n if (offer.Depot && isNaN(offer.Depot)) {\r\n $scope.errorMessage = $scope.DepotErrorMessage;\r\n return;\r\n }\r\n if (offer.Others && isNaN(offer.Others)) {\r\n $scope.errorMessage = $scope.OthersErrorMessage;\r\n return;\r\n }\r\n if (offer.PaymentDate && !regexDate.test(offer.PaymentDate)) {\r\n $scope.errorMessage = $scope.DatePaymentForBaseErrorMessage;\r\n return;\r\n }\r\n\r\n if ($scope.bActiveDecomposeBase)\r\n offer.ExpiryBase = Number(offer.Prime) + Number(offer.Margin) + Number(offer.FinancialCosts) + Number(offer.LogisticCosts) + Number(offer.Depot) + Number(offer.Others);\r\n\r\n result.push({\r\n IdExpiry: offer.IdFirstExpiry,\r\n Base: offer.ExpiryBase ? Number(offer.ExpiryBase) : 0,\r\n IncidenceBase: offer.IncidenceBase ? Number(offer.IncidenceBase) : null,\r\n Prime: offer.Prime ? Number(offer.Prime) : null,\r\n Margin: offer.Margin ? Number(offer.Margin) : null,\r\n FinancialCosts: offer.FinancialCosts ? Number(offer.FinancialCosts) : null,\r\n LogisticCosts: offer.LogisticCosts ? Number(offer.LogisticCosts) : null,\r\n Depot: offer.Depot ? Number(offer.Depot) : null,\r\n Others: offer.Others ? Number(offer.Others) : null,\r\n PaymentDate: offer.PaymentDate != null ? dateService.ConvertDateToDateAPI(offer.PaymentDate) : null\r\n });\r\n\r\n offer.QuotesExpiryOfferManagerVM.forEach(function (exp) {\r\n if (exp.Base && isNaN(exp.Base)) {\r\n $scope.errorMessage = $scope.BaseErrorMessage;\r\n return;\r\n }\r\n if (exp.IncidenceBase && isNaN(exp.IncidenceBase)) {\r\n $scope.errorMessage = $scope.IncidenceBaseErrorMessage;\r\n return;\r\n }\r\n if (exp.Prime && isNaN(exp.Prime)) {\r\n $scope.errorMessage = $scope.PrimeErrorMessage;\r\n return;\r\n }\r\n if (exp.Margin && isNaN(exp.Margin)) {\r\n $scope.errorMessage = $scope.MarginErrorMessage;\r\n return;\r\n }\r\n if (exp.FinancialCosts && isNaN(exp.FinancialCosts)) {\r\n $scope.errorMessage = $scope.FinancialCostsErrorMessage;\r\n return;\r\n }\r\n if (exp.LogisticCosts && isNaN(exp.LogisticCosts)) {\r\n $scope.errorMessage = $scope.LogisticCostsErrorMessage;\r\n return;\r\n }\r\n if (exp.Depot && isNaN(exp.Depot)) {\r\n $scope.errorMessage = $scope.DepotErrorMessage;\r\n return;\r\n }\r\n if (exp.Others && isNaN(exp.Others)) {\r\n $scope.errorMessage = $scope.OthersErrorMessage;\r\n return;\r\n }\r\n if (exp.PaymentDate && !regexDate.test(exp.PaymentDate)) {\r\n $scope.errorMessage = $scope.DatePaymentForBaseErrorMessage;\r\n return;\r\n }\r\n\r\n if ($scope.bActiveDecomposeBase)\r\n exp.Base = Number(exp.Prime) + Number(exp.Margin) + Number(exp.FinancialCosts) + Number(exp.LogisticCosts) + Number(exp.Depot) + Number(exp.Others);\r\n\r\n result.push({\r\n IdExpiry: exp.IdExpiry,\r\n Base: exp.Base ? Number(exp.Base) : 0,\r\n IncidenceBase: exp.IncidenceBase ? Number(exp.IncidenceBase) : null,\r\n Prime: exp.Prime ? Number(exp.Prime) : null,\r\n Margin: exp.Margin ? Number(exp.Margin) : null,\r\n FinancialCosts: exp.FinancialCosts ? Number(exp.FinancialCosts) : null,\r\n LogisticCosts: exp.LogisticCosts ? Number(exp.LogisticCosts) : null,\r\n Depot: exp.Depot ? Number(exp.Depot) : null,\r\n Others: exp.Others ? Number(exp.Others) : null,\r\n PaymentDate: exp.PaymentDate != null ? dateService.ConvertDateToDateAPI(exp.PaymentDate) : null,\r\n });\r\n });\r\n }\r\n });\r\n\r\n var lstOfferGroupContactIncidenceVm = [];\r\n if ($scope.parambActiveOfferGroupContactIncidence) {\r\n for (var propertyKey in $scope.offerGroupContactIncidenceVm) {\r\n lstOfferGroupContactIncidenceVm.push({ 'IdOffer': propertyKey.split('_')[0], 'IdGroupContact': propertyKey.split('_')[1], Incidence: $scope.offerGroupContactIncidenceVm[propertyKey] });\r\n }\r\n }\r\n\r\n if (!$scope.errorMessage) {\r\n var postData = {\r\n offerVariablesInfos: result,\r\n offerGroupContactIncidencesInfos: lstOfferGroupContactIncidenceVm,\r\n editInfosForOffer: lstInfosForOffer\r\n };\r\n $scope.loading = true;\r\n offerService.SaveVariablesForOffers(postData, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n $scope.loading = false;\r\n } else {\r\n $scope.GetAllOffers();\r\n $scope.successMessage = $scope.EditVariableForBaseSuccessMessage;\r\n }\r\n });\r\n }\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n $scope.GetAllOffers();\r\n };\r\n\r\n $scope.ChangeTab = function (id) {\r\n $scope.idStatus = id;\r\n $rootScope.filtersListingOffers.idStatus = id;\r\n $scope.GetAllOffers();\r\n //$scope.ChangeElementSelected();\r\n };\r\n\r\n $scope.SelectAll = function () {\r\n $scope.offerAction.LstIdOffer = [];\r\n\r\n if ($scope.allSelected) {\r\n $scope.offers.forEach(function (offerItem) {\r\n if (offerItem.CanDisableOrEnableOffer) {\r\n $scope.offerAction.LstIdOffer.push(offerItem.IdOffer);\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.SelectOffer = function (idOffer) {\r\n var index = $scope.offerAction.LstIdOffer.indexOf(idOffer);\r\n if (index >= 0) {\r\n $scope.offerAction.LstIdOffer.splice(index, 1);\r\n } else {\r\n $scope.offerAction.LstIdOffer.push(idOffer);\r\n }\r\n };\r\n\r\n $scope.PopUpDesactivateOffer = function (showPopUpDesactivateOffer) {\r\n if ($scope.offerAction.LstIdOffer.length > 0) {\r\n showPopUpDesactivateOffer();\r\n }\r\n };\r\n\r\n $scope.DesactivateOffer = function () {\r\n $scope.offerAction.IsDisable = $scope.idStatus == enumFactory.OfferStatus.Enabled;\r\n offerService.DisableOrEnableOffers($scope.offerAction, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $location.path('/');\r\n }\r\n } else {\r\n $scope.GetAllOffers();\r\n }\r\n });\r\n };\r\n\r\n var init = function () {\r\n initGroupContacts();\r\n };\r\n\r\n var initGroupContacts = function () { // intialisation des GroupContacts\r\n $scope.groupContactLabel = 'Tous';\r\n $scope.groupContactLabelsMenuItems = [];\r\n $scope.groupContactsMenuItems.push({ groupContact: 'Tous', idGroupContact: -1, checked: true });\r\n };\r\n\r\n //Permet de gerer les arrondis des prices pour les decimale > 2\r\n $scope.$watch(\"offers\", function (n, o) {\r\n if (n !== o) {\r\n var regexfloat = /^[0-9]+.[0-9]{3,100}/;\r\n n.forEach(function (item) {\r\n if (regexfloat.test(item.Price)) {\r\n item.Price = parseFloat(item.Price).toFixed(2);\r\n }\r\n });\r\n }\r\n }, true);\r\n\r\n $scope.GetAllOffers();\r\n\r\n init();\r\n\r\n $scope.toggleSublistAndRecalculHeight = function (offer) {\r\n offer.showAllExpiryOffer = !offer.showAllExpiryOffer;\r\n\r\n var tableLeft = $(\"#idForReCalculHeight\").find('.t_resp_left'),\r\n tableScrollable = $(\"#idForReCalculHeight\").find('.t_resp_center'),\r\n tableRight = $(\"#idForReCalculHeight\").find('.t_resp_right'),\r\n currentHeaderHeight = $('#idForReCalculHeight').find('.t_resp_center thead').outerHeight();\r\n\r\n $timeout(function () {\r\n tableScrollable.find('tr.sublist').each(function (i) {\r\n tableLeft.find('tr.sublist').eq(i).css({\r\n 'height': $(this)[0].getBoundingClientRect().height\r\n });\r\n tableRight.find('tr.sublist').eq(i).css({\r\n 'height': $(this)[0].getBoundingClientRect().height\r\n });\r\n\r\n i++;\r\n });\r\n }, 0);\r\n };\r\n\r\n $scope.RecalculateStrikes = function (idOffer) {\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n strikeService.RecalculateStrikes(idOffer, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.GetAllOffers();\r\n $scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_RecalculateStrikes_SuccessMessage.Content;\r\n }\r\n });\r\n };\r\n\r\n $scope.GetStrikesByIdExpiry = function () {\r\n strikeService.GetStrikesByIdExpiry($scope.offerOptionExpirySelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorPopupDetailStrikesMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.expiryStrikeDetail = data;\r\n }\r\n });\r\n };\r\n\r\n $scope.PopUpShowDetailStrikes = function (showPopUpDetailStrikes, idOffer) {\r\n $scope.errorPopupDetailStrikesMessage = \"\";\r\n \r\n var offer = $filter('filter')($scope.allOffers, { IdOffer: idOffer }, true)[0];\r\n $scope.offerOptionExpiriesVm = [\r\n { IdExpiry: offer.IdFirstExpiry, LabelExpiry: offer.LabelExpiry }\r\n ];\r\n\r\n offer.QuotesExpiryOfferManagerVM.forEach(function (exp) {\r\n $scope.offerOptionExpiriesVm.push({ IdExpiry: exp.IdExpiry, LabelExpiry: exp.LabelExpiry });\r\n });\r\n\r\n $scope.offerOptionExpirySelected = $scope.offerOptionExpiriesVm[0].IdExpiry;\r\n $scope.GetStrikesByIdExpiry($scope.offerOptionExpirySelected);\r\n $scope.TextExpiryLabel = $rootScope.editableObjectsFactory.EditableObjects.Common_Expiry_Label.Content;\r\n $scope.HeaderExerciceDate = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_ExerciceDate.Content;\r\n $scope.HeaderPrime = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_Prime.Content;\r\n $scope.HeaderSubscriptionCost = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_SubscriptionCost.Content;\r\n $scope.HeaderStrike = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_Strike.Content;\r\n showPopUpDetailStrikes();\r\n };\r\n }]);\r\n","AgrimarketControllers.controller('createofferController', ['$scope', '$filter', '$rootScope', '$routeParams', '$http', '$location', '$upload',\r\n \"currentUserFactory\", 'configurationFactory', 'enumFactory', '$log', 'wsdApiService', '$timeout', 'productsService', 'typeOffersService',\r\n 'typeQuotesService', 'cropsService', 'offerService', 'typeOptionsService', 'typeCalculOptionsService', 'offerVisibilityService', 'deliveryPeriodService', 'validityDurationService', 'groupContactService', 'templatesService',\r\n 'conditionsService', '$q', '$sce', 'dateService', 'compagnyService', 'typeOfferCommitmentsService', 'typeCommitmentsService', 'parametersFactory', 'operationService', 'contractsService', 'languageService', 'contractBaseService', 'typeFixationBasesService', 'currencyService', 'unitService', 'categoryOfferService', 'ceremisApiService', 'criteriaOfferService', 'modulesFactory', 'typePriceService',\r\n function ($scope, $filter, $rootScope, $routeParams, $http, $location, $upload, currentUserFactory, configurationFactory, enumFactory, $log, wsdApiService,\r\n $timeout, productsService, typeOffersService, typeQuotesService, cropsService, offerService, typeOptionsService, typeCalculOptionsService, offerVisibilityService, deliveryPeriodService, validityDurationService, groupContactService,\r\n templatesService, conditionsService, $q, $sce, dateService, compagnyService, typeOfferCommitmentsService, typeCommitmentsService, parametersFactory, operationService, contractsService, languageService, contractBaseService, typeFixationBasesService, currencyService, unitService, categoryOfferService, ceremisApiService, criteriaOfferService, modulesFactory, typePriceService) {\r\n\r\n $scope.disableSubmitedButton = false;\r\n $scope.errorMessage = '';\r\n $scope.infosMultiCropMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_MultiCrop_Text_step1.Content;\r\n $scope.lstSelectedVarieties = [];\r\n $scope.lstSelectedGroup = [];\r\n $scope.lstSelectedContract = [];\r\n $scope.lstSelectedtmp = [];\r\n $scope.currentOffer = {};\r\n $scope.lstOffersCeremis = [];\r\n $scope.refIdsSubCrops = [];\r\n $scope.fixe = false;\r\n $scope.blankContract = false;\r\n $scope.tmpOffer = {};\r\n $scope.watchedit = null;\r\n $scope.watchEditBuiltPrice = null;\r\n $scope.watchTypeFixation = null;\r\n $scope.watchFixationBaseConstraint = null;\r\n $scope.master = false;\r\n $scope.master2 = false;\r\n $scope.fileName = \"\";\r\n $scope.ModeDupliquer = false;\r\n $scope.ModeEdition = false;\r\n $scope.validTypeTemplateNotSame = false;\r\n $scope.paramWatcher = {};\r\n $scope.year = 0;\r\n $scope.years = [];\r\n $scope.enumTypeQuotes = enumFactory.TypeQuotes;\r\n $scope.enumValidityDurations = enumFactory.ValidityDurations;\r\n $scope.enumTypeOffers = enumFactory.TypeOffer;\r\n $scope.enumTypeOfferCommitments = enumFactory.TypeOfferCommitment;\r\n $scope.enumTypeCommitments = enumFactory.TypeCommitment;\r\n $scope.enumTypeCalculOption = enumFactory.TypeCalculOption;\r\n $scope.paramDisplaySurfaceYield = parametersFactory.Parameters.DisplaySurfaceYield.Value === \"1\";\r\n $scope.IsUneal = $rootScope.paramNameCoop === enumFactory.Coops.Uneal ? true : false;\r\n $scope.enumTypeOption = enumFactory.TypeOption;\r\n $scope.enumVisibilityOffer = enumFactory.VisibilityOffer;\r\n $scope.strikeAutoVm = [];\r\n $scope.TotalQuantityLimit = 0;\r\n $scope.HasQuantityLimit = false;\r\n $scope.EditableObjectComment = $rootScope.editableObjectsFactory.getIsVisibleByKey(\"Admin_Offer_Step2_Comment\");\r\n $scope.parambChooseEntryModeActive = parametersFactory.Parameters.bChooseEntryMode.Value === \"1\";\r\n $scope.pushNotificationEnabled = parametersFactory.Parameters.GoogleConsoleCloudServiceFilename.Value ;\r\n $scope.bActivateContractsValidation = parametersFactory.Parameters.bActivateContractsValidation.Value === \"1\";\r\n $scope.bActivateSignatureOffer = parametersFactory.Parameters.bActivateSignatureOffer.Value === \"1\";\r\n $scope.bActiveDecomposeBase = parametersFactory.Parameters.bActiveDecomposeBase.Value === \"1\";\r\n $scope.paramBActiveLinkWithCeremis = parametersFactory.Parameters.bActiveLinkWithCeremis.Value === \"1\";\r\n $scope.paramBActivateModeDeltaForStrike = parametersFactory.Parameters.bActivateModeDeltaForStrike.Value === \"1\";\r\n $scope.paramBActiveOfferOptionCapacityControl = parametersFactory.Parameters.bActiveOfferOptionCapacityControl.Value === \"1\";\r\n $scope.step2_Title = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Step2_Label.Content;\r\n\r\n $scope.Label_Admin_Offer_Strike_ExerciceDate = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_ExerciceDate.Content;\r\n $scope.Label_Admin_Offer_Strike_Prime = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_Prime.Content;\r\n $scope.Label_Admin_Offer_Strike_SubscriptionCost = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_SubscriptionCost.Content;\r\n $scope.Label_Admin_Offer_Strike_Variations = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_Variations.Content;\r\n $scope.Label_Admin_Offer_Strike_Add = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_Add.Content;\r\n $scope.Label_Admin_Offer_Strike_Edit = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_Edit.Content;\r\n $scope.Label_Admin_Offer_Strike_Strike = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_Strike.Content;\r\n\r\n $scope.Admin_CreateOffer_PopUpStrikeAuto_Title = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_PopUpStrikeAuto_Title.Content;\r\n $scope.Admin_CreateOffer_PopUpStrikeAuto_Label_Margin = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_PopUpStrikeAuto_Label_Margin.Content;\r\n $scope.Admin_CreateOffer_PopUpStrikeAuto_Label_Cost = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_PopUpStrikeAuto_Label_Cost.Content;\r\n $scope.Admin_CreateOffer_PopUpStrikeAuto_Column_Label_ExcerciceLimitDate = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_PopUpStrikeAuto_Column_Label_ExcerciceLimitDate.Content;\r\n $scope.Admin_CreateOffer_PopUpStrikeAuto_Column_Label_Gap = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_PopUpStrikeAuto_Column_Label_Gap.Content;\r\n $scope.Admin_CreateOffer_PopUpStrikeAuto_Button_Add = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_PopUpStrikeAuto_Button_Add.Content;\r\n $scope.Admin_CreateOffer_PopUpStrikeAuto_NbStrikes = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_PopUpStrikeAuto_NbStrikes.Content;\r\n $scope.Admin_CreateOffer_PopUpStrikeAuto_GapVariation = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_PopUpStrikeAuto_GapVariation.Content;\r\n $scope.Admin_CreateOffer_PopUpStrikeAuto_ExerciceDate = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_PopUpStrikeAuto_ExerciceDate.Content;\r\n \r\n $scope.Admin_CreateOffer_Error_Times_TargetPrice = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Error_Times_TargetPrice.Content;\r\n $scope.Admin_CreateOffer_Error_Times_TargetPrice2 = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Error_Times_TargetPrice2.Content;\r\n $scope.Admin_CreateOffer_Error_SelectDurationValidity_TargetPrice = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Error_SelectDurationValidity_TargetPrice.Content;\r\n $scope.Admin_CreateOffer_Error_SelectTypeCommitment = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Error_SelectTypeCommitment.Content;\r\n\r\n $scope.Label_Admin_Offer_Step3_Display = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step3_Display.Content;\r\n $scope.Label_Admin_Offer_Step3_FixationMode = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step3_FixationMode.Content;\r\n $scope.Label_Admin_Offer_Step3_CommitmentConstraint = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step3_CommitmentConstraint.Content;\r\n $scope.Label_Admin_Offer_Step3_TypeCommitment = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step3_TypeCommitment.Content;\r\n $scope.Label_Admin_Offer_Step3_FixationBaseConstraint = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step3_FixationBaseConstraint.Content;\r\n $scope.Label_Admin_Offer_Step3_FixationCurrencyUnit = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step3_FixationCurrencyUnit.Content;\r\n $scope.Label_Admin_Offer_Step3_FixationDecimal = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step3_FixationDecimal.Content;\r\n $scope.Label_Admin_Offer_Step3_FixationExerciceOption = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step3_FixationExerciceOption.Content;\r\n $scope.Label_Admin_Offer_Step3_HoursOpenFixationExerciceOption = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step3_HoursOpenFixationExerciceOption.Content;\r\n $scope.Label_Admin_Offer_Step3_HoursOpenFixationTargetExerciceOption = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step3_HoursOpenFixationTargetExerciceOption.Content;\r\n $scope.Label_Admin_Offer_Step3_StartOpenFixationCommon = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step3_StartOpenFixationCommon.Content;\r\n $scope.Label_Admin_Offer_Step3_EndOpenFixationCommon = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step3_EndOpenFixationCommon.Content;\r\n $scope.Label_Admin_Offer_Step3_OpenH24FixationCommon = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step3_OpenH24FixationCommon.Content;\r\n\r\n $scope.Label_Admin_Offer_Step1_CategoryOffer = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step1_CategoryOffer.Content;\r\n $scope.Label_Admin_Offer_Step1_CriteriaOffer = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step1_CriteriaOffer.Content;\r\n\r\n $scope.Label_Admin_Offer_Step4_TonnageLimit = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step4_TonnageLimit.Content;\r\n $scope.Label_Admin_Offer_Step4_SurfaceLimit = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step4_SurfaceLimit.Content;\r\n $scope.Label_Admin_Offer_Step4_Label_TonnageLimit = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step4_Label_TonnageLimit.Content;\r\n $scope.Label_Admin_Offer_Step4_Label_SurfaceLimit = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step4_Label_SurfaceLimit.Content;\r\n $scope.Label_Admin_Offer_Step4_Tonnes = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step4_Tonnes.Content;\r\n $scope.Label_Admin_Offer_Step4_Hectares = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step4_Hectares.Content;\r\n\r\n $scope.Label_Admin_Offer_Step5_DistributionTonnageLimit = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step5_DistributionTonnageLimit.Content;\r\n $scope.Label_Admin_Offer_Step5_TotalTonnage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step5_TotalTonnage.Content;\r\n $scope.Label_Admin_Offer_Step5_DistributionSurfaceLimit = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step5_DistributionSurfaceLimit.Content;\r\n $scope.Label_Admin_Offer_Step5_TotalSurface = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step5_TotalSurface.Content;\r\n\r\n $scope.Label_Admin_Offer_Step2_Comment = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Step2_Comment.Content;\r\n $scope.Label_Admin_Offer_Step2_Strike_Button_Validate = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_Button_Validate.Content;\r\n\r\n $scope.Label_Admin_Offer_ErrorMessage_Step5_TonnageByGroup = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_ErrorMessage_Step5_TonnageByGroup.Content;\r\n $scope.Label_Admin_Offer_ErrorMessage_Step5_Sum_LowerTonnage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_ErrorMessage_Step5_Sum_LowerTonnage.Content;\r\n $scope.Label_Admin_Offer_ErrorMessage_Step5_Sum_HigherTonnage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_ErrorMessage_Step5_Sum_HigherTonnage.Content;\r\n $scope.Label_Admin_Offer_ErrorMessage_Step5_TonnageGroup = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_ErrorMessage_Step5_TonnageGroup.Content;\r\n $scope.Label_Admin_Offer_ErrorMessage_Step4_DistributionTonnage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_ErrorMessage_Step4_DistributionTonnage.Content;\r\n\r\n $scope.Admin_CreateOffer_Error_MissingFixingTime_ExerciceOption = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Error_MissingFixingTime_ExerciceOption.Content;\r\n $scope.Admin_CreateOffer_Error_InvalidDateFormat_ExerciceOption = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Error_InvalidDateFormat_ExerciceOption.Content;\r\n $scope.Admin_CreateOffer_Error_InvalidFixingTime_ExerciceOption = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Error_InvalidFixingTime_ExerciceOption.Content;\r\n $scope.Admin_CreateOffer_Error_MissingFixingTime_TargetExerciceOption = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Error_MissingFixingTime_TargetExerciceOption.Content;\r\n $scope.Admin_CreateOffer_Error_InvalidDateFormat_TargetExerciceOption = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Error_InvalidDateFormat_TargetExerciceOption.Content;\r\n $scope.Admin_CreateOffer_Error_InvalidFixingTime_TargetExerciceOption = $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Error_InvalidFixingTime_TargetExerciceOption.Content;\r\n\r\n $scope.Label_Admin_Offer_PrimeExpiry = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_PrimeExpiry_ErrorMessage.Content;\r\n $scope.Label_Admin_Offer_MarginExpiry = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_MarginExpiry_ErrorMessage.Content;\r\n $scope.Label_Admin_Offer_FinancialCostsExpiry = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_FinancialCostsExpiry_ErrorMessage.Content;\r\n $scope.Label_Admin_Offer_LogisticCostsExpiry = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_LogisticCostsExpiry_ErrorMessage.Content;\r\n $scope.Label_Admin_Offer_DepotExpiry = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_DepotExpiry_ErrorMessage.Content;\r\n $scope.Label_Admin_Offer_OthersExpiry = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_OthersExpiry_ErrorMessage.Content;\r\n \r\n $scope.moduleAutomaticCover = $rootScope.ModuleAutomaticCover.Active;\r\n $scope.signingSmsGlobalyActived = modulesFactory.Modules.ModuleSignatureElectroniqueYouSign.Active || modulesFactory.Modules.ModuleElectronicSignature.Active;\r\n\r\n var start;\r\n var end;\r\n var startpriseposition;\r\n var endpriseposition;\r\n var startpriseobjectif;\r\n var endpriseobjectif;\r\n var startprisepositionBase;\r\n var endprisepositionBase;\r\n var startpriseobjectifBase;\r\n var endpriseobjectifBase;\r\n var startprisepositionExerciceOption;\r\n var endprisepositionExerciceOption;\r\n var startPositionTargetExerciceOption;\r\n var endPositionTargetExerciceOption;\r\n var nbStep = 5;\r\n var idOffer = $routeParams.idoffer;\r\n var lstAllTypeQuotes;\r\n var ducroquetValidTypeCoverPopUp = false;\r\n var lstTypeFixationBasesOrigin;\r\n\r\n $scope.lstEntryModes = [\r\n { Id: false, Label: $rootScope.editableObjectsFactory.EditableObjects.TonLabel.Content },\r\n { Id: true, Label: $rootScope.editableObjectsFactory.EditableObjects.LotLabel.Content }\r\n ];\r\n\r\n $scope.init = function () {\r\n productsService.GetAllProducts(function (data, status) {\r\n if (status === null) {\r\n $scope.lstProducts = data;\r\n $scope.lstAllProducts = angular.copy(data);\r\n if (idOffer === undefined || idOffer === null || idOffer == -1) {\r\n offerService.GetBodyOffer(function (data) {\r\n $scope.currentOffer = data;\r\n $scope.step = 1;\r\n $scope.currentOffer.OfferOptionCapacityControlActivated = $scope.paramBActiveOfferOptionCapacityControl;\r\n $scope.currentOffer.VarietiesVm = [];\r\n $scope.currentOffer.GroupContacts = [];\r\n $scope.currentOffer.GroupContacts.OfferGroupContactTonnages = [];\r\n $scope.currentOffer.Templates = [];\r\n $scope.currentOffer.Validate = false;\r\n $scope.currentOffer.IsVisibleTC = false;\r\n $scope.currentOffer.ContractSigningEnabled = true;\r\n $scope.currentOffer.DisplaySurfaceYield = false;\r\n $scope.currentOffer.AllowDateEndTargetPrice = false;\r\n $scope.currentOffer.IdVisibilityOffer = 1; // On préselectionne Tous par défaut\r\n $scope.currentOffer.LotEntryMode = undefined;\r\n $scope.lstOfferExpiry = $scope.currentOffer.OfferExpiriesVm = [];\r\n $scope.currentOffer.OfferCurrencyUnits = {\r\n IdCurrencyFinal: null,\r\n IdUnitFinal: null,\r\n IdCurrencyForComponents: null,\r\n IdUnitForComponents: null,\r\n DecimalFinal: 2,\r\n DecimalForComponents: 2\r\n };\r\n $scope.currentOffer.TypeFixationTypeOrders = {\r\n SoldBase: false,\r\n TargetPriceBase: false,\r\n SoldFuture: false,\r\n TargetPriceFuture: false,\r\n SoldGlobalPrice: false,\r\n TargetPriceGlobalPrice: false,\r\n SoldExerciceOption: false,\r\n TargetExerciceOption: false\r\n };\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Ferme)\r\n $scope.currentOffer.IdTypeOfferCommitment = $scope.enumTypeOfferCommitments.EngagementFacultatif;\r\n $scope.currentOffer.OfferGroupContactTonnageVm = [];\r\n $scope.currentOffer.IdsSubCrops = [];\r\n });\r\n } else {\r\n offerService.GetOfferById(idOffer, function (data) {\r\n $scope.currentOffer = data;\r\n $scope.currentOffer.StartValidity = $filter('date')($scope.currentOffer.StartValidity, 'dd/MM/yyyy');\r\n $scope.currentOffer.EndValidity = $filter('date')($scope.currentOffer.EndValidity, 'dd/MM/yyyy');\r\n $scope.currentOffer.isVisibleH24 = $scope.currentOffer.StartVisibility === \"00:00:00\" && $scope.currentOffer.EndVisibility === \"23:59:59\";\r\n $scope.currentOffer.isPositionH24 = $scope.currentOffer.StartPosition === \"00:00:00\" && $scope.currentOffer.EndPosition === \"23:59:59\";\r\n $scope.currentOffer.isTargetPriceH24 = $scope.currentOffer.StartTargetPrice === \"00:00:00\" && $scope.currentOffer.EndTargetPrice === \"23:59:59\";\r\n $scope.currentOffer.isPositionBaseH24 = $scope.currentOffer.StartPositionBase === \"00:00:00\" && $scope.currentOffer.EndPositionBase === \"23:59:59\";\r\n $scope.currentOffer.isTargetPriceBaseH24 = $scope.currentOffer.StartTargetPriceBase === \"00:00:00\" && $scope.currentOffer.EndTargetPriceBase === \"23:59:59\";\r\n $scope.currentOffer.isPositionExerciceOptionH24 = $scope.currentOffer.StartPositionExerciceOption === \"00:00:00\" && $scope.currentOffer.EndPositionExerciceOption === \"23:59:59\";\r\n $scope.currentOffer.isTargetExerciceOptionH24 = $scope.currentOffer.StartPositionTargetExerciceOption === \"00:00:00\" && $scope.currentOffer.EndPositionTargetExerciceOption === \"23:59:59\";\r\n $scope.step2_Title = $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Engagement ? $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Step2_Label_Commitment.Content : $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Step2_Label.Content;\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.PrixConstruit) {\r\n $scope.ObservationPeriodStarted = new Date() >= new Date(data.ObservationPeriodBuiltPriceStartDate);\r\n $scope.currentOffer.SubscriptionPeriodBuiltPriceStartDate = $filter('date')($scope.currentOffer.SubscriptionPeriodBuiltPriceStartDate, 'dd/MM/yyyy');\r\n $scope.currentOffer.SubscriptionPeriodBuiltPriceEndDate = $filter('date')($scope.currentOffer.SubscriptionPeriodBuiltPriceEndDate, 'dd/MM/yyyy');\r\n $scope.currentOffer.ObservationPeriodBuiltPriceStartDate = $filter('date')($scope.currentOffer.ObservationPeriodBuiltPriceStartDate, 'dd/MM/yyyy');\r\n $scope.currentOffer.ObservationPeriodBuiltPriceEndDate = $filter('date')($scope.currentOffer.ObservationPeriodBuiltPriceEndDate, 'dd/MM/yyyy');\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Engagement || $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.EngagementSurface) {\r\n if ($rootScope.paramBUseDeliveriesDates) {\r\n $scope.currentOffer.DeliveryStartDate = $filter('date')($scope.currentOffer.DeliveryStartDate, 'dd/MM/yyyy');\r\n $scope.currentOffer.DeliveryEndDate = $filter('date')($scope.currentOffer.DeliveryEndDate, 'dd/MM/yyyy');\r\n }\r\n\r\n if ($rootScope.paramBUsePaymentDate)\r\n $scope.currentOffer.PaymentDate = $filter('date')($scope.currentOffer.PaymentDate, 'dd/MM/yyyy');\r\n }\r\n\r\n if ($scope.currentOffer.OfferExpiriesVm && $scope.currentOffer.OfferExpiriesVm.length > 0) {\r\n var offerExpiries = $scope.currentOffer.OfferExpiriesVm;\r\n $scope.lstOfferExpiry = offerExpiries.filter(function (element) {\r\n element.DateClosed = $filter('date')(element.DateClosed, 'dd/MM/yyyy');\r\n if (element.DateStart)\r\n element.DateStart = $filter('date')(element.DateStart, 'dd/MM/yyyy');\r\n if (element.OptionLimitExerciceDate)\r\n element.OptionLimitExerciceDate = $filter('date')(element.OptionLimitExerciceDate, 'dd/MM/yyyy');\r\n\r\n if ($scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.Option) {\r\n if ($rootScope.paramBUseDeliveriesDates) {\r\n element.DeliveryStartDate = $filter('date')(element.DeliveryStartDate, 'dd/MM/yyyy');\r\n element.DeliveryEndDate = $filter('date')(element.DeliveryEndDate, 'dd/MM/yyyy');\r\n }\r\n\r\n if ($rootScope.paramBUsePaymentDate)\r\n element.PaymentDate = $filter('date')(element.PaymentDate, 'dd/MM/yyyy');\r\n }\r\n\r\n element.DateMin = new Date();\r\n return element;\r\n });\r\n loadStrikeAutoVm();\r\n\r\n } else {\r\n $scope.lstOfferExpiry = [];\r\n }\r\n $scope.currentOffer.IdMarket = $scope.currentOffer.IdMarket;\r\n $scope.currentOffer.IdExpiry = !$scope.lstOfferExpiry || $scope.lstOfferExpiry.length === 0 ? null : $scope.lstOfferExpiry[0].IdExpiryWSD;\r\n\r\n $scope.HasQuantityLimit = $scope.currentOffer.QuantityLimit === undefined || $scope.currentOffer.QuantityLimit === null ? false : true;\r\n $scope.HasContract = $scope.currentOffer.HasContract;\r\n $scope.HasContractBase = $scope.currentOffer.HasContractBase;\r\n $scope.HasContractOption = $scope.currentOffer.HasContractOption;\r\n $scope.GetDataStep2();\r\n $scope.GetDataStep3();\r\n $scope.GetDataStep5();\r\n if ($scope.currentOffer.IdAttachment !== undefined && $scope.currentOffer.IdAttachment !== null) {\r\n $scope.fileName = $scope.currentOffer.Attachment.PublicLabel;\r\n }\r\n if (!$scope.fixe) {\r\n if ($scope.currentOffer.IdMarket !== undefined && $scope.currentOffer.IdMarket !== null)\r\n $scope.GetExpiries(true);\r\n }\r\n if (data.Validate) {\r\n $scope.step = 1;\r\n if (($scope.watchedit === undefined || $scope.watchedit === null)) {\r\n $scope.VerifChangementData();\r\n }\r\n }\r\n else {\r\n $scope.step = data.Step;\r\n }\r\n if ($location.path() == '/admin/offer/dupliquer/' + idOffer) {\r\n $scope.ModeDupliquer = true;\r\n $scope.HasContract = false;\r\n $scope.HasContractBase = false;\r\n $scope.HasContractOption = false;\r\n $scope.currentOffer.HasContract = false;\r\n $scope.currentOffer.HasContractBase = false;\r\n $scope.currentOffer.HasContractOption = false;\r\n $scope.currentOffer.Validate = false;\r\n if ($scope.currentOffer.OfferExpiriesVm)\r\n $scope.currentOffer.OfferExpiriesVm.forEach(function (oe) {\r\n oe.HasContract = false;\r\n oe.HasContractBase = false;\r\n oe.HasContractOption = false;\r\n });\r\n $scope.step = 1;\r\n if ($scope.lstOfferExpiry.length > 0)\r\n removeExpiryClosed();\r\n }\r\n else if ($scope.currentOffer.Validate) {\r\n $scope.ModeEdition = true;\r\n }\r\n\r\n });\r\n }\r\n } else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n\r\n compagnyService.GetAll(function (data, status) {\r\n if (status === null) {\r\n $scope.lstCompagnies = data;\r\n if ($scope.lstCompagnies != null && $scope.lstCompagnies.length == 1)\r\n $scope.FilterProducts($scope.lstCompagnies[0].IdCompagny, false);\r\n else\r\n $scope.FilterProducts(null, false);\r\n\r\n }\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n });\r\n\r\n typeOffersService.GetTypeOffers(function (data, status) {\r\n if (status === null) {\r\n $scope.lstTypeOffer = data;\r\n }\r\n else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n if ($rootScope.paramBUseOperation) {\r\n operationService.GetOperationsByTreatment(function (data, status) {\r\n if (status === null) {\r\n $scope.lstOperations = data;\r\n }\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = status;\r\n });\r\n\r\n typePriceService.GetTypePrices(function (data, status) {\r\n if (status === null) {\r\n $scope.lstTypePrices = data;\r\n }\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = status;\r\n });\r\n }\r\n\r\n typeQuotesService.GetTypeQuotes(function (data, status) {\r\n if (status === null) {\r\n lstAllTypeQuotes = data;\r\n $scope.updateLstTypeQuote();\r\n }\r\n else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n cropsService.GetCropsVisible(function (data, status) {\r\n if (status === null) {\r\n $scope.lstCrops = data;\r\n\r\n }\r\n else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n conditionsService.GetTreesForSelect(function (data, status) {//On charge maintenant à la première étape à cause de du cas de l'engagement sans achat de base\r\n if (status === null) {\r\n $scope.lstTree = data;\r\n } else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n typeOptionsService.GetTypeOptions(function (data, status) {\r\n if (status === null) {\r\n $scope.lstTypeOption = data;\r\n }\r\n else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n typeCalculOptionsService.GetTypeCalculOptions(function (data, status) {\r\n if (status === null) {\r\n $scope.lstTypeCalculOption = data;\r\n }\r\n else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n languageService.GetDefaultLanguage(function (data, status) {\r\n if (status === null) {\r\n $scope.defaultLanguage = data;\r\n }\r\n else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n categoryOfferService.GetAllCategoryOffers(function (data, status) {\r\n if (status === null) {\r\n $scope.lstCategoryOffer = data;\r\n }\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n criteriaOfferService.GetAllCriteriaOffers(function (data, status) {\r\n if (status === null) {\r\n $scope.lstCriteriaOffer = data;\r\n }\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n };\r\n\r\n $scope.updateLstTypeQuoteAndSetContractValidationDisabled = function () {\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.MultiCampagne)\r\n $scope.currentOffer.IdTypeQuote = enumFactory.TypeQuotes.Fixe;\r\n else\r\n $scope.currentOffer.IdTypeQuote = null;\r\n\r\n $scope.currentOffer.ContractValidationDisabled = $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.ContratVierge;\r\n $scope.step2_Title = $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Engagement ? $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Step2_Label_Commitment.Content : $rootScope.editableObjectsFactory.EditableObjects.Admin_CreateOffer_Step2_Label.Content;\r\n $scope.updateLstTypeQuote();\r\n };\r\n\r\n $scope.updateLstTypeQuote = function () {\r\n if ($scope.currentOffer.IdTypeOffer == $scope.enumTypeOffers.Option) {\r\n $scope.lstTypeQuotes = lstAllTypeQuotes.filter(function (quote) { return quote.IdTypeQuote != 1; });\r\n $scope.currentOffer.IdTypeOption = 1;\r\n $scope.currentOffer.IdTypeCalculOption = $scope.paramBActiveLinkWithCeremis ? enumFactory.TypeCalculOption.Automatic : enumFactory.TypeCalculOption.Manual;\r\n }\r\n else {\r\n $scope.lstTypeQuotes = lstAllTypeQuotes;\r\n }\r\n };\r\n\r\n $scope.GetDataStep2 = function () {\r\n loadMarkets(loadAndFilterOffersCeremis);\r\n\r\n $scope.fixe = $scope.currentOffer.IdTypeQuote === enumFactory.TypeQuotes.Fixe;\r\n $scope.blankContract = $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.ContratVierge;\r\n $scope.contractBuiltPrice = $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.PrixConstruit;\r\n $scope.multiCampagne = $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.MultiCampagne;\r\n\r\n //valeur par défaut quand on n'a jamais coché la case et qu'on est venu la premiere fois\r\n if (!$scope.fixe && !$scope.currentOffer.BasisMajorationValue && !$scope.BasisMajorationMonth && !$scope.currentOffer.BasisMajorationEnabled) {\r\n $scope.currentOffer.BasisMajorationValue = 0.93;\r\n $scope.currentOffer.BasisMajorationMonth = 7;\r\n }\r\n };\r\n\r\n $scope.GetDataStep3 = function () {\r\n if($scope.multiCampagne) {\r\n $scope.currentOffer.TypeFixationTypeOrders.FixationGlobalPrice = true;\r\n $scope.currentOffer.TypeFixationTypeOrders.SoldGlobalPrice = true;\r\n }\r\n\r\n validityDurationService.GetAll(function (data, status) {\r\n if (status === null)\r\n $scope.lstValidityDuration = data;\r\n else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n typeFixationBasesService.GetTypeFixationBases(function (data, status) {\r\n if (status === null) {\r\n lstTypeFixationBasesOrigin = data;\r\n $scope.lstTypeFixationBases = angular.copy(lstTypeFixationBasesOrigin);\r\n }\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n typeOfferCommitmentsService.GetTypeOfferCommitments(function (data, status) {\r\n if (status === null) {\r\n $scope.lstTypeOfferCommitments = data;\r\n }\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n typeCommitmentsService.GetTypeCommitments(function (data, status) {\r\n if (status === null) {\r\n $scope.lstTypeCommitments = data;\r\n }\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n currencyService.GetAllCurrencies(function (data, status) {\r\n if (status === null) {\r\n $scope.lstCurrencies = data;\r\n\r\n if (!$scope.currentOffer.OfferCurrencyUnits.IdOfferCurrencyUnit && $scope.lstCurrencies.length == 1) // si une seule devise\r\n {\r\n $scope.currentOffer.OfferCurrencyUnits.IdCurrencyForComponents = data[0].IdCurrency;\r\n $scope.currentOffer.OfferCurrencyUnits.IdCurrencyFinal = data[0].IdCurrency;\r\n }\r\n // si les devises par défaut n'est pas dans la table de la coop\r\n if ($filter('filter')(data, { IdCurrency: $scope.currentOffer.OfferCurrencyUnits.IdCurrencyForComponents }).length === 0 && $filter('filter')(data, { IdCurrency: $scope.currentOffer.OfferCurrencyUnits.IdCurrencyFinal }).length === 0 && !($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Ferme && $scope.lstCurrencies.length > 1)) {\r\n $scope.currentOffer.OfferCurrencyUnits.IdCurrencyForComponents = data[0].IdCurrency;\r\n $scope.currentOffer.OfferCurrencyUnits.IdCurrencyFinal = data[0].IdCurrency;\r\n }\r\n\r\n if (($scope.currentOffer.IdTypeOffer == 2 || $scope.currentOffer.IdTypeOffer == 3 || $scope.currentOffer.IdTypeOffer == 6) && $scope.lstCurrencies.length >= 1) // si offre d'engagement, engagement de surface ou option, on met les devises par défaut\r\n {\r\n $scope.currentOffer.OfferCurrencyUnits.IdCurrencyForComponents = data[0].IdCurrency;\r\n $scope.currentOffer.OfferCurrencyUnits.IdCurrencyFinal = data[0].IdCurrency;\r\n }\r\n }\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n unitService.GetAllUnits(function (data, status) {\r\n if (status === null) {\r\n $scope.lstUnits = data;\r\n\r\n // Initialisation Devises, unités et décimales\r\n if(!($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Ferme && $scope.lstUnits.length > 1))\r\n {\r\n $scope.currentOffer.OfferCurrencyUnits = {\r\n IdCurrencyFinal: $scope.currentOffer.OfferCurrencyUnits.IdCurrencyFinal != null ? $scope.currentOffer.OfferCurrencyUnits.IdCurrencyFinal : 1,\r\n IdUnitFinal: $scope.currentOffer.OfferCurrencyUnits.IdUnitFinal != null ? $scope.currentOffer.OfferCurrencyUnits.IdUnitFinal : 1,\r\n IdCurrencyForComponents: $scope.currentOffer.OfferCurrencyUnits.IdCurrencyForComponents != null ? $scope.currentOffer.OfferCurrencyUnits.IdCurrencyForComponents : 1,\r\n IdUnitForComponents: $scope.currentOffer.OfferCurrencyUnits.IdUnitForComponents != null ? $scope.currentOffer.OfferCurrencyUnits.IdUnitForComponents : 1,\r\n DecimalFinal: $scope.currentOffer.OfferCurrencyUnits.DecimalFinal != null ? $scope.currentOffer.OfferCurrencyUnits.DecimalFinal : 2,\r\n DecimalForComponents: $scope.currentOffer.OfferCurrencyUnits.DecimalForComponents != null ? $scope.currentOffer.OfferCurrencyUnits.DecimalForComponents : 2\r\n };\r\n }\r\n\r\n if (!$scope.currentOffer.OfferCurrencyUnits.IdOfferCurrencyUnit && $scope.lstUnits.length == 1) // si une seule unité\r\n {\r\n $scope.currentOffer.OfferCurrencyUnits.IdUnitForComponents = data[0].IdUnit;\r\n $scope.currentOffer.OfferCurrencyUnits.IdUnitFinal = data[0].IdUnit;\r\n }\r\n\r\n // si les unités par défaut n'est pas dans la table de la coop\r\n if ($filter('filter')(data, { IdUnit: $scope.currentOffer.OfferCurrencyUnits.IdUnitForComponents }).length === 0 && $filter('filter')(data, { IdUnit: $scope.currentOffer.OfferCurrencyUnits.IdUnitFinal }).length === 0 && !($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Ferme && $scope.lstUnits.length > 1))\r\n {\r\n $scope.currentOffer.OfferCurrencyUnits.IdUnitForComponents = data[0].IdUnit;\r\n $scope.currentOffer.OfferCurrencyUnits.IdUnitFinal = data[0].IdUnit;\r\n }\r\n\r\n if (($scope.currentOffer.IdTypeOffer == 2 || $scope.currentOffer.IdTypeOffer == 3 || $scope.currentOffer.IdTypeOffer == 6) && $scope.lstUnits.length >= 1) // si offre d'engagement, engagement de surface ou option, on met les unités par défaut\r\n {\r\n $scope.currentOffer.OfferCurrencyUnits.IdUnitForComponents = data[0].IdUnit;\r\n $scope.currentOffer.OfferCurrencyUnits.IdUnitFinal = data[0].IdUnit;\r\n }\r\n }\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n if (($scope.watchTypeFixation === undefined || $scope.watchTypeFixation === null) && $scope.step === 3){\r\n $scope.watchTypeFixation = $scope.$watchCollection(\"currentOffer.TypeFixationTypeOrders\", function (value) {\r\n var indexTypeFixationBaseAuto = $scope.lstTypeFixationBases.indexOf($filter('filter')($scope.lstTypeFixationBases, { \"IdTypeFixationBase\": enumFactory.TypeFixationBases.Automatic }, true)[0]);\r\n \r\n if (value.TargetPriceFuture){\r\n $scope.lstTypeFixationBases = angular.copy(lstTypeFixationBasesOrigin);\r\n\r\n } else if (indexTypeFixationBaseAuto !== -1){\r\n $scope.lstTypeFixationBases.splice(indexTypeFixationBaseAuto, 1);\r\n if($scope.currentOffer.IdTypeFixationBase == enumFactory.TypeFixationBases.Automatic)\r\n $scope.currentOffer.IdTypeFixationBase = null;\r\n }\r\n });\r\n }\r\n\r\n if (($scope.watchFixationBaseConstraint === undefined || $scope.watchFixationBaseConstraint === null) && $scope.step === 3){\r\n $scope.watchFixationBaseConstraint = $scope.$watchCollection(\"currentOffer.IdTypeFixationBase\", function (value) {\r\n if(value === enumFactory.TypeFixationBases.Automatic){\r\n $scope.currentOffer.TypeFixationTypeOrders = {\r\n FixationBase:true,\r\n SoldBase: true,\r\n TargetPriceBase: false,\r\n FixationFuture:true,\r\n SoldFuture: false,\r\n TargetPriceFuture: true,\r\n SoldGlobalPrice: false,\r\n TargetPriceGlobalPrice: false\r\n };\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.GetDataStep5 = function () {\r\n groupContactService.GetAll(function (data, status) {\r\n if (status === null) {\r\n $scope.lstGroupContacts = {};\r\n $scope.lstGroupContacts = data;\r\n\r\n $scope.lstGroupContacts = $scope.lstGroupContacts.filter(function (element) { return $scope.currentOffer.GroupContacts.filter(function (e) { return e.IdGroupContact === element.IdGroupContact; }); });\r\n $scope.UpdateOfferGroupContact();\r\n } else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n $scope.setSelectedList();\r\n });\r\n\r\n $scope.UpdateOfferGroupContact = function () {\r\n if ($scope.HasQuantityLimit && $scope.currentOffer.IsTonnageLimit) {\r\n $scope.currentOffer.OfferGroupContactTonnageVm = [];\r\n\r\n $scope.currentOffer.GroupContacts.forEach(function (currentGroupContact) {\r\n if (currentGroupContact.OfferGroupContactTonnages != null)\r\n currentGroupContact.OfferGroupContactTonnages = currentGroupContact.OfferGroupContactTonnages.filter(function (element) { return element.IdOffer === $scope.currentOffer.IdOffer; });\r\n else currentGroupContact.OfferGroupContactTonnages = [];\r\n });\r\n\r\n $scope.currentOffer.GroupContacts.forEach(function (currentGroupContact) {\r\n if (currentGroupContact.OfferGroupContactTonnages.length == 0) {\r\n var offerGroup = {\r\n Label: currentGroupContact.Label,\r\n IdGroupContact: currentGroupContact.IdGroupContact,\r\n IdOffer: $scope.currentOffer.IdOffer\r\n };\r\n $scope.currentOffer.OfferGroupContactTonnageVm.push(offerGroup);\r\n }\r\n else {\r\n currentGroupContact.OfferGroupContactTonnages.forEach(function (groupContact) {\r\n if (groupContact.IdGroupContact == currentGroupContact.IdGroupContact && groupContact.IdOffer == $scope.currentOffer.IdOffer) {\r\n var offerGroup = {\r\n IdOfferGroupContactTonnage: groupContact.IdOfferGroupContactTonnage,\r\n Label: currentGroupContact.Label,\r\n IdGroupContact: groupContact.IdGroupContact,\r\n IdOffer: $scope.currentOffer.IdOffer,\r\n QuantityLimit: groupContact.QuantityLimit\r\n };\r\n $scope.currentOffer.OfferGroupContactTonnageVm.push(offerGroup);\r\n }\r\n });\r\n }\r\n });\r\n $scope.SumTonnageLimit($scope.currentOffer.OfferGroupContactTonnageVm);\r\n }\r\n };\r\n\r\n offerVisibilityService.GetOfferVisibilities(function (data, status) {\r\n if (status === null) {\r\n if ($scope.blankContract) {\r\n $scope.lstVisibilityOffer = data.filter(function (element) { return (element.IdVisibilityOffer === $scope.enumVisibilityOffer.Tc_Only || element.IdVisibilityOffer === $scope.enumVisibilityOffer.Dr_Ra || element.IdVisibilityOffer === $scope.enumVisibilityOffer.Siege); });\r\n if (idOffer === undefined || idOffer === null || idOffer == -1) { //Si c'est une nouvelle offre\r\n $scope.currentOffer.IdVisibilityOffer = $scope.enumVisibilityOffer.Tc_Only; //On préselectionne Tc uniquement si on a un type d'offre: contrat vierge\r\n }\r\n } else {\r\n $scope.lstVisibilityOffer = data;\r\n }\r\n }\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n templatesService.GetTemplates(function (data, status) {\r\n if (status === null) {\r\n\r\n $scope.lstTemplates = data;\r\n var typeTemplatesNecessary = [];\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Engagement) {\r\n typeTemplatesNecessary.push(enumFactory.TypeTemplates.Engagement);\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.EngagementSurface) {\r\n typeTemplatesNecessary.push(enumFactory.TypeTemplates.EngagementSurface);\r\n }\r\n\r\n if ($scope.blankContract) {\r\n typeTemplatesNecessary.push(enumFactory.TypeTemplates.BlankContract);\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.PrixConstruit) {\r\n typeTemplatesNecessary.push(enumFactory.TypeTemplates.ContratBuiltPrice);\r\n typeTemplatesNecessary.push(enumFactory.TypeTemplates.ExitAnticipatedBuiltPrice);\r\n }\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Option) {\r\n typeTemplatesNecessary.push(enumFactory.TypeTemplates.Option);\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.SoldExerciceOption) {\r\n typeTemplatesNecessary.push(enumFactory.TypeTemplates.ExerciseOption);\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.TargetExerciceOption) {\r\n typeTemplatesNecessary.push(enumFactory.TypeTemplates.TargetExerciseOption);\r\n }\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Ferme) {\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.SoldFuture || $scope.currentOffer.TypeFixationTypeOrders.SoldGlobalPrice) {\r\n typeTemplatesNecessary.push(enumFactory.TypeTemplates.Vente);\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.TargetPriceFuture || $scope.currentOffer.TypeFixationTypeOrders.TargetPriceGlobalPrice) {\r\n typeTemplatesNecessary.push(enumFactory.TypeTemplates.Objectif);\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.SoldBase) {\r\n typeTemplatesNecessary.push(enumFactory.TypeTemplates.VenteBase);\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.TargetPriceBase) {\r\n typeTemplatesNecessary.push(enumFactory.TypeTemplates.ObjectifBase);\r\n }\r\n }\r\n\r\n if ($scope.multiCampagne) {\r\n typeTemplatesNecessary.push(enumFactory.TypeTemplates.MultiCrop);\r\n }\r\n\r\n $scope.lstTemplates = $scope.lstTemplates.filter(function (element) {\r\n return element.IsEnable === true &&\r\n typeTemplatesNecessary.includes(element.IdTypeTemplate) &&\r\n $scope.currentOffer.Templates.filter(function (e) { return e.IdTemplate === element.IdTemplate; });\r\n });\r\n\r\n $scope.lstTemplates = $scope.lstTemplates.sort(function (a, b) {\r\n if (a.Label.toLowerCase() < b.Label.toLowerCase()) {\r\n return -1;\r\n }\r\n if (a.Label.toLowerCase() > b.Label.toLowerCase()) {\r\n return 1;\r\n }\r\n return 0;\r\n });\r\n }\r\n else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n $scope.setSelectedList();\r\n });\r\n\r\n if ($scope.currentOffer.IdAttachment !== undefined && $scope.currentOffer.IdAttachment !== null && $scope.currentOffer.IdAttachment !== \"\")\r\n $scope.fileName = $scope.currentOffer.Attachment.PublicLabel;\r\n };\r\n\r\n $scope.Cancel = function () {\r\n if ($scope.watchEditBuiltPrice !== null && $scope.watchEditBuiltPrice !== undefined) {\r\n $scope.noWatchBuiltPriceData();\r\n }\r\n if ($scope.watchedit !== null && $scope.watchedit !== undefined) {\r\n $scope.noWatch();\r\n }\r\n if ($scope.watchTypeFixation !== null && $scope.watchTypeFixation !== undefined) {\r\n $scope.noWatchTypeFixation();\r\n }\r\n if ($scope.watchFixationBaseConstraint !== null && $scope.watchFixationBaseConstraint !== undefined) {\r\n $scope.nowatchFixationBaseConstraint();\r\n }\r\n $location.path('/admin/offers/' + ($rootScope.filtersListingOffers ? $rootScope.filtersListingOffers.idStatus : '' ));\r\n };\r\n\r\n $scope.NextStep = function (goToStep) { //suivant\r\n if (goToStep)\r\n $scope.step = goToStep;\r\n else\r\n $scope.step += 1;\r\n if ($scope.watchedit !== undefined && $scope.watchedit !== null) {\r\n $scope.noWatch();\r\n }\r\n if (!$scope.ModeDupliquer && $scope.watchEditBuiltPrice == undefined && $scope.watchEditBuiltPrice == null && idOffer > 0) {\r\n $scope.VerifChangementBuiltPriceData();\r\n }\r\n };\r\n\r\n $scope.PrevStep = function () { //precedent\r\n if ($scope.step === 3 && ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.EngagementSurface))\r\n $scope.step = 1;\r\n else if ($scope.step === 4 && $scope.blankContract) {\r\n $scope.step = 2;\r\n }\r\n else if ($scope.step === 4 && $scope.contractBuiltPrice) {\r\n $scope.step = 2;\r\n }\r\n else\r\n $scope.step -= 1;\r\n $scope.errorMessage = \"\";\r\n if (($scope.watchedit === undefined || $scope.watchedit === null) && !$scope.HasContract && $scope.step === 1) {\r\n $scope.VerifChangementData();\r\n }\r\n if (!$scope.ModeDupliquer && ($scope.watchEditBuiltPrice === undefined || $scope.watchEditBuiltPrice === null) && ($scope.step === 2 || $scope.step === 4) && idOffer > 0) {\r\n $scope.VerifChangementBuiltPriceData();\r\n }\r\n };\r\n\r\n function SaveOffer(callBack) {\r\n $scope.disableSubmitedButton = true;\r\n offerService.SaveOffer($scope.currentOffer, function (data, status) {\r\n if (status === null) {\r\n if (callBack)\r\n callBack();\r\n $location.path('/admin/offers/' + data);\r\n }\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = status;\r\n $scope.disableSubmitedButton = false;\r\n });\r\n }\r\n\r\n // Activé watcher sur champs de l'offre\r\n $scope.VerifChangementData = function () {\r\n $scope.watchedit = $scope.$watchCollection(\"currentOffer\", function (value, old) {\r\n var param = {};\r\n param.oldValue = old;\r\n param.newValue = value;\r\n $scope.paramWatcher = angular.copy(param);\r\n if (value === undefined || value === null) return;\r\n\r\n if (value.IdCrop != old.IdCrop ||\r\n value.IdProduct != old.IdProduct ||\r\n value.IdTypeOffer != old.IdTypeOffer ||\r\n value.IdTypeQuote != old.IdTypeQuote) {\r\n if (!$scope.ModeDupliquer) {\r\n $scope.showPopUpEditOffer(param); //directive\r\n } else if ($scope.ModeDupliquer) {\r\n $scope.showPopUpEditOffer(param);\r\n }\r\n }\r\n });\r\n };\r\n\r\n // désactivé watcher type Fixation\r\n $scope.noWatchTypeFixation = function () {\r\n $scope.watchTypeFixation = null;\r\n };\r\n $scope.nowatchFixationBaseConstraint = function () {\r\n $scope.watchFixationBaseConstraint = null;\r\n };\r\n \r\n // désactivé watcher sur champs de l'offre\r\n $scope.noWatch = function () {\r\n $scope.watchedit();\r\n $scope.watchedit = null;\r\n };\r\n\r\n //appelée par directive popup dans la vue\r\n $scope.disableWatcher = function () {\r\n $scope.noWatch();\r\n $scope.ClearStep($scope.step);\r\n };\r\n\r\n //appelée par directive popup dans la vue\r\n $scope.cancelModif = function (param) {\r\n if ($scope.watchedit !== undefined && $scope.watchedit !== null) {\r\n $scope.noWatch();\r\n }\r\n $scope.currentOffer = param.oldValue;\r\n $scope.VerifChangementData();\r\n $scope.setSelectedList();\r\n };\r\n\r\n //*************************** POPUP Modification offre BUILT PRICE *******************************************/\r\n $scope.VerifChangementBuiltPriceData = function () {\r\n $scope.watchEditBuiltPrice = $scope.$watchCollection(\"currentOffer\", function (value, old) {\r\n var param = {};\r\n param.oldValue = old;\r\n param.newValue = value;\r\n $scope.paramWatcher = angular.copy(param);\r\n if (value === undefined || value === null) return;\r\n if ($scope.currentOffer.IdTypeOffer == $scope.enumTypeOffers.PrixConstruit && (\r\n value.IdMarket != old.IdMarket ||\r\n value.ObservationPeriodBuiltPriceStartDate != old.ObservationPeriodBuiltPriceStartDate ||\r\n value.ObservationPeriodBuiltPriceEndDate != old.ObservationPeriodBuiltPriceEndDate)) {\r\n $scope.showPopUpEditBuiltPriceOffer(param);\r\n }\r\n });\r\n };\r\n\r\n $scope.noWatchBuiltPriceData = function () {\r\n if ($scope.watchEditBuiltPrice !== undefined && $scope.watchEditBuiltPrice !== null)\r\n $scope.watchEditBuiltPrice();\r\n $scope.watchEditBuiltPrice = null;\r\n };\r\n\r\n $scope.disableWatcherBuiltPriceData = function () {\r\n $scope.noWatchBuiltPriceData();\r\n };\r\n\r\n $scope.cancelModifBuiltPriceData = function (param) {\r\n if ($scope.watchEditBuiltPrice !== undefined && $scope.watchEditBuiltPrice !== null){\r\n $scope.noWatchBuiltPriceData();\r\n }\r\n $scope.currentOffer = param.oldValue;\r\n $scope.VerifChangementBuiltPriceData();\r\n $scope.setSelectedList();\r\n };\r\n\r\n //************************************************************************************************* */\r\n\r\n $scope.ValidTargetContractBasesFix = function () {\r\n\r\n SaveOffer(function () {\r\n contractBaseService.ValidTargetContractBasesFix($scope.currentOffer.OfferExpiriesVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = status;\r\n }\r\n else {\r\n contractsService.ValidTargetContracts($scope.currentOffer.IdOffer, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n }\r\n });\r\n });\r\n };\r\n\r\n $scope.setSelectedList = function () {\r\n if ($scope.currentOffer.VarietiesVm === undefined || $scope.currentOffer.VarietiesVm === null || !$scope.currentOffer.IdProduct)\r\n $scope.currentOffer.VarietiesVm = [];\r\n else {\r\n $scope.lstvarieteTmp = angular.copy($filter('filter')($scope.lstProducts, { IdProduct: $scope.currentOffer.IdProduct }, true)[0].Varieties);\r\n $.each($scope.currentOffer.VarietiesVm, function (index, item) {\r\n if ($scope.lstvarieteTmp.indexOf($filter('filter')($scope.lstvarieteTmp, { \"IdVariety\": Number(item.IdVariety) }, true)[0]) !== -1) {\r\n $scope.lstvarieteTmp.splice($scope.lstvarieteTmp.indexOf($filter('filter')($scope.lstvarieteTmp, { \"IdVariety\": Number(item.IdVariety) }, true)[0]), 1);\r\n }\r\n });\r\n }\r\n if ($scope.currentOffer.GroupContacts === undefined || $scope.currentOffer.GroupContacts === null) {\r\n $scope.currentOffer.GroupContacts = [];\r\n } else {\r\n $scope.$watch(\"lstGroupContacts\", function (value) {\r\n if (value === undefined) return;\r\n $.each($scope.currentOffer.GroupContacts, function (index, item) {\r\n if ($scope.lstGroupContacts.indexOf($filter('filter')($scope.lstGroupContacts, { \"IdGroupContact\": Number(item.IdGroupContact) }, true)[0]) !== -1) {\r\n $scope.lstGroupContacts.splice($scope.lstGroupContacts.indexOf($filter('filter')($scope.lstGroupContacts, { \"IdGroupContact\": Number(item.IdGroupContact) }, true)[0]), 1);\r\n }\r\n });\r\n });\r\n }\r\n if ($scope.currentOffer.Templates === undefined || $scope.currentOffer.Templates === null) {\r\n $scope.currentOffer.Templates = [];\r\n } else {\r\n $scope.$watch(\"lstTemplates\", function (value) {\r\n if (value === undefined) return;\r\n $.each($scope.currentOffer.Templates, function (index, item) {\r\n if ($scope.lstTemplates.indexOf($filter('filter')($scope.lstTemplates, { \"IdTemplate\": Number(item.IdTemplate) }, true)[0]) !== -1) {\r\n $scope.lstTemplates.splice($scope.lstTemplates.indexOf($filter('filter')($scope.lstTemplates, { \"IdTemplate\": Number(item.IdTemplate) }, true)[0]), 1);\r\n }\r\n });\r\n });\r\n }\r\n\r\n if ($scope.currentOffer.OfferExpiriesVm === undefined || $scope.currentOffer.OfferExpiriesVm === null)\r\n $scope.currentOffer.OfferExpiriesVm = [];\r\n };\r\n\r\n $scope.$watch(\"lstTypeOffer\", function (value) {\r\n if (value === undefined) return;\r\n $scope.currentOffer.IdTypeOffer = value[0].IdTypeOffer;\r\n });\r\n\r\n $scope.FilterProducts = function (idCompagny, resetIdProduct) {\r\n if(resetIdProduct) {\r\n $scope.currentOffer.IdProduct = null;\r\n $scope.currentOffer.VarietiesVm = [];\r\n }\r\n $scope.lstvarieteTmp = [];\r\n $scope.lstProducts = [];\r\n $scope.lstProductsFiltre = [];\r\n if (idCompagny != null) {\r\n $scope.lstAllProducts.forEach(function (product) {\r\n if (product.Compagnies.length > 0) {\r\n if ($filter('filter')(product.Compagnies, { IdCompagny: idCompagny })[0] !== undefined)\r\n $scope.lstProducts.push(product);\r\n }\r\n });\r\n }\r\n else {\r\n $scope.lstAllProducts.forEach(function (product) {\r\n if (product.Compagnies.length > 0)\r\n $scope.lstProducts.push(product);\r\n });\r\n }\r\n };\r\n \r\n $scope.greaterThan = function(index){\r\n var idCropRef = $scope.currentOffer.IdCrop ;\r\n if (index > 0) {\r\n idCropRef = $scope.currentOffer.IdsSubCrops[index-1] ;\r\n }\r\n \r\n var minLabel = idCropRef ? $scope.lstCrops.filter(function (crop) {\r\n return crop.IdCrop == idCropRef;\r\n })[0].Label : 0;\r\n \r\n return function(item){\r\n return item.Label > minLabel;\r\n };\r\n };\r\n\r\n $scope.LstMultiCrop = function(index, idCropSelected) {\r\n $scope.errorMessage = \"\";\r\n if($scope.currentOffer.IdCrop === undefined || $scope.currentOffer.IdCrop === null || $scope.currentOffer.IdCrop === 0 || (idCropSelected && idCropSelected !== $scope.currentOffer.IdCrop ) ){\r\n $scope.currentOffer.IdsSubCrops.splice(0, $scope.currentOffer.IdsSubCrops.length);\r\n }\r\n if($scope.currentOffer.IdsSubCrops[index] === null)\r\n $scope.currentOffer.IdsSubCrops.splice(index, ($scope.currentOffer.IdsSubCrops.length - index));\r\n\r\n if ($scope.refIdsSubCrops.length > 0 && ($scope.refIdsSubCrops[index] != $scope.currentOffer.IdsSubCrops[index])) {\r\n for(var i=index+1;i<$scope.currentOffer.IdsSubCrops.length;i++) {\r\n $scope.currentOffer.IdsSubCrops.splice(i, ($scope.currentOffer.IdsSubCrops.length - i));\r\n }\r\n }\r\n $scope.refIdsSubCrops = angular.copy($scope.currentOffer.IdsSubCrops) ;\r\n };\r\n\r\n $scope.GetVarieties = function () {\r\n if ($scope.currentOffer.IdProduct == null || $scope.currentOffer.IdTypeOffer == $scope.enumTypeOffers.Option) {\r\n $scope.lstvarieteTmp = [];\r\n return;\r\n }\r\n $scope.lstVarieties = [];\r\n $scope.lstVarietiesByProduct = $filter('filter')($scope.lstProducts, { IdProduct: $scope.currentOffer.IdProduct }, true)[0].Varieties;\r\n if ($scope.currentOffer.IdCompagny != null) {\r\n $scope.lstVarietiesByProduct.forEach(function (variety) {\r\n if (variety.Compagnies.length > 0) {\r\n if ($filter('filter')(variety.Compagnies, { IdCompagny: $scope.currentOffer.IdCompagny })[0] !== undefined)\r\n $scope.lstVarieties.push(variety);\r\n }\r\n });\r\n }\r\n else\r\n $scope.lstVarietiesByProduct.forEach(function (variety) {\r\n if (variety.Compagnies.length > 0)\r\n $scope.lstVarieties.push(variety);\r\n });\r\n\r\n $scope.lstvarieteTmp = angular.copy($scope.lstVarieties);\r\n $scope.currentOffer.VarietiesVm = [];\r\n };\r\n\r\n $scope.GetExpiries = function (isInit) {\r\n if (!isInit)\r\n $scope.lstOfferExpiry = [];\r\n\r\n if (!$scope.lstMarkets) {\r\n loadMarkets(loadExpiries);\r\n } else {\r\n loadExpiries();\r\n }\r\n };\r\n\r\n $scope.ChangeTypeCalculOption = function () {\r\n $scope.lstOfferExpiry.forEach(function (expiry) {\r\n expiry.Strikes = [];\r\n $scope.strikeAutoVm = [];\r\n });\r\n };\r\n\r\n $scope.ChangeQuantityLimit = function () {\r\n $scope.HasQuantityLimit = $scope.currentOffer.QuantityLimit > 0 ? true : false;\r\n };\r\n\r\n $scope.SumTonnageLimit = function (lstGroup) {\r\n $scope.TotalQuantityLimit = 0;\r\n lstGroup.forEach(function (group) {\r\n if (group.QuantityLimit !== undefined && group.QuantityLimit !== \"\" && angular.isNumber(parseFloat(group.QuantityLimit)) && group.QuantityLimit !== null)\r\n $scope.TotalQuantityLimit = parseFloat($scope.TotalQuantityLimit + parseFloat(group.QuantityLimit));\r\n });\r\n };\r\n\r\n $scope.Check = function (step) {\r\n\r\n if (step)\r\n $scope.step = step;\r\n\r\n switch ($scope.step) {\r\n case 1:\r\n if (CheckStep($scope.step)) {\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.EngagementSurface) {\r\n $scope.NextStep(3);\r\n $scope.GetDataStep3();\r\n }\r\n else {\r\n $scope.NextStep();\r\n $scope.GetDataStep2();\r\n }\r\n }\r\n return;\r\n case 2:\r\n if (CheckStep($scope.step) && $scope.contractBuiltPrice){\r\n $scope.NextStep(4);\r\n } else if ($scope.lstOfferExpiry && $scope.lstOfferExpiry.length > 0) {\r\n $scope.CheckExpiries().then(function (results) {\r\n if (CheckStep($scope.step)) {\r\n if ($scope.blankContract) {\r\n $scope.NextStep(4);\r\n }\r\n else {\r\n $scope.NextStep();\r\n $scope.GetDataStep3();\r\n }\r\n }\r\n });\r\n } else {\r\n if (CheckStep($scope.step)) {\r\n $scope.NextStep();\r\n $scope.GetDataStep3();\r\n }\r\n }\r\n return;\r\n case 3:\r\n if (CheckStep($scope.step)) {\r\n $scope.NextStep();\r\n }\r\n return;\r\n case 4:\r\n if (CheckStep($scope.step)) {\r\n $scope.NextStep();\r\n $scope.GetDataStep5();\r\n }\r\n return;\r\n case 5:\r\n $scope.CheckSameTypeTemplate().then(function (results) {\r\n if (CheckStep($scope.step)) {\r\n if (!$scope.ModeDupliquer) {\r\n $scope.currentOffer.Validate = true;\r\n }\r\n\r\n if ($rootScope.paramNameCoop == enumFactory.Coops.Ducroquet && !$scope.ModeEdition && !ducroquetValidTypeCoverPopUp)\r\n $scope.showPopUpTypeCover($scope.Check);\r\n else\r\n $scope.CheckAndSaveOffer();\r\n }\r\n });\r\n return;\r\n default:\r\n }\r\n };\r\n\r\n //enregistré et quitter\r\n $scope.TmpSave = function (step) {\r\n\r\n if (step)\r\n $scope.step = step;\r\n\r\n if ($rootScope.paramNameCoop == enumFactory.Coops.Ducroquet && !$scope.ModeEdition && !ducroquetValidTypeCoverPopUp)\r\n $scope.showPopUpTypeCover($scope.TmpSave);\r\n else {\r\n $scope.errorMessage = \"\";\r\n if ($scope.ModeEdition || $scope.ModeDupliquer) {\r\n $scope.CheckTemplate();\r\n\r\n if ($scope.errorMessage !== \"\")\r\n return false;\r\n }\r\n if ($scope.step === 2 && $scope.lstOfferExpiry && $scope.lstOfferExpiry.length > 0) {\r\n $scope.CheckExpiries().then(function (results) {\r\n if (CheckStep($scope.step))\r\n $scope.CheckAndSaveOffer();\r\n });\r\n }\r\n else {\r\n $scope.CheckSameTypeTemplate().then(function () {\r\n if (CheckStep($scope.step))\r\n $scope.CheckAndSaveOffer();\r\n });\r\n }\r\n }\r\n };\r\n\r\n $scope.confirmPopUpTypeCover = function (callback) {\r\n ducroquetValidTypeCoverPopUp = true;\r\n callback();\r\n };\r\n\r\n function checkDistinct(array) {\r\n for (var i = 0; i < array.length; i++) { \r\n if (array.indexOf(array[i]) !== i) { \r\n return false; \r\n } \r\n }\r\n\r\n if(array.includes($scope.currentOffer.IdCrop))\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n function checkIfOfferSubCropsExist(array) {\r\n var cmpt = 0;\r\n for (var i = 0; i < array.length; i++) {\r\n if(array[i] === 0 || array[i] === undefined || array[i] === null) {\r\n cmpt++;\r\n }\r\n }\r\n if(cmpt === array.length)\r\n return false;\r\n\r\n return true;\r\n }\r\n\r\n function CheckStep(step) {\r\n switch (step) {\r\n case 1:\r\n if ($scope.currentOffer.IdTypeOffer === undefined || $scope.currentOffer.IdTypeOffer === null || $scope.currentOffer.IdTypeOffer === 0) {\r\n $scope.errorMessage = \"Veuillez sélectionner un type d'offre\";\r\n return false;\r\n }\r\n if ($rootScope.paramBUseOperation && ($scope.currentOffer.IdOperation === undefined || $scope.currentOffer.IdOperation === null || $scope.currentOffer.IdOperation === 0)) {\r\n $scope.errorMessage = \"Veuillez sélectionner un type d'opération\";\r\n return false;\r\n }\r\n if ($rootScope.paramBUseOperation && $scope.lstTypePrices && $scope.lstTypePrices.length > 0 && !$scope.currentOffer.IdTypePrice) {\r\n $scope.errorMessage = \"Veuillez sélectionner un type de prix\";\r\n return false;\r\n }\r\n if ($scope.currentOffer.IdCrop === undefined || $scope.currentOffer.IdCrop === null || $scope.currentOffer.IdCrop === 0) {\r\n $scope.errorMessage = \"Veuillez sélectionner une campagne\";\r\n return false;\r\n }\r\n if ($scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.ContratVierge && ($scope.currentOffer.IdProduct === undefined || $scope.currentOffer.IdProduct === null || $scope.currentOffer.IdProduct === 0)) {\r\n $scope.errorMessage = \"Veuillez sélectionner un produit\";\r\n return false;\r\n }\r\n if ($scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.Engagement && $scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.EngagementSurface && $scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.ContratVierge && $scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.PrixConstruit && ($scope.currentOffer.IdTypeQuote === undefined || $scope.currentOffer.IdTypeQuote === null || $scope.currentOffer.IdTypeQuote === 0)) {\r\n $scope.errorMessage = \"Veuillez sélectionner un type de cotation\";\r\n return false;\r\n }\r\n if ($scope.IsUneal && $scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.ContratVierge && $scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.PrixConstruit && ($scope.currentOffer.IdCriteriaOffer === undefined || $scope.currentOffer.IdCriteriaOffer === null || $scope.currentOffer.IdCriteriaOffer === 0)) {\r\n $scope.errorMessage = \"Veuillez sélectionner un critère de qualité\";\r\n return false;\r\n }\r\n if ($scope.currentOffer.Label === undefined || $scope.currentOffer.Label === null || $scope.currentOffer.Label === '') {\r\n $scope.errorMessage = \"Veuillez renseigner un nom d'offre\";\r\n return false;\r\n }\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Engagement || $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.EngagementSurface || $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.ContratVierge || $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.PrixConstruit)\r\n $scope.currentOffer.IdTypeQuote = null;\r\n\r\n if (!$rootScope.paramBUseOperation)\r\n $scope.currentOffer.IdOperation = null;\r\n\r\n if($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.MultiCampagne) {\r\n if(!checkDistinct($scope.currentOffer.IdsSubCrops)) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_MultiCrop_ErrorMessage_step1.Content;\r\n return false;\r\n }\r\n \r\n if(!checkIfOfferSubCropsExist($scope.currentOffer.IdsSubCrops)) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_MultiCrop_ErrorMessage2_step1.Content;\r\n return false;\r\n }\r\n }\r\n\r\n $scope.errorMessage = \"\";\r\n return true;\r\n\r\n case 2:\r\n\r\n if ($scope.currentOffer.IdTypeOffer == $scope.enumTypeOffers.Engagement) {\r\n $scope.errorMessage = \"\";\r\n return true;\r\n }\r\n\r\n if (!$scope.blankContract) {\r\n if ($scope.fixe && !$scope.contractBuiltPrice) {\r\n if ($scope.currentOffer.Price === undefined || $scope.currentOffer.Price === null || $scope.currentOffer.Price === 0.0 || $scope.currentOffer.Price === \"\" || !angular.isNumber(parseFloat($scope.currentOffer.Price))) {\r\n $scope.errorMessage = \"Veuillez renseigner un prix valide\";\r\n return false;\r\n }\r\n } else {\r\n if ($scope.currentOffer.IdMarket === \"\" || $scope.currentOffer.IdMarket === 0 || $scope.currentOffer.IdMarket === undefined || $scope.currentOffer.IdMarket === null) {\r\n $scope.errorMessage = \"Veuillez sélectionner un marché\";\r\n return false;\r\n }\r\n if (($scope.currentOffer.IdExpiry === \"\" || $scope.currentOffer.IdExpiry === 0 || $scope.currentOffer.IdExpiry === undefined || $scope.currentOffer.IdExpiry === null) && !$scope.contractBuiltPrice && !$scope.multiCampagne) {\r\n $scope.errorMessage = \"Veuillez sélectionner une écheance\";\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n if(!$scope.contractBuiltPrice && !$scope.multiCampagne){\r\n if (!$scope.lstOfferExpiry || $scope.lstOfferExpiry.length === 0) {\r\n $scope.errorMessage = \"Veuillez renseigner vos échéances\";\r\n return false;\r\n } else\r\n if (!$scope.validExpiries)\r\n return false;\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Option) {\r\n var checkStrike = true;\r\n if ($scope.currentOffer.IdTypeCalculOption == enumFactory.TypeCalculOption.Manual) {\r\n $scope.lstOfferExpiry.forEach(function (expiry) {\r\n if (checkStrike) {\r\n if (expiry.Strikes == null || expiry.Strikes.length < 1) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Option_ErrorExpiryStrike.Content + expiry.Label;\r\n checkStrike = false;\r\n }\r\n\r\n expiry.Strikes.forEach(function (strike) {\r\n if (!strike.ExerciceDate ||\r\n strike.Prime === '' ||\r\n isNaN(strike.Prime) ||\r\n strike.Variation === '' ||\r\n isNaN(strike.Variation)\r\n ) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Option_ErrorStrike.Content + expiry.Label;\r\n checkStrike = false;\r\n }\r\n });\r\n\r\n var strikesInTheMoney = expiry.Strikes.filter(function(x){ return x.Variation === 0;});\r\n if (!strikesInTheMoney || strikesInTheMoney.length > 1) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_CreateOffer_Strikes_GapInTheMoney.Content;\r\n checkStrike = false;\r\n }\r\n\r\n }\r\n });\r\n return checkStrike;\r\n }\r\n else if ($scope.currentOffer.IdTypeCalculOption == enumFactory.TypeCalculOption.Automatic && !$scope.paramBActiveLinkWithCeremis) {\r\n checkStrike = true;\r\n $scope.lstOfferExpiry.forEach(function (expiry) {\r\n if (checkStrike && expiry.Strikes.length === 0) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Option_ErrorExpiryStrike.Content + expiry.Label;\r\n checkStrike = false;\r\n }\r\n });\r\n return checkStrike;\r\n }\r\n }\r\n if(!$scope.contractBuiltPrice && !$scope.multiCampagne){\r\n if ($scope.currentOffer.BasisMajorationEnabled == true) {\r\n if (!$scope.currentOffer.BasisMajorationMonth) {\r\n $scope.errorMessage = \"Veuillez saisir un mois de référence\";\r\n return false;\r\n }\r\n if (!$scope.currentOffer.BasisMajorationValue) {\r\n $scope.errorMessage = \"Veuillez saisir une valeur de majoration\";\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n $scope.errorMessage = \"\";\r\n return true;\r\n case 3:\r\n if (!$scope.currentOffer.StartVisibility || !$scope.currentOffer.EndVisibility) {\r\n $scope.errorMessage = \"Veuillez renseigner des horaires de visibilité de l'offre\";\r\n return false;\r\n } else {\r\n try {\r\n start = new Date(\"1975/01/01 \" + $scope.currentOffer.StartVisibility).toISOString();\r\n end = new Date(\"1975/01/01 \" + $scope.currentOffer.EndVisibility).toISOString();\r\n } catch (e) {\r\n\r\n $scope.errorMessage = \"Le format de date n'est pas valide\";\r\n return false;\r\n }\r\n }\r\n if (($scope.currentOffer.TypeFixationTypeOrders.SoldFuture || $scope.currentOffer.TypeFixationTypeOrders.SoldGlobalPrice || $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Option) && (!$scope.currentOffer.StartPosition || !$scope.currentOffer.EndPosition)) {\r\n $scope.errorMessage = \"Veuillez renseigner des horaires pour la fixation du prix\";\r\n return false;\r\n }\r\n else if ($scope.currentOffer.TypeFixationTypeOrders.SoldFuture || $scope.currentOffer.TypeFixationTypeOrders.SoldGlobalPrice) {\r\n try {\r\n startpriseposition = new Date(\"1975/01/01 \" + $scope.currentOffer.StartPosition).toISOString();\r\n endpriseposition = new Date(\"1975/01/01 \" + $scope.currentOffer.EndPosition).toISOString();\r\n } catch (e) {\r\n $scope.errorMessage = \"Le format de date n'est pas valide\";\r\n return false;\r\n }\r\n if (start > startpriseposition || end < endpriseposition) {\r\n $scope.errorMessage = \"Le créneau horaire de la fixation du prix est en dehors du créneau horaire de la visibilité de l'offre\";\r\n return false;\r\n }\r\n }\r\n if (($scope.currentOffer.TypeFixationTypeOrders.TargetPriceFuture || $scope.currentOffer.TypeFixationTypeOrders.TargetPriceGlobalPrice) && (!$scope.currentOffer.StartTargetPrice || !$scope.currentOffer.EndTargetPrice)) {\r\n $scope.errorMessage = $scope.Admin_CreateOffer_Error_Times_TargetPrice;\r\n return false;\r\n }\r\n else if ($scope.currentOffer.TypeFixationTypeOrders.TargetPriceFuture || $scope.currentOffer.TypeFixationTypeOrders.TargetPriceGlobalPrice) {\r\n try {\r\n startpriseobjectif = new Date(\"1975/01/01 \" + $scope.currentOffer.StartTargetPrice).toISOString();\r\n endpriseobjectif = new Date(\"1975/01/01 \" + $scope.currentOffer.EndTargetPrice).toISOString();\r\n } catch (e) {\r\n $scope.errorMessage = \"Le format de date n'est pas valide\";\r\n return false;\r\n }\r\n if (start > startpriseobjectif || end < endpriseobjectif) {\r\n $scope.errorMessage = $scope.Admin_CreateOffer_Error_Times_TargetPrice2;\r\n return false;\r\n }\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.SoldBase && (!$scope.currentOffer.StartPositionBase || !$scope.currentOffer.EndPositionBase)) {\r\n $scope.errorMessage = \"Veuillez renseigner des horaires pour la fixation de base\";\r\n return false;\r\n }\r\n else if ($scope.currentOffer.TypeFixationTypeOrders.SoldBase) {\r\n try {\r\n startprisepositionBase = new Date(\"1975/01/01 \" + $scope.currentOffer.StartPositionBase).toISOString();\r\n endprisepositionBase = new Date(\"1975/01/01 \" + $scope.currentOffer.EndPositionBase).toISOString();\r\n } catch (e) {\r\n $scope.errorMessage = \"Le format de date n'est pas valide\";\r\n return false;\r\n }\r\n if (start > startprisepositionBase || end < endprisepositionBase) {\r\n $scope.errorMessage = \"Le créneau horaire de la fixation de la base est en dehors du créneau horaire de la visibilité de l'offre\";\r\n return false;\r\n }\r\n }\r\n if ($scope.currentOffer.TypeFixationTypeOrders.TargetPriceBase && (!$scope.currentOffer.StartTargetPriceBase || !$scope.currentOffer.EndTargetPriceBase)) {\r\n $scope.errorMessage = \"Veuillez renseigner des horaires pour la définition d'un \" + enumFactory.TypeOrders.Prixobjectif.Label;\r\n return false;\r\n }\r\n else if ($scope.currentOffer.TypeFixationTypeOrders.TargetPriceBase) {\r\n try {\r\n startpriseobjectifBase = new Date(\"1975/01/01 \" + $scope.currentOffer.StartTargetPriceBase).toISOString();\r\n endpriseobjectifBase = new Date(\"1975/01/01 \" + $scope.currentOffer.EndTargetPriceBase).toISOString();\r\n } catch (e) {\r\n $scope.errorMessage = \"Le format de date n'est pas valide\";\r\n return false;\r\n }\r\n if (start > startpriseobjectifBase || end < endpriseobjectifBase) {\r\n $scope.errorMessage = \"Le créneau horaire de la définition du \" + enumFactory.TypeOrders.Prixobjectif.Label + \" de base est en dehors du créneau horaire de la visibilité de l'offre\";\r\n return false;\r\n }\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.SoldExerciceOption && (!$scope.currentOffer.StartPositionExerciceOption || !$scope.currentOffer.EndPositionExerciceOption)) {\r\n $scope.errorMessage = $scope.Admin_CreateOffer_Error_MissingFixingTime_ExerciceOption;\r\n return false;\r\n }\r\n else if ($scope.currentOffer.TypeFixationTypeOrders.SoldExerciceOption) {\r\n try {\r\n startprisepositionExerciceOption = new Date(\"1975/01/01 \" + $scope.currentOffer.StartPositionExerciceOption).toISOString();\r\n endprisepositionExerciceOption = new Date(\"1975/01/01 \" + $scope.currentOffer.EndPositionExerciceOption).toISOString();\r\n } catch (e) {\r\n $scope.errorMessage = $scope.Admin_CreateOffer_Error_InvalidDateFormat_ExerciceOption;\r\n return false;\r\n }\r\n if (start > startprisepositionExerciceOption || end < endprisepositionExerciceOption) {\r\n $scope.errorMessage = $scope.Admin_CreateOffer_Error_InvalidFixingTime_ExerciceOption;\r\n return false;\r\n }\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.TargetExerciceOption && (!$scope.currentOffer.StartPositionTargetExerciceOption || !$scope.currentOffer.EndPositionTargetExerciceOption)) {\r\n $scope.errorMessage = $scope.Admin_CreateOffer_Error_MissingFixingTime_TargetExerciceOption;\r\n return false;\r\n }\r\n else if ($scope.currentOffer.TypeFixationTypeOrders.TargetExerciceOption) {\r\n try {\r\n startPositionTargetExerciceOption = new Date(\"1975/01/01 \" + $scope.currentOffer.StartPositionTargetExerciceOption).toISOString();\r\n endPositionTargetExerciceOption = new Date(\"1975/01/01 \" + $scope.currentOffer.EndPositionTargetExerciceOption).toISOString();\r\n } catch (e) {\r\n $scope.errorMessage = $scope.Admin_CreateOffer_Error_InvalidDateFormat_TargetExerciceOption;\r\n return false;\r\n }\r\n if (start > startPositionTargetExerciceOption || end < endPositionTargetExerciceOption) {\r\n $scope.errorMessage = $scope.Admin_CreateOffer_Error_InvalidFixingTime_TargetExerciceOption;\r\n return false;\r\n }\r\n }\r\n\r\n\r\n if (($scope.currentOffer.TypeFixationTypeOrders.TargetPriceBase || $scope.currentOffer.TypeFixationTypeOrders.TargetPriceFuture || $scope.currentOffer.TypeFixationTypeOrders.TargetPriceGlobalPrice) && (!$scope.currentOffer.IdValidityDuration || $scope.currentOffer.IdValidityDuration === 0)) {\r\n $scope.errorMessage = $scope.Admin_CreateOffer_Error_SelectDurationValidity_TargetPrice;\r\n return false;\r\n }\r\n\r\n if (($scope.currentOffer.TypeFixationTypeOrders.TargetPriceBase || $scope.currentOffer.TypeFixationTypeOrders.TargetPriceFuture || $scope.currentOffer.TypeFixationTypeOrders.TargetPriceGlobalPrice) && ($scope.currentOffer.IdValidityDuration !== enumFactory.ValidityDurations.EndDateOffer)) {\r\n $scope.currentOffer.AllowDateEndTargetPrice = null;\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Ferme && ($scope.currentOffer.TypeFixationTypeOrders.SoldBase || $scope.currentOffer.TypeFixationTypeOrders.TargetPriceBase || $scope.currentOffer.TypeFixationTypeOrders.SoldFuture || $scope.currentOffer.TypeFixationTypeOrders.TargetPriceFuture) && !$scope.currentOffer.IdTypeFixationBase) {\r\n $scope.errorMessage = \"Veuillez sélectionner une contrainte de fixation de base.\";\r\n return false;\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Ferme && !$scope.currentOffer.IdTypeOfferCommitment) {\r\n $scope.errorMessage = \"Veuillez sélectionner une contrainte d'engagement.\";\r\n return false;\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Ferme && ($scope.currentOffer.IdTypeOfferCommitment === $scope.enumTypeOfferCommitments.EngagementObligatoire || $scope.currentOffer.IdTypeOfferCommitment === $scope.enumTypeOfferCommitments.EngagementFacultatif) && !$scope.currentOffer.IdTypeCommitmentForSubscribe) {\r\n $scope.errorMessage = \"Veuillez sélectionner le type d'engagement obligatoire pour la prise de position.\";\r\n return false;\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Engagement && !$scope.currentOffer.IdTypeCommitment) {\r\n $scope.errorMessage = $scope.Admin_CreateOffer_Error_SelectTypeCommitment;\r\n return false;\r\n }\r\n\r\n if ((!$scope.currentOffer.TypeFixationTypeOrders.TargetPriceGlobalPrice && !$scope.currentOffer.TypeFixationTypeOrders.TargetPriceFuture) || $scope.moduleAutomaticCover) {\r\n $scope.currentOffer.AutomaticSwitchExpiry = false;\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.FixationGlobalPrice) {\r\n if (!$scope.currentOffer.OfferCurrencyUnits.IdCurrencyFinal || !$scope.currentOffer.OfferCurrencyUnits.IdCurrencyForComponents) {\r\n $scope.errorMessage = \"Veuillez sélectionner une devise pour le prix de l'offre.\";\r\n return false;\r\n }\r\n if (!$scope.currentOffer.OfferCurrencyUnits.IdUnitFinal || !$scope.currentOffer.OfferCurrencyUnits.IdUnitForComponents) {\r\n $scope.errorMessage = \"Veuillez sélectionner une unité pour le prix de l'offre.\";\r\n return false;\r\n }\r\n if (!$scope.currentOffer.OfferCurrencyUnits.DecimalFinal) {\r\n $scope.errorMessage = \"Veuillez sélectionner un nombre décimal valide pour le prix de l'offre.\";\r\n return false;\r\n }\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.FixationBase || $scope.currentOffer.TypeFixationTypeOrders.FixationFuture) {\r\n\r\n if (!$scope.currentOffer.OfferCurrencyUnits.IdCurrencyForComponents || !$scope.currentOffer.OfferCurrencyUnits.IdCurrencyForComponents) {\r\n $scope.errorMessage = \"Veuillez sélectionner une devise pour les composantes.\";\r\n return false;\r\n }\r\n if (!$scope.currentOffer.OfferCurrencyUnits.IdUnitForComponents || !$scope.currentOffer.OfferCurrencyUnits.IdUnitForComponents) {\r\n $scope.errorMessage = \"Veuillez sélectionner une unité pour les composantes.\";\r\n return false;\r\n }\r\n if (!$scope.currentOffer.OfferCurrencyUnits.DecimalForComponents) {\r\n $scope.errorMessage = \"Veuillez sélectionner un nombre décimal valide pour les composantes.\";\r\n return false;\r\n }\r\n }\r\n\r\n if ($scope.parambChooseEntryModeActive && ($scope.currentOffer.TypeFixationTypeOrders.FixationGlobalPrice || $scope.currentOffer.TypeFixationTypeOrders.FixationBase || $scope.currentOffer.TypeFixationTypeOrders.FixationFuture) && ($scope.currentOffer.LotEntryMode === undefined || $scope.currentOffer.LotEntryMode === null || $scope.currentOffer.LotEntryMode === \"\")) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_EntryMode_Error.Content;\r\n return false;\r\n }\r\n\r\n if ($scope.IsUneal && $scope.currentOffer.TypeFixationTypeOrders.TargetPriceGlobalPrice && $scope.currentOffer.TargetPriceWithBaseAcquisition && !$scope.currentOffer.TypeFixationTypeOrders.SoldBase) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_TargetPriceWithBaseAcquisition_ErrorSoldBaseNotSelected.Content;\r\n return false;\r\n }\r\n\r\n $scope.errorMessage = \"\";\r\n return true;\r\n case 4:\r\n var tab1;\r\n var tab2;\r\n var date1;\r\n var date2;\r\n var date3;\r\n var date4;\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.PrixConstruit) {\r\n if ($scope.currentOffer.SubscriptionPeriodBuiltPriceStartDate === \"\" || $scope.currentOffer.SubscriptionPeriodBuiltPriceEndDate === \"\" || $scope.currentOffer.SubscriptionPeriodBuiltPriceStartDate === undefined || $scope.currentOffer.SubscriptionPeriodBuiltPriceEndDate === undefined || $scope.currentOffer.SubscriptionPeriodBuiltPriceStartDate === null || $scope.currentOffer.SubscriptionPeriodBuiltPriceEndDate === null) {\r\n $scope.errorMessage = \"Veuillez renseigner la période de souscription de l'offre\";\r\n return false;\r\n }\r\n else {\r\n try {\r\n tab1 = $scope.currentOffer.SubscriptionPeriodBuiltPriceStartDate.split('/');\r\n tab2 = $scope.currentOffer.SubscriptionPeriodBuiltPriceEndDate.split('/');\r\n if (tab1.length > 1)\r\n date1 = new Date(tab1[2] + \"-\" + tab1[1] + \"-\" + tab1[0]).toISOString();\r\n else {\r\n date1 = new Date($scope.currentOffer.SubscriptionPeriodBuiltPriceStartDate).toISOString();\r\n }\r\n if (tab2.length > 1)\r\n date2 = new Date(tab2[2] + \"-\" + tab2[1] + \"-\" + tab2[0]).toISOString();\r\n else {\r\n date1 = new Date($scope.currentOffer.SubscriptionPeriodBuiltPriceEndDate).toISOString();\r\n }\r\n }\r\n catch (e) {\r\n\r\n $scope.errorMessage = \"Le format de date pour la période de souscription n'est pas valide\";\r\n return false;\r\n }\r\n }\r\n\r\n if ($scope.currentOffer.ObservationPeriodBuiltPriceStartDate === \"\" || $scope.currentOffer.ObservationPeriodBuiltPriceEndDate === \"\" || $scope.currentOffer.ObservationPeriodBuiltPriceStartDate === undefined || $scope.currentOffer.ObservationPeriodBuiltPriceEndDate === undefined || $scope.currentOffer.ObservationPeriodBuiltPriceStartDate === null || $scope.currentOffer.ObservationPeriodBuiltPriceEndDate === null) {\r\n $scope.errorMessage = \"Veuillez renseigner la période d'observation de l'offre\";\r\n return false;\r\n }\r\n else {\r\n try {\r\n tab1 = $scope.currentOffer.ObservationPeriodBuiltPriceStartDate.split('/');\r\n tab2 = $scope.currentOffer.ObservationPeriodBuiltPriceEndDate.split('/');\r\n if (tab1.length > 1)\r\n date3 = new Date(tab1[2] + \"-\" + tab1[1] + \"-\" + tab1[0]).toISOString();\r\n else {\r\n date3 = new Date($scope.currentOffer.ObservationPeriodBuiltPriceStartDate).toISOString();\r\n }\r\n if (tab2.length > 1)\r\n date4 = new Date(tab2[2] + \"-\" + tab2[1] + \"-\" + tab2[0]).toISOString();\r\n else {\r\n date3 = new Date($scope.currentOffer.ObservationPeriodBuiltPriceEndDate).toISOString();\r\n }\r\n }\r\n catch (e) {\r\n\r\n $scope.errorMessage = \"Le format de date pour la période d'observation n'est pas valide\";\r\n return false;\r\n }\r\n }\r\n if (date1 > date2) {\r\n\r\n $scope.errorMessage = \"La date de début de la période de souscription de l'offre est ultérieure à la date de fin de la période de souscription\";\r\n return false;\r\n }\r\n if (date3 > date4) {\r\n\r\n $scope.errorMessage = \"La date de début de la période d'observation de l'offre est ultérieure à la date de fin de la période d'observation\";\r\n return false;\r\n }\r\n if (date2 >= date3) {\r\n\r\n $scope.errorMessage = \"La date de fin de la période de souscription de l'offre est ultérieure ou égale à la date de début de la période d'observation\";\r\n return false;\r\n }\r\n }\r\n else {\r\n if ($scope.currentOffer.StartValidity === \"\" || $scope.currentOffer.EndValidity === \"\" || $scope.currentOffer.StartValidity === undefined || $scope.currentOffer.EndValidity === undefined || $scope.currentOffer.StartValidity === null || $scope.currentOffer.EndValidity === null) {\r\n $scope.errorMessage = \"Veuillez renseigner la date de validitée de l'offre\";\r\n return false;\r\n }\r\n else {\r\n\r\n try {\r\n tab1 = $scope.currentOffer.StartValidity.split('/');\r\n tab2 = $scope.currentOffer.EndValidity.split('/');\r\n if (tab1.length > 1)\r\n date1 = new Date(tab1[2] + \"-\" + tab1[1] + \"-\" + tab1[0]).toISOString();\r\n else {\r\n date1 = new Date($scope.currentOffer.StartValidity).toISOString();\r\n }\r\n if (tab2.length > 1)\r\n date2 = new Date(tab2[2] + \"-\" + tab2[1] + \"-\" + tab2[0]).toISOString();\r\n else {\r\n date1 = new Date($scope.currentOffer.EndValidity).toISOString();\r\n }\r\n }\r\n catch (e) {\r\n\r\n $scope.errorMessage = \"Le format de date n'est pas valide\";\r\n return false;\r\n }\r\n if (date1 > date2) {\r\n\r\n $scope.errorMessage = \"La date de début de validité de l'offre est ultérieur à la date de fin de validité\";\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Engagement || $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.EngagementSurface) {\r\n var regexDate = /^(\\d{2}\\/){2}\\d{4}$/;\r\n\r\n if ($rootScope.paramBUseDeliveriesDates){\r\n if (!$scope.currentOffer.DeliveryStartDate || !regexDate.test($scope.currentOffer.DeliveryStartDate)) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Expiry_DeliveryStartDate_Error.Content;\r\n return false;\r\n }\r\n if (!$scope.currentOffer.DeliveryEndDate || !regexDate.test($scope.currentOffer.DeliveryEndDate)) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Expiry_DeliveryEndDate_Error.Content;\r\n return false;\r\n }\r\n if ($scope.currentOffer.DeliveryEndDate && $scope.currentOffer.DeliveryStartDate && dateService.compareDate($scope.currentOffer.DeliveryEndDate, $scope.currentOffer.DeliveryStartDate)) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Expiry_DateError_EndDateBeforeStartDate.Content;\r\n return false;\r\n }\r\n }\r\n\r\n if ($rootScope.paramBUsePaymentDate && (!$scope.currentOffer.PaymentDate || !regexDate.test($scope.currentOffer.PaymentDate))) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Expiry_PaymentDate_Error.Content;\r\n return false;\r\n }\r\n }\r\n\r\n if ($scope.currentOffer.CommitmentMin !== undefined && $scope.currentOffer.CommitmentMin !== \"\" && $scope.currentOffer.CommitmentMin !== null && isNaN($scope.currentOffer.CommitmentMin)) {\r\n $scope.errorMessage = \"Veuillez renseigner un engagement minimum valide\";\r\n return false;\r\n }\r\n if ($scope.currentOffer.CommitmentMax !== undefined && $scope.currentOffer.CommitmentMax !== \"\" && $scope.currentOffer.CommitmentMax !== null && isNaN($scope.currentOffer.CommitmentMax)) {\r\n $scope.errorMessage = \"Veuillez renseigner un engagement maximum valide\";\r\n return false;\r\n }\r\n\r\n if ($scope.currentOffer.Quotity === undefined && $scope.currentOffer.Quotity === \"\" && $scope.currentOffer.Quotity === null && isNaN($scope.currentOffer.Quotity)) {\r\n $scope.errorMessage = \"Veuillez renseigner un pas valide\";\r\n return false;\r\n }\r\n\r\n $scope.errorMessage = \"\";\r\n return true;\r\n case 5:\r\n if (!$scope.blankContract && ($scope.currentOffer.GroupContacts === undefined || $scope.currentOffer.GroupContacts === null || $scope.currentOffer.GroupContacts === \"\" || $scope.currentOffer.GroupContacts.length === 0 ||\r\n $scope.currentOffer.Templates === undefined || $scope.currentOffer.Templates === null || $scope.currentOffer.Templates === \"\" || $scope.currentOffer.Templates.length === 0)) {\r\n $scope.errorMessage = \"Veuillez renseigner l'ensemble des éléments.\";\r\n return false;\r\n } else if ($scope.blankContract && ($scope.currentOffer.Templates === undefined || $scope.currentOffer.Templates === null || $scope.currentOffer.Templates === \"\" || $scope.currentOffer.Templates.length === 0)) {\r\n $scope.errorMessage = \"Veuillez renseigner l'ensemble des éléments.\";\r\n }\r\n\r\n if (!$scope.validTypeTemplateNotSame)\r\n return false;\r\n\r\n $scope.CheckTemplate();\r\n\r\n if ($scope.HasQuantityLimit && $scope.currentOffer.IsTonnageLimit) {\r\n\r\n $scope.currentOffer.OfferGroupContactTonnageVm.forEach(function (OfferGroupContactTonnage) {\r\n if (OfferGroupContactTonnage.QuantityLimit == null || OfferGroupContactTonnage.QuantityLimit == \"\" || OfferGroupContactTonnage.QuantityLimit == undefined || !angular.isNumber(parseFloat(OfferGroupContactTonnage.QuantityLimit))) {\r\n $scope.errorMessage += $scope.Label_Admin_Offer_ErrorMessage_Step5_TonnageGroup + OfferGroupContactTonnage.Label + \".<br/>\";\r\n return false;\r\n }\r\n });\r\n\r\n if ($scope.TotalQuantityLimit == 0) {\r\n $scope.errorMessage += $scope.Label_Admin_Offer_ErrorMessage_Step5_TonnageByGroup + \"<br/>\";\r\n return false;\r\n }\r\n\r\n if ($scope.TotalQuantityLimit < $scope.currentOffer.QuantityLimit) {\r\n $scope.errorMessage += $scope.Label_Admin_Offer_ErrorMessage_Step5_Sum_LowerTonnage + \"<br/>\";\r\n return false;\r\n }\r\n\r\n if ($scope.TotalQuantityLimit > $scope.currentOffer.QuantityLimit) {\r\n $scope.errorMessage += $scope.Label_Admin_Offer_ErrorMessage_Step5_Sum_HigherTonnage + \"<br/>\";\r\n return false;\r\n }\r\n }\r\n\r\n if ($scope.errorMessage !== \"\")\r\n return false;\r\n else\r\n return true;\r\n break;\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n $scope.CheckTemplate = function () {\r\n $scope.errorMessage = \"\";\r\n\r\n var idTypeTemplateToCheck = 0;\r\n var contractLabel = \"\";\r\n var typeOrderLabel = null;\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Engagement) {\r\n idTypeTemplateToCheck = enumFactory.TypeTemplates.Engagement;\r\n contractLabel = \"\\\"\" + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_ContractCommitement.Content + \"\\\"\";\r\n checkTemplateForType(idTypeTemplateToCheck, contractLabel);\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.EngagementSurface) {\r\n idTypeTemplateToCheck = enumFactory.TypeTemplates.EngagementSurface;\r\n contractLabel = \"\\\"\" + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_ContractCommitmentSurface.Content + \"\\\"\";\r\n checkTemplateForType(idTypeTemplateToCheck, contractLabel);\r\n }\r\n\r\n if ($scope.blankContract) {\r\n idTypeTemplateToCheck = enumFactory.TypeTemplates.BlankContract;\r\n contractLabel = \"\\\"\" + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_BlankContract.Content + \"\\\"\";\r\n var anyBlankContractTemplate = $filter('filter')($scope.currentOffer.Templates, { IdTypeTemplate: idTypeTemplateToCheck }, true).length > 0;\r\n if (!anyBlankContractTemplate)\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_MustSelectContractType.Content + contractLabel + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_ForTypeOrder.Content;\r\n }\r\n\r\n if ($scope.multiCampagne) {\r\n idTypeTemplateToCheck = enumFactory.TypeTemplates.MultiCrop;\r\n contractLabel = \"\\\"\" + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_ContractMultiCrop.Content + \"\\\"\";\r\n var anyContractMultiCropTemplate = $filter('filter')($scope.currentOffer.Templates, { IdTypeTemplate: idTypeTemplateToCheck }, true).length > 0;\r\n if (!anyContractMultiCropTemplate)\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_MustSelectContractType.Content + contractLabel + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_ForTypeOrder.Content;\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.PrixConstruit) {\r\n idTypeTemplateToCheck = enumFactory.TypeTemplates.ContratBuiltPrice;\r\n contractLabel = \"\\\"\" + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_ContratBuiltPrice.Content + \"\\\"\";\r\n checkTemplateForType(idTypeTemplateToCheck, contractLabel);\r\n\r\n idTypeTemplateToCheck = enumFactory.TypeTemplates.ExitAnticipatedBuiltPrice;\r\n contractLabel = \"\\\"\" + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_ExitAnticipatedBuiltPrice.Content + \"\\\"\";\r\n checkTemplateForType(idTypeTemplateToCheck, contractLabel);\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Option) {\r\n idTypeTemplateToCheck = enumFactory.TypeTemplates.Option;\r\n contractLabel = \"\\\"\" + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_ContractOption.Content + \"\\\"\";\r\n checkTemplateForType(idTypeTemplateToCheck, contractLabel);\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.SoldExerciceOption) {\r\n idTypeTemplateToCheck = enumFactory.TypeTemplates.ExerciseOption; // Template exercise d'option obligatoire\r\n contractLabel = \"\\\"\" + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_ExerciseOption.Content + \"\\\"\";\r\n checkTemplateForType(idTypeTemplateToCheck, contractLabel);\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.TargetExerciceOption) {\r\n idTypeTemplateToCheck = enumFactory.TypeTemplates.TargetExerciseOption; // Template objectif exercise d'option obligatoire\r\n contractLabel = \"\\\"\" + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_TargetExerciseOption.Content + \"\\\"\";\r\n checkTemplateForType(idTypeTemplateToCheck, contractLabel);\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.SoldFuture || $scope.currentOffer.TypeFixationTypeOrders.SoldGlobalPrice && !$scope.multiCampagne) {\r\n idTypeTemplateToCheck = enumFactory.TypeTemplates.Vente;\r\n contractLabel = \"\\\"\" + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_ContractSell.Content + \"\\\"\";\r\n typeOrderLabel = enumFactory.TypeOrders.Vente.Label;\r\n checkTemplateForType(idTypeTemplateToCheck, contractLabel);\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.TargetPriceFuture || $scope.currentOffer.TypeFixationTypeOrders.TargetPriceGlobalPrice) {\r\n idTypeTemplateToCheck = enumFactory.TypeTemplates.Objectif;\r\n contractLabel = \"\\\"\" + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_ContractObjectifPrice.Content + \"\\\"\";\r\n typeOrderLabel = enumFactory.TypeOrders.Prixobjectif.Label;\r\n checkTemplateForType(idTypeTemplateToCheck, contractLabel);\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.SoldBase) {\r\n idTypeTemplateToCheck = enumFactory.TypeTemplates.VenteBase;\r\n contractLabel = \"\\\"\" + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_ContractBaseSell.Content + \"\\\"\";\r\n typeOrderLabel = enumFactory.TypeOrders.Vente.Label;\r\n checkTemplateForType(idTypeTemplateToCheck, contractLabel);\r\n }\r\n\r\n if ($scope.currentOffer.TypeFixationTypeOrders.TargetPriceBase) {\r\n idTypeTemplateToCheck = enumFactory.TypeTemplates.ObjectifBase;\r\n contractLabel = \"\\\"\" + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_ContractBaseObjectifPrice.Content + \"\\\"\";\r\n typeOrderLabel = enumFactory.TypeOrders.Prixobjectif.Label;\r\n checkTemplateForType(idTypeTemplateToCheck, contractLabel);\r\n }\r\n\r\n checkCrossTypeTemplate();\r\n };\r\n\r\n var checkTemplateForType = function (idTypeTemplateToCheck, contractLabel) {\r\n\r\n //Check des template par type\r\n if (!$rootScope.ModuleMultipleCompagnies.Active) { // Pas de multisociété\r\n if (!$scope.currentOffer.Templates.some(function (template) { return template.IdTypeTemplate === idTypeTemplateToCheck; })) {\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_MustSelectContractType.Content + contractLabel + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_ForTypeOrder.Content;\r\n $scope.errorMessage += \"<br/>\";\r\n return;\r\n }\r\n\r\n if (!$scope.currentOffer.Templates.some(function (template) { return template.IdTypeTemplate === idTypeTemplateToCheck && template.IdLanguage == $scope.defaultLanguage.IdLanguage; })) {\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_MustSelectContractType.Content + contractLabel +\r\n $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_InLanguage.Content + \"\\\"\" + $scope.defaultLanguage.Label + \"\\\"\";\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_ForTypeOrder.Content;\r\n $scope.errorMessage += \"<br/>\";\r\n return;\r\n }\r\n } else {\r\n if ($scope.currentOffer.IdCompagny) { // une société choisie\r\n var offerSelectedCompagny = $filter('filter')($scope.lstCompagnies, { IdCompagny: Number($scope.currentOffer.IdCompagny) }, true)[0];\r\n\r\n if (!$scope.currentOffer.Templates.some(function (template) { return template.IdTypeTemplate === idTypeTemplateToCheck && template.IdCompagny === Number($scope.currentOffer.IdCompagny); })) {\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_MustSelectContractType.Content + contractLabel +\r\n $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_ForSociety.Content + \"\\\"\" + offerSelectedCompagny.Label + \"\\\"\";\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_ForTypeOrder.Content;\r\n $scope.errorMessage += \"<br/>\";\r\n return;\r\n }\r\n\r\n if (!$scope.currentOffer.Templates.some(function (template) { return template.IdTypeTemplate === idTypeTemplateToCheck && template.IdCompagny === Number($scope.currentOffer.IdCompagny) && template.IdLanguage == $scope.defaultLanguage.IdLanguage; })) {\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_MustSelectContractType.Content + contractLabel +\r\n $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_ForSociety.Content + \"\\\"\" + offerSelectedCompagny.Label + \"\\\"\" +\r\n $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_InLanguage.Content + \"\\\"\" + $scope.defaultLanguage.Label + \"\\\"\";\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_ForTypeOrder.Content;\r\n $scope.errorMessage += \"<br/>\";\r\n }\r\n }\r\n else { // toutes les sociétés\r\n if ($scope.currentOffer.Templates.filter(function (template) { return template.IdTypeTemplate === idTypeTemplateToCheck; }).length < $scope.lstCompagnies.length) {\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_MustSelectContractType.Content + contractLabel + $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_ForAllSociety.Content;\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_ForTypeOrder.Content;\r\n $scope.errorMessage += \"<br/>\";\r\n return;\r\n }\r\n\r\n $scope.lstCompagnies.forEach(function (compangny) {\r\n if (!$scope.currentOffer.Templates.some(function (template) { return template.IdTypeTemplate === idTypeTemplateToCheck && template.IdCompagny === compangny.IdCompagny; })) {\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_MustSelectContractType.Content + contractLabel +\r\n $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_ForSociety.Content + \"\\\"\" + compangny.Label + \"\\\"\";\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_ForTypeOrder.Content;\r\n $scope.errorMessage += \"<br/>\";\r\n }\r\n\r\n if (!$scope.currentOffer.Templates.some(function (template) { return template.IdTypeTemplate === idTypeTemplateToCheck && template.IdCompagny === compangny.IdCompagny && template.IdLanguage == $scope.defaultLanguage.IdLanguage; })) {\r\n\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_MustSelectContractType.Content + contractLabel +\r\n $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_ForSociety.Content + \"\\\"\" + compangny.Label + \"\\\"\" +\r\n $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_InLanguage.Content + \"\\\"\" + $scope.defaultLanguage.Label + \"\\\"\";\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_ForTypeOrder.Content;\r\n $scope.errorMessage += \"<br/>\";\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n var checkCrossTypeTemplate = function () {\r\n\r\n angular.forEach($scope.currentOffer.Templates, function (itemTemplate) {\r\n\r\n if ((itemTemplate.IdTypeTemplate === enumFactory.TypeTemplates.Engagement && $scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.Engagement) ||\r\n (itemTemplate.IdTypeTemplate === enumFactory.TypeTemplates.EngagementSurface && $scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.EngagementSurface) ||\r\n (itemTemplate.IdTypeTemplate === enumFactory.TypeTemplates.ContratBuiltPrice && $scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.PrixConstruit) ||\r\n (itemTemplate.IdTypeTemplate === enumFactory.TypeTemplates.ExitAnticipatedBuiltPrice && $scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.PrixConstruit) ||\r\n (itemTemplate.IdTypeTemplate === enumFactory.TypeTemplates.Option && $scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.Option) ||\r\n (itemTemplate.IdTypeTemplate === enumFactory.TypeTemplates.Vente && (!$scope.currentOffer.TypeFixationTypeOrders.SoldFuture && !$scope.currentOffer.TypeFixationTypeOrders.SoldGlobalPrice)) ||\r\n (itemTemplate.IdTypeTemplate === enumFactory.TypeTemplates.Objectif && (!$scope.currentOffer.TypeFixationTypeOrders.TargetPriceFuture && !$scope.currentOffer.TypeFixationTypeOrders.TargetPriceGlobalPrice)) ||\r\n (itemTemplate.IdTypeTemplate === enumFactory.TypeTemplates.VenteBase && !$scope.currentOffer.TypeFixationTypeOrders.SoldBase) ||\r\n (itemTemplate.IdTypeTemplate === enumFactory.TypeTemplates.ObjectifBase && !$scope.currentOffer.TypeFixationTypeOrders.TargetPriceBase) ||\r\n (itemTemplate.IdTypeTemplate === enumFactory.TypeTemplates.MultiCrop && !$scope.multiCampagne) ||\r\n (itemTemplate.IdTypeTemplate === enumFactory.TypeTemplates.ExerciseOption && !$scope.currentOffer.TypeFixationTypeOrders.SoldExerciceOption) ||\r\n (itemTemplate.IdTypeTemplate === enumFactory.TypeTemplates.TargetExerciseOption && !$scope.currentOffer.TypeFixationTypeOrders.TargetExerciceOption)\r\n ) {\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.CreateOffer_Template_Error_NotAuthorized.Content.replace('[template]', '\"' + itemTemplate.Label + '\"');\r\n $scope.errorMessage += \"<br />\";\r\n }\r\n });\r\n\r\n };\r\n\r\n $scope.CheckAndSaveOffer = function () {\r\n if ($scope.ModeDupliquer) {\r\n if ($scope.watchedit !== undefined && $scope.watchedit !== null) {\r\n $scope.noWatch();\r\n }\r\n if ($scope.watchTypeFixation !== undefined && $scope.watchTypeFixation !== null) {\r\n $scope.noWatchTypeFixation();\r\n }\r\n if ($scope.watchFixationBaseConstraint !== undefined && $scope.watchFixationBaseConstraint !== null) {\r\n $scope.nowatchFixationBaseConstraint();\r\n }\r\n \r\n if ($scope.watchEditBuiltPrice !== undefined && $scope.watchEditBuiltPrice !== null) {\r\n $scope.noWatchBuiltPriceData();\r\n }\r\n $scope.errorMessage = \"\";\r\n $scope.currentOffer.IdOffer = 0;\r\n $scope.currentOffer.Validate = true;\r\n }\r\n\r\n if ($scope.currentOffer.StartValidity && $scope.currentOffer.EndValidity) {\r\n var tabStartValidity = $scope.currentOffer.StartValidity.split('/');\r\n var tabEndValidity = $scope.currentOffer.EndValidity.split('/');\r\n\r\n if (tabStartValidity.length > 1)\r\n $scope.currentOffer.StartValidity = new Date(tabStartValidity[2] + \"-\" + tabStartValidity[1] + \"-\" + tabStartValidity[0]).toISOString();\r\n else {\r\n $scope.currentOffer.StartValidity = new Date($scope.currentOffer.StartValidity).toISOString();\r\n }\r\n if (tabEndValidity.length > 1)\r\n $scope.currentOffer.EndValidity = new Date(tabEndValidity[2] + \"-\" + tabEndValidity[1] + \"-\" + tabEndValidity[0]).toISOString();\r\n else {\r\n $scope.currentOffer.EndValidity = new Date($scope.currentOffer.EndValidity).toISOString();\r\n }\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.PrixConstruit) {\r\n if ($scope.currentOffer.SubscriptionPeriodBuiltPriceStartDate && $scope.currentOffer.SubscriptionPeriodBuiltPriceEndDate) {\r\n var tabSubscriptionPeriodBuiltPriceStartDate = $scope.currentOffer.SubscriptionPeriodBuiltPriceStartDate.split('/');\r\n var tabSubscriptionPeriodBuiltPriceEndDate = $scope.currentOffer.SubscriptionPeriodBuiltPriceEndDate.split('/');\r\n\r\n if (tabSubscriptionPeriodBuiltPriceStartDate.length > 1)\r\n $scope.currentOffer.SubscriptionPeriodBuiltPriceStartDate = new Date(tabSubscriptionPeriodBuiltPriceStartDate[2] + \"-\" + tabSubscriptionPeriodBuiltPriceStartDate[1] + \"-\" + tabSubscriptionPeriodBuiltPriceStartDate[0]).toISOString();\r\n else {\r\n $scope.currentOffer.SubscriptionPeriodBuiltPriceStartDate = new Date($scope.currentOffer.SubscriptionPeriodBuiltPriceStartDate).toISOString();\r\n }\r\n if (tabSubscriptionPeriodBuiltPriceEndDate.length > 1)\r\n $scope.currentOffer.SubscriptionPeriodBuiltPriceEndDate = new Date(tabSubscriptionPeriodBuiltPriceEndDate[2] + \"-\" + tabSubscriptionPeriodBuiltPriceEndDate[1] + \"-\" + tabSubscriptionPeriodBuiltPriceEndDate[0]).toISOString();\r\n else {\r\n $scope.currentOffer.SubscriptionPeriodBuiltPriceEndDate = new Date($scope.currentOffer.SubscriptionPeriodBuiltPriceEndDate).toISOString();\r\n }\r\n }\r\n\r\n if ($scope.currentOffer.ObservationPeriodBuiltPriceStartDate && $scope.currentOffer.ObservationPeriodBuiltPriceEndDate) {\r\n var tabObservationPeriodBuiltPriceStartDate = $scope.currentOffer.ObservationPeriodBuiltPriceStartDate.split('/');\r\n var tabObservationPeriodBuiltPriceEndDate = $scope.currentOffer.ObservationPeriodBuiltPriceEndDate.split('/');\r\n\r\n if (tabObservationPeriodBuiltPriceStartDate.length > 1)\r\n $scope.currentOffer.ObservationPeriodBuiltPriceStartDate = new Date(tabObservationPeriodBuiltPriceStartDate[2] + \"-\" + tabObservationPeriodBuiltPriceStartDate[1] + \"-\" + tabObservationPeriodBuiltPriceStartDate[0]).toISOString();\r\n else {\r\n $scope.currentOffer.ObservationPeriodBuiltPriceStartDate = new Date($scope.currentOffer.ObservationPeriodBuiltPriceStartDate).toISOString();\r\n }\r\n if (tabObservationPeriodBuiltPriceEndDate.length > 1)\r\n $scope.currentOffer.ObservationPeriodBuiltPriceEndDate = new Date(tabObservationPeriodBuiltPriceEndDate[2] + \"-\" + tabObservationPeriodBuiltPriceEndDate[1] + \"-\" + tabObservationPeriodBuiltPriceEndDate[0]).toISOString();\r\n else {\r\n $scope.currentOffer.ObservationPeriodBuiltPriceEndDate = new Date($scope.currentOffer.ObservationPeriodBuiltPriceEndDate).toISOString();\r\n }\r\n }\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Engagement || $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.EngagementSurface) {\r\n if ($rootScope.paramBUseDeliveriesDates && $scope.currentOffer.DeliveryStartDate)\r\n $scope.currentOffer.DeliveryStartDate = dateService.ConvertDateToDateAPI($scope.currentOffer.DeliveryStartDate);\r\n if ($rootScope.paramBUseDeliveriesDates && $scope.currentOffer.DeliveryEndDate)\r\n $scope.currentOffer.DeliveryEndDate = dateService.ConvertDateToDateAPI($scope.currentOffer.DeliveryEndDate);\r\n if ($rootScope.paramBUsePaymentDate && $scope.currentOffer.PaymentDate)\r\n $scope.currentOffer.PaymentDate = dateService.ConvertDateToDateAPI($scope.currentOffer.PaymentDate);\r\n }\r\n\r\n $scope.currentOffer.Step = $scope.step;\r\n\r\n if ($scope.watchEditBuiltPrice !== undefined && $scope.watchEditBuiltPrice !== null) {\r\n $scope.noWatchBuiltPriceData();\r\n }\r\n if ($scope.watchedit !== undefined && $scope.watchedit !== null) {\r\n $scope.noWatch();\r\n }\r\n\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Engagement || $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.EngagementSurface) {\r\n $scope.currentOffer.IdMarket = null;\r\n $scope.currentOffer.OfferExpiriesVm = [];\r\n $scope.lstOfferExpiry = null;\r\n }\r\n\r\n if ($scope.lstOfferExpiry) {\r\n var offerExpiries = angular.copy($scope.lstOfferExpiry);\r\n $scope.currentOffer.OfferExpiriesVm = offerExpiries.filter(function (element) {\r\n element.DateClosed = dateService.ConvertDateToDateAPI(element.DateClosed);\r\n if (element.DateStart)\r\n element.DateStart = dateService.ConvertDateToDateAPI(element.DateStart);\r\n\r\n if (element.OptionLimitExerciceDate)\r\n element.OptionLimitExerciceDate = dateService.ConvertDateToDateAPI(element.OptionLimitExerciceDate);\r\n\r\n if ($scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.Option && !$scope.blankContract) {\r\n if ($rootScope.paramBUseDeliveriesDates){\r\n element.DeliveryStartDate = dateService.ConvertDateToDateAPI(element.DeliveryStartDate);\r\n element.DeliveryEndDate = dateService.ConvertDateToDateAPI(element.DeliveryEndDate);\r\n }\r\n if ($rootScope.paramBUsePaymentDate)\r\n element.PaymentDate = dateService.ConvertDateToDateAPI(element.PaymentDate);\r\n }\r\n\r\n return element;\r\n });\r\n }\r\n\r\n //Controle répartition des tonnages de l'étape 5 \r\n if ($scope.TotalQuantityLimit != parseFloat($scope.currentOffer.QuantityLimit) && $scope.currentOffer.IsTonnageLimit) {\r\n $scope.errorMessage = $scope.Label_Admin_Offer_ErrorMessage_Step4_DistributionTonnage;\r\n return;\r\n }\r\n // On renseigne le IdTypeCommitmentForSubscribe que si l'admin à choisi le type d'engagement 'Engagement obligatoire avant prise de position'\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Ferme && $scope.currentOffer.IdTypeOfferCommitment !== $scope.enumTypeOfferCommitments.EngagementObligatoire && $scope.currentOffer.IdTypeOfferCommitment !== $scope.enumTypeOfferCommitments.EngagementFacultatif)\r\n $scope.currentOffer.IdTypeCommitmentForSubscribe = null;\r\n\r\n $scope.listContractBasesToValide = null;\r\n $scope.listContractsToValide = null;\r\n if (!$scope.watchedit) {\r\n if ($scope.ModeEdition && $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Ferme && ($scope.currentOffer.TypeFixationTypeOrders.TargetPriceBase || $scope.currentOffer.TypeFixationTypeOrders.TargetPriceFuture || $scope.currentOffer.TypeFixationTypeOrders.TargetPriceGlobalPrice)) {\r\n contractBaseService.GetTargetContractBasesFixToValidate($scope.currentOffer.OfferExpiriesVm, function (dataContractBase, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = status;\r\n }\r\n else {\r\n if (dataContractBase && dataContractBase.length > 0)\r\n $scope.listContractBasesToValide = dataContractBase;\r\n\r\n if (!$scope.currentOffer.Price)\r\n $scope.currentOffer.Price = \"\";\r\n\r\n contractsService.GetTargetContractsToValidate($scope.currentOffer.Price, $scope.currentOffer.OfferExpiriesVm, function (dataContract, statusContract) {\r\n if (statusContract !== null) {\r\n if (statusContract === 400)\r\n $scope.errorMessage = dataContract[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = statusContract;\r\n }\r\n else {\r\n if (dataContract && dataContract.length > 0)\r\n $scope.listContractsToValide = dataContract;\r\n\r\n if (($scope.listContractsToValide && $scope.listContractsToValide.length > 0) || ($scope.listContractBasesToValide && $scope.listContractBasesToValide.length > 0))\r\n $scope.showPopUpListContractsFixToValidate();\r\n else\r\n SaveOffer();\r\n }\r\n });\r\n }\r\n\r\n });\r\n }\r\n else {\r\n SaveOffer();\r\n }\r\n }\r\n };\r\n\r\n $scope.toogleAllElementsLeft = function () {\r\n $scope.master = !$scope.master;\r\n $.each($scope.lstvarieteTmp, function (index, item) {\r\n item.checked = $scope.master;\r\n });\r\n };\r\n\r\n $scope.toogleAllElementsRight = function () {\r\n $scope.master2 = !$scope.master2;\r\n $.each($scope.currentOffer.VarietiesVm, function (index, item) {\r\n item.checked = $scope.master2;\r\n });\r\n };\r\n\r\n //ajout des variétés a l'offre\r\n $scope.ListToSelected = function () {\r\n $scope.master = false;\r\n $scope.master2 = false;\r\n\r\n // On envoi tous les éléments sélectionnés dans la liste de droite\r\n $.each($scope.lstvarieteTmp, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.currentOffer.VarietiesVm.push(item);\r\n }\r\n });\r\n\r\n // On supprime de la liste de gauche, tous les éléments envoyés\r\n $.each($scope.currentOffer.VarietiesVm, function (index, item) {\r\n var indexItem = $scope.lstvarieteTmp.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.lstvarieteTmp.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n //suppression des variétés a l'offre\r\n $scope.SelectedToList = function () {\r\n $scope.master = false;\r\n $scope.master2 = false;\r\n\r\n // On envoi tous les éléments sélectionnés dans la liste de gauche\r\n $.each($scope.currentOffer.VarietiesVm, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.lstvarieteTmp.push(item);\r\n }\r\n });\r\n\r\n // On supprime de la liste de droite, tous les éléments envoyés\r\n $.each($scope.lstvarieteTmp, function (index, item) {\r\n var indexItem = $scope.currentOffer.VarietiesVm.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.currentOffer.VarietiesVm.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $scope.toogleAllElementsLeftGroup = function () {\r\n $scope.master3 = !$scope.master3;\r\n $.each($scope.lstGroupContacts, function (index, item) {\r\n item.checked = $scope.master3;\r\n });\r\n };\r\n\r\n $scope.toogleAllElementsRightGroup = function () {\r\n $scope.master4 = !$scope.master4;\r\n $.each($scope.currentOffer.GroupContacts, function (index, item) {\r\n item.checked = $scope.master4;\r\n });\r\n };\r\n\r\n $scope.ListToSelectedGroup = function () {\r\n $scope.master3 = false;\r\n $scope.master4 = false;\r\n\r\n $.each($scope.lstGroupContacts, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.currentOffer.GroupContacts.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.currentOffer.GroupContacts, function (index, item) {\r\n var indexItem = $scope.lstGroupContacts.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.lstGroupContacts.splice(indexItem, 1);\r\n });\r\n $scope.UpdateOfferGroupContact();\r\n };\r\n\r\n $scope.SelectedToListGroup = function () {\r\n $scope.master3 = false;\r\n $scope.master4 = false;\r\n\r\n $.each($scope.currentOffer.GroupContacts, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.lstGroupContacts.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.lstGroupContacts, function (index, item) {\r\n var indexItem = $scope.currentOffer.GroupContacts.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.currentOffer.GroupContacts.splice(indexItem, 1);\r\n });\r\n $scope.UpdateOfferGroupContact();\r\n };\r\n\r\n $scope.toogleAllElementsLeftContract = function () {\r\n $scope.master5 = !$scope.master5;\r\n $.each($scope.lstTemplates, function (index, item) {\r\n item.checked = $scope.master5;\r\n });\r\n };\r\n\r\n $scope.toogleAllElementsRightContract = function () {\r\n $scope.master6 = !$scope.master6;\r\n $.each($scope.currentOffer.Templates, function (index, item) {\r\n item.checked = $scope.master6;\r\n });\r\n };\r\n\r\n\r\n $scope.ListToSelectedContract = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.master5 = false;\r\n $scope.master6 = false;\r\n\r\n $.each($scope.lstTemplates, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.currentOffer.Templates.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.currentOffer.Templates, function (index, item) {\r\n var indexItem = $scope.lstTemplates.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.lstTemplates.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $scope.SelectedToListContract = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.master5 = false;\r\n $scope.master6 = false;\r\n\r\n $.each($scope.currentOffer.Templates, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.lstTemplates.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.lstTemplates, function (index, item) {\r\n var indexItem = $scope.currentOffer.Templates.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.currentOffer.Templates.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $scope.ClearStep = function (step) {\r\n //nbStep = nombre des etapes a vidé\r\n for (var i = step + 1; i <= nbStep; i++) {\r\n Clear(i);\r\n }\r\n $scope.currentOffer.Validate = false;\r\n };\r\n\r\n function Clear(step) {\r\n switch (step) {\r\n case 2:\r\n $scope.currentOffer.Price = \"\";\r\n $scope.currentOffer.IdMarket = \"\";\r\n $scope.currentOffer.IdExpiry = \"\";\r\n $scope.currentOffer.Base = \"\";\r\n $scope.currentOffer.IdDestination = \"\";\r\n $scope.currentOffer.IdTree = \"\";\r\n $scope.lstOfferExpiry = [];\r\n $scope.currentOffer.Prime = \"\";\r\n $scope.currentOffer.Margin = \"\";\r\n $scope.currentOffer.FinancialCosts = \"\";\r\n $scope.currentOffer.LogisticCosts = \"\";\r\n $scope.currentOffer.Depot = \"\";\r\n $scope.currentOffer.Others = \"\";\r\n break;\r\n case 3:\r\n $scope.currentOffer.TargetPrice = false;\r\n $scope.currentOffer.StartVisibility = \"\";\r\n $scope.currentOffer.EndVisibility = \"\";\r\n $scope.currentOffer.StartPosition = \"\";\r\n $scope.currentOffer.EndPosition = \"\";\r\n $scope.currentOffer.StartTargetPrice = \"\";\r\n $scope.currentOffer.EndTargetPrice = \"\";\r\n $scope.currentOffer.IdValidityDuration = \"\";\r\n $scope.currentOffer.AllowDateEndTargetPrice = null;\r\n $scope.currentOffer.isVisibleH24 = false;\r\n $scope.currentOffer.isPositionH24 = false;\r\n $scope.currentOffer.isTargetPriceH24 = false;\r\n $scope.currentOffer.isPositionExerciceOptionH24 = false;\r\n $scope.currentOffer.isTargetExerciceOptionH24 = false;\r\n $scope.currentOffer.IdTypeOfferCommitment = null;\r\n $scope.currentOffer.IdTypeCommitmentForSubscribe = null;\r\n $scope.currentOffer.TypeFixationTypeOrders = {\r\n SoldBase: false,\r\n TargetPriceBase: false,\r\n SoldFuture: false,\r\n TargetPriceFuture: false,\r\n SoldGlobalPrice: false,\r\n TargetPriceGlobalPrice: false\r\n };\r\n break;\r\n case 4:\r\n $scope.currentOffer.StartValidity = \"\";\r\n $scope.currentOffer.EndValidity = \"\";\r\n $scope.currentOffer.DeliveryStartDate = \"\";\r\n $scope.currentOffer.DeliveryEndDate = \"\";\r\n $scope.currentOffer.PaymentDate = \"\";\r\n $scope.currentOffer.QuantityLimit = \"\";\r\n $scope.currentOffer.CommitmentMin = \"\";\r\n $scope.currentOffer.CommitmentMax = \"\";\r\n $scope.currentOffer.Quotity = \"\";\r\n $scope.currentOffer.SubscriptionPeriodBuiltPriceStartDate = \"\";\r\n $scope.currentOffer.SubscriptionPeriodBuiltPriceEndDate = \"\";\r\n $scope.currentOffer.ObservationPeriodBuiltPriceStartDate = \"\";\r\n $scope.currentOffer.ObservationPeriodBuiltPriceEndDate = \"\";\r\n\r\n break;\r\n case 5:\r\n\r\n $scope.currentOffer.Templates = [];\r\n $scope.currentOffer.GroupContacts = [];\r\n break;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n $scope.CheckDateObjectif = function () {\r\n if (($scope.currentOffer.IdValidityDuration && $scope.currentOffer.IdValidityDuration === enumFactory.ValidityDurations.EndDateOffer && !$scope.currentOffer.AllowDateEndTargetPrice) || $scope.currentOffer.IdValidityDuration !== enumFactory.ValidityDurations.EndDateOffer)\r\n $scope.currentOffer.AllowDateEndTargetPrice = false;\r\n };\r\n\r\n $scope.AddExpiry = function () {\r\n $scope.errorMessage = \"\";\r\n var expiryVm = {\r\n };\r\n if ($scope.currentOffer.IdExpiry && $scope.lstExpiry && $scope.lstExpiry.length > 0 && !$scope.fixe && !$scope.blankContract) {\r\n var expriryWSD = $filter('filter')($scope.lstExpiry, { IdExpiry: $scope.currentOffer.IdExpiry }, true)[0];\r\n var marketVm = $filter('filter')($scope.lstMarkets, { IdMarket: $scope.currentOffer.IdMarket }, true)[0];\r\n expiryVm = {\r\n IdExpiry: 0,\r\n IdOffer: $scope.currentOffer.IdOffer,\r\n IdExpiryWSD: expriryWSD.IdExpiry,\r\n IdMarket: $scope.currentOffer.IdMarket,\r\n LabelledWSD: expriryWSD.ExpiryNameFR,\r\n DateClosed: $filter('date')(expriryWSD.CloseDate, 'dd/MM/yyyy'),\r\n DateStart: null,\r\n Label: expriryWSD.ExpiryNameFR,\r\n LabelDefault: expriryWSD.ExpiryNameFR,\r\n Base: null,\r\n IsNew: true,\r\n TypeLocat: marketVm.TypeLocat,\r\n Strikes: [],\r\n ListStrikeDelta: [],\r\n IsVisible: true,\r\n Prime: null,\r\n Margin: null,\r\n FinancialCosts: null,\r\n LogisticCosts: null,\r\n Depot: null,\r\n Others: null\r\n\r\n };\r\n } else {\r\n if ($scope.fixe || $scope.blankContract) {\r\n expiryVm = {\r\n IdExpiry: 0,\r\n IdOffer: $scope.currentOffer.IdOffer,\r\n IdExpiryWSD: null,\r\n IdMarket: null,\r\n LabelledWSD: '',\r\n DateClosed: null,\r\n DateStart: null,\r\n Label: \"\",\r\n LabelDefault: \"\",\r\n Base: null,\r\n IsNew: true,\r\n DateMin: new Date(),\r\n IsVisible: true,\r\n Strikes: [],\r\n ListStrikeDelta: [],\r\n Prime: null,\r\n Margin: null,\r\n FinancialCosts: null,\r\n LogisticCosts: null,\r\n Depot: null,\r\n Others: null\r\n };\r\n }\r\n }\r\n if (expiryVm) {\r\n $scope.lstOfferExpiry.push(expiryVm);\r\n }\r\n };\r\n\r\n $scope.DeleteExpiry = function (index) {\r\n $scope.errorMessage = \"\";\r\n if ($scope.lstOfferExpiry && $scope.lstOfferExpiry.length > 0)\r\n $scope.lstOfferExpiry.splice(index, 1);\r\n };\r\n\r\n $scope.GetTotalBase = function (offerExpiry) {\r\n var offerExpiryBaseValueToRound = Number(offerExpiry.Prime) + Number(offerExpiry.Margin) + Number(offerExpiry.FinancialCosts) + Number(offerExpiry.LogisticCosts) + Number(offerExpiry.Depot) + Number(offerExpiry.Others);\r\n offerExpiry.Base = offerExpiryBaseValueToRound.toFixed(2);\r\n };\r\n\r\n $scope.CheckExpiries = function () {\r\n \r\n $scope.errorMessage = \"\";\r\n var error = \"\";\r\n var promises = [];\r\n var regexDate = /^(\\d{2}\\/){2}\\d{4}$/;\r\n var dateDuJour = new Date();\r\n dateDuJour.setHours(0, 0, 0, 0);\r\n $scope.lstOfferExpiry.forEach(function (item, index) {\r\n var deferred = $q.defer();\r\n var dateClosedSplitted = item.DateClosed.split('/');\r\n var dateClosed = new Date(dateClosedSplitted[2], dateClosedSplitted[1] - 1, dateClosedSplitted[0]);\r\n \r\n if (!item.Label)\r\n error += \"Veuillez renseigner un libellé pour l'échéance \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n\r\n if ((!item.DateClosed && !item.Base) || (item.DateClosed && item.Base && !Number(item.Base) && !regexDate.test(item.DateClosed)))\r\n error += \"Veuillez renseigner une date de fin d'échéance et une base valide pour l'échéance \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n else {\r\n if (!item.DateClosed || (item.IsVisible && dateClosed < dateDuJour) || (item.DateClosed && !regexDate.test(item.DateClosed)))\r\n error += \"Veuillez renseigner une date de fin d'échéance valide pour l'échéance \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n if (item.DateStart && !regexDate.test(item.DateStart))\r\n error += \"Veuillez renseigner une date de début d'échéance valide pour l'échéance \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n if (item.DateStart && dateService.compareDate(item.DateClosed, item.DateStart))\r\n error += \"La date de début doit être antérieur à la date de fin d'échéance pour l'échéance \" + item.Label + \"<br />\";\r\n \r\n if (!$scope.IsUneal && $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Ferme){\r\n if (!item.Base)\r\n item.Base = 0;\r\n if (Number(item.Base) !== 0 && !Number(item.Base))\r\n error += \"Veuillez renseigner une base valide pour l'échéance \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n }\r\n\r\n if ($scope.IsUneal && $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Ferme) {\r\n if (item.Prime !== 0 && item.Prime !== '0' && item.Prime && !Number(item.Prime))\r\n error += $scope.Label_Admin_Offer_PrimeExpiry + \" \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n if (item.Margin !== 0 && item.Margin !== '0' && item.Margin && !Number(item.Margin))\r\n error += $scope.Label_Admin_Offer_MarginExpiry + \" \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n if (item.FinancialCosts !== 0 && item.FinancialCosts !== '0' && item.FinancialCosts && !Number(item.FinancialCosts))\r\n error += $scope.Label_Admin_Offer_FinancialCostsExpiry + \" \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n if (item.LogisticCosts !== 0 && item.LogisticCosts !== '0' && item.LogisticCosts && !Number(item.LogisticCosts))\r\n error += $scope.Label_Admin_Offer_LogisticCostsExpiry + \" \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n if (item.Depot !== 0 && item.Depot !== '0' && item.Depot && !Number(item.Depot))\r\n error += $scope.Label_Admin_Offer_DepotExpiry + \" \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n if (item.Others !== 0 && item.Others !== '0' && item.Others && !Number(item.Others))\r\n error += $scope.Label_Admin_Offer_OthersExpiry + \" \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n }\r\n }\r\n\r\n item.Prime = $scope.bActiveDecomposeBase && (item.Prime == null || item.Prime == undefined || item.Prime == \"\") ? null : item.Prime;\r\n item.Margin = $scope.bActiveDecomposeBase && (item.Margin == null || item.Margin == undefined || item.Margin == \"\") ? null : item.Margin;\r\n item.FinancialCosts = $scope.bActiveDecomposeBase && (item.FinancialCosts == null || item.FinancialCosts == undefined || item.FinancialCosts == \"\") ? null : item.FinancialCosts;\r\n item.LogisticCosts = $scope.bActiveDecomposeBase && (item.LogisticCosts == null || item.LogisticCosts == undefined || item.LogisticCosts == \"\") ? null : item.LogisticCosts;\r\n item.Depot = $scope.bActiveDecomposeBase && (item.Depot == null || item.Depot == undefined || item.Depot == \"\") ? null : item.Depot;\r\n item.Others = $scope.bActiveDecomposeBase && (item.Others == null || item.Others == undefined || item.Others == \"\") ? null : item.Others;\r\n\r\n\r\n if ($scope.currentOffer.IdTypeOffer !== $scope.enumTypeOffers.Option && !$scope.blankContract) {\r\n if ($rootScope.paramBUseDeliveriesDates){\r\n if (!item.DeliveryStartDate || !regexDate.test(item.DeliveryStartDate))\r\n error += $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Expiry_DeliveryStartDate_Error.Content + \" pour l'échéance \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n if (!item.DeliveryEndDate || !regexDate.test(item.DeliveryEndDate))\r\n error += $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Expiry_DeliveryEndDate_Error.Content + \" pour l'échéance \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n if (item.DeliveryEndDate && item.DeliveryStartDate && dateService.compareDate(item.DeliveryEndDate, item.DeliveryStartDate))\r\n error += $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Expiry_DateError_EndDateBeforeStartDate.Content + \" pour l'échéance \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n }\r\n\r\n if ($rootScope.paramBUsePaymentDate && (!item.PaymentDate || !regexDate.test(item.PaymentDate)))\r\n error += $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Expiry_PaymentDate_Error.Content + \" pour l'échéance \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n }\r\n\r\n if ($scope.paramBActiveLinkWithCeremis && item.IsVisible && $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Option) {\r\n if (!item.OptionSubscribeCost || isNaN(item.OptionSubscribeCost))\r\n error += $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_ExpiryOption_SubscribeCost_Error.Content + \" pour l'échéance \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n if (!item.OptionLimitExerciceDate || !regexDate.test(item.OptionLimitExerciceDate) ||\r\n (\r\n item.IsVisible &&\r\n dateService.compareDate1SuperiorDate2(dateService.ConvertDateToDateAPI(item.DateClosed), new Date()) &&\r\n !dateService.compareDate1SuperiorDate2(dateService.ConvertDateToDateAPI(item.OptionLimitExerciceDate), new Date())\r\n ))\r\n error += $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_ExpiryOption_LimitExerciceDate_Error.Content + \" pour l'échéance \" + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n if ($scope.paramBActivateModeDeltaForStrike && (!item.ListStrikeDelta || item.ListStrikeDelta.length === 0))\r\n error += $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_ExpiryOption_NoStrikeSelected_Error.Content + (!item.Label ? (index + 1) : item.Label) + \"<br />\";\r\n }\r\n\r\n if (error) {\r\n $scope.errorMessage = $sce.trustAsHtml(error);\r\n deferred.resolve(false);\r\n }\r\n else {\r\n deferred.resolve(true);\r\n }\r\n promises.push(deferred.promise);\r\n });\r\n\r\n var result = $q.defer();\r\n $q.all(promises).then(function (values) {\r\n $scope.validExpiries = values.filter(function (element) {\r\n return element === false;\r\n }).length === 0 ? true : false;\r\n result.resolve();\r\n });\r\n return result.promise;\r\n };\r\n\r\n $scope.CheckSameTypeTemplate = function () {\r\n\r\n var promises = [];\r\n\r\n if ($scope.blankContract) {\r\n var deferred = $q.defer();\r\n deferred.resolve(true);\r\n promises.push(deferred.promise);\r\n }\r\n else {\r\n $scope.currentOffer.Templates.forEach(function (template) {\r\n var deferred = $q.defer();\r\n var sameTypeTemplates = $scope.currentOffer.Templates.filter(function (element) {\r\n if (!$rootScope.ModuleMultipleCompagnies.Active || ($rootScope.ModuleMultipleCompagnies.Active && $scope.currentOffer.IdCompagny))\r\n return element.IdTypeTemplate === template.IdTypeTemplate && element.IdLanguage == template.IdLanguage;\r\n\r\n return element.IdTypeTemplate == template.IdTypeTemplate && element.IdCompagny == template.IdCompagny && element.IdLanguage == template.IdLanguage;\r\n });\r\n if (sameTypeTemplates.length > 1 && $scope.errorMessage === \"\") {\r\n var error = \"Vous ne pouvez pas lier les templates '\";\r\n sameTypeTemplates.forEach(function (item) {\r\n error += item.Label;\r\n if (sameTypeTemplates.indexOf(item) === sameTypeTemplates.length - 2)\r\n error += \"' et '\";\r\n else\r\n error += \"', '\";\r\n });\r\n $scope.errorMessage = error.substring(0, error.length - 3);\r\n if (!$rootScope.ModuleMultipleCompagnies.Active || ($rootScope.ModuleMultipleCompagnies.Active && $scope.currentOffer.IdCompagny))\r\n $scope.errorMessage += \" car ils ont le même type de template.\";\r\n else\r\n $scope.errorMessage += \" car ils ont le même type de template et la même société\";\r\n\r\n deferred.resolve(false);\r\n } else\r\n deferred.resolve(true);\r\n\r\n promises.push(deferred.promise);\r\n });\r\n }\r\n\r\n var result = $q.defer();\r\n $q.all(promises).then(function (values) {\r\n $scope.validTypeTemplateNotSame = values.filter(function (element) { return element === false; }).length === 0 ? true : false;\r\n result.resolve();\r\n });\r\n return result.promise;\r\n };\r\n\r\n $scope.orderByExpiries = function (expiry) {\r\n var regexDate = /^(\\d{2}\\/){2}\\d{4}$/;\r\n if (expiry.DateClosed && regexDate.test(expiry.DateClosed))\r\n return new Date(expiry.DateClosed);\r\n };\r\n\r\n $scope.setVisibilityOfferH24 = function () {\r\n $scope.currentOffer.isVisibleH24 = !$scope.currentOffer.isVisibleH24;\r\n $scope.currentOffer.StartVisibility = \"00:00:00\";\r\n $scope.currentOffer.EndVisibility = $scope.currentOffer.isVisibleH24 ? \"23:59:59\" : \"00:00:00\";\r\n };\r\n\r\n $scope.setPositionOfferH24 = function () {\r\n $scope.currentOffer.isPositionH24 = !$scope.currentOffer.isPositionH24;\r\n $scope.currentOffer.StartPosition = \"00:00:00\";\r\n $scope.currentOffer.EndPosition = $scope.currentOffer.isPositionH24 ? \"23:59:59\" : \"00:00:00\";\r\n };\r\n\r\n $scope.setTargetPriceOfferH24 = function () {\r\n $scope.currentOffer.isTargetPriceH24 = !$scope.currentOffer.isTargetPriceH24;\r\n $scope.currentOffer.StartTargetPrice = \"00:00:00\";\r\n $scope.currentOffer.EndTargetPrice = $scope.currentOffer.isTargetPriceH24 ? \"23:59:59\" : \"00:00:00\";\r\n };\r\n\r\n $scope.setPositionOfferBaseH24 = function () {\r\n $scope.currentOffer.isPositionBaseH24 = !$scope.currentOffer.isPositionBaseH24;\r\n $scope.currentOffer.StartPositionBase = \"00:00:00\";\r\n $scope.currentOffer.EndPositionBase = $scope.currentOffer.isPositionBaseH24 ? \"23:59:59\" : \"00:00:00\";\r\n };\r\n\r\n $scope.setTargetPriceOfferBaseH24 = function () {\r\n $scope.currentOffer.isTargetPriceBaseH24 = !$scope.currentOffer.isTargetPriceBaseH24;\r\n $scope.currentOffer.StartTargetPriceBase = \"00:00:00\";\r\n $scope.currentOffer.EndTargetPriceBase = $scope.currentOffer.isTargetPriceBaseH24 ? \"23:59:59\" : \"00:00:00\";\r\n };\r\n\r\n $scope.setPositionExerciceOptionH24 = function () {\r\n $scope.currentOffer.isPositionExerciceOptionH24 = !$scope.currentOffer.isPositionExerciceOptionH24;\r\n $scope.currentOffer.StartPositionExerciceOption = \"00:00:00\";\r\n $scope.currentOffer.EndPositionExerciceOption = $scope.currentOffer.isPositionExerciceOptionH24 ? \"23:59:59\" : \"00:00:00\";\r\n };\r\n\r\n $scope.setTargetExerciceOptionH24 = function () {\r\n $scope.currentOffer.isTargetExerciceOptionH24 = !$scope.currentOffer.isTargetExerciceOptionH24;\r\n $scope.currentOffer.StartPositionTargetExerciceOption = \"00:00:00\";\r\n $scope.currentOffer.EndPositionTargetExerciceOption = $scope.currentOffer.isTargetExerciceOptionH24 ? \"23:59:59\" : \"00:00:00\";\r\n };\r\n\r\n $scope.setAutomaticSwitchExpiry = function () {\r\n $scope.currentOffer.AutomaticSwitchExpiry = !$scope.currentOffer.AutomaticSwitchExpiry;\r\n };\r\n\r\n $scope.addStrike = function (expiry) {\r\n if (!expiry.Strikes)\r\n expiry.Strikes = [];\r\n\r\n var strike = {\r\n ExerciceDate: null,\r\n Prime: null,\r\n Cost: null,\r\n Variation: null\r\n };\r\n\r\n if (expiry.Strikes.length === 0){\r\n strike.IsStrikeToTheMoney = true;\r\n strike.Variation = 0;\r\n }\r\n \r\n expiry.Strikes.push(strike);\r\n };\r\n\r\n $scope.deleteStrike = function (offerExpiry, index) {\r\n $scope.errorMessage = \"\";\r\n var strikeToDelete = offerExpiry.Strikes[index];\r\n\r\n if (strikeToDelete.IdStrike > 0) {\r\n\r\n offerService.CanDeleteStrike(strikeToDelete.IdStrike, function (canDelete) {\r\n if (canDelete != \"true\") {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_Delete_Strike.Content;\r\n return;\r\n }\r\n else\r\n offerExpiry.Strikes.splice(index, 1);\r\n });\r\n\r\n }\r\n else\r\n offerExpiry.Strikes.splice(index, 1);\r\n };\r\n\r\n function loadStrikeAutoVm() {\r\n $scope.lstOfferExpiry.forEach(function (expiry, index) {\r\n $scope.strikeAutoVm[index] = {};\r\n $scope.strikeAutoVm[index].IdExpiryWsd = expiry.IdExpiryWSD;\r\n $scope.strikeAutoVm[index].DateClosedExpiry = dateService.ConvertDateToDateAPI(expiry.DateClosed);\r\n $scope.strikeAutoVm[index].LabelExpiry = expiry.Label;\r\n $scope.strikeAutoVm[index].IdTypeOption = $scope.currentOffer.IdTypeOption;\r\n $scope.strikeAutoVm[index].GapsStrikeAutoVm = [];\r\n var isFirst = true;\r\n expiry.Strikes.forEach(function (strike, indexStrike) {\r\n $scope.strikeAutoVm[index].GapsStrikeAutoVm[indexStrike] = {};\r\n if (isFirst) {\r\n $scope.strikeAutoVm[index].Cost = strike.Cost;\r\n $scope.strikeAutoVm[index].Margin = strike.Margin;\r\n isFirst = false;\r\n }\r\n $scope.strikeAutoVm[index].GapsStrikeAutoVm[indexStrike].ExerciceDate = strike.ExerciceDate;\r\n $scope.strikeAutoVm[index].GapsStrikeAutoVm[indexStrike].Variation = strike.Variation;\r\n $scope.strikeAutoVm[index].GapsStrikeAutoVm[indexStrike].IsStrikeToTheMoney = strike.IsStrikeToTheMoney;\r\n });\r\n });\r\n }\r\n\r\n $scope.ShowAutomaticStrike = function (openPopUp, offerExpiry, index) {\r\n if (!$scope.strikeAutoVm[index]) {\r\n $scope.strikeAutoVm[index] = {};\r\n $scope.strikeAutoVm[index].Cost = null;\r\n $scope.strikeAutoVm[index].Margin = null;\r\n $scope.strikeAutoVm[index].IdExpiryWsd = offerExpiry.IdExpiryWSD;\r\n $scope.strikeAutoVm[index].DateClosedExpiry = dateService.ConvertDateToDateAPI(offerExpiry.DateClosed);\r\n $scope.strikeAutoVm[index].LabelExpiry = offerExpiry.Label;\r\n $scope.strikeAutoVm[index].IdTypeOption = $scope.currentOffer.IdTypeOption;\r\n $scope.strikeAutoVm[index].GapsStrikeAutoVm = [];\r\n }\r\n\r\n $scope.indexStrikeAutoToInsert = index;\r\n\r\n $scope.strikeAutoErrorMessage = '';\r\n openPopUp();\r\n };\r\n\r\n $scope.addStrikeGap = function () {\r\n $scope.strikeAutoErrorMessage = \"\";\r\n var config = $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert];\r\n\r\n if (!config.ExerciceDate){\r\n $scope.strikeAutoErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_CreateOffer_PopUpStrikeAuto_ExerciceDate.Content;\r\n return;\r\n }\r\n if (isNaN(config.NbStrikes)){\r\n $scope.strikeAutoErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_CreateOffer_PopUpStrikeAuto_NbStrikes.Content;\r\n return;\r\n }\r\n if (isNaN(config.GapVariation)){\r\n $scope.strikeAutoErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_CreateOffer_PopUpStrikeAuto_GapVariation.Content;\r\n return;\r\n }\r\n\r\n config.GapsStrikeAutoVm = [];\r\n var nbStrikesInTheMoney = Number(config.NbStrikes) / 2;\r\n\r\n // Hors la monnaie\r\n for (var i = 1; i <= nbStrikesInTheMoney; i++) {\r\n config.GapsStrikeAutoVm.push({\r\n ExerciceDate: config.ExerciceDate,\r\n Variation: Number((-i * config.GapVariation).toFixed(2))\r\n });\r\n }\r\n\r\n // A la monnaie\r\n config.GapsStrikeAutoVm.push({\r\n ExerciceDate: config.ExerciceDate,\r\n Variation: 0,\r\n IsStrikeToTheMoney: true\r\n });\r\n\r\n // Dans la monnaie\r\n for (var j = 1; j <= nbStrikesInTheMoney; j++) {\r\n config.GapsStrikeAutoVm.push({\r\n ExerciceDate: config.ExerciceDate,\r\n Variation: Number((j * config.GapVariation).toFixed(2))\r\n });\r\n }\r\n\r\n config.GapsStrikeAutoVm = config.GapsStrikeAutoVm.sort(function(a, b){return a.Variation - b.Variation;});\r\n config.ExerciceDate = null;\r\n config.GapVariation = null;\r\n config.NbStrikes = null;\r\n };\r\n\r\n $scope.DeleteStrikeAuto = function (index) {\r\n $scope.errorMessage = \"\";\r\n if ($scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].GapsStrikeAutoVm && $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].GapsStrikeAutoVm.length > 0)\r\n $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].GapsStrikeAutoVm.splice(index, 1);\r\n };\r\n\r\n $scope.ChkStrikeAuto = function () {\r\n $scope.strikeAutoErrorMessage = '';\r\n if ((!$scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].Margin || !Number($scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].Margin)) && $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].Margin !== '0' && $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].Margin !== 0) {\r\n $scope.strikeAutoErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_CreateOffer_PopUpStrikeAuto_Margin.Content;\r\n return false;\r\n }\r\n\r\n if ((!$scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].Cost || !Number($scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].Cost)) && $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].Cost !== '0' && $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].Cost !== 0) {\r\n $scope.strikeAutoErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_CreateOffer_PopUpStrikeAuto_Cost.Content;\r\n return false;\r\n }\r\n\r\n if (!$scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].GapsStrikeAutoVm || $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].GapsStrikeAutoVm.length === 0) {\r\n $scope.strikeAutoErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_CreateOffer_PopUpStrikeAuto_NoGaps.Content;\r\n return false;\r\n }\r\n\r\n for (var index = 0; index < $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].GapsStrikeAutoVm.length; index++) {\r\n var numLine = index + 1;\r\n if (!$scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].GapsStrikeAutoVm[index].ExerciceDate) {\r\n $scope.strikeAutoErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_CreateOffer_PopUpStrikeAuto_ExcerciceDate.Content + ' ' + numLine;\r\n return false;\r\n }\r\n \r\n if ((!$scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].GapsStrikeAutoVm[index].Variation || !Number($scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].GapsStrikeAutoVm[index].Variation)) && $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].GapsStrikeAutoVm[index].Variation != 0) {\r\n $scope.strikeAutoErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_CreateOffer_PopUpStrikeAuto_Gap.Content + ' ' + numLine;\r\n return false;\r\n }\r\n }\r\n\r\n var strikesInTheMoney = $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].GapsStrikeAutoVm.filter(function(x){ return x.Variation === 0;});\r\n if (!strikesInTheMoney || strikesInTheMoney.length > 1) {\r\n $scope.strikeAutoErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_CreateOffer_Strikes_GapInTheMoney.Content;\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n $scope.cancelPopUpStrikeAutoButton = function () {\r\n $scope.strikeAutoErrorMessage = '';\r\n $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].Margin = null;\r\n $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].Cost = null;\r\n $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].GapsStrikeAutoVm = [];\r\n $scope.lstOfferExpiry[$scope.indexStrikeAutoToInsert].Strikes = [];\r\n $scope.cancelPopUpStrikeAuto();\r\n };\r\n\r\n $scope.ValidStrikeAuto = function () {\r\n $scope.strikeAutoErrorMessage = '';\r\n $scope.strikeAutoVm[$scope.indexStrikeAutoToInsert].IdTypeQuote = $scope.currentOffer.IdTypeQuote;\r\n offerService.GenerateStrikeAuto($scope.strikeAutoVm[$scope.indexStrikeAutoToInsert], function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.lstOfferExpiry[$scope.indexStrikeAutoToInsert].Strikes = [];\r\n $scope.lstOfferExpiry[$scope.indexStrikeAutoToInsert].Strikes = data;\r\n }\r\n }\r\n });\r\n };\r\n\r\n function removeExpiryClosed() {\r\n var dateDuJour = new Date();\r\n dateDuJour.setHours(0, 0, 0, 0);\r\n var lstOfferDuplicateTmp = angular.copy($scope.lstOfferExpiry);\r\n $.each(lstOfferDuplicateTmp, function (index, item) {\r\n var dateClosedSplitted = item.DateClosed.split('/');\r\n var dateClosed = new Date(dateClosedSplitted[2], dateClosedSplitted[1] - 1, dateClosedSplitted[0]);\r\n if (dateClosed < dateDuJour) {\r\n index = $scope.lstOfferExpiry.findIndex(function (expiry){return expiry.IdExpiry == item.IdExpiry;});\r\n $scope.lstOfferExpiry.splice(index, 1);\r\n }\r\n });\r\n }\r\n\r\n function loadMarkets(callbackFn) {\r\n // Vu qu'on ne sélectionne pas de quotation pour une offre prix construit, on affiche la liste des indexés temps réel à l'étape 2\r\n if ($scope.currentOffer.IdTypeQuote === enumFactory.TypeQuotes.IndexeTempsReel ) {\r\n wsdApiService.GetMarketsFutureAndCash(function (data, status) {\r\n if (status === null) {\r\n $scope.lstMarkets = data;\r\n if (callbackFn)\r\n callbackFn();\r\n } else\r\n $scope.errorMessage = status;\r\n });\r\n }\r\n else if ($scope.currentOffer.IdTypeQuote !== enumFactory.TypeQuotes.Fixe || $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.PrixConstruit) {\r\n wsdApiService.GetMarketsWSDToEuronext(function (data, status) {\r\n if (status === null) {\r\n $scope.lstMarkets = data;\r\n if (callbackFn)\r\n callbackFn();\r\n }\r\n else\r\n $scope.errorMessage = status;\r\n });\r\n }\r\n }\r\n\r\n $scope.GetCrop = function (idCrop) {\r\n $scope.currentOffer.Crop = null;\r\n\r\n if (idCrop != null)\r\n if ($filter('filter')($scope.lstCrops, { IdCrop: idCrop })[0] !== undefined)\r\n $scope.currentOffer.Crop = $filter('filter')($scope.lstCrops, { IdCrop: idCrop }, true)[0];\r\n };\r\n\r\n function loadAndFilterOffersCeremis() {\r\n if ($scope.paramBActiveLinkWithCeremis && ($scope.currentOffer.IdTypeQuote === enumFactory.TypeQuotes.IndexeTempsReel || $scope.currentOffer.IdTypeQuote === enumFactory.TypeQuotes.IndexeCoursCompensation || $scope.currentOffer.IdTypeQuote === enumFactory.TypeQuotes.Indexe3FoisParJour)) {\r\n $scope.GetCrop($scope.currentOffer.IdCrop);\r\n\r\n ceremisApiService.GetOffersCeremis($scope.currentOffer.Crop.IdExt, function (data, status) {\r\n if (status === null) {\r\n $scope.lstOffersCeremis = data;\r\n\r\n $scope.lstmarketTmp = [];\r\n\r\n $.each($scope.lstMarkets, function (index, item) {\r\n if ($scope.lstOffersCeremis.indexOf($filter('filter')($scope.lstOffersCeremis, { \"IdMarketWSD\": Number(item.IdMarket) }, true)[0]) !== -1) {\r\n $scope.lstmarketTmp.push(item);\r\n }\r\n });\r\n\r\n $scope.lstMarkets = $scope.lstmarketTmp;\r\n } else\r\n $scope.errorMessage = status;\r\n });\r\n }\r\n }\r\n\r\n function loadExpiries() {\r\n var market = $filter('filter')($scope.lstMarkets, { IdMarket: $scope.currentOffer.IdMarket })[0];\r\n if ($scope.currentOffer.IdMarket) {\r\n //cas pour les offres ferme indéxées \r\n if ($scope.currentOffer.IdTypeQuote) {\r\n wsdApiService.GetExpiriesWSDByIdMarketWithQuotes($scope.currentOffer.IdMarket, $scope.currentOffer.IdTypeQuote, market.TypeLocat, function (data, status) {\r\n if (status === null) {\r\n $scope.lstExpiry = data.Expiries;\r\n\r\n if ($scope.paramBActiveLinkWithCeremis) {\r\n $scope.lstExpiryTmp = [];\r\n\r\n $.each($scope.lstExpiry, function (index, item) {\r\n if ($scope.lstOffersCeremis.indexOf($filter('filter')($scope.lstOffersCeremis, { \"IdExpiryWSD\": Number(item.IdExpiry) }, true)[0]) !== -1) {\r\n $scope.lstExpiryTmp.push(item);\r\n }\r\n });\r\n $scope.lstExpiry = $scope.lstExpiryTmp;\r\n }\r\n } else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n }\r\n //cas pour les offres d'engagement , engagement de surface et prix construit\r\n else if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Engagement || $scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.EngagementSurface) {\r\n wsdApiService.GetExpiriesWSDByIdMarket($scope.currentOffer.IdMarket, function (data, status) {\r\n if (status === null) {\r\n $scope.lstExpiry = data.Expiries;\r\n } else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n }\r\n\r\n //cas pour les offre d'option\r\n if ($scope.currentOffer.IdTypeOffer === $scope.enumTypeOffers.Option) {\r\n $scope.currentOffer.typeCalculOption = 1;\r\n }\r\n }\r\n }\r\n\r\n $scope.onFileSelect = function ($files) {\r\n var upload = function (i, $file) {\r\n $scope.fileName = '';\r\n $scope.percent = '';\r\n $scope.linkFile = '';\r\n $scope.errorMessage = \"\";\r\n $upload.upload({\r\n url: configurationFactory.Url['Api'] + 'Upload/Upload', // webapi url\r\n method: \"POST\",\r\n params: { idAttachment: -1 },\r\n file: $file\r\n }).progress(function (evt) {\r\n // get upload percentage\r\n $scope.percent = parseInt(100.0 * evt.loaded / evt.total) + '%';\r\n }).success(function (data) {\r\n // file is uploaded successfully\r\n $scope.currentOffer.IdAttachment = data.IdAttachment;\r\n $scope.fileName = data.PublicLabel;\r\n }).error(function (data) {\r\n $scope.errorMessage = data;\r\n });\r\n };\r\n\r\n for (var i = 0; i < $files.length; i++) {\r\n var $file = $files[i];\r\n upload(i, $file);\r\n }\r\n };\r\n\r\n $scope.resetFile = function () {\r\n $scope.errorMessage = \"\";\r\n if($scope.ModeDupliquer){\r\n $scope.fileName = \"\";\r\n $scope.currentOffer.IdAttachment = null;\r\n }\r\n else if ($scope.currentOffer.IdOffer !== undefined || $scope.currentOffer.IdOffer !== null || $scope.currentOffer.IdOffer !== -1) {\r\n offerService.DeleteAttachement($scope.currentOffer.IdOffer, $scope.currentOffer.IdAttachment, function (data, status) {\r\n if (status === null) {\r\n $scope.fileName = '';\r\n $scope.percent = '';\r\n $scope.linkFile = '';\r\n $scope.currentOffer.IdAttachment = null;\r\n } else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.ShowStrikes = function (openPopUp, offerExpiry, index) {\r\n $scope.showStrikesErrorMessage = \"\";\r\n $scope.strikesInfos = [];\r\n $scope.showStrikesTitleByExpiryWsd = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_StrikesVisibility.Content + offerExpiry.Label;\r\n\r\n ceremisApiService.GetCeremisStrikes(offerExpiry.IdExpiryWSD, $scope.currentOffer.IdTypeOption, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.showStrikesErrorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.showStrikesErrorMessage = status;\r\n }\r\n else {\r\n if (data && data.length > 0 && data !== \"null\") {\r\n $scope.strikesInfos = data[0].ListStrikeInfoVm;\r\n\r\n if ($scope.paramBActivateModeDeltaForStrike)\r\n manageCheckBoxStrikeForDelta(offerExpiry, index);\r\n }\r\n else\r\n $scope.showStrikesErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_NoStrikeAvailable.Content + offerExpiry.Label;\r\n }\r\n openPopUp();\r\n });\r\n };\r\n\r\n function manageCheckBoxStrikeForDelta(offerExpiry, index) {\r\n $scope.currentIndexForStrikeDelta = index;\r\n $scope.strikeDeltaPopUp = [];\r\n var strikeToTheMoney = $scope.strikesInfos.filter(function (element) { return element.IsStrikeToTheMoney === true; })[0];\r\n if (strikeToTheMoney)\r\n {\r\n $scope.currentStrikeToTheMoneyForStrikeDelta = strikeToTheMoney.Strike;\r\n $scope.strikesInfos.forEach(function (strikeinfoVm) {\r\n var deltaCurrentStrikeAndStrikeToTheMoney = strikeinfoVm.Strike - strikeToTheMoney.Strike;\r\n strikeinfoVm.deltaValue = deltaCurrentStrikeAndStrikeToTheMoney;\r\n var indexInOfferExpiryListStrikeDelta = offerExpiry.ListStrikeDelta ? offerExpiry.ListStrikeDelta.indexOf(deltaCurrentStrikeAndStrikeToTheMoney) : -1;\r\n if (strikeinfoVm.Strike == strikeToTheMoney.Strike || indexInOfferExpiryListStrikeDelta >= 0) {\r\n $scope.SelectStrikeForDelta(deltaCurrentStrikeAndStrikeToTheMoney);\r\n }\r\n });\r\n }\r\n else\r\n $scope.showStrikesErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_Strike_NoStrikeToTheMoneyAvailable.Content + offerExpiry.Label;\r\n }\r\n \r\n $scope.SelectStrikeForDelta = function (deltaValue) {\r\n var index = $scope.strikeDeltaPopUp.indexOf(deltaValue);\r\n if (index >= 0) {\r\n $scope.strikeDeltaPopUp.splice(index, 1);\r\n } else {\r\n $scope.strikeDeltaPopUp.push(deltaValue);\r\n }\r\n };\r\n\r\n $scope.confirmPopUpStrikes = function () {\r\n $scope.lstOfferExpiry[$scope.currentIndexForStrikeDelta].ListStrikeDelta = [];\r\n $scope.strikeDeltaPopUp.forEach(function (strikeDelta) {\r\n $scope.lstOfferExpiry[$scope.currentIndexForStrikeDelta].ListStrikeDelta.push(strikeDelta);\r\n });\r\n $scope.closePopUpStrikes();\r\n };\r\n\r\n $scope.init();\r\n }]);\r\n","AgrimarketControllers.controller('builtPriceManagerController', ['$scope', '$rootScope', '$routeParams', 'offerService', 'parametersFactory', 'athenaOrdersService', 'coverService', '$sce', '$location','dateService', '$filter',\r\n function ($scope, $rootScope, $routeParams, offerService, parametersFactory, athenaOrdersService, coverService, $sce, $location, dateService, $filter) {\r\n\r\n var idOffer = $routeParams.idoffer;\r\n $scope.offer = {};\r\n $scope.isPopUpBuiltPriceOrder = true;\r\n $scope.labelExpiry = \"\";\r\n $scope.successMessageEditable = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_EditVariableForBase_SuccessMessage.Content;\r\n $scope.titlePage = $rootScope.editableObjectsFactory.EditableObjects.Menu_Admin_Offer_BuiltPriceManager.Content;\r\n $scope.offerLabel = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_BuiltPriceManager_OfferLabel.Content;\r\n $scope.totalQtyLabel = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_BuiltPriceManager_QuantityTotalLabel.Content;\r\n $scope.qtyExitBuiltPriceLabel = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_BuiltPriceManager_QuantityOfContractsAnticipatedExitLabel.Content;\r\n $scope.qtyAvailableLabel = $rootScope.editableObjectsFactory.EditableObjects.Admin_Offer_BuiltPriceManager_QuantityAvailableForAnticipatedExitLabel.Content;\r\n \r\n $scope.dateObservation_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_Date_Observation.Content;\r\n $scope.percentDay_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_PercentDay.Content;\r\n $scope.percentFixeAccount_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_PercentFixedAccount.Content;\r\n $scope.qtyToCovered_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_QtyToCovered.Content;\r\n $scope.qtyExitAnticipated_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_QtyExitAnticipated.Content;\r\n $scope.qtyCoveredWithLots_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_QtyCoveredWithLots.Content;\r\n $scope.qtyCovered_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_QtyCovered.Content;\r\n $scope.qtyToExitAnticipated_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_QtyToExitAnticipated.Content;\r\n $scope.qtyRemainingToSell_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_QtyRemainingToSell.Content;\r\n $scope.expiryCover_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_ExpiryCover.Content;\r\n $scope.TotalBaseComponent_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_TotalBaseComponentValue.Content;\r\n $scope.averageMarketPriceWithoutExitAnticipated_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_AverageMarketPriceWithoutExitAnticipated.Content;\r\n $scope.averagePriceWithoutExitAnticipated_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_AveragePriceWithoutExitAnticipated.Content;\r\n \r\n $scope.startDateFilter_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_StartDateFilter.Content;\r\n $scope.endDateFilter_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_EndDateFilter.Content;\r\n\r\n $scope.market_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_Market_Label.Content;\r\n $scope.nbLotsCover_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_NbLotsCover.Content;\r\n $scope.nbLotsToCover = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_NbLotsToCover.Content;\r\n $scope.paramNbDaysFilterDateBuiltPriceObservations = parametersFactory.Parameters.NbDaysFilterDateBuiltPriceObservations.Value;\r\n\r\n\r\n $scope.price_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_Price.Content ;\r\n $scope.numOrder_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_NumOrder.Content ;\r\n $scope.numExt_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_NumExt.Content ;\r\n $scope.tonsCovered_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_TonsCovered.Content ;\r\n $scope.lotCovered_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_LotCovered.Content ;\r\n $scope.anyLot_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_AnyLot.Content ;\r\n $scope.date_Label = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_Date.Content ;\r\n\r\n var init = function () {\r\n\r\n offerService.GetInfoBuiltPriceForAdmin(idOffer, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.isEuronextOpen = data.IsEuronextOpen;\r\n $scope.offer = data;\r\n $scope.qtyAvailableForExit = $filter('roundByDecimalAndConverter')(data.QuantityAvailableForAnticipatedExitBuiltPrice, '2');\r\n $scope.StartDateFilter = $filter('date')(data.InfoBuiltPriceFilterVm.StartDateFilter, 'dd/MM/yyyy');\r\n $scope.EndDateFilter = $filter('date')(data.InfoBuiltPriceFilterVm.EndDateFilter, 'dd/MM/yyyy');\r\n\r\n $scope.getInfoBuiltPriceObservationsForAdmin(idOffer, $scope.StartDateFilter, $scope.EndDateFilter);\r\n }\r\n });\r\n };\r\n\r\n $scope.filterDate = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.getInfoBuiltPriceObservationsForAdmin(idOffer, $scope.StartDateFilter, $scope.EndDateFilter);\r\n };\r\n\r\n $scope.saveOfferInfos = function () {\r\n $scope.errorMessage = null;\r\n $scope.successMessage = null;\r\n $scope.expiryAndBaseComponents = [];\r\n\r\n $scope.infoBuiltPriceObservations.LstBuiltPriceObservations.forEach(function(e) {\r\n $scope.expiryAndBaseComponents.push({\r\n \"IdOfferBuiltPriceObservation\" : e.IdOfferBuiltPriceObservation,\r\n \"IdExpiryWsd\": e.IdExpiryWsd,\r\n \"BaseComponentValues\": e.LstBaseComponentValues\r\n });\r\n });\r\n\r\n offerService.PostInfoBuiltPriceForAdmin(\r\n {\r\n IdOffer: idOffer,\r\n QuantityAvailableForAnticipatedExitBuiltPrice: $scope.qtyAvailableForExit,\r\n ExpiryAndBaseComponents: $scope.expiryAndBaseComponents\r\n },\r\n function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.successMessage = $scope.successMessageEditable;\r\n $scope.init();\r\n }\r\n }\r\n );\r\n };\r\n\r\n $scope.getInfoBuiltPriceObservationsForAdmin = function(idOffer, startDateFilter, endDateFilter){\r\n offerService.GetInfoBuiltPriceObservationsForAdmin(idOffer, startDateFilter, endDateFilter, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n \r\n var nowDate = new Date(); \r\n data.LstBuiltPriceObservations.forEach(function(item) { \r\n if (dateService.getFormatDateFromApi(item.DateObservation) == ((nowDate.getDate() < 10 ? '0' : '') + nowDate.getDate()+'/'+(nowDate.getMonth()+1)+'/'+nowDate.getFullYear())) { \r\n item.cssColorLine = \"current_day\" ;\r\n } else if (dateService.compareDate1SuperiorDate2(nowDate, new Date(item.DateObservation))) {\r\n item.cssColorLine = \"past_day\";\r\n }\r\n });\r\n $scope.infoBuiltPriceObservations = data;\r\n }\r\n });\r\n };\r\n\r\n $scope.OpenPopUpOrder = function (openPopup) {\r\n $scope.orderPopUp = {};\r\n getInfosPopUpAthenaOrderBuiltPrice(idOffer, openPopup);\r\n };\r\n\r\n $scope.SavePopupOrder = function () {\r\n athenaOrdersService.PostAthenaOrderVm($scope.orderPopUp, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.popupOrderErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n $scope.openPopupOrder();\r\n }\r\n }\r\n else\r\n $scope.init();\r\n });\r\n };\r\n\r\n $scope.OpenPopUpSellOrders = function (openPopup, idOfferBuiltPriceObservation) {\r\n //appel api\r\n $scope.modalTitleSellOrders = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_LotCovered.Content ;\r\n\r\n $scope.errorMessageSellOrders = \"\";\r\n\r\n athenaOrdersService.GetAthenaOrdersSellByIdOfferBuiltPriceObservation(idOfferBuiltPriceObservation, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageSellOrders = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstAthenaOrdersSell = data;\r\n openPopup();\r\n }\r\n });\r\n };\r\n\r\n\r\n $scope.OpenPopUpExitAnticipatedOrders = function (openPopup, idOfferBuiltPriceObservation) {\r\n //appel api\r\n $scope.modalTitleExitAnticipatedOrders = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_ExitAnticipateds.Content ;\r\n\r\n $scope.errorMessageExitAnticipatedOrders = \"\";\r\n\r\n athenaOrdersService.GetAthenaOrdersExitAnticipatedByIdOfferBuiltPriceObservation(idOfferBuiltPriceObservation, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessageExitAnticipatedOrders = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstAthenaOrdersExitAnticipated = data;\r\n openPopup();\r\n }\r\n });\r\n\r\n\r\n };\r\n\r\n $scope.Cancel = function () {\r\n $location.path('/admin/offers/' + ($rootScope.filtersListingOffers ? $rootScope.filtersListingOffers.idStatus : '' ));\r\n };\r\n\r\n function getInfosPopUpAthenaOrderBuiltPrice(idOffer, openPopup) {\r\n athenaOrdersService.GetInfosPopUpAthenaOrderBuiltPrice(idOffer, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400){\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.labelExpiry = data.LabelExpiry;\r\n $scope.orderPopUp.IdAccount = data.IdAccount;\r\n $scope.orderPopUp.IdExpiryWsd = data.IdExpiry;\r\n $scope.orderPopUp.Direction = data.Direction;\r\n $scope.orderPopUp.IdOrderType = data.IdOrderType;\r\n $scope.orderPopUp.IdMarketWsd = data.IdMarket;\r\n $scope.orderPopUp.TxtQtyToSend = $rootScope.editableObjectsFactory.EditableObjects.Admin_Built_Price_Manager_PopUp_TxtQtyToSend.Content.replace(\"[QtyToSend]\", data.QtyToSend);\r\n $scope.orderPopUp.IdOfferBuiltPrice = idOffer;\r\n\r\n $scope.openPopupOrder = openPopup;\r\n \r\n $scope.popupOrderErrorMessage = \"\";\r\n $scope.modalTitle = $rootScope.editableObjectsFactory.EditableObjects.ModalTitleAddOrder.Content;\r\n \r\n getAccounts();\r\n openPopup();\r\n }\r\n });\r\n }\r\n\r\n function getAccounts() {\r\n coverService.GetAllAccounts(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.popupOrderErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else\r\n $scope.lstAccounts = data;\r\n });\r\n }\r\n\r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('cropsController', ['$scope', '$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory', 'cropsService', '$filter', 'parametersService', '$sce', 'parametersFactory',\r\n\tfunction ($scope, $rootScope, $http, $location, currentUserFactory, configurationFactory, cropsService, $filter, parametersService, $sce, parametersFactory) {\r\n\r\n\t $scope.init = function () {\r\n\t cropsService.GetCrops(function (data, status) {\r\n\t if (status !== null) {\r\n\t if (status == 400)\r\n\t $scope.errorMessage = data[0].errors[0].Message;\r\n\t } else\r\n\t $scope.crops = data;\r\n\t $scope.ChangeDefaultCrop(parametersFactory.Parameters.DefaultCrop.Value);\r\n\t });\r\n\t };\r\n\r\n\t $scope.init();\r\n\r\n\t $scope.ChangeDefaultCrop = function (idDefaultCrop) {\r\n\t $scope.crops.forEach(function (crop) {\r\n\t if (crop.IdCrop == idDefaultCrop)\r\n\t crop.IsDefault = true;\r\n\t else\r\n\t crop.IsDefault = false;\r\n\t });\r\n\t };\r\n\r\n\t $scope.CheckCrops = function () {\r\n\t var crop = $filter('filter')($scope.crops, { IsDefault: true })[0];\r\n\t if (!crop)\r\n\t $scope.errorMessage = \"Veuillez sélectionner une campagne par défaut\";\r\n\t else if (!crop.Visible)\r\n\t $scope.errorMessage = \"Vous ne pouvez pas définir comme campagne par défaut une campagne qui n'est pas visible.\";\r\n\t };\r\n\r\n\t $scope.SaveCrops = function () {\r\n\t $scope.errorMessage = \"\";\r\n\t $scope.validationMessage = \"\";\r\n\t $scope.CheckCrops();\r\n\r\n\t if ($scope.errorMessage !== \"\") {\r\n\t $scope.errorMessage = $sce.trustAsHtml($scope.errorMessage);\r\n\t return;\r\n\t }\r\n\r\n\t cropsService.SaveCrops($scope.crops, function (data, status) {\r\n\t if (status !== null) {\r\n\t if (status == 400)\r\n\t $scope.errorMessage = data[0].errors[0].Message;\r\n\t }\r\n\t parametersService.SaveParameterByKey(\"DefaultCrop\", $filter('filter')($scope.crops, { IsDefault: true })[0].IdCrop, function (dataParam, statusPram) {\r\n\t if (statusPram !== undefined && statusPram !== null) {\r\n\t if (status == 400) {\r\n\t if ($scope.errorMessage !== \"\")\r\n\t $scope.errorMessage += \"<br />\";\r\n\r\n\t $scope.errorMessage += dataParam[0].errors[0].Message;\r\n\t }\r\n\t }\r\n\t else\r\n\t parametersFactory.Parameters.DefaultCrop.Value = dataParam.Value;\r\n\r\n\t if ($scope.errorMessage === \"\")\r\n\t $scope.validationMessage = \"Mise à jour effectuée avec succès.\";\r\n\t else\r\n\t $scope.errorMessage = $sce.trustAsHtml($scope.errorMessage);\r\n\t });\r\n\t });\r\n\t };\r\n\t $rootScope.onRefresh = function () { $scope.init(); };\r\n\t}]);","AgrimarketControllers.controller('globalController', ['$scope', '$rootScope', '$http', '$location', \"currentUserFactory\",\r\n\t'configurationFactory', 'parametersFactory', 'parametersService', '$sce', '$upload', 'uploadService', 'enumFactory',\r\n function ($scope, $rootScope, $http, $location, currentUserFactory, configurationFactory, parametersFactory, parametersService, $sce, $upload,\r\n \tuploadService, enumFactory) {\r\n\r\n $scope.showDetail = true;\r\n $scope.uploads = {};\r\n $scope.typeParameters = enumFactory.TypeParameters;\r\n\r\n $scope.init = function () {\r\n var idsGroupParameters = enumFactory.GroupParameters.Offer + \";\" + enumFactory.GroupParameters.Documentation + \";\" + enumFactory.GroupParameters.ManagementSite + \";\" + enumFactory.GroupParameters.ManagementMessage;\r\n parametersService.GetParametersByIdsGroup(idsGroupParameters, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n else {\r\n $scope.globalParameters = data;\r\n $scope.globalParameters.forEach(function (group) {\r\n group.Parameters.forEach(function (parameter, index, object) {\r\n if (parameter.IdTypeParameter == enumFactory.TypeParameters.FileUpload) {\r\n if (parameter.Value !== undefined && parameter.Value !== null && parameter.Value !== \"\") {\r\n uploadService.GetFileName(parameter.Value, function (d, sta) {\r\n if (sta === undefined || sta === null) {\r\n $scope.uploads[parameter.Key].fileName = d;\r\n } else if (sta == 400) {\r\n $scope.errorMessage = d[0].errors[0].Message;\r\n } else {\r\n $scope.errorMessage = sta;\r\n }\r\n });\r\n }\r\n\r\n $scope.uploads[parameter.Key] = {};\r\n $scope.uploads[parameter.Key].fileName = '';\r\n $scope.uploads[parameter.Key].percent = '';\r\n $scope.uploads[parameter.Key].linkFile = '';\r\n }\r\n //affichage dans l'onglet Routage d'ordre\r\n if (parameter.Key === \"TypePresentOffers\")\r\n object.splice(index, 1);\r\n });\r\n });\r\n }\r\n });\r\n };\r\n\r\n $scope.init();\r\n\r\n $scope.SaveGlobalParameters = function () {\r\n //if (!$scope.CheckParameters())\r\n // return false;\r\n\r\n $scope.errorMessage = \"\";\r\n $scope.validationMessage = \"\";\r\n\r\n $scope.globalParameters.forEach(function (param) {\r\n if (param.IdTypeParameter == enumFactory.TypeParameters.CheckBox) {\r\n param.Value = \"\";\r\n param.PossibleValuesTab.forEach(function (item) {\r\n if (item.Checked)\r\n param.Value += item.Value + \";\";\r\n });\r\n }\r\n });\r\n\r\n parametersService.SaveParametersGlobal($scope.globalParameters, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n else {\r\n $scope.globalParameters.forEach(function (param) {\r\n if (param.IdTypeParameter === enumFactory.TypeParameters.FileUpload && param.Value === null) {\r\n $scope.deleteFile(param);\r\n }\r\n });\r\n\r\n $scope.validationMessage = \"Vos paramètres ont bien été pris en compte.\";\r\n }\r\n });\r\n return true;\r\n };\r\n\r\n $rootScope.onRefresh = function () { $scope.init(); };\r\n\r\n $scope.onFileSelect = function ($files, parameter) {\r\n var upload = function (i, $file) {\r\n $scope.uploads[parameter.Key].fileName = '';\r\n $scope.uploads[parameter.Key].percent = '';\r\n $scope.uploads[parameter.Key].linkFile = '';\r\n $scope.errorMessage = null;\r\n $upload.upload({\r\n url: configurationFactory.Url['Api'] + 'Upload/Upload', // webapi url\r\n method: \"POST\",\r\n params: { idAttachment: -1},\r\n file: $file\r\n }).progress(function (evt) {\r\n // get upload percentage\r\n $scope.uploads[parameter.Key].percent = parseInt(100.0 * evt.loaded / evt.total) + '%';\r\n }).success(function (data) {\r\n // file is uploaded successfully\r\n parameter.Value = data.PrivateLabel;\r\n $scope.uploads[parameter.Key].fileName = data.PublicLabel;\r\n }).error(function (data) {\r\n $scope.errorMessage = data;\r\n });\r\n };\r\n\r\n for (var i = 0; i < $files.length; i++) {\r\n var $file = $files[i];\r\n upload(i, $file);\r\n }\r\n };\r\n\r\n $scope.resetFile = function (parameter) {\r\n $scope.uploads[parameter.Key].fileName = '';\r\n $scope.uploads[parameter.Key].percent = '';\r\n $scope.uploads[parameter.Key].linkFile = '';\r\n $scope.errorMessage = null;\r\n parameter.Value = null;\r\n };\r\n\r\n $scope.deleteFile = function (parameter) {\r\n uploadService.DeleteUpload(parameter.Value, function (data, status) {\r\n if (status === undefined || status === null) {\r\n\r\n $scope.uploads[parameter.Key].fileName = '';\r\n $scope.uploads[parameter.Key].percent = '';\r\n $scope.uploads[parameter.Key].linkFile = '';\r\n $scope.errorMessage = null;\r\n parameter.Value = null;\r\n\r\n } else if (status == 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.errorMessage = status;\r\n }\r\n\r\n });\r\n };\r\n\r\n }]);\r\n\r\n","AgrimarketControllers.controller('productsController', ['$scope', '$rootScope', '$http', '$location', '$filter', 'currentUserFactory', 'configurationFactory', 'productsService', 'modulesFactory',\r\n\tfunction ($scope, $rootScope, $http, $location, $filter, currentUserFactory, configurationFactory, productsService, modulesFactory) {\r\n\r\n\t\t$scope.products = [];\r\n\t\t$scope.Ckeditor = false;\r\n\t\t$scope.imageLibrary = [];\r\n\t\t$scope.productId = undefined;\r\n\t\t$scope.selectedIdImageLibrary = undefined;\r\n\t\t$scope.Variety = {};\r\n $scope.criteriaContent = \"\";\r\n\t\t$scope.imageLibraryErrorMessage = \"\";\r\n\t\t$scope.selectedProductName = \"\";\r\n\t\t$rootScope.loading = false;\r\n\t\t\r\n\r\n\t\tvar GetProducts = function () {\r\n\t\t\t$scope.loading = true;\r\n\t\t\tproductsService.GetAllProducts(function (data, status) {\r\n\t\t\t\tif (status !== null) {\r\n\t\t\t\t\tif (status === 400)\r\n\t\t\t\t\t\t$scope.productDefaultErrorMessage = data[0].errors[0].Message;\r\n\t\t\t\t}\r\n\t\t\t\t$scope.products = data;\r\n\t\t\t\t$scope.showDetails = [];\r\n\t\t\t\t$scope.products.forEach(function (item, index) {\r\n\t\t\t\t\t$scope.showDetails[index] = false;\r\n\t\t\t\t});\r\n\t\t\t\t$scope.loading = false;\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tvar GetImageLibrary = function () {\r\n\t\t\tproductsService.GetAllImgProducts(function (data, status) {\r\n\t\t\t\tif (status !== null) {\r\n\t\t\t\t\tif (status === 400)\r\n\t\t\t\t\t\t$scope.productDefaultErrorMessage = data[0].errors[0].Message;\r\n\t\t\t\t}\r\n\t\t\t\t$scope.imageLibrary = data.images;\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t$scope.ClosePopUpCkeditor = function () {\r\n $scope.Ckeditor = false;\r\n $rootScope.modalVisibility = false;\r\n\t\t};\r\n\r\n\t\t$scope.SaveCriteriaVariety = function (criteriaContent) {\r\n\t\t $scope.Variety.Criteria = criteriaContent;\r\n\t\t\t$scope.Ckeditor = false;\r\n\t\t\t$rootScope.modalVisibility = false;\r\n\t\t productsService.SaveVariety($scope.Variety, function (data, status) {\r\n\t\t if (status !== null) {\r\n\t\t if (status === 400)\r\n\t\t $scope.productDefaultErrorMessage = data[0].errors[0].Message;\r\n\t\t }\r\n\t\t });\r\n\t\t};\r\n\r\n\t\t$scope.EditProductCriteria = function (item) {\r\n\t\t\t$scope.Variety = item;\r\n $scope.Ckeditor = true;\r\n $rootScope.modalVisibility = true;\r\n\t\t\t$scope.criteriaContent = item.Criteria;\r\n\t\t};\r\n\r\n\t\t$scope.EditImageLibraryPopUp = function (product, showPopUpImageLibrary) {\r\n\t\t\t$scope.selectedProductName = \"Sélectionner l’image de \"+ product.Label + \" à présenter sur l’application\";\r\n\t\t\t$scope.imageLibraryErrorMessage = \"\";\r\n\t\t\t$scope.productId = product.IdProduct;\r\n\t\t\t$scope.selectedIdImageLibrary = null;\r\n\t\t\tif (product.IdImageLibrary) {\r\n\t\t\t\t$scope.selectedIdImageLibrary = product.IdImageLibrary;\r\n\t\t\t}\r\n\t\t\t$scope.productDefaultErrorMessage = \"\";\r\n\t\t\tshowPopUpImageLibrary();\r\n\t\t};\r\n\r\n\t\tvar CheckIsNotAFloat = function (n) {\r\n\t\t\treturn n % 1 === 0;\r\n\t\t};\r\n\r\n\t\tvar CheckValidOrderData = function (data, isProduct) {\r\n\t\t\t$scope.productDefaultErrorMessage = \"\";\r\n\t\t\t$scope.productValidMessage = \"\";\r\n\t\t\tif (!CheckIsNotAFloat(data.NewOrder)) {\r\n\t\t\t\t$scope.productDefaultErrorMessage += \"Le nombre doit être un entier.\";\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (!angular.isNumber(data.NewOrder)) {\r\n\t\t\t\t$scope.productDefaultErrorMessage += \"L'ordre doit être un nombre\";\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (isProduct && (data.NewOrder < 1 || data.NewOrder > $scope.products.length)) {\r\n\t\t\t\t$scope.productDefaultErrorMessage += \"L'ordre doit être compris entre 1 et \" + $scope.products.length;\r\n\t\t\t\treturn false;\r\n\t\t\t} else if (!isProduct) {\r\n\t\t\t\tvar product = $filter('filter')($scope.products, { \"IdProduct\": data.IdProduct }, true)[0];\r\n\t\t\t\tif (data.NewOrder < 1 || data.NewOrder > product.Varieties.length) {\r\n\t\t\t\t\t$scope.productDefaultErrorMessage += \"L'ordre doit être compris entre 1 et \" + product.Varieties.length;\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\r\n\t\tvar RemoveSelectedInput = function () {\r\n\t\t\t$scope.products.forEach(function (p) {\r\n\t\t\t\tp.Selected = false;\r\n\t\t\t\tp.Editing = false;\r\n\t\t\t\tp.Varieties.forEach(function (v) {\r\n\t\t\t\t\tv.Selected = false;\r\n\t\t\t\t\tv.Editing = false;\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t};\r\n\r\n\r\n\t\t$scope.ConfirmImageChoose = function (val) {\r\n\t\t\t$scope.selectedIdImageLibrary = val;\r\n\t\t};\r\n\r\n\t\t$scope.EditProductOrVariety = function (data) {\r\n\t\t\t$scope.productDefaultErrorMessage = \"\";\r\n\t\t\t$scope.productValidMessage = \"\";\r\n\t\t\tRemoveSelectedInput();\r\n\t\t\tdata.Editing = true;\r\n\t\t\tdata.Selected = true;\r\n\t\t};\r\n\r\n\t\t$scope.SaveProductOrder = function (product) {\r\n\t\t\tproduct.Editing = false;\r\n\r\n\t\t\tif (CheckValidOrderData(product, true)) {\r\n\t\t\t\tproductsService.SaveProduct(product, function (data, status) {\r\n\t\t\t\t\tif (status !== null) {\r\n\t\t\t\t\t\tif (status === 400)\r\n\t\t\t\t\t\t\t$scope.productDefaultErrorMessage = data[0].errors[0].Message;\r\n\t\t\t\t\t\t\t$scope.openPopUp();\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$scope.productValidMessage = \"Vos modifications ont bien été prises en compte.\";\r\n\t\t\t\t\tGetProducts();\r\n\t\t\t\t});\r\n\t\t\t} else\r\n\t\t\t\tErrorData(product);\r\n\t\t};\r\n\r\n\t\t$scope.CheckImageLibraryIsValid = function () {\r\n\t\t\t$scope.imageLibraryErrorMessage = productsService.CheckImageLibraryIsValid($scope.selectedIdImageLibrary);\r\n\t\t\tif ($scope.imageLibraryErrorMessage !== \"\") {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t$scope.SaveImageProduct = function () \r\n\t\t{\r\n\t\t\tvar productImage = {\r\n\t\t\t\t\"IdProduct\": $scope.productId,\r\n\t\t\t\t\"IdImageLibrary\" : $scope.selectedIdImageLibrary\r\n\t\t\t};\r\n\t\t\tproductsService.PutImgProduct(productImage, function (data, status) {\r\n\t\t\t\tif (status !== null) {\r\n\t\t\t\t\tif (status === 400)\r\n\t\t\t\t\t\t$scope.productDefaultErrorMessage = data[0].errors[0].Message;\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t$scope.productValidMessage = \"Vos modifications ont bien été prises en compte.\";\r\n\t\t\t\t\tGetProducts();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t$scope.selectedIdImageLibrary = null;\r\n\r\n\t\t};\r\n\r\n\t\t$scope.SaveVarietyOrder = function (variety) {\r\n\t\t\tvariety.Editing = false;\r\n\t\t\tif (CheckValidOrderData(variety, false)) {\r\n\t\t\t\tproductsService.SaveVariety(variety, function (data, status) {\r\n\t\t\t\t\tif (status !== null) {\r\n\t\t\t\t\t\tif (status === 400)\r\n\t\t\t\t\t\t\t$scope.productDefaultErrorMessage = data[0].errors[0].Message;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$scope.productValidMessage = \"Vos modifications ont bien été prises en compte.\";\r\n\t\t\t\t\tGetProducts();\r\n\t\t\t\t});\r\n\t\t\t} else\r\n\t\t\t\tErrorData(variety);\r\n\t\t};\r\n\r\n\t\tvar ErrorData = function (productOrVariety) {\r\n\t\t\tproductOrVariety.Editing = true;\r\n\t\t\tproductOrVariety.Selected = true;\r\n\t\t};\r\n\r\n\t\tGetProducts();\r\n\t\tGetImageLibrary();\r\n\r\n\t\t$rootScope.onRefresh = function () { GetProducts(); GetImageLibrary(); };\r\n\t}]);","AgrimarketControllers.controller('homePageApplicationMobilesController', ['$scope', '$rootScope', '$http', '$location', '$filter', 'currentUserFactory', 'configurationFactory', 'typeDashboardActualityAppMobileService', 'modulesFactory',\r\n\tfunction ($scope, $rootScope, $http, $location, $filter, currentUserFactory, configurationFactory, typeDashboardActualityAppMobileService, modulesFactory) {\r\n\r\n\t\t$scope.typeDashboardActualityAppMobiles = [];\r\n\t\t$scope.showTypeDashboardActualityAppMobiles = true;\r\n\r\n\t\tvar GetTypeDashboardActualityAppMobiles = function () {\r\n\t\t\ttypeDashboardActualityAppMobileService.GetAllTypeDashboardActualityAppMobile(function (data, status) {\r\n\t\t\t\tif (status !== null) {\r\n\t\t\t\t\tif (status === 400)\r\n\t\t\t\t\t\t$scope.typeDashboardActualityAppMobileDefaultErrorMessage = data[0].errors[0].Message;\r\n\t\t\t\t}\r\n\t\t\t\t$scope.typeDashboardActualityAppMobiles = data;\r\n\t\t\t\t$scope.typeDashboardActualityAppMobiles.forEach(function (item, index) {\r\n\t\t\t\t\titem.NewPosition = item.Position;\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tvar CheckIsNotAFloat = function (n) {\r\n\t\t\treturn n % 1 === 0;\r\n\t\t};\r\n\r\n\t\tvar CheckValidOrderData = function (data) {\r\n\t\t\t$scope.typeDashboardActualityAppMobileDefaultErrorMessage = \"\";\r\n\t\t\t$scope.typeDashboardActualityAppMobileValidMessage = \"\";\r\n\t\t\tif (!CheckIsNotAFloat(data.NewPosition)) {\r\n\t\t\t\t$scope.typeDashboardActualityAppMobileDefaultErrorMessage += \"Le nombre doit être un entier.\";\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (!angular.isNumber(data.NewPosition)) {\r\n\t\t\t\t$scope.typeDashboardActualityAppMobileDefaultErrorMessage += \"L'ordre doit être un nombre\";\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (data.NewPosition < 1 || data.NewPosition > $scope.typeDashboardActualityAppMobiles.length) {\r\n\t\t\t\t$scope.typeDashboardActualityAppMobileDefaultErrorMessage += \"L'ordre doit être compris entre 1 et \" + $scope.typeDashboardActualityAppMobiles.length;\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\r\n\t\tvar RemoveSelectedInput = function () {\r\n\t\t\t$scope.typeDashboardActualityAppMobiles.forEach(function (p) {\r\n\t\t\t\tp.Selected = false;\r\n\t\t\t\tp.Editing = false;\r\n\t\t\t});\r\n\t\t};\r\n\r\n\r\n\t\t$scope.EditTypeDashboardActualityAppMobile = function (data) {\r\n\t\t\t$scope.typeDashboardActualityAppMobileDefaultErrorMessage = \"\";\r\n\t\t\t$scope.typeDashboardActualityAppMobileValidMessage = \"\";\r\n\t\t\tRemoveSelectedInput();\r\n\t\t\tdata.Editing = true;\r\n\t\t\tdata.Selected = true;\r\n\t\t};\r\n\r\n\t\t$scope.SaveTypeDashboardActualityAppMobileOrder = function (typeDashboardActualityAppMobile) {\r\n\t\t\ttypeDashboardActualityAppMobile.Editing = false;\r\n\r\n\t\t\tif (CheckValidOrderData(typeDashboardActualityAppMobile, true)) {\r\n\t\t\t\ttypeDashboardActualityAppMobileService.SaveTypeDashboardActualityAppMobileOrder(typeDashboardActualityAppMobile, function (data, status) {\r\n\t\t\t\t\tif (status !== null) {\r\n\t\t\t\t\t\tif (status === 400)\r\n\t\t\t\t\t\t\t$scope.typeDashboardActualityAppMobileDefaultErrorMessage = data[0].errors[0].Message;\r\n\t\t\t\t\t\t\t$scope.openPopUp();\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$scope.typeDashboardActualityAppMobileValidMessage = \"Vos modifications ont bien été prises en compte.\";\r\n\t\t\t\t\tGetTypeDashboardActualityAppMobiles();\r\n\t\t\t\t});\r\n\t\t\t} else\r\n\t\t\t\tErrorData(typeDashboardActualityAppMobile);\r\n\t\t};\r\n\r\n\t\tvar ErrorData = function (typeDashboardActualityAppMobile) {\r\n\t\t\ttypeDashboardActualityAppMobile.Editing = true;\r\n\t\t\ttypeDashboardActualityAppMobile.Selected = true;\r\n\t\t};\r\n\r\n\t\tGetTypeDashboardActualityAppMobiles();\r\n\r\n\t\t$rootScope.onRefresh = function () { GetTypeDashboardActualityAppMobiles(); };\r\n\t}]);","AgrimarketControllers.controller('closeDayController', ['$scope', '$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory', 'closeDayService', '$filter', 'parametersService', '$q',\r\n\tfunction ($scope, $rootScope, $http, $location, currentUserFactory, configurationFactory, closeDayService, $filter, parametersService, $q) {\r\n\r\n\t $rootScope.onRefresh = function () {\r\n\t $scope.GetCloseDays();\r\n\t };\r\n\r\n\t $scope.Init = function () {\r\n\t $scope.errorMessage = $scope.validationMessage = \"\";\r\n\t $scope.GetCloseDays();\r\n\t $scope.GetOpenDaysSalesUser();\r\n\t };\r\n\r\n\t $scope.GetCloseDays = function () {\r\n\t closeDayService.GetCloseDays(function (data, status) {\r\n\t if (status !== null) {\r\n\t if (status === 400)\r\n\t $scope.message = data[0].errors[0].Message;\r\n\t } else\r\n\t $scope.closeDays = data;\r\n\t });\r\n\t };\r\n\r\n\t $scope.GetOpenDaysSalesUser = function () {\r\n\t parametersService.GetParameterByKey(\"OpenDaysSalesUser\", function (data, status) {\r\n\t if (status !== null) {\r\n\t if (status === 400)\r\n\t $scope.message = data[0].errors[0].Message;\r\n\t } else {\r\n\t if (data && data.PossibleLabels && data.Value && data.Value.length === 7) {\r\n\t $scope.OpenDaysSalesUser = [];\r\n\t data.PossibleLabels.split(',').forEach(function (item, index) {\r\n\t var day = {\r\n\t Id: null,\r\n\t Label: null,\r\n\t Value: false\r\n\t };\r\n\t day.Id = index + 1;\r\n\t day.Label = item.trim();\r\n\t if (Number(data.Value.substring(index, index + 1)))\r\n\t day.Value = Number(data.Value.substring(index, index + 1)) === 1;\r\n\r\n\t $scope.OpenDaysSalesUser.push(day);\r\n\t });\r\n\t }\r\n\t }\r\n\t });\r\n\t };\r\n\r\n\t function ConvertChoixDaysToString() {\r\n\t var deferred = $q.defer();\r\n\t var valueString = \"\";\r\n\t $scope.OpenDaysSalesUser.forEach(function (item) {\r\n\t if (item.Value)\r\n\t valueString += \"1\";\r\n\t else\r\n\t valueString += \"0\";\r\n\t });\r\n\t deferred.resolve(valueString);\r\n\t return deferred.promise;\r\n\t }\r\n\r\n\t $scope.SaveChoixDayOpen = function () {\r\n\t ConvertChoixDaysToString().then(function (value) {\r\n\t parametersService.SaveParameterByKey(\"OpenDaysSalesUser\", value, function (data, status) {\r\n\t if (status !== null) {\r\n\t if (status === 400)\r\n\t $scope.message = data[0].errors[0].Message;\r\n\t }\r\n\t });\r\n\t });\r\n\t };\r\n\t $scope.AddCloseDay = function (openPopUp, titreModal) {\r\n\t $scope.closeDay = null;\r\n\t $scope.errorMessage = $scope.validationMessage = \"\";\r\n\t $scope.ModalTitle = titreModal;\r\n\t $scope.ActionType = \"new\";\r\n\t openPopUp();\r\n\t };\r\n\r\n\t $scope.EditCloseDay = function (closeDay, openPopUp, titreModal) {\r\n\t $scope.errorMessage = $scope.validationMessage = \"\";\r\n\t $scope.closeDay = angular.copy(closeDay);\r\n\t $scope.ModalTitle = titreModal;\r\n\t $scope.ActionType = \"edit\";\r\n\t openPopUp();\r\n\t };\r\n\r\n\t $scope.CheckCloseDay = function () {\r\n\t $scope.errorMessage = $scope.validationMessage = \"\";\r\n\r\n\t if (($scope.closeDay === undefined || $scope.closeDay === null) || ($scope.closeDay !== undefined && $scope.closeDay !== null) && ($scope.closeDay.Date === \"\" || $scope.closeDay.DateString === \"\" || $scope.closeDay.DateString === undefined || $scope.closeDay.DateString === null || $scope.closeDay.Label === \"\" || $scope.closeDay.Label === undefined || $scope.closeDay.Label === null))\r\n\t $scope.errorMessage += \"Veuillez renseigner tous les champs.\";\r\n\t else {\r\n\t var dateExist = $filter('filter')($scope.closeDays, { DateString: $filter('date')($scope.closeDay.DateString, \"dd/MM/yyyy\") })[0];\r\n\t if (dateExist !== undefined && dateExist !== null && dateExist.IdCloseDay != $scope.closeDay.IdCloseDay)\r\n\t $scope.errorMessage += \"Cette date est déjà attribuée à '\" + dateExist.Label + \"'.\";\r\n\t }\r\n\t if ($scope.errorMessage !== \"\")\r\n\t return false;\r\n\t else\r\n\t return true;\r\n\t };\r\n\r\n\t $scope.SaveCloseDay = function () {\r\n\t if ($scope.ActionType == \"new\") {\r\n\t closeDayService.AddCloseDay($scope.closeDay, function (data, status) {\r\n\t if (status !== null) {\r\n\t if (status === 400)\r\n\t $scope.message = data[0].errors[0].Message;\r\n\t } else {\r\n\t $scope.validationMessage = \"Votre jour fermé a bien été pris en compte.\";\r\n\t $scope.closeDays = data;\r\n\t }\r\n\t });\r\n\t } else if ($scope.ActionType == \"edit\") {\r\n\t closeDayService.EditCloseDay($scope.closeDay, function (data, status) {\r\n\t if (status !== null) {\r\n\t if (status === 400)\r\n\t $scope.message = data[0].errors[0].Message;\r\n\t } else {\r\n\t $scope.closeDays = data;\r\n\t $scope.validationMessage = \"Vos modifications ont bien été prises en compte.\";\r\n\t }\r\n\t });\r\n\t }\r\n\t };\r\n\r\n\t $scope.DeleteCloseDay = function (param) {\r\n\t $scope.errorMessage = $scope.validationMessage = \"\";\r\n\t closeDayService.DeleteCloseDay(param.IdCloseDay, function (data, status) {\r\n\t if (status !== null) {\r\n\t if (status === 400)\r\n\t $scope.message = data[0].errors[0].Message;\r\n\t } else {\r\n\t $scope.closeDays.splice(param.Index, 1);\r\n\t }\r\n\t });\r\n\t };\r\n\t $scope.Init();\r\n\t}]);","AgrimarketControllers.controller('coverController', [\r\n '$scope', '$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory', 'cropsService', '$filter',\r\n 'parametersService', '$sce', 'parametersFactory', 'coverService', 'productsService', 'typeCoversService', 'offerService', 'coverParametersService', 'enumFactory', '$routeParams',\r\n function ($scope, $rootScope, $http, $location, currentUserFactory, configurationFactory, cropsService, $filter, parametersService, $sce, parametersFactory,\r\n coverService, productsService, typeCoversService, offerService, coverParametersService, enumFactory, $routeParams) {\r\n\r\n $scope.cover = {\r\n isAutomatic: '0',\r\n };\r\n\r\n $scope.paramsAccountCover =\r\n {\r\n Id: null,\r\n Name: null,\r\n IsGlobal: false,\r\n ShowDetailAccount: true\r\n };\r\n\r\n $scope.paramsDelayCover =\r\n {\r\n ShowDelayCover: true\r\n };\r\n\r\n $scope.lstProducts = [];\r\n $scope.lstTypeCovers = [];\r\n $scope.lstAccounts = [];\r\n $scope.TypeCover = enumFactory.TypeCover;\r\n $scope.enumTypeQuotes = enumFactory.TypeQuotes;\r\n $scope.filterTabs = {\r\n IdProduct: \"\",\r\n IdTypeCover: \"\",\r\n IdCrop: \"\"\r\n };\r\n $scope.viewMode = $routeParams.typeView;\r\n $scope.typeParameters = enumFactory.TypeParameters;\r\n $scope.filterCover = {\r\n idProductSelected: \"\",\r\n idCropSelected: \"\"\r\n };\r\n $scope.enumTypeOffer = enumFactory.TypeOffer;\r\n if (!$rootScope.ModuleAutomaticCover.Active)\r\n $location.path('/admin/parameters/global');\r\n\r\n $scope.RefreshTableOffers = function (initProducts) {\r\n offerService.GetAllFinalisedActivesVm(function (data, status) {\r\n $scope.filterTabs.IdTypeCover = \"\";\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.offerErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.offerTabs = angular.copy(data);\r\n\r\n // Filtre Produit\r\n if (initProducts) {\r\n angular.forEach($scope.offerTabs, function (item) {\r\n if ($filter('filter')($scope.lstProducts, { IdProduct: item.IdProduct }).length === 0)\r\n $scope.lstProducts.push({ IdProduct: item.IdProduct, ProductLabel: item.LabelProduct });\r\n });\r\n if ($scope.lstProducts.length === 1)\r\n $scope.filterTabs.IdProduct = $scope.lstProducts[0].IdProduct;\r\n }\r\n\r\n // Filtre Type couverture\r\n $scope.lstTypeCovers = [];\r\n angular.forEach($scope.offerTabs, function (item) {\r\n if ($filter('filter')($scope.lstTypeCovers, { IdTypeCover: item.IdTypeCover }).length === 0) {\r\n var typeCover = $filter('filter')($scope.typeCovers, { IdTypeCover: item.IdTypeCover });\r\n if (typeCover.length > 0)\r\n $scope.lstTypeCovers.push({ IdTypeCover: item.IdTypeCover, Label: typeCover[0] }.Label);\r\n }\r\n });\r\n if ($scope.lstTypeCovers.length === 1)\r\n $scope.filterTabs.IdTypeCover = $scope.lstTypeCovers[0].IdTypeCover;\r\n\r\n // Filtre campagne\r\n $scope.lstCrops = [];\r\n angular.forEach($scope.offerTabs, function (item) {\r\n if ($filter('filter')($scope.lstCrops, { IdCrop: item.IdCrop }).length === 0)\r\n $scope.lstCrops.push({ IdCrop: item.IdCrop, Label: item.LabelCrop });\r\n });\r\n if ($scope.lstCrops.length === 1)\r\n $scope.filterTabs.IdCrop = $scope.lstCrops[0].IdCrop;\r\n\r\n $scope.FilterTableOffers();\r\n\r\n if ($scope.offers)\r\n $scope.offers.forEach(function (offer) {\r\n if (offer.IdTypeQuote === $scope.enumTypeQuotes.Fixe) {\r\n offer.IdTypeCover = $scope.TypeCover.Manuel;\r\n }\r\n });\r\n }\r\n });\r\n };\r\n\r\n $scope.init = function () {\r\n parametersService.GetParameters(function (dataParam, statusParam) {\r\n if (statusParam !== undefined && statusParam !== null) {\r\n if (statusParam == 400) {\r\n $scope.loginErrorMessage = dataParam[0].errors[0].Message;\r\n }\r\n } else {\r\n parametersFactory.Parameters = dataParam;\r\n $scope.cover.isAutomatic = (parametersFactory.Parameters.AutomaticCover.Value === \"1\");\r\n }\r\n });\r\n var idsGroupParameters = enumFactory.GroupParameters.ContractingDelay + \";\" + enumFactory.GroupParameters.DelayedCover;\r\n parametersService.GetParametersByIdsGroup(idsGroupParameters, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else\r\n $scope.globalParameters = data;\r\n });\r\n\r\n coverService.GetAllAccounts(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.accountErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstAccounts = angular.copy(data);\r\n $scope.GlobalChoice();\r\n }\r\n });\r\n\r\n cropsService.GetCropsVisible(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.productErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.crops = data;\r\n if (data.length === 0) {\r\n $scope.productErrorMessageFixed = \"Vous n'avez renseigné aucun produit pour le moment.\";\r\n }\r\n $scope.crop = data[0];\r\n }\r\n });\r\n\r\n\r\n productsService.GetAllProducts(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.productErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.products = data;\r\n if (data.length === 0) {\r\n $scope.productErrorMessageFixed = \"Vous n'avez renseigné aucun produit pour le moment.\";\r\n }\r\n $scope.product = data[0];\r\n $scope.filterCover.idProductSelected = angular.copy(data[0].IdProduct);\r\n\r\n coverParametersService.GetCoverParameters(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.productErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.coverParemeters = data;\r\n\r\n }\r\n\r\n $scope.FilterCoverParameters();\r\n });\r\n }\r\n });\r\n\r\n\r\n\r\n\r\n offerService.GetAllOffersFinalisedActives(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.offerErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.offers = angular.copy(data);\r\n if (data.length === 0)\r\n $scope.offerErrorMessageFixed = \"Vous n'avez renseigné aucune offre finalisée pour le moment.\";\r\n else {\r\n $scope.offer = angular.copy(data[0]);\r\n $scope.idOfferSelected = angular.copy(data[0].IdOffer);\r\n }\r\n }\r\n });\r\n\r\n typeCoversService.GetTypeCovers(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.offerErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.typeCovers = angular.copy(data);\r\n $scope.RefreshTableOffers(true);\r\n }\r\n });\r\n $scope.message = \"\";\r\n };\r\n\r\n $scope.CheckAutomaticCover = function (showPopUp) {\r\n $scope.ResetMessages();\r\n var foundProductOrOffer = false;\r\n if (parametersFactory.Parameters.AutomaticCover.Value == \"1\" && $scope.cover.isAutomatic === \"0\") {\r\n $scope.products.some(function (product) {\r\n if (product.IdTypeCover == enumFactory.TypeCover.Automatique || product.IdTypeCover == enumFactory.TypeCover.Differee) {\r\n foundProductOrOffer = true;\r\n return true;\r\n }\r\n return false;\r\n });\r\n if (!foundProductOrOffer) {\r\n $scope.offers.some(function (offer) {\r\n if (offer.IdTypeCover == enumFactory.TypeCover.Automatique || offer.IdTypeCover == enumFactory.TypeCover.Differee) {\r\n foundProductOrOffer = true;\r\n return true;\r\n }\r\n return false;\r\n });\r\n }\r\n\r\n if (foundProductOrOffer) {\r\n showPopUp();\r\n return;\r\n }\r\n\r\n }\r\n //Recherche du sous compte global\r\n if ($scope.account === undefined || $scope.account === null || $scope.account === \"\") {\r\n var error = false;\r\n $scope.account = null;\r\n $scope.products.forEach(function (product) {\r\n if (product.IdAccount === undefined || product.IdAccount === null || product.IdAccount === \"\") {\r\n $scope.errorMessage = \"Si le sous compte global est vide, il faut mettre un sous compte pour chaque produit\";\r\n error = true;\r\n return;\r\n }\r\n });\r\n if (error)\r\n return;\r\n }\r\n $scope.UpdateCover();\r\n };\r\n\r\n $scope.CheckParameterProduct = function () {\r\n $scope.ResetMessages();\r\n\r\n if ($scope.coverParemeter.IdTypeCover == enumFactory.TypeCover.Differee) {\r\n if ($scope.coverParemeter.UpperLimit === undefined || $scope.coverParemeter.UpperLimit === null)\r\n $scope.productErrorMessage += \"Veuillez renseigner une borne haute.<br/>\";\r\n else {\r\n if ($scope.coverParemeter.UpperLimit < 0)\r\n $scope.productErrorMessage += \"La borne haute doit être positive.<br/>\";\r\n\r\n }\r\n if ($scope.coverParemeter.LowerLimit === undefined || $scope.coverParemeter.LowerLimit === null)\r\n $scope.productErrorMessage += \"Veuillez renseigner une borne basse.<br/>\";\r\n else {\r\n if ($scope.coverParemeter.LowerLimit > 0)\r\n $scope.productErrorMessage += \"La borne basse doit être négative.<br/>\";\r\n }\r\n }\r\n\r\n if ($scope.productErrorMessage !== \"\") {\r\n $scope.productErrorMessage = $sce.trustAsHtml($scope.productErrorMessage);\r\n return false;\r\n }\r\n\r\n $scope.UpdateParameterProductAndOffers();\r\n\r\n return true;\r\n };\r\n\r\n $scope.CheckParameterOffer = function () {\r\n $scope.ResetMessages();\r\n if ($scope.offer.IdTypeCover == enumFactory.TypeCover.Differee) {\r\n if ($scope.offer.UpperLimit === undefined || $scope.offer.UpperLimit === null)\r\n $scope.offerErrorMessage += \"Veuillez renseigner une borne haute.<br/>\";\r\n else {\r\n if ($scope.offer.UpperLimit < 0)\r\n $scope.offerErrorMessage += \"La borne haute doit être positive.<br/>\";\r\n\r\n }\r\n if ($scope.offer.LowerLimit === undefined || $scope.offer.LowerLimit === null)\r\n $scope.offerErrorMessage += \"Veuillez renseigner une borne basse.<br/>\";\r\n else {\r\n if ($scope.offer.LowerLimit > 0)\r\n $scope.offerErrorMessage += \"La borne basse doit être négative.<br/>\";\r\n }\r\n }\r\n\r\n if ($scope.offerErrorMessage !== \"\") {\r\n $scope.offerErrorMessage = $sce.trustAsHtml($scope.offerErrorMessage);\r\n return false;\r\n }\r\n else\r\n return true;\r\n };\r\n\r\n $scope.UpdateCover = function () {\r\n coverService.SaveParameterCover($scope.cover.isAutomatic, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n parametersFactory.Parameters.AutomaticCover.Value = data;\r\n $scope.message = \"Votre changement de paramètre a bien été pris en compte\";\r\n $scope.RefreshTableOffers(false);\r\n }\r\n });\r\n };\r\n\r\n $scope.UpdateParameterProduct = function () {\r\n coverParametersService.SaveCoverParameter($scope.coverParemeter, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.productErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.coverParemeter.IdCoverParameter = data.IdCoverParameter;\r\n var cover = $scope.coverParemeters.filter(function (element) { return (element.IdCoverParameter === data.IdCoverParameter); })[0];\r\n\r\n if (cover === undefined) {\r\n $scope.coverParemeters.push(data);\r\n }\r\n else {\r\n cover.IdTypeCover = data.IdTypeCover;\r\n cover.LowerLimit = data.LowerLimit;\r\n cover.UpperLimit = data.UpperLimit;\r\n cover.IdAccount = data.IdAccount;\r\n }\r\n\r\n $scope.productValidationMessage = \"Vos modifications ont bien été prises en compte.\";\r\n $scope.RefreshTableOffers(false);\r\n }\r\n });\r\n return true;\r\n };\r\n\r\n $scope.UpdateParameterOffer = function () {\r\n if (!$scope.CheckParameterOffer())\r\n return false;\r\n\r\n offerService.SaveParameterOffer($scope.offer, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.offerErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.offers = data;\r\n $scope.offerValidationMessage = \"Vos modifications ont bien été prises en compte.\";\r\n $scope.RefreshTableOffers(false);\r\n }\r\n });\r\n return true;\r\n };\r\n\r\n $scope.UpdateParameterProductAndOffers = function () {\r\n $scope.UpdateParameterProduct();\r\n $scope.UpdateParametersOfferByCover($scope.coverParemeter);\r\n };\r\n\r\n $scope.UpdateParametersOfferByCover = function (cover) {\r\n $scope.ResetMessages();\r\n offerService.SaveParametersOfferByCover(cover, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.productErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.offers = data;\r\n $scope.offer = $filter('filter')($scope.offers, { IdOffer: parseInt($scope.offer.IdOffer) })[0];\r\n $scope.productValidationMessage = \"Vos modifications ont bien été prises en compte.\";\r\n $scope.RefreshTableOffers(false);\r\n }\r\n });\r\n };\r\n\r\n $scope.ChangeElementSelected = function (id, typeDDL) {\r\n $scope.ResetMessages();\r\n if (typeDDL == \"Product\")\r\n $scope.product = angular.copy($filter('filter')($scope.products, { IdProduct: id })[0]);\r\n else if (typeDDL == \"Offer\")\r\n $scope.offer = angular.copy($filter('filter')($scope.offers, { IdOffer: id })[0]);\r\n };\r\n\r\n $scope.ResetMessages = function () {\r\n $scope.productErrorMessage = $scope.productValidationMessage = \"\";\r\n $scope.offerErrorMessage = $scope.offerValidationMessage = \"\";\r\n $scope.accountErrorMessage = $scope.brokerErrorMessage = \"\";\r\n $scope.message = $scope.errorMessage = \"\";\r\n $scope.DelayerrorMessage = \"\";\r\n };\r\n\r\n $scope.FilterTableOffers = function () {\r\n $scope.offerTabsFilter = angular.copy($scope.offerTabs);\r\n if ($scope.filterTabs.IdProduct !== \"\")\r\n $scope.offerTabsFilter = angular.copy($scope.offerTabsFilter.filter(function (element) { return (element.IdProduct === Number($scope.filterTabs.IdProduct)); }));\r\n if ($scope.filterTabs.IdTypeCover !== \"\")\r\n $scope.offerTabsFilter = angular.copy($scope.offerTabsFilter.filter(function (element) { return (element.IdTypeCover === Number($scope.filterTabs.IdTypeCover)); }));\r\n if ($scope.filterTabs.IdCrop !== \"\")\r\n $scope.offerTabsFilter = angular.copy($scope.offerTabsFilter.filter(function (element) { return (element.IdCrop === Number($scope.filterTabs.IdCrop)); }));\r\n };\r\n\r\n $scope.FilterCoverParameters = function () {\r\n\r\n var idCrop = !$scope.filterCover.idCropSelected ? null : Number($scope.filterCover.idCropSelected);\r\n\r\n $scope.coverParemeter = angular.copy(\r\n $scope.coverParemeters.filter(function (element) { return (element.IdProduct === Number($scope.filterCover.idProductSelected) && element.IdCrop === idCrop); })[0]\r\n );\r\n\r\n if ($scope.coverParemeter == undefined) {\r\n $scope.coverParemeter = {\r\n IdProduct: $scope.filterCover.idProductSelected,\r\n IdCrop: $scope.filterCover.idCropSelected,\r\n IdTypeCover: 1\r\n };\r\n }\r\n };\r\n\r\n $scope.GlobalChoice = function () {\r\n if ($scope.lstAccounts.length > 0)\r\n $scope.lstAccounts.forEach(function (item) {\r\n if (item.IsGlobal) {\r\n $scope.paramsAccountCover.Id = item.Id;\r\n $scope.account = item.Name;\r\n return;\r\n }\r\n });\r\n };\r\n\r\n $scope.SaveParameters = function () {\r\n if (!$scope.CheckDelayParameters())\r\n return false;\r\n\r\n parametersService.SaveParametersGlobal($scope.globalParameters, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.paramsAccountCover.IsGlobal = true;\r\n coverService.SaveParamsAccount($scope.paramsAccountCover, function (data, status) {\r\n\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.lstAccounts = angular.copy(data);\r\n $scope.GlobalChoice();\r\n $scope.message = \"Votre changement de paramètre a bien été pris en compte.\";\r\n }\r\n });\r\n }\r\n });\r\n return true;\r\n };\r\n\r\n $scope.CheckDelayParameters = function () {\r\n $scope.ResetMessages();\r\n var time;\r\n $scope.globalParameters.forEach(function (group) {\r\n group.Parameters.forEach(function (param) {\r\n if (param.Key == 'ContractingDelay') {\r\n if (param.Value === undefined || param.Value === null || param.Value === \"\")\r\n $scope.DelayerrorMessage += \"Veuillez renseigner un délai de contractualisation valide.<br/>\";\r\n else {\r\n time = param.Value.split(':');\r\n if (!(time.length === 2 && time[0] <= 59 && time[1] <= 59))\r\n $scope.DelayerrorMessage += \"Le delai de contractualisation n'est pas dans le bon format 'mm:ss'.<br/>\";\r\n }\r\n }\r\n\r\n if (param.Key == 'HourEndDelayedCover') {\r\n if (param.Value === undefined || param.Value === null || param.Value === \"\")\r\n $scope.DelayerrorMessage += \"Veuillez renseigner un horaire de fin de validité des couvertures diférée.<br/>\";\r\n else {\r\n time = param.Value.split(':');\r\n if (!(time.length === 2 && time[0] <= 23 && time[1] <= 59))\r\n $scope.DelayerrorMessage += \"L'horaire de fin de validité des couvertures diférée n'est pas dans le bon format 'hh:mm'.<br/>\";\r\n }\r\n }\r\n\r\n });\r\n });\r\n\r\n if ($scope.paramsAccountCover.Id === undefined || $scope.paramsAccountCover.Id === null) {\r\n $scope.DelayerrorMessage += \"Veuillez renseigner un sous-compte global <br/>\";\r\n } else {\r\n $scope.paramsAccountCover.IsGlobal = true;\r\n }\r\n\r\n if ($scope.DelayerrorMessage !== \"\") {\r\n $scope.DelayerrorMessage = $sce.trustAsHtml($scope.DelayerrorMessage);\r\n return false;\r\n }\r\n else\r\n return true;\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n $scope.init();\r\n };\r\n\r\n $scope.init();\r\n\r\n }]);","AgrimarketControllers.controller(\"conditionsController\", [\"$scope\", \"$routeParams\", \"conditionsService\", \"typeOperationsService\", \"$filter\",\"$rootScope\",\r\n function ($scope, $routeParams, conditionsService, typeOperationsService, $filter, $rootScope) {\r\n\r\n\r\n /************** ViewMode = treeConditions ************/\r\n\r\n $scope.InitTreeConditions = function () {\r\n\r\n $scope.selectedAutoCompleteInput = {\r\n selectedTree: null\r\n };\r\n $scope.currentTree = {};\r\n $scope.currentTreeSelected = {};\r\n $scope.changed = false;\r\n $scope.treesFilter = [];\r\n $scope.lstTrees = [];\r\n $scope.typeOperations = [];\r\n $scope.showDetailtrees = [];\r\n $scope.isDisplayTree = false;\r\n $scope.isAbreCondPart = false;\r\n $scope.currentIndexTreeOperation = 0;\r\n $scope.formGroupCondition = { IdHidden: false };\r\n $scope.formGroupCondition.groupSelected = {};\r\n $scope.formGroupCondition.lstParticularConditions = [];\r\n $scope.indexCondition = -1;\r\n $scope.lstGroupConditions = [];\r\n $scope.showValidation = true;\r\n $scope.currentTreeGroupCondition = null;\r\n $scope.treeGroupFounded = false;\r\n\r\n typeOperationsService.GetTypeOperations(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else\r\n $scope.typeOperations = data;\r\n });\r\n\r\n conditionsService.GetTrees(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n data.forEach(function (tree) {\r\n tree.TreeGroups.forEach(function (group) {\r\n $scope.currentIndexTreeOperation = $scope.GenerateIndexCondition(group, $scope.currentIndexTreeOperation, 0);\r\n });\r\n });\r\n $scope.lstTrees = $scope.treesFilter = data;\r\n }\r\n\r\n $scope.treeDeleteToolTip = \"Supprimer\";\r\n\r\n });\r\n\r\n conditionsService.GetGroupConditions(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.lstGroupConditions = data;\r\n }\r\n });\r\n };\r\n\r\n $scope.GenerateIndexCondition = function (group, index) {\r\n group.TreeOperations.forEach(function (treeOperation) {\r\n index++;\r\n treeOperation.Index = index;\r\n treeOperation.TreeGroups.forEach(function (treeOperationGroup) {\r\n index = $scope.GenerateIndexCondition(treeOperationGroup, index);\r\n });\r\n });\r\n\r\n return index;\r\n };\r\n\r\n $scope.$watch(\"selectedAutoCompleteInput.selectedTree\", function (newValue) {\r\n if (newValue !== undefined && newValue !== null) {\r\n $scope.Filter();\r\n }\r\n });\r\n\r\n $scope.SaveTree = function () {\r\n $scope.showValidation = false;\r\n conditionsService.SaveTree($scope.currentTree, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n console.dir(data);\r\n $scope.currentTree.IdTree = data;\r\n var tree = angular.copy($scope.currentTree);\r\n $scope.InitTreeConditions();\r\n $scope.currentTreeSelected = tree;\r\n $scope.DisplayTree();\r\n $scope.succesMessage = \"Vos modifications ont bien été prises en compte\";\r\n }\r\n $scope.showValidation = true;\r\n });\r\n };\r\n\r\n $scope.VerifTree = function () {\r\n $scope.ResetMessages();\r\n if (!$scope.currentTree) {\r\n $scope.errorMessage = \"Veuillez selectionnez un arbre\";\r\n return false;\r\n }\r\n\r\n if ($scope.currentTree.Label === null || $scope.currentTree.Label === \"\" || $scope.currentTree.Label === undefined) {\r\n $scope.errorMessage = \"Veuillez renseignez un nom\";\r\n return false;\r\n }\r\n\r\n $scope.SaveTree();\r\n return true;\r\n };\r\n\r\n $scope.CheckChangeTree = function (item, popup) {\r\n\r\n $scope.currentTreeSelected = item;\r\n $scope.PopupChangeTreeSelectedTitle = \"Modification en cours\";\r\n if ($scope.changed)\r\n popup();\r\n else\r\n $scope.DisplayTree();\r\n };\r\n\r\n $scope.DisplayTree = function () {\r\n if ($scope.currentTreeSelected) {\r\n $scope.ResetMessages();\r\n $scope.changed = false;\r\n $scope.IdTreeDisplay = $scope.currentTreeSelected.IdTree;\r\n $scope.currentTree = angular.copy($scope.currentTreeSelected);\r\n $scope.isDisplayTree = true;\r\n }\r\n };\r\n\r\n $scope.AddTree = function () {\r\n $scope.ResetMessages();\r\n $scope.currentTree = {};\r\n $scope.IdTreeDisplay = null;\r\n $scope.isDisplayTree = true;\r\n };\r\n\r\n $scope.Filter = function () {\r\n $scope.errorMessage = \"\";\r\n var filterGeneral = angular.copy($scope.lstTrees);\r\n\r\n if ($scope.selectedAutoCompleteInput.selectedTree !== undefined && $scope.selectedAutoCompleteInput.selectedTree !== null && $scope.selectedAutoCompleteInput.selectedTree !== \"\") {\r\n filterGeneral = filterGeneral.filter(function (element) {\r\n if ($scope.CheckElement(element.Label, $scope.selectedAutoCompleteInput.selectedTree)) {\r\n return element;\r\n }\r\n return null;\r\n });\r\n }\r\n $scope.treesFilter = filterGeneral;\r\n };\r\n\r\n $scope.DeleteTree = function (item, popup) {\r\n $scope.ResetMessages();\r\n $scope.isDisplayTree = false;\r\n $scope.PopupDeleteTreeSelectedTitle = \"Supprimer un arbre\";\r\n $scope.messageConfirmPopup = \"Êtes vous sûr de vouloir supprimer cet arbre ?\";\r\n $scope.currentTree = angular.copy(item);\r\n $scope.cleanGroup = false;\r\n popup();\r\n };\r\n\r\n $scope.DeleteCurrentTree = function (popup) {\r\n $scope.PopupDeleteTreeSelectedTitle = \"Supprimer le contenu de cet arbre\";\r\n $scope.messageConfirmPopup = \"Êtes vous sûr de vouloir supprimer le contenu de cet arbre ?\";\r\n $scope.cleanGroup = true;\r\n popup();\r\n };\r\n\r\n $scope.DeleteTreeSelected = function () {\r\n if (!$scope.currentTree)\r\n return;\r\n\r\n if (!$scope.cleanGroup) {\r\n conditionsService.DeleteTree($scope.currentTree.IdTree, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.InitTreeConditions();\r\n $scope.succesMessage = \"Votre suppression a bien été prise en compte\";\r\n }\r\n });\r\n } else {\r\n $scope.currentTree.TreeGroups = [];\r\n }\r\n };\r\n\r\n $scope.ResetMessages = function () {\r\n $scope.succesMessage = \"\";\r\n $scope.errorMessage = \"\";\r\n $scope.indexOperation = 0;\r\n $scope.indexGroup = null;\r\n $scope.IdTreeGroupCondition = null;\r\n $scope.update = false;\r\n $scope.delete = false;\r\n $scope.deleteServer = false;\r\n };\r\n\r\n $scope.ChangePosition = function (positionarray) {\r\n $scope.changed = true;\r\n var ids = positionarray.MovedId.split(\"_\");\r\n if (ids.length === 3) {\r\n var idOperation = ids[1];\r\n var groups;\r\n if (idOperation === \"0\") //on est a la racine\r\n {\r\n var group = angular.copy($scope.currentTree.TreeGroups[positionarray.MovedIndexStart]);\r\n groups = angular.copy($scope.currentTree.TreeGroups);\r\n\r\n groups.splice(positionarray.MovedIndexStart, 1);\r\n groups.splice(positionarray.MovedIndexEnd, 0, group);\r\n\r\n $scope.currentTree.TreeGroups = groups;\r\n } else {\r\n groups = $scope.FindGroup(positionarray, $scope.currentTree.TreeGroups, idOperation);\r\n }\r\n $scope.currentTree.TreeGroups = groups;\r\n }\r\n };\r\n\r\n $scope.FindGroup = function (positionarray, treeGroups, idOperation) {\r\n treeGroups.forEach(function (group) {\r\n group.TreeOperations.forEach(function (operation) {\r\n if ((\"\" + operation.Index) === idOperation) {\r\n var group = angular.copy(operation.TreeGroups[positionarray.MovedIndexStart]);\r\n var groups = angular.copy(operation.TreeGroups);\r\n\r\n groups.splice(positionarray.MovedIndexStart, 1);\r\n groups.splice(positionarray.MovedIndexEnd, 0, group);\r\n\r\n operation.TreeGroups = groups;\r\n return operation.TreeGroups;\r\n } else {\r\n operation.TreeGroups = $scope.FindGroup(positionarray, operation.TreeGroups, idOperation);\r\n }\r\n });\r\n });\r\n return treeGroups;\r\n };\r\n\r\n $scope.AddTreeGroup = function (indexOperation, popup) {\r\n $scope.ResetMessages();\r\n $scope.indexOperation = indexOperation;\r\n if ($scope.lstGroupConditions.length > 0) {\r\n $scope.formGroupCondition.lstGroupConditions = angular.copy($scope.lstGroupConditions);\r\n $scope.formGroupCondition.groupSelected = angular.copy($scope.lstGroupConditions[0]);\r\n $scope.formGroupCondition.groupSelected.AllCondition = false;\r\n }\r\n popup();\r\n };\r\n\r\n $scope.UpdateTreeGroup = function (indexOperation, indexGroup, treeGroup, popup) {\r\n $scope.ResetMessages();\r\n $scope.indexOperation = indexOperation;\r\n $scope.indexGroup = indexGroup;\r\n $scope.IdTreeGroupCondition = treeGroup.IdTreeGroupCondition;\r\n $scope.formGroupCondition.IsHidden = treeGroup.IsHidden;\r\n $scope.formGroupCondition.IsEditable = treeGroup.IsEditable;\r\n $scope.formGroupCondition.DoNotImpactThePrice = treeGroup.DoNotImpactThePrice;\r\n\r\n $scope.update = true;\r\n if ($scope.lstGroupConditions.length > 0) {\r\n $scope.formGroupCondition.lstGroupConditions = angular.copy($scope.lstGroupConditions);\r\n }\r\n\r\n for (var i = 0; i < $scope.formGroupCondition.lstGroupConditions.length; i++) {\r\n if ($scope.formGroupCondition.lstGroupConditions[i].IdGroupCondition === treeGroup.IdGroupCondition) {\r\n var group = $scope.formGroupCondition.lstGroupConditions[i];\r\n\r\n for (var j = 0; j < group.ParticularConditions.length; j++) {\r\n var condition = group.ParticularConditions[j];\r\n for (var k = 0; k < treeGroup.TreeConditions.length; k++) {\r\n var treeCondition = treeGroup.TreeConditions[k];\r\n if (condition.IdParticularCondition === treeCondition.IdParticularCondition) {\r\n condition.IdTreeCondition = treeCondition.IdTreeCondition;\r\n condition.DefaultValue = treeCondition.Value;\r\n condition.Selected = true;\r\n condition.Visible = treeCondition.Visible;\r\n group.ParticularConditions[j] = condition;\r\n }\r\n }\r\n\r\n }\r\n\r\n $scope.formGroupCondition.groupSelected = group;\r\n\r\n break;\r\n }\r\n }\r\n popup();\r\n };\r\n\r\n $scope.CheckAll = function () {\r\n $scope.formGroupCondition.groupSelected.AllCondition = !$scope.formGroupCondition.groupSelected.AllCondition;\r\n\r\n $scope.formGroupCondition.groupSelected.ParticularConditions.forEach(function (condition) {\r\n condition.Selected = $scope.formGroupCondition.groupSelected.AllCondition ? true : false;\r\n });\r\n };\r\n\r\n $scope.CheckAddTreeGroupSelected = function () {\r\n $scope.errorMessagePopup = \"\";\r\n var check = false;\r\n for (var i = 0; i < $scope.formGroupCondition.groupSelected.ParticularConditions.length; i++) {\r\n var condition = $scope.formGroupCondition.groupSelected.ParticularConditions[i];\r\n\r\n if (condition.Selected) {\r\n check = true;\r\n if (condition.DefaultValue !== undefined && condition.DefaultValue !== null && condition.DefaultValue !== \"\" && isNaN(condition.DefaultValue)) {\r\n $scope.errorMessagePopup = \"La valeur pour la condition \" + condition.Label + \" doit être un nombre.\";\r\n return false;\r\n } else\r\n condition.Value = null;\r\n }\r\n }\r\n\r\n // si mode de saissie libre, on ne bloque pas la sauvegarde d'ajout d'un groupe de condition, US 700\r\n if(!$scope.formGroupCondition.groupSelected.IdTypeFreeInput){\r\n if (!check) {\r\n $scope.errorMessagePopup = \"Il faut selectioner au moins une condition particulière\";\r\n return false;\r\n }\r\n }\r\n\r\n // Si on décoche des conditions du TreeGroupCondition, et qu'il existait des TreeOpération dessus, on les supprime\r\n var conditionsNotSelecteds = $filter('filter')($scope.formGroupCondition.groupSelected.ParticularConditions, { Selected: false });\r\n var currentTreeGroupCondition = findRecursiveTreeGroup($scope.currentTree.TreeGroups, $scope.IdTreeGroupCondition);\r\n if (currentTreeGroupCondition && currentTreeGroupCondition.TreeOperations && currentTreeGroupCondition.TreeOperations.length > 0) {\r\n for (var u = 0; u < conditionsNotSelecteds.length; u++) {\r\n var conditionNotSelected = conditionsNotSelecteds[u];\r\n /* jshint ignore:start */\r\n currentTreeGroupCondition.TreeOperations = $filter('filter')(currentTreeGroupCondition.TreeOperations, function (item) {\r\n return item.IdTreeCondition !== conditionNotSelected.IdTreeCondition && item.IdParticularCondition !== conditionNotSelected.IdParticularCondition;\r\n });\r\n /* jshint ignore:end */\r\n }\r\n }\r\n\r\n $scope.treeGroupFounded = false;\r\n $scope.currentTreeGroupCondition = null;\r\n return true;\r\n };\r\n\r\n var findRecursiveTreeGroup = function (treeGroups, idTreeGroupCondition) {\r\n if (treeGroups && treeGroups.length > 0) {\r\n for (var w = 0; w < treeGroups.length; w++) {\r\n if ($scope.treeGroupFounded)\r\n return $scope.currentTreeGroupCondition;\r\n\r\n var currentTreeGroup = treeGroups[w];\r\n if (currentTreeGroup.IdTreeGroupCondition === idTreeGroupCondition) {\r\n $scope.treeGroupFounded = true;\r\n $scope.currentTreeGroupCondition = currentTreeGroup;\r\n }\r\n else {\r\n if (currentTreeGroup.TreeOperations && currentTreeGroup.TreeOperations.length > 0)\r\n for (var z = 0; z < currentTreeGroup.TreeOperations.length; z++) {\r\n findRecursiveTreeGroup(currentTreeGroup.TreeOperations[z].TreeGroups, idTreeGroupCondition);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n $scope.AddTreeGroupSelected = function () {\r\n var treeGroup = {\r\n IdGroupCondition: $scope.formGroupCondition.groupSelected.IdGroupCondition,\r\n Label: $scope.formGroupCondition.groupSelected.Label,\r\n IsHidden: $scope.formGroupCondition.IsHidden,\r\n IsEditable: $scope.formGroupCondition.IsEditable,\r\n DoNotImpactThePrice: $scope.formGroupCondition.DoNotImpactThePrice,\r\n TreeConditions: []\r\n };\r\n\r\n if ($scope.update) {\r\n treeGroup.IdTreeGroupCondition = $scope.IdTreeGroupCondition;\r\n }\r\n\r\n $scope.formGroupCondition.groupSelected.ParticularConditions.forEach(function (condition) {\r\n if (condition.Selected)\r\n treeGroup.TreeConditions.push({\r\n IdTreeCondition: condition.IdTreeCondition,\r\n Value: condition.DefaultValue,\r\n Visible: condition.Visible,\r\n Label: condition.Label,\r\n IdParticularCondition: condition.IdParticularCondition\r\n });\r\n });\r\n if ($scope.indexOperation === 0) {\r\n if ($scope.update) {\r\n $scope.currentTree.TreeGroups[$scope.indexGroup].TreeConditions = treeGroup.TreeConditions;\r\n $scope.currentTree.TreeGroups[$scope.indexGroup].IdGroupCondition = treeGroup.IdGroupCondition;\r\n $scope.currentTree.TreeGroups[$scope.indexGroup].Label = treeGroup.Label;\r\n $scope.currentTree.TreeGroups[$scope.indexGroup].IsHidden = treeGroup.IsHidden;\r\n $scope.currentTree.TreeGroups[$scope.indexGroup].IsEditable = treeGroup.IsEditable;\r\n $scope.currentTree.TreeGroups[$scope.indexGroup].DoNotImpactThePrice = treeGroup.DoNotImpactThePrice;\r\n \r\n if(!$scope.formGroupCondition.groupSelected.IdTypeFreeInput && $scope.currentTree.TreeGroups[$scope.indexGroup].TreeOperations){\r\n for (var k = 0; k < $scope.currentTree.TreeGroups[$scope.indexGroup].TreeOperations.length; k++) {\r\n $scope.currentTree.TreeGroups[$scope.indexGroup].TreeOperations[k].TreeConditions = treeGroup.TreeConditions;\r\n }\r\n }\r\n }\r\n else {\r\n if (!$scope.currentTree.TreeGroups)\r\n $scope.currentTree.TreeGroups = [];\r\n\r\n $scope.currentTree.TreeGroups.push(treeGroup);\r\n }\r\n } else {\r\n $scope.ManageGroupConditon($scope.currentTree.TreeGroups, treeGroup, $scope.indexOperation);\r\n }\r\n };\r\n\r\n $scope.ManageGroupConditon = function (groups, groupToInsert, indexOperation) {\r\n for (var i = 0; i < groups.length; i++) {\r\n var group = groups[i];\r\n if (group.TreeOperations && group.TreeOperations.length > 0) {\r\n for (var j = 0; j < group.TreeOperations.length; j++) {\r\n var treeOperation = group.TreeOperations[j];\r\n if (treeOperation.Index === indexOperation) {\r\n if (!treeOperation.TreeGroups)\r\n treeOperation.TreeGroups = [];\r\n\r\n if ($scope.delete) {\r\n treeOperation.TreeGroups.splice($scope.indexGroup, 1);\r\n } else if ($scope.update) {\r\n treeOperation.TreeGroups[$scope.indexGroup].TreeConditions = groupToInsert.TreeConditions;\r\n treeOperation.TreeGroups[$scope.indexGroup].IdGroupCondition = groupToInsert.IdGroupCondition;\r\n treeOperation.TreeGroups[$scope.indexGroup].Label = groupToInsert.Label;\r\n treeOperation.TreeGroups[$scope.indexGroup].IsHidden = groupToInsert.IsHidden;\r\n treeOperation.TreeGroups[$scope.indexGroup].IsEditable = groupToInsert.IsEditable;\r\n treeOperation.TreeGroups[$scope.indexGroup].DoNotImpactThePrice = groupToInsert.DoNotImpactThePrice;\r\n\r\n if (treeOperation.TreeGroups[$scope.indexGroup].TreeOperations)\r\n for (var k = 0; k < treeOperation.TreeGroups[$scope.indexGroup].TreeOperations.length; k++) {\r\n treeOperation.TreeGroups[$scope.indexGroup].TreeOperations[k].TreeConditions = groupToInsert.TreeConditions;\r\n }\r\n } else\r\n treeOperation.TreeGroups.push(groupToInsert);\r\n\r\n } else if (treeOperation.TreeGroups && treeOperation.TreeGroups.length > 0) {\r\n ($scope.ManageGroupConditon(treeOperation.TreeGroups, groupToInsert, indexOperation));\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n $scope.DeleteTreeGroup = function (indexOperation, indexGroup, popup) {\r\n $scope.ResetMessages();\r\n $scope.indexOperation = indexOperation;\r\n $scope.indexGroup = indexGroup;\r\n $scope.delete = true;\r\n $scope.PopupDeleteTreeGroupSelectedTitle = \"Supprimer un groupe\";\r\n popup();\r\n };\r\n\r\n $scope.DeleteTreeGroupSelected = function () {\r\n if ($scope.indexOperation === 0) {\r\n $scope.currentTree.TreeGroups.splice($scope.indexGroup, 1);\r\n } else {\r\n $scope.ManageGroupConditon($scope.currentTree.TreeGroups, null, $scope.indexOperation);\r\n }\r\n };\r\n\r\n $scope.AddTreeOperation = function (indexOperation, indexGroup) {\r\n $scope.ResetMessages();\r\n if (indexOperation === 0) {\r\n $scope.currentIndexTreeOperation++;\r\n if (!$scope.currentTree.TreeGroups[indexGroup].TreeOperations)\r\n $scope.currentTree.TreeGroups[indexGroup].TreeOperations = [];\r\n\r\n $scope.currentTree.TreeGroups[indexGroup].TreeOperations.push({\r\n IdTreeOperation: 0,\r\n IdTypeOperation: $scope.typeOperations[0].IdTypeOperation,\r\n IdTreeCondition: $scope.currentTree.TreeGroups[indexGroup].TreeConditions[0].IdTreeCondition,\r\n IdParticularCondition: $scope.currentTree.TreeGroups[indexGroup].TreeConditions[0].IdParticularCondition,\r\n TypeOperation: $scope.typeOperations[0].Label,\r\n TreeGroups: [],\r\n TreeConditions: $scope.currentTree.TreeGroups[indexGroup].TreeConditions,\r\n Index: $scope.currentIndexTreeOperation\r\n });\r\n $scope.currentTree.TreeGroups[indexGroup].showDetail = true;\r\n } else {\r\n $scope.currentTree.TreeGroups.forEach(function (group) {\r\n if (group.TreeOperations && group.TreeOperations.length > 0) {\r\n $scope.ManageTreeOperation(group.TreeOperations, indexOperation, indexGroup);\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.ManageTreeOperation = function (operations, indexOperation, indexGroup) {\r\n for (var i = 0; i < operations.length; i++) {\r\n var operation = operations[i];\r\n if (operation.Index === indexOperation) {\r\n if ($scope.delete) {\r\n operations.splice(i, 1);\r\n } else {\r\n $scope.currentIndexTreeOperation++;\r\n if (!operation.TreeGroups[indexGroup].TreeOperations)\r\n operation.TreeGroups[indexGroup].TreeOperations = [];\r\n\r\n operation.TreeGroups[indexGroup].TreeOperations.push({\r\n IdTreeOperation: 0,\r\n IdTypeOperation: $scope.typeOperations[0].IdTypeOperation,\r\n IdTreeCondition: operation.TreeGroups[indexGroup].TreeConditions[0].IdTreeCondition,\r\n IdParticularCondition: operation.TreeGroups[indexGroup].TreeConditions[0].IdParticularCondition,\r\n TypeOperation: $scope.typeOperations[0].Label,\r\n TreeGroups: [],\r\n TreeConditions: operation.TreeGroups[indexGroup].TreeConditions,\r\n Index: $scope.currentIndexTreeOperation\r\n });\r\n operation.TreeGroups[indexGroup].showDetail = true;\r\n }\r\n } else {\r\n if (operation.TreeGroups && operation.TreeGroups.length > 0) {\r\n for (var j = 0; j < operation.TreeGroups.length; j++) {\r\n var treeGroup = operation.TreeGroups[j];\r\n if (treeGroup.TreeOperations && treeGroup.TreeOperations.length > 0)\r\n $scope.ManageTreeOperation(treeGroup.TreeOperations, indexOperation, indexGroup);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n\r\n $scope.DeleteOperation = function (indexOperation, popup) {\r\n $scope.ResetMessages();\r\n $scope.delete = true;\r\n $scope.indexOperation = indexOperation;\r\n $scope.PopupDeleteOperationSelectedTitle = \"Supprimer une condition\";\r\n\r\n popup();\r\n };\r\n\r\n $scope.DeleteOperationSelected = function () {\r\n if ($scope.indexOperation !== 0) {\r\n $scope.currentTree.TreeGroups.forEach(function (group) {\r\n if (group.TreeOperations && group.TreeOperations.length > 0) {\r\n $scope.ManageTreeOperation(group.TreeOperations, $scope.indexOperation, null);\r\n }\r\n });\r\n }\r\n };\r\n\r\n /************** ViewMode = groupConditions ************/\r\n\r\n $scope.showGrp = [];\r\n $scope.InitGroupConditions = function () {\r\n\r\n $scope.selectedGroupAutoComplete = {\r\n selectedGroup: null\r\n };\r\n\r\n $scope.ResetForm();\r\n\r\n conditionsService.GetGroupConditions(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.lstGroups = data;\r\n }\r\n });\r\n $scope.GetTypeFreeInputs();\r\n };\r\n\r\n $scope.SaveGroupCondition = function () {\r\n\r\n if($scope.groupCondition.IsFreeInput && !$scope.groupCondition.IdTypeFreeInput){\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_Inform_Type_Free_Input_Group_Condition.Content;\r\n return;\r\n }\r\n\r\n if ($scope.groupCondition.Label === undefined || $scope.groupCondition.Label === null || $scope.groupCondition.Label === \"\") {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_Inform_Label_Group_Condition.Content;\r\n return;\r\n }\r\n\r\n if ($scope.indexGroup !== -1) {\r\n $scope.lstGroups[$scope.indexGroup] = angular.copy($scope.groupCondition);\r\n } else {\r\n $scope.lstGroups.push(angular.copy($scope.groupCondition));\r\n }\r\n $scope.ResetForm();\r\n };\r\n\r\n $scope.UpdateGroupCondition = function (item, index) {\r\n $scope.groupCondition = angular.copy(item);\r\n $scope.groupCondition.IsFreeInput = !!item.IdTypeFreeInput;\r\n $scope.buttonSaveText = \"Modifier\";\r\n $scope.textSave = \"Modifier le groupe\";\r\n $scope.indexGroup = index;\r\n };\r\n\r\n $scope.ResetForm = function () {\r\n $scope.groupCondition = {};\r\n $scope.buttonSaveText = \"Ajouter\";\r\n $scope.textSave = \"Créer un groupe\";\r\n $scope.errorMessage = \"\";\r\n $scope.succesMessage = \"\";\r\n $scope.errorMessagePopup = \"\";\r\n $scope.condition = {};\r\n $scope.indexGroup = -1;\r\n $scope.indexCondition = -1;\r\n $scope.errors = [];\r\n };\r\n\r\n $scope.SaveGroupConditions = function () {\r\n $scope.ResetForm();\r\n $scope.lstGroups.forEach(function (group, indexGroup) {\r\n if (group.ParticularConditions !== undefined && group.ParticularConditions !== null) {\r\n group.ParticularConditions.forEach(function (condition, indexCondition) {\r\n\r\n var message = \"\";\r\n var error = {};\r\n if (condition.DefaultValue === undefined || condition.DefaultValue === null || condition.DefaultValue === \"\") {\r\n condition.DefaultValue = null;\r\n } else if (condition.DefaultValue !== \"\" && isNaN(condition.DefaultValue)) {\r\n message = \"La valeur par defaut doit être un nombre\";\r\n error.DefaultValue = true;\r\n }\r\n\r\n if (condition.Label === undefined || condition.Label === null || condition.Label === \"\") {\r\n message = \"Veuillez saisir un libellé.\";\r\n error.Label = true;\r\n }\r\n\r\n if (!condition.Order) {\r\n condition.Order = null;\r\n } else if (condition.Order !== \"\" && isNaN(condition.Order)) {\r\n message = \"L'ordre doit être un nombre\";\r\n error.Order = true;\r\n }\r\n\r\n if (message !== \"\") {\r\n if ($scope.errors[indexGroup] === undefined || $scope.errors[indexGroup] === null)\r\n $scope.errors[indexGroup] = [];\r\n\r\n $scope.errors[indexGroup][indexCondition] = error;\r\n\r\n if ($scope.errorMessage === \"\")\r\n $scope.errorMessage = message;\r\n }\r\n });\r\n }\r\n });\r\n\r\n if ($scope.errorMessage === \"\")\r\n conditionsService.SaveGroupConditions($scope.lstGroups, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.InitGroupConditions();\r\n $scope.succesMessage = \"Vos modifications ont bien été prises en compte\";\r\n }\r\n });\r\n };\r\n\r\n $scope.DeleteGroup = function (index, popup) {\r\n $scope.ResetForm();\r\n $scope.PopupDeleteGroupSelectedTitle = \"Supprimer un groupe de conditions\";\r\n $scope.CancelBlocked = false;\r\n $scope.indexGroup = index;\r\n\r\n if ($scope.lstGroups[index].IsInTree) {\r\n $scope.PopupDeleteGroupSelectedText = \"Impossible de supprimer ce groupe car il est actuellement utilisé dans un arbre de conditions.\";\r\n $scope.CancelBlocked = true;\r\n } else if ($scope.lstGroups[index].HasContract) {\r\n $scope.PopupDeleteGroupSelectedText = \"Impossible de supprimer ce groupe car il est actuellement utilisé dans un ou plusieurs contrats.\";\r\n $scope.CancelBlocked = true;\r\n }\r\n else\r\n $scope.PopupDeleteGroupSelectedText = \"Êtes vous sûre de vouloir supprimer ce groupe ?\";\r\n\r\n popup();\r\n };\r\n\r\n $scope.DeleteGroupSelected = function () {\r\n\r\n if ($scope.indexGroup !== -1) {\r\n $scope.lstGroups.splice($scope.indexGroup, 1);\r\n }\r\n\r\n $scope.ResetForm();\r\n };\r\n\r\n $scope.FilterGroup = function (item) {\r\n\r\n if ($scope.selectedGroupAutoComplete.selectedGroup !== undefined && $scope.selectedGroupAutoComplete.selectedGroup !== null && $scope.selectedGroupAutoComplete.selectedGroup !== \"\") {\r\n if ($scope.CheckElement(item.Label, $scope.selectedGroupAutoComplete.selectedGroup)) {\r\n return true;\r\n } else\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.AddCondition = function (index, popup) {\r\n $scope.ResetForm();\r\n $scope.condition = {};\r\n $scope.indexGroup = index;\r\n popup();\r\n };\r\n\r\n $scope.CheckAddConditionSelected = function () {\r\n $scope.errorMessagePopup = \"\";\r\n\r\n if ($scope.condition.DefaultValue === undefined || $scope.condition.DefaultValue === null || $scope.condition.DefaultValue === \"\") {\r\n $scope.condition.DefaultValue = null;\r\n } else if ($scope.condition.DefaultValue !== \"\" && isNaN($scope.condition.DefaultValue)) {\r\n $scope.errorMessagePopup = \"La valeur par defaut doit être un nombre\";\r\n return false;\r\n }\r\n\r\n if ($scope.condition.Label === undefined || $scope.condition.Label === null || $scope.condition.Label === \"\") {\r\n $scope.errorMessagePopup = \"Veuillez saisir un libellé.\";\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n $scope.AddConditionSelected = function () {\r\n\r\n if ($scope.indexGroup !== -1) {\r\n\r\n if ($scope.lstGroups[$scope.indexGroup].ParticularConditions === undefined || $scope.lstGroups[$scope.indexGroup].ParticularConditions === null)\r\n $scope.lstGroups[$scope.indexGroup].ParticularConditions = [];\r\n\r\n $scope.lstGroups[$scope.indexGroup].ParticularConditions.push(angular.copy($scope.condition));\r\n $scope.showGrp[$scope.indexGroup] = true;\r\n $scope.ResetForm();\r\n }\r\n };\r\n\r\n $scope.DeleteCondition = function (indexGroup, indexCondition, popup) {\r\n $scope.ResetForm();\r\n $scope.PopupDeleteConditionSelectedTitle = \"Supprimer une condition\";\r\n $scope.indexGroup = indexGroup;\r\n $scope.indexCondition = indexCondition;\r\n\r\n if ($scope.lstGroups[indexGroup].ParticularConditions[indexCondition].IsInTree) {\r\n $scope.PopupDeleteConditionSelectedText = \"Impossible de supprimer cette condition car elle est actuellement utilisée dans un arbre de conditions.\";\r\n $scope.CancelBlocked = true;\r\n }\r\n else\r\n $scope.PopupDeleteConditionSelectedText = \"Êtes vous sûr de vouloir supprimer cette condition ?\";\r\n\r\n popup();\r\n };\r\n\r\n $scope.DeleteConditionSelected = function () {\r\n if ($scope.indexCondition !== -1) {\r\n $scope.lstGroups[$scope.indexGroup].ParticularConditions.splice($scope.indexCondition, 1);\r\n }\r\n };\r\n\r\n /************* common *************************/\r\n\r\n $scope.viewMode = $routeParams.typeView;\r\n\r\n $scope.Init = function () {\r\n if ($scope.viewMode === \"treeConditions\")\r\n $scope.InitTreeConditions();\r\n else if ($scope.viewMode === \"groupConditions\")\r\n $scope.InitGroupConditions();\r\n };\r\n\r\n $scope.CheckElement = function (attr, string) {\r\n if (attr.toLowerCase().indexOf(string.toLowerCase()) !== -1)\r\n return true;\r\n else return false;\r\n };\r\n\r\n $scope.GetTypeFreeInputs = function () {\r\n conditionsService.GetTypeFreeInputs(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = data;\r\n }\r\n else {\r\n $scope.listTypeFreeInput = data;\r\n }\r\n });\r\n };\r\n\r\n $scope.Init();\r\n }]);","AgrimarketControllers.controller('categoryOfferController', ['$scope', '$rootScope', '$sce', '$location', 'configurationFactory', '$upload', 'categoryOfferService', 'colonnes', 'languageService',\r\n function ($scope, $rootScope, $sce, $location, configurationFactory, $upload, categoryOfferService, colonnes, languageService) {\r\n\r\n $scope.searchText = \"\";\r\n $scope.errorMessage = \"\";\r\n $scope.lstCategoryOffer = [];\r\n $scope.categoryOffer = {};\r\n $scope.Languages = {};\r\n\r\n $scope.InitMessage = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.errorMessagePopup = \"\";\r\n };\r\n $scope.data = { reverse: false, sortKey: \"Position\" };\r\n $scope.pageNo = 1;\r\n $scope.max = 10;\r\n\r\n $scope.GetLanguages = function () {\r\n languageService.GetLanguages(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.Languages = data;\r\n }\r\n });\r\n };\r\n\r\n\r\n $scope.GetCategoryOffer = function () {\r\n categoryOfferService.GetCategoryOfferPaginateWithFilter($scope.searchText, $scope.max, $scope.pageNo, $scope.data.sortKey, $scope.data.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = data;\r\n }\r\n else {\r\n $scope.lstCategoryOffer = data.ListVm;\r\n $scope.total = data.Total;\r\n }\r\n });\r\n };\r\n\r\n $scope.GetCategoryOfferLanguage = function (test) {\r\n categoryOfferService.GetCategoryOfferPaginateWithFilter($scope.searchText, $scope.max, $scope.pageNo, $scope.data.sortKey, $scope.data.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = data;\r\n }\r\n else {\r\n $scope.lstCategoryOffer = data.ListVm;\r\n $scope.total = data.Total;\r\n }\r\n });\r\n };\r\n\r\n $scope.AddCategoryOffer = function (popup) {\r\n $scope.InitMessage();\r\n $scope.categoryOffer = {};\r\n $scope.categoryOffer.CategoryOfferLanguages = [];\r\n $scope.Languages.forEach(function (item) {\r\n var categoryOfferLanguage = {};\r\n categoryOfferLanguage.IdCategoryOffer = 0;\r\n categoryOfferLanguage.IdLanguage = item.IdLanguage;\r\n categoryOfferLanguage.Language = item;\r\n categoryOfferLanguage.Label = \"\";\r\n\r\n $scope.categoryOffer.CategoryOfferLanguages.push(categoryOfferLanguage);\r\n });\r\n\r\n $scope.txtButton = \"Ajouter\";\r\n $scope.modalTitle = \"Ajouter une catégorie\";\r\n popup();\r\n };\r\n\r\n $scope.EditCategoryOffer = function (item, openPoPup) {\r\n $scope.InitMessage();\r\n $scope.categoryOffer = angular.copy(item);\r\n $scope.txtButton = \"Modifier\";\r\n $scope.modalTitle = \"Modifier une catégorie\";\r\n openPoPup();\r\n };\r\n\r\n $scope.CheckCategoryOffer = function () {\r\n $scope.InitMessage();\r\n if ($scope.categoryOffer.CategoryOfferLanguages.length > 0) {\r\n $scope.categoryOffer.CategoryOfferLanguages.forEach(function (item) { \r\n if (item.Label === undefined || item.Label === null || item.Label === \"\")\r\n $scope.errorMessagePopup += \"Veuillez renseigner le nom (\" + item.Language.Label + \") de la catégorie<br/>\";\r\n else if (item.Label.length > 100)\r\n $scope.errorMessagePopup += \"Veuillez renseigner le nom (\" + item.Language.Label + \") de 100 caractères maximum de la catégorie<br/>\"; \r\n });\r\n }\r\n if ($scope.categoryOffer.Position === undefined || $scope.categoryOffer.Position === null || $scope.categoryOffer.Position === \"\")\r\n $scope.errorMessagePopup += \"Veuillez renseigner la position de la catégorie<br/>\";\r\n else if (($scope.lstCategoryOffer.length === 0 && ($scope.categoryOffer.Position < 0 || $scope.categoryOffer.Position > $scope.lstCategoryOffer.length + 1) ||\r\n ($scope.categoryOffer.IdCategoryOffer !== undefined && $scope.lstCategoryOffer.length > 0 && ($scope.categoryOffer.Position < 0 || $scope.categoryOffer.Position > $scope.lstCategoryOffer.length)\r\n )))\r\n $scope.errorMessagePopup += \"La position doit être de 1 <br/>\";\r\n else if ($scope.lstCategoryOffer.length > 0 && ($scope.categoryOffer.Position < 0 || $scope.categoryOffer.Position > ($scope.lstCategoryOffer.length + 1)))\r\n $scope.errorMessagePopup += \"La position doit être comprise entre 1 et \" + ($scope.lstCategoryOffer.length + 1) + \"<br/>\";\r\n\r\n if ($scope.errorMessagePopup !== \"\") {\r\n $scope.errorMessagePopup = $sce.trustAsHtml($scope.errorMessagePopup);\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.SaveCategoryOffer = function () {\r\n categoryOfferService.PostCategoryOffer($scope.categoryOffer, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.errorMessagePopup = $sce.trustAsHtml(data[0].errors[0].Message);\r\n $scope.openPopUp();\r\n return false;\r\n }\r\n }\r\n else {\r\n $scope.categoryOffer = {};\r\n $scope.successMessage = \"Votre catégorie a bien été enregistrée\";\r\n $scope.GetCategoryOffer();\r\n }\r\n return true;\r\n });\r\n };\r\n\r\n $scope.DeleteCategoryOffer = function (item) {\r\n $scope.InitMessage();\r\n categoryOfferService.DeleteCategoryOffer(item.IdCategoryOffer, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = status;\r\n } else {\r\n $scope.categoryOffer = {};\r\n $scope.successMessage = \"Votre catégorie a bien été supprimé\";\r\n $scope.GetCategoryOffer();\r\n }\r\n });\r\n };\r\n\r\n\r\n $scope.GetData = function (pageNo) {\r\n $scope.pageNo = pageNo;\r\n $scope.GetCategoryOffer();\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.data.sortKey = sortKey;\r\n $scope.data.reverse = reverse;\r\n $scope.GetCategoryOffer();\r\n };\r\n\r\n $scope.$watch(\"searchText\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetCategoryOffer();\r\n });\r\n\r\n $scope.Init = function () {\r\n $scope.tableCategoryOfferDataVisible = [\"Position\",\"IdCategoryOffer\",\"Label\",\"StatusCategory\"];\r\n $scope.tableCategoryOfferLabels = [\"Position\",\"IdCategorie\",\"Nom\",\"Etat\"];\r\n $scope.InitMessage();\r\n $scope.GetCategoryOffer();\r\n $scope.GetLanguages();\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n $scope.Init();\r\n };\r\n\r\n $scope.Init();\r\n }]);\r\n","AgrimarketControllers.controller('compagniesController', ['$scope', '$rootScope', 'compagnyService',\r\n\tfunction ($scope, $rootScope, compagnyService) {\r\n\r\n\t\t$scope.compagnies = [];\r\n\r\n\t\tvar GetCompagnies = function () {\r\n\t\t\tcompagnyService.GetAllCompagnies(function (data, status) {\r\n\t\t\t\tif (status !== null) {\r\n\t\t\t\t\tif (status === 400)\r\n\t\t\t\t\t\t$scope.productDefaultErrorMessage = data[0].errors[0].Message;\r\n\t\t\t\t}\r\n\t\t\t\t$scope.compagnies = data;\r\n\t\t\t\t$scope.showDetails = [];\r\n\t\t\t\t$scope.compagnies.forEach(function (item, index) {\r\n\t\t\t\t\t$scope.showDetails[index] = false;\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\tvar CheckIsNotAFloat = function (n) {\r\n\t\t\treturn n % 1 === 0;\r\n\t\t};\r\n\r\n $scope.EditIsDefault = function (compagnie) {\r\n $scope.compagnies.forEach(function (e) {\r\n if (compagnie.IsDefault == false && e.IsDefault == true && e.IdCompagny != compagnie.IdCompagny) {\r\n e.IsDefault = false;\r\n }\r\n });\r\n };\r\n\r\n\t\tvar CheckValidOrderData = function (data, isCompagnie) {\r\n\t\t\t$scope.compagnieDefaultErrorMessage = \"\";\r\n\t\t\t$scope.compagnieValidMessage = \"\";\r\n\t\t\tif (!CheckIsNotAFloat(data.NewOrder)) {\r\n\t\t\t\t$scope.compagnieDefaultErrorMessage += \"Le nombre doit être un entier.\";\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif (!angular.isNumber(data.NewOrder)) {\r\n\t\t\t\t$scope.compagnieDefaultErrorMessage += \"L'ordre doit être un nombre\";\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tif (isCompagnie && (data.NewOrder < 1 || data.NewOrder > $scope.compagnies.length)) {\r\n\t\t\t\t$scope.compagnieDefaultErrorMessage += \"L'ordre doit être compris entre 1 et \" + $scope.compagnies.length;\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\t\tvar RemoveSelectedInput = function () {\r\n\t\t\t$scope.compagnies.forEach(function (p) {\r\n\t\t\t\tp.Selected = false;\r\n\t\t\t\tp.Editing = false;\r\n\t\t\t});\r\n\t\t};\r\n\r\n\r\n\t\t$scope.EditCompagnie = function (data) {\r\n\t\t\t$scope.compagnieDefaultErrorMessage = \"\";\r\n\t\t\t$scope.compagnieValidMessage = \"\";\r\n\t\t\tRemoveSelectedInput();\r\n\t\t\tdata.Editing = true;\r\n\t\t\tdata.Selected = true;\r\n\t\t};\r\n\r\n\t\t$scope.SaveCompagnieOrder = function (compagnie) {\r\n\t\t\tcompagnie.Editing = false;\r\n\t\t\tcompagnie.IsDefault = compagnie.IsDefault ? compagnie.IsDefault : false;\r\n\t\t\tif (CheckValidOrderData(compagnie, true)) {\r\n\t\t\t\tcompagnyService.SaveCompagnie(compagnie, function (data, status) {\r\n\t\t\t\t\tif (status !== null) {\r\n\t\t\t\t\t\tif (status === 400)\r\n\t\t\t\t\t\t\t$scope.compagnieDefaultErrorMessage = data[0].errors[0].Message;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$scope.compagnieValidMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Parameter_Compagnies_ValidMessage.Content;\r\n\t\t\t\t\tGetCompagnies();\r\n\t\t\t\t});\r\n\t\t\t} else\r\n\t\t\t\tErrorData(compagnie);\r\n\t\t};\r\n\r\n\t\tvar ErrorData = function (compagnie) {\r\n\t\t\tcompagnie.Editing = true;\r\n\t\t\tcompagnie.Selected = true;\r\n\t\t};\r\n\r\n\t\tGetCompagnies();\r\n\r\n\t\t$rootScope.onRefresh = function () { GetCompagnies(); };\r\n\t}]);","AgrimarketControllers.controller('quoteAdminController', ['$scope', '$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory', 'cropsService', '$filter',\r\n\t'parametersService', '$sce', 'parametersFactory', 'coverService', 'productsService', 'typeCoversService', 'enumFactory', 'wsdApiService', 'quoteService',\r\n\tfunction ($scope, $rootScope, $http, $location, currentUserFactory, configurationFactory, cropsService, $filter, parametersService, $sce, parametersFactory,\r\n\t\tcoverService, productsService, typeCoversService, enumFactory, wsdApiService, quoteService) {\r\n\t\t$scope.isAutomatic = false;\r\n\t\t$scope.TypeCover = enumFactory.TypeCover;\r\n\t\t$scope.market = {};\r\n\t\t$scope.errorMessage = \"\";\r\n\t\t$scope.successMessage = \"\";\r\n\t\t$scope.txtButton = \"\";\r\n\t\t$scope.quoteexpiry = {};\r\n\t\t$scope.lstMarketsWSD = [];\r\n\t\t$scope.lstMarketsWSDFull = [];\r\n\t\t$scope.edit = false;\r\n\t\t$scope.showDetail = true;\r\n\r\n\r\n\t\tif (!$rootScope.ModuleCotation.Active)\r\n\t\t\t$location.path('/admin/parameters/global');\r\n\r\n\t\t$scope.InitPopup = function (popup) {\r\n\t\t\t$scope.GetMarketNotSelected();\r\n\t\t\t$scope.edit = false;\r\n\t\t\t$scope.market = {};\r\n\t\t\t$scope.title = \"Ajouter un marché\";\r\n\t\t\t$scope.InitMessage();\r\n\t\t\tpopup();\r\n\t\t};\r\n\t\t$scope.InitPopupEdit = function (popup, market) {\r\n\t\t\t$scope.lstMarketsWSD = [];\r\n\t\t\t$scope.lstMarketsWSD.push($filter('filter')($scope.lstMarketsWSDFull, { IdMarket: market.IdMarketWSD }, true)[0]);\r\n\t\t\t$scope.edit = true;\r\n\t\t\t$scope.title = \"Modifier un marché\";\r\n\t\t\t$scope.market = angular.copy(market);\r\n\t\t\t$scope.InitMessage();\r\n\t\t\tpopup();\r\n\t\t};\r\n\r\n\t\t$scope.closePopUp = function () {\r\n\t\t\t$scope.market={};\r\n\t\t\t$scope.formCancel();\r\n\t\t};\r\n\r\n\t\t$scope.ToAddExpiry = function (item) {\r\n\t\t\t$scope.lstMarkets.forEach(function (market, index) {\r\n\t\t\t\tmarket.QuoteExpiries.forEach(function (item3, index2) {\r\n\t\t\t\t\t\t\tvar expiry = $filter('filter')($scope.lstMarkets[index].QuoteExpiries, { IdExpiryWSD: item.IdExpiryWSD }, true)[0];\r\n\t\t\t\t\t\t\tif (expiry !== undefined && expiry !== null && item3 === expiry) {\r\n\t\t\t\t\t\t\t\tmarket.QuoteExpiries[index2].IdQuoteExpiry = expiry.IdQuoteExpiry;\r\n\t\t\t\t\t\t\t\tmarket.QuoteExpiries[index2].IsVisible = !expiry.IsVisible;\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t$scope.CheckMarket = function () {\r\n\t\t\t$scope.InitMessage();\r\n\t\t\tif (($scope.market.IdMarketWSD !== null && $scope.market.IdMarketWSD !== undefined) && (!$scope.edit && $filter('filter')($scope.lstMarkets, { IdMarketWSD: $scope.market.IdMarketWSD }, true)[0] !== undefined && $filter('filter')($scope.lstMarkets, { IdMarketWSD: $scope.market.IdMarketWSD }, true)[0] !== null)) {\r\n\t\t\t\t$scope.errorMessagePopup = \"Ce marché a déjà été ajouté\";\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\r\n\t\t\tif ($scope.market.IdMarketWSD === undefined || $scope.market.IdMarketWSD === null || $scope.market.IdMarketWSD === 0){\r\n\t\t\t\t$scope.errorMessagePopup = \"Veuillez renseigner un marché\";\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\treturn true;\r\n\t\t};\r\n\r\n\t\t$scope.AddMarket = function () {\r\n\t\t\t$scope.InitMessage();\r\n\t\t\tif ($scope.market.Label === undefined || $scope.market.Label === null || $scope.market.Label.trim() === \"\") {\r\n\t\t\t\t$scope.market.Label = $filter('filter')($scope.lstMarketsWSD, { IdMarket: $scope.market.IdMarketWSD }, true)[0].MarketNameFR;\r\n\t\t\t}\r\n\t\t\tif ($scope.market.IdQuoteMarket === undefined) {\r\n\t\t\t\twsdApiService.GetExpiriesWSDByIdMarket($scope.market.IdMarketWSD, function (data, status) {\r\n\t\t\t\t\tif (status === null) {\r\n\t\t\t\t\t\t$scope.market.QuoteExpiries = [];\r\n\t\t\t\t\t\tdata.Expiries.forEach(function(item) {\r\n\t\t\t\t\t\t\t$scope.market.QuoteExpiries.push($scope.ConvertExpiryWSDToQuoteExpiry($scope.market.IdMarketWSD, item));\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\t$scope.SaveMarket($scope.market);\r\n\t\t\t\t\t} else if (status == 400)\r\n\t\t\t\t\t\t$scope.errorMessage = data[0].errors[0].Message;\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\t$scope.errorMessage = status;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\t$scope.SaveMarket($scope.market);\r\n\t\t};\r\n\r\n\t\t$scope.SaveMarket = function (market) {\r\n\t\t\t$scope.InitMessage();\r\n\t\t\tquoteService.AddMarket(market, function (data, status) {\r\n\t\t\t\tif (status === null) {\r\n\t\t\t\t\tif ($scope.edit)\r\n\t\t\t\t\t\t$scope.successMessage = \"Vos modifications ont bien été prises en compte.\";\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\t$scope.successMessage = \"Votre marché a bien été pris en compte.\";\r\n\t\t\t\t\tif (market.IdQuoteMarket !== undefined) {\r\n\t\t\t\t\t\t$filter('filter')($scope.lstMarkets, { IdQuoteMarket: market.IdQuoteMarket }, true)[0].Label = market.Label;\r\n\t\t\t\t\t\t$filter('filter')($scope.lstMarkets, { IdQuoteMarket: market.IdQuoteMarket }, true)[0].IsVisible = market.IsVisible;\r\n\t\t\t\t\t}\r\n\t\t\t\t\t$scope.market = {};\r\n\t\t\t\t\tif(!$scope.edit)\r\n\t\t\t\t\t$scope.GetMarket();\r\n\t\t\t\t} else if (status == 400) {\r\n\t\t\t\t\t$scope.errorMessage = data[0].errors[0].Message;\r\n\t\t\t\t\t$scope.market = {};\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$scope.errorMessage = status;\r\n\t\t\t\t\t$scope.market = {};\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\t\t$scope.DeleteMarket = function (market) {\r\n\t\t\t$scope.InitMessage();\r\n\t\t\tquoteService.DeleteQuoteMarket(market, function (data, status) {\r\n\t\t\t\tif (status === null) {\r\n\t\t\t\t\t$scope.successMessage = \"Votre marché a bien été supprimé\";\r\n\t\t\t\t\t$scope.market = {};\r\n\t\t\t\t\t$scope.GetMarket();\r\n\t\t\t\t} else if (status == 400) {\r\n\t\t\t\t\t$scope.errorMessage = data[0].errors[0].Message;\r\n\t\t\t\t\t$scope.market = {};\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$scope.errorMessage = status;\r\n\t\t\t\t\t$scope.market = {};\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\t\t$scope.InitMessage = function() {\r\n\t\t\t$scope.errorMessage = \"\";\r\n\t\t\t$scope.successMessage = \"\";\r\n\t\t\t$scope.errorMessagePopup = \"\";\r\n\t\t};\r\n\r\n\t\t$scope.GetMarketNotSelected = function () {\r\n\t\t\t$scope.lstMarketsWSD = angular.copy($scope.lstMarketsWSDFull);\r\n\t\t\t$scope.lstMarkets.forEach(function(market) {\r\n\t\t\t\tif ($filter('filter')($scope.lstMarketsWSD, { IdMarket: market.IdMarketWSD }, true)[0] !== undefined) {\r\n\t\t\t\t\t$scope.lstMarketsWSD.splice($scope.lstMarketsWSD.indexOf($filter('filter')($scope.lstMarketsWSD, { IdMarket: market.IdMarketWSD }, true)[0]), 1);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\t\t$scope.GetMarket = function() {\r\n\t\t\tquoteService.GetMarkets(function (data, status) {\r\n\t\t\t\tif (status === null) {\r\n\t\t\t\t\t$scope.lstMarkets = data;\r\n\t\t\t\t\t$scope.lstMarketsWSD = angular.copy($scope.lstMarketsWSDFull);\r\n\t\t\t\t\t$scope.lstMarkets.forEach(function (market, index) {\r\n\t\t\t\t\t\tif ($filter('filter')($scope.lstMarketsWSD, { IdMarket: market.IdMarketWSD }, true)[0] !==undefined) {\r\n\t\t\t\t\t\t\t$scope.lstMarketsWSD.splice($scope.lstMarketsWSD.indexOf($filter('filter')($scope.lstMarketsWSD, { IdMarket: market.IdMarketWSD }, true)[0]), 1);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\twsdApiService.GetExpiriesWSDByIdMarket(market.IdMarketWSD, function (data2, status2) {\r\n\t\t\t\t\t\t\tif (status2 === null) {\r\n\t\t\t\t\t\t\t\tvar tmplst = angular.copy($scope.lstMarkets[index].QuoteExpiries);\r\n\t\t\t\t\t\t\t\tmarket.QuoteExpiries = [];\r\n\t\t\t\t\t\t\t\tdata2.Expiries.forEach(function (item2, index2) {\r\n\t\t\t\t\t\t\t\t\tvar expiry = $filter('filter')(tmplst, { IdExpiryWSD: item2.IdExpiry }, true)[0];\r\n\t\t\t\t\t\t\t\t\tmarket.QuoteExpiries.push($scope.ConvertExpiryWSDToQuoteExpiry(market.IdQuoteMarket, item2));\r\n\t\t\t\t\t\t\t\t\tif (expiry !== undefined && expiry !== null) {\r\n\t\t\t\t\t\t\t\t\t\tmarket.QuoteExpiries[index2].IdQuoteExpiry = expiry.IdQuoteExpiry;\r\n\t\t\t\t\t\t\t\t\t\tmarket.QuoteExpiries[index2].IsVisible = true;\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\tmarket.QuoteExpiries[index2].IdQuoteExpiry = 0;\r\n\t\t\t\t\t\t\t\t\t\tmarket.QuoteExpiries[index2].IsVisible = false;\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t} else if (status2 == 400)\r\n\t\t\t\t\t\t\t\t$scope.errorMessage = data2[0].errors[0].Message;\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\t$scope.errorMessage = status2;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$scope.errorMessage = status;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\t\t\r\n\t\t\r\n\t\t$scope.init = function() {\r\n\t\t\twsdApiService.GetMarketsWSDToEuronext(function (data, status) {\r\n\t\t\t\tif (status === null) {\r\n\t\t\t\t\t$scope.lstMarketsWSDFull = data;\r\n\t\t\t\t\t$scope.GetMarket();\r\n\t\t\t\t} else {\r\n\t\t\t\t\t$scope.errorMessage = status;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t\t\r\n\t\t};\r\n\r\n\t\t$scope.ConvertExpiryWSDToQuoteExpiry = function (idquotemarket,expirywsd) {\r\n\t\t\tvar tmpquoteexpiry = {};\r\n\t\t\t\ttmpquoteexpiry.IdQuoteMarket = idquotemarket;\r\n\t\t\t\ttmpquoteexpiry.IdExpiryWSD = expirywsd.IdExpiry;\r\n\t\t\t\ttmpquoteexpiry.Label = expirywsd.ExpiryNameFR;\r\n\t\t\treturn tmpquoteexpiry;\r\n\t\t};\r\n\r\n\t\t$scope.SaveExpiry = function () {\r\n\t\t\t$scope.InitMessage();\r\n\t\t\t$scope.tmplstmarket = angular.copy($scope.lstMarkets);\r\n\t\t\t$scope.tmplstmarket.forEach(function (item) {\r\n\t\t\t\titem.QuoteExpiries = $filter('filter')(item.QuoteExpiries, { IsVisible: true }, true);\r\n\t\t\t});\r\n\t\t\tquoteService.PutQuoteExpiry($scope.tmplstmarket, function (data, status) {\r\n\t\t\t\tif (status === null) {\r\n\t\t\t\t\t$scope.successMessage = \"Vos modifications ont bien été enregistrées\";\r\n\t\t\t\t\t//$scope.GetMarket();\r\n\t\t\t\t} else if (status == 400)\r\n\t\t\t\t\t$scope.errorMessage = data[0].errors[0].Message;\r\n\t\t\t\telse {\r\n\t\t\t\t\t$scope.errorMessage = status;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t$scope.ChangePosition = function (positionarray) {\r\n\t\t\t$scope.InitMessage();\r\n\t\t\tvar pos = 1;\r\n\t\t\tpositionarray.End.forEach(function (item) {\r\n\t\t\t\titem = JSON.parse(item);\r\n\t\t\t\t$scope.lstMarkets.forEach(function (item2, index) {\r\n\t\t\t\t\tif (item2.IdMarketWSD == item.quoteId) {\r\n\t\t\t\t\t\titem2.Position = pos++;\r\n\t\t\t\t\t\treturn false;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t});\r\n\t\t\r\n\t\t};\r\n\r\n\t\t$scope.init();\r\n\r\n\t\t$rootScope.onRefresh = function () { $scope.init(); };\r\n\t}]);","AgrimarketControllers.controller('newsController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', '$http', '$location', 'newsService', 'colonnes', 'userTableService', 'parametersFactory', 'parametersService', 'enumFactory',\r\n function ($scope, $rootScope, $routeParams, $sce, $filter, $http, $location, newsService, colonnes, userTableService, parametersFactory, parametersService, enumFactory) {\r\n\r\n $scope.data = { reverse: true, sortKey: \"IdNews\" };\r\n $scope.pageNo = 1;\r\n $scope.max = 10;\r\n $scope.News = {};\r\n\r\n if (!$rootScope.ModuleNews.Active)\r\n $location.path('/admin/parameters/global');\r\n\r\n if ($rootScope.succesMessageNews !== undefined && $rootScope.succesMessageNews !== null)\r\n $scope.successMessage = $rootScope.succesMessageNews;\r\n\r\n $scope.GetNews = function () {\r\n \tnewsService.GetNewsPaginateWithFilter($scope.searchText, $scope.max, $scope.pageNo, $scope.data.sortKey, $scope.data.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } \r\n } else {\r\n \t$scope.lstNews = data.ListVm;\r\n \t$scope.total = data.Total;\r\n\r\n\t $scope.lstNews.forEach(function(item) {\r\n\t \titem.CreateDate = $filter('date')(item.CreateDate, 'dd/MM/yyyy');\r\n\t \titem.StartPublication = $filter('date')(item.StartPublication, 'dd/MM/yyyy');\r\n\t \titem.EndPublication = $filter('date')(item.EndPublication, 'dd/MM/yyyy');\r\n\t });\r\n }\r\n });\r\n };\r\n\r\n $scope.AddNews = function () {\r\n $location.path('/admin/contents/news/saveNews/-1');\r\n };\r\n\r\n $scope.EditNews = function (news) {\r\n $location.path('/admin/contents/news/saveNews/' + news.IdNews);\r\n };\r\n\r\n $scope.DeleteNews = function (news, index, openPopUp, modalTitle) {\r\n $scope.successMessage = \"\";\r\n $scope.errorMessage = \"\";\r\n $scope.index = index;\r\n $scope.ModalTitle = modalTitle;\r\n $scope.News = angular.copy(news);\r\n openPopUp();\r\n };\r\n\r\n $scope.deleteNews = function () {\r\n newsService.DeleteNews($scope.News.IdNews, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } \r\n } else {\r\n \t$scope.successMessage = \"L'actualité a bien été supprimée.\";\r\n \t$scope.GetNews();\r\n }\r\n return true;\r\n });\r\n };\r\n\r\n $scope.GetData = function (pageNo) {\r\n \t$scope.pageNo = pageNo;\r\n \t$scope.GetNews();\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n \t$scope.data.sortKey = sortKey;\r\n \t$scope.data.reverse = reverse;\r\n \t$scope.GetNews();\r\n };\r\n\r\n $scope.$watch(\"searchText\", function (newValue, oldValue) {\r\n \tif ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n \t\t$scope.GetNews();\r\n });\r\n\r\n var init = function () {\r\n \t$scope.errorMessage = \"\";\r\n \t$scope.searchText = \"\";\r\n \t$scope.tableNewsDataVisible = colonnes.data.DataVisible.split(',');\r\n \t$scope.tableNewsLabels = colonnes.data.ColumnName.split(',');\r\n $scope.GetNews();\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n \tinit();\r\n };\r\n\r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('saveNewsController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', '$http', '$location', 'newsService', 'dateService', 'configurationFactory', 'groupContactService', '$upload', 'uploadService',\r\n function ($scope, $rootScope, $routeParams, $sce, $filter, $http, $location, newsService, dateService, configurationFactory, groupContactService, $upload, uploadService) {\r\n\r\n var idnews = $routeParams.idnews;\r\n $rootScope.succesMessageNews = \"\";\r\n $scope.News = {\r\n GroupContacts: []\r\n };\r\n $scope.tmpGroupContacts1 = [];\r\n $scope.tmpGroupContacts2 = [];\r\n\r\n $scope.uploads = [];\r\n $scope.lstAttachments = [];\r\n\r\n var init = function () {\r\n $scope.NewNews = false;\r\n\r\n if (idnews === undefined || idnews === null || idnews == -1) { //nouvelle actualité\r\n $scope.News.ShowPreviewActuality = true;\r\n $scope.blocTitle = \"Ajouter une nouvelle actualité\";\r\n $scope.action = \"Créer\";\r\n $scope.NewNews = true;\r\n getGroupContacts();\r\n } else { // modifier actualité\r\n $scope.blocTitle = \"Modifier une nouvelle actualité\";\r\n $scope.action = \"Modifier\";\r\n newsService.GetNewsById(idnews, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.NewsErrorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.News = data;\r\n $scope.lstAttachments = $scope.News.Attachments;\r\n getGroupContacts();\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.UploadImage = function (data) {\r\n CKEDITOR.instances.txtContent.insertHtml(\"<img src='\" + $filter('uploadLinkInline')(data.PrivateLabel) + \"'>\");\r\n };\r\n\r\n $scope.checkNews = function () {\r\n $scope.NewsErrorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n\r\n if (!$scope.News.Content)\r\n $scope.NewsErrorMessage += \"Veuillez renseigner un contenu. <br/>\";\r\n\r\n if (!$scope.News.Title)\r\n $scope.NewsErrorMessage += \"Veuillez renseigner un titre. <br/>\";\r\n\r\n if ($scope.News.ShowPreviewActuality && !$scope.News.Preview)\r\n $scope.NewsErrorMessage += \"Veuillez renseigner un aperçu. <br/>\";\r\n\r\n if (!$scope.News.StartPublication)\r\n $scope.NewsErrorMessage += \"Veuillez renseigner une date de début de publication. <br/>\";\r\n\r\n if ($scope.News.StartPublication && $scope.News.EndPublication && !$scope.compareDate($scope.News.StartPublication, $scope.News.EndPublication))\r\n $scope.NewsErrorMessage += \"Veuillez renseigner une date de fin de publication postérieur à la date de début de publication.\";\r\n\r\n if ($scope.NewsErrorMessage !== \"\") {\r\n $scope.NewsErrorMessage = $scope.NewsErrorMessage;\r\n return false;\r\n }\r\n\r\n $scope.saveNews();\r\n return true;\r\n };\r\n\r\n $scope.saveNews = function () {\r\n $scope.NewsErrorMessage = \"\";\r\n $scope.News.Attachments = $scope.lstAttachments;\r\n newsService.SaveNews($scope.News, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.NewsErrorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n if ($scope.action === \"Modifier\")\r\n $rootScope.succesMessageNews = \"Vos modifications ont bien été prises en compte.\";\r\n else\r\n $rootScope.succesMessageNews = \"Votre actualité a bien été prise en compte.\";\r\n\r\n $location.path('/admin/contents/news/');\r\n }\r\n });\r\n };\r\n\r\n $scope.compareDate = function (date1, date2) {\r\n return dateService.compareDate(date1, date2);\r\n };\r\n\r\n $scope.Cancel = function () {\r\n $location.path('/admin/contents/news');\r\n };\r\n\r\n var getGroupContacts = function () {\r\n groupContactService.GetAll(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.NewsErrorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.lstGroupContacts = data;\r\n $scope.lstGroupContacts = $scope.lstGroupContacts.filter(function (element) { return $scope.News.GroupContacts.filter(function (e) { return e.IdGroupContact === element.IdGroupContact; }); });\r\n $scope.setSelectedList();\r\n }\r\n });\r\n };\r\n\r\n $scope.setSelectedList = function () {\r\n if ($scope.News.GroupContacts === undefined || $scope.News.GroupContacts === null) {\r\n $scope.News.GroupContacts = [];\r\n } else {\r\n $scope.$watch(\"lstGroupContacts\", function (value) {\r\n if (value === undefined) return;\r\n $.each($scope.News.GroupContacts, function (index, item) {\r\n if ($scope.lstGroupContacts.indexOf($filter('filter')($scope.lstGroupContacts, { \"IdGroupContact\": Number(item.IdGroupContact) }, true)[0]) !== -1) {\r\n $scope.lstGroupContacts.splice($scope.lstGroupContacts.indexOf($filter('filter')($scope.lstGroupContacts, { \"IdGroupContact\": Number(item.IdGroupContact) }, true)[0]), 1);\r\n }\r\n });\r\n });\r\n }\r\n };\r\n\r\n $scope.toogleAllElementsLeft = function () {\r\n $scope.master3 = !$scope.master3;\r\n $.each($scope.lstGroupContacts, function (index, item) {\r\n item.checked = $scope.master3;\r\n });\r\n };\r\n\r\n $scope.toogleAllElementsRight = function () {\r\n $scope.master4 = !$scope.master4;\r\n $.each($scope.News.GroupContacts, function (index, item) {\r\n item.checked = $scope.master4;\r\n });\r\n };\r\n\r\n $scope.ListToSelectedGroup = function () {\r\n $scope.master3 = false;\r\n $scope.master4 = false;\r\n\r\n $.each($scope.lstGroupContacts, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.News.GroupContacts.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.News.GroupContacts, function (index, item) {\r\n var indexItem = $scope.lstGroupContacts.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.lstGroupContacts.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $scope.SelectedToListGroup = function () {\r\n $scope.master3 = false;\r\n $scope.master4 = false;\r\n\r\n $.each($scope.News.GroupContacts, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.lstGroupContacts.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.lstGroupContacts, function (index, item) {\r\n var indexItem = $scope.News.GroupContacts.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.News.GroupContacts.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n init();\r\n };\r\n\r\n init();\r\n\r\n $scope.UploadAttachments = function (data) {\r\n CKEDITOR.instances.txtContent.insertHtml(\"{{Attachment|\" + data.IdAttachment + \"|\" + $scope.fileName + \"}}\");\r\n };\r\n\r\n }]);\r\n","AgrimarketControllers.controller('fluxrssController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', '$http', '$location', 'newsService', 'currentUserFactory', 'configurationFactory', '$log', '$timeout', 'fluxrssService', 'colonnes', 'userTableService', 'enumFactory',\r\n function ($scope, $rootScope, $routeParams, $sce, $filter, $http, $location, newsService, currentUserFactory, configurationFactory, $log, $timeout, fluxrssService, colonnes, userTableService, enumFactory) {\r\n\r\n \tif (!$rootScope.ModuleNews.Active)\r\n \t\t$location.path('/admin/parameters/global');\r\n\r\n \t$scope.searchText = \"\";\r\n \t$scope.errorMessage = \"\";\r\n \t$scope.lstFlux = [];\r\n \t$scope.flux = {};\r\n \t$scope.InitMessage = function () {\r\n \t\t$scope.errorMessage = \"\";\r\n \t\t$scope.successMessage = \"\";\r\n \t\t$scope.errorMessagePopup = \"\";\r\n \t};\r\n \t$scope.data = { reverse: false, sortKey: \"Position\" };\r\n \t$scope.pageNo = 1;\r\n \t$scope.max = 10;\r\n\r\n \t$scope.GetFlux = function () {\r\n \t\tfluxrssService.GetFluxPaginateWithFilter($scope.searchText, $scope.max, $scope.pageNo, $scope.data.sortKey, $scope.data.reverse, function (data, status) {\r\n \t\t\tif (status !== null) {\r\n \t\t\t\tif (status === 400)\r\n \t\t\t\t\t$scope.errorMessage = data[0].errors[0].Message;\r\n \t\t\t\telse\r\n \t\t\t\t\t$scope.errorMessage = data;\r\n \t\t\t}\r\n \t\t\telse {\r\n \t\t\t\t$scope.lstFlux = data.ListVm;\r\n \t\t\t\t$scope.total = data.Total;\r\n \t\t\t}\r\n \t\t});\r\n \t};\r\n\r\n \t$scope.AddFlux = function (popup) {\r\n \t\t$scope.InitMessage();\r\n \t\t$scope.flux = {};\r\n \t\t$scope.txtButton = \"Ajouter\";\r\n \t\t$scope.modalTitle = \"Ajouter un Flux RSS\";\r\n \t\tpopup();\r\n \t};\r\n\r\n \t$scope.EditFlux = function (item, index, openPoPup) {\r\n \t\t$scope.InitMessage();\r\n \t\t$scope.flux = angular.copy(item);\r\n \t\t$scope.txtButton = \"Modifier\";\r\n \t\t$scope.modalTitle = \"Modifier un Flux RSS\";\r\n \t\topenPoPup();\r\n \t};\r\n\r\n \t$scope.CheckFlux = function () {\r\n \t\t$scope.InitMessage();\r\n \t\tif ($scope.flux.Label === undefined || $scope.flux.Label === null || $scope.flux.Label === \"\")\r\n \t\t\t$scope.errorMessagePopup += \"Veuillez renseigner un nom de flux<br/>\";\r\n \t\telse if ($scope.flux.Label.length > 20)\r\n \t\t\t$scope.errorMessagePopup += \"Veuillez renseigner un nom de flux de 20 caractères maximum<br/>\";\r\n\r\n \t\tif ($scope.flux.Link === undefined || $scope.flux.Link === null || $scope.flux.Link === \"\")\r\n \t\t\t$scope.errorMessagePopup += \"Veuillez renseigner le lien du flux<br/>\";\r\n\r\n \t\tif ($scope.flux.Position === undefined || $scope.flux.Position === null || $scope.flux.Position === \"\")\r\n \t\t\t$scope.errorMessagePopup += \"Veuillez renseigner la position du flux<br/>\";\r\n \t\telse if (($scope.lstFlux.length === 0 && ($scope.flux.Position < 0 || $scope.flux.Position > $scope.lstFlux.length + 1) ||\r\n \t\t\t\t ($scope.flux.IdFluxRss !== undefined && $scope.lstFlux.length > 0 && ($scope.flux.Position < 0 || $scope.flux.Position > $scope.lstFlux.length)\r\n\t\t\t\t)))\r\n \t\t\t$scope.errorMessagePopup += \"La position doit être de 1 <br/>\";\r\n \t\telse if ($scope.lstFlux.length > 0 && ($scope.flux.Position < 0 || $scope.flux.Position > ($scope.lstFlux.length + 1)))\r\n \t\t\t$scope.errorMessagePopup += \"La position doit être comprise entre 1 et \" + ($scope.lstFlux.length + 1) + \"<br/>\";\r\n\r\n \t\tif ($scope.errorMessagePopup !== \"\") {\r\n \t\t\t$scope.errorMessagePopup = $sce.trustAsHtml($scope.errorMessagePopup);\r\n \t\t\treturn false;\r\n \t\t}\r\n \t\treturn true;\r\n \t};\r\n\r\n \t$scope.SaveFlux = function () {\r\n \t\tfluxrssService.PostFlux($scope.flux, function (data, status) {\r\n \t\t\tif (status !== null) {\r\n \t\t\t\tif (status == 400) {\r\n \t\t\t\t\t$scope.errorMessagePopup = $sce.trustAsHtml(data[0].errors[0].Message);\r\n \t\t\t\t\t$scope.openPopUp();\r\n \t\t\t\t\treturn false;\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t\telse {\r\n \t\t\t\t$scope.lstFlux = $scope.filterGeneral = data;\r\n \t\t\t\t$scope.Filter();\r\n \t\t\t\t$scope.flux = {};\r\n \t\t\t\t$scope.successMessage = \"Votre flux RSS a bien été enregistré\";\r\n \t\t\t}\r\n \t\t\treturn true;\r\n \t\t});\r\n \t};\r\n\r\n \t$scope.DeleteFlux = function (item) {\r\n \t\t$scope.InitMessage();\r\n \t\tfluxrssService.DeleteFlux(item.IdFluxRss, function (data, status) {\r\n \t\t\tif (status !== null) {\r\n \t\t\t\tif (status == 400)\r\n \t\t\t\t\t$scope.errorMessage = data[0].errors[0].Message;\r\n \t\t\t\telse\r\n \t\t\t\t\t$scope.errorMessage = status;\r\n \t\t\t} else {\r\n \t\t\t\t$scope.lstFlux = $scope.filterGeneral = data;\r\n \t\t\t\t$scope.flux = {};\r\n \t\t\t\t$scope.successMessage = \"Votre flux RSS a bien été supprimé\";\r\n \t\t\t}\r\n \t\t});\r\n \t};\r\n\r\n \t$scope.GetData = function (pageNo) {\r\n \t\t$scope.pageNo = pageNo;\r\n \t\t$scope.GetFlux();\r\n \t};\r\n\r\n \t$scope.Sort = function (sortKey, reverse) {\r\n \t\t$scope.data.sortKey = sortKey;\r\n \t\t$scope.data.reverse = reverse;\r\n \t\t$scope.GetFlux();\r\n \t};\r\n\r\n \t$scope.$watch(\"searchText\", function (newValue, oldValue) {\r\n \t\tif ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n \t\t\t$scope.GetFlux();\r\n \t});\r\n\r\n \t$scope.Init = function () { \t \r\n \t\t$scope.tableFluxDataVisible = colonnes.data.DataVisible.split(',');\r\n \t\t$scope.tableFluxLabels = colonnes.data.ColumnName.split(',');\r\n \t\t$scope.InitMessage();\r\n \t\t$scope.GetFlux();\r\n \t};\r\n\r\n \t$rootScope.onRefresh = function () {\r\n \t\t$scope.Init();\r\n \t};\r\n\r\n \t$scope.Init();\r\n }]);\r\n","AgrimarketControllers.controller('videoController', ['$scope', '$rootScope', '$sce', '$location', 'videoService', 'colonnes',\r\n function ($scope, $rootScope, $sce, $location, videoService, colonnes) {\r\n\r\n \tif (!$rootScope.ModuleNews.Active)\r\n \t\t$location.path('/admin/parameters/global');\r\n\r\n \t$scope.searchText = \"\";\r\n \t$scope.errorMessage = \"\";\r\n \t$scope.lstVideo = [];\r\n \t$scope.video = {};\r\n \t$scope.InitMessage = function () {\r\n \t\t$scope.errorMessage = \"\";\r\n \t\t$scope.successMessage = \"\";\r\n \t\t$scope.errorMessagePopup = \"\";\r\n \t};\r\n \t$scope.data = { reverse: false, sortKey: \"Position\" };\r\n \t$scope.pageNo = 1;\r\n \t$scope.max = 10;\r\n \r\n $scope.GetVideo = function () {\r\n videoService.GetVideoPaginateWithFilter($scope.searchText, $scope.max, $scope.pageNo, $scope.data.sortKey, $scope.data.reverse, function (data, status) {\r\n \t\t\tif (status !== null) {\r\n \t\t\t\tif (status === 400)\r\n \t\t\t\t\t$scope.errorMessage = data[0].errors[0].Message;\r\n \t\t\t\telse\r\n \t\t\t\t\t$scope.errorMessage = data;\r\n \t\t\t}\r\n \t\t\telse {\r\n $scope.lstVideo = data.ListVm;\r\n \t\t\t\t$scope.total = data.Total;\r\n \t\t\t}\r\n \t\t});\r\n \t};\r\n\r\n \t$scope.AddVideo = function (popup) {\r\n \t\t$scope.InitMessage();\r\n \t\t$scope.video = {};\r\n \t\t$scope.txtButton = \"Ajouter\";\r\n \t\t$scope.modalTitle = \"Ajouter une vidéo\";\r\n \t\tpopup();\r\n \t};\r\n\r\n \t$scope.EditVideo = function (item, index, openPoPup) {\r\n \t\t$scope.InitMessage();\r\n \t\t$scope.video = angular.copy(item);\r\n \t\t$scope.txtButton = \"Modifier\";\r\n \t\t$scope.modalTitle = \"Modifier une vidéo\";\r\n \t\topenPoPup();\r\n \t};\r\n\r\n \t$scope.CheckVideo = function () {\r\n \t\t$scope.InitMessage();\r\n if ($scope.video.Label === undefined || $scope.video.Label === null || $scope.video.Label === \"\")\r\n $scope.errorMessagePopup += \"Veuillez renseigner un nom de vidéo<br/>\";\r\n else if ($scope.video.Label.length > 20)\r\n $scope.errorMessagePopup += \"Veuillez renseigner un nom de vidéo de 20 caractères maximum<br/>\";\r\n\r\n if ($scope.video.Link === undefined || $scope.video.Link === null || $scope.video.Link === \"\")\r\n $scope.errorMessagePopup += \"Veuillez renseigner le lien du vidéo<br/>\";\r\n\r\n if ($scope.video.Position === undefined || $scope.video.Position === null || $scope.video.Position === \"\")\r\n $scope.errorMessagePopup += \"Veuillez renseigner la position du vidéo<br/>\";\r\n else if (($scope.lstVideo.length === 0 && ($scope.video.Position < 0 || $scope.video.Position > $scope.lstVideo.length + 1) ||\r\n ($scope.video.IdVideo !== undefined && $scope.lstVideo.length > 0 && ($scope.video.Position < 0 || $scope.video.Position > $scope.lstVideo.length)\r\n\t\t\t\t)))\r\n \t\t\t$scope.errorMessagePopup += \"La position doit être de 1 <br/>\";\r\n else if ($scope.lstVideo.length > 0 && ($scope.video.Position < 0 || $scope.video.Position > ($scope.lstVideo.length + 1)))\r\n \t\t\t$scope.errorMessagePopup += \"La position doit être comprise entre 1 et \" + ($scope.lstVideo.length + 1) + \"<br/>\";\r\n\r\n \t\tif ($scope.errorMessagePopup !== \"\") {\r\n \t\t\t$scope.errorMessagePopup = $sce.trustAsHtml($scope.errorMessagePopup);\r\n \t\t\treturn false;\r\n \t\t}\r\n \t\treturn true;\r\n \t};\r\n\r\n \t$scope.SaveVideo = function () {\r\n videoService.PostVideo($scope.video, function (data, status) {\r\n \t\t\tif (status !== null) {\r\n \t\t\t\tif (status == 400) {\r\n \t\t\t\t\t$scope.errorMessagePopup = $sce.trustAsHtml(data[0].errors[0].Message);\r\n \t\t\t\t\t$scope.openPopUp();\r\n \t\t\t\t\treturn false;\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t\telse {\r\n \t\t\t\t$scope.lstVideo = $scope.filterGeneral = data;\r\n \t\t\t\t$scope.Filter();\r\n $scope.video = {};\r\n $scope.successMessage = \"Votre vidéo a bien été enregistrée\";\r\n \t\t\t}\r\n \t\t\treturn true;\r\n \t\t});\r\n \t};\r\n\r\n \t$scope.DeleteVideo = function (item) {\r\n \t\t$scope.InitMessage();\r\n \t\tvideoService.DeleteVideo(item.IdVideo, function (data, status) {\r\n \t\t\tif (status !== null) {\r\n \t\t\t\tif (status == 400)\r\n \t\t\t\t\t$scope.errorMessage = data[0].errors[0].Message;\r\n \t\t\t\telse\r\n \t\t\t\t\t$scope.errorMessage = status;\r\n \t\t\t} else {\r\n \t\t\t\t$scope.lstVideo = $scope.filterGeneral = data;\r\n \t\t\t\t$scope.Filter();\r\n $scope.video = {};\r\n $scope.successMessage = \"Votre vidéo a bien été supprimé\";\r\n \t\t\t}\r\n \t\t});\r\n \t};\r\n\r\n \t$scope.GetData = function (pageNo) {\r\n \t\t$scope.pageNo = pageNo;\r\n \t\t$scope.GetVideo();\r\n \t};\r\n\r\n \t$scope.Sort = function (sortKey, reverse) {\r\n \t\t$scope.data.sortKey = sortKey;\r\n \t\t$scope.data.reverse = reverse;\r\n \t\t$scope.GetVideo();\r\n \t};\r\n\r\n \t$scope.$watch(\"searchText\", function (newValue, oldValue) {\r\n \t\tif ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n \t\t\t$scope.GetVideo();\r\n \t});\r\n\r\n $scope.Init = function () { \r\n \t\t$scope.tableVideoDataVisible = colonnes.data.DataVisible.split(',');\r\n \t\t$scope.tableVideoLabels = colonnes.data.ColumnName.split(',');\r\n \t\t$scope.InitMessage();\r\n \t\t$scope.GetVideo();\r\n \t};\r\n\r\n \t$rootScope.onRefresh = function () {\r\n \t\t$scope.Init();\r\n \t};\r\n\r\n \t$scope.Init();\r\n }]);\r\n","AgrimarketControllers.controller('contactsController', ['$scope', '$rootScope', '$sce', 'parametersService',\r\n\tfunction ($scope, $rootScope, $sce, parametersService) {\r\n\r\n\t\t$scope.lstOptionTypeContact = [];\r\n\r\n\t\t$scope.Init = function () {\r\n\t\t\tparametersService.GetParameterByKey('contactTypeDisplayedOnHomePage', function (data, status) {\r\n\t\t\t\tif (status !== null) {\r\n\t\t\t\t\tif (status == 400)\r\n\t\t\t\t\t\t$scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n\t\t\t\t}\r\n\t\t\t\telse if (data && data.PossibleLabels && data.PossibleValues) {\r\n\t\t\t\t\t$scope.parameter = data;\r\n\t\t\t\t\t\r\n\t\t\t\t\tvar tabValues = data.PossibleValues.split(';');\r\n\t\t\t\t\tvar tabLabels = data.PossibleLabels.split(';');\r\n\r\n\t\t\t\t\tfor (var i = 0; i < tabLabels.length; i++) {\r\n\t\t\t\t\t\t$scope.lstOptionTypeContact.push({ value: tabValues[i], label: tabLabels[i]});\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\r\n\t\t$scope.Init();\r\n\r\n\t\t$scope.SaveContactTypeParameter = function () {\r\n\t\t\t$scope.successMessage = \"\";\r\n\t\t\tparametersService.SaveParameterByKey(\"contactTypeDisplayedOnHomePage\", $scope.parameter.Value, function (data, status) {\r\n\t\t\t\tif (status !== null) {\r\n\t\t\t\t\tif (status === 400)\r\n\t\t\t\t\t\t$scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n\t\t\t\t}else {\r\n\t\t\t\t\t$scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.EditorialContent_Contacts_SuccessMessage.Content;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t};\r\n\t}]);\r\n","AgrimarketControllers.controller('carouselPictureController', ['$scope', '$rootScope', '$sce', '$location', 'configurationFactory', '$upload', 'carouselPictureService', 'colonnes',\r\n function ($scope, $rootScope, $sce, $location, configurationFactory, $upload, carouselPictureService, colonnes) {\r\n\r\n \tif (!$rootScope.ModuleNews.Active)\r\n \t\t$location.path('/admin/parameters/global');\r\n\r\n $scope.uploads = {};\r\n \t$scope.searchText = \"\";\r\n \t$scope.errorMessage = \"\";\r\n \t$scope.lstCarouselPicture = [];\r\n $scope.carouselPicture = {};\r\n \t$scope.InitMessage = function () {\r\n \t\t$scope.errorMessage = \"\";\r\n \t\t$scope.successMessage = \"\";\r\n \t\t$scope.errorMessagePopup = \"\";\r\n \t};\r\n \t$scope.data = { reverse: false, sortKey: \"Position\" };\r\n \t$scope.pageNo = 1;\r\n \t$scope.max = 10;\r\n \r\n $scope.GetCarouselPicture = function () {\r\n carouselPictureService.GetCarouselPicturePaginateWithFilter($scope.searchText, $scope.max, $scope.pageNo, $scope.data.sortKey, $scope.data.reverse, function (data, status) {\r\n \t\t\tif (status !== null) {\r\n \t\t\t\tif (status === 400)\r\n \t\t\t\t\t$scope.errorMessage = data[0].errors[0].Message;\r\n \t\t\t\telse\r\n \t\t\t\t\t$scope.errorMessage = data;\r\n \t\t\t}\r\n \t\t\telse {\r\n $scope.lstCarouselPicture = data.ListVm;\r\n \t\t\t\t$scope.total = data.Total;\r\n \t\t\t}\r\n \t\t});\r\n \t};\r\n\r\n $scope.AddCarouselPicture = function (popup) {\r\n $scope.InitMessage();\r\n $scope.carouselPicture = {};\r\n $scope.uploads.fileName = '';\r\n $scope.txtButton = \"Ajouter\";\r\n angular.element(\"input[type='file']\").val(null);\r\n $scope.modalTitle = \"Ajouter une image\";\r\n popup();\r\n };\r\n\r\n $scope.onFileSelect = function ($files) {\r\n $scope.carouselPicture.IdAttachment = undefined;\r\n\r\n var upload = function (i, $file) {\r\n $scope.uploads.fileName = '';\r\n $scope.uploads.percent = '';\r\n $scope.errorMessage = null;\r\n $upload.upload({\r\n url: configurationFactory.Url['Api'] + 'Upload/Upload', // webapi url\r\n method: \"POST\",\r\n params: { idAttachment: -1, fromCarousel: true },\r\n file: $file\r\n }).progress(function (evt) {\r\n // get upload percentage\r\n $scope.uploads.percent = parseInt(100.0 * evt.loaded / evt.total) + '%';\r\n }).success(function (data) {\r\n // file is uploaded successfully\r\n $scope.carouselPicture.IdAttachment = data.IdAttachment;\r\n $scope.uploads.fileName = data.PublicLabel;\r\n }).error(function (data) {\r\n $scope.errorMessagePopup = data;\r\n });\r\n };\r\n\r\n for (var i = 0; i < $files.length; i++) {\r\n var $file = $files[i];\r\n upload(i, $file);\r\n }\r\n };\r\n\r\n $scope.EditCarouselPicture = function (item, index, openPoPup) {\r\n \t\t$scope.InitMessage();\r\n $scope.carouselPicture = angular.copy(item);\r\n $scope.uploads.fileName = $scope.carouselPicture.Attachment.PublicLabel;\r\n angular.element(\"input[type='file']\").val(null);\r\n $scope.uploads.percent = \"100%\";\r\n \t\t$scope.txtButton = \"Modifier\";\r\n \t\t$scope.modalTitle = \"Modifier une image\";\r\n openPoPup();\r\n \t};\r\n\r\n $scope.CheckCarouselPicture = function () {\r\n \t\t$scope.InitMessage();\r\n if ($scope.carouselPicture.Label === undefined || $scope.carouselPicture.Label === null || $scope.carouselPicture.Label === \"\")\r\n $scope.errorMessagePopup += \"Veuillez renseigner un nom de l'image<br/>\";\r\n else if ($scope.carouselPicture.Label.length > 20)\r\n $scope.errorMessagePopup += \"Veuillez renseigner un nom de l'image de 20 caractères maximum<br/>\";\r\n\r\n if ($scope.carouselPicture.IdAttachment === undefined || $scope.carouselPicture.IdAttachment === 0 || $scope.carouselPicture.IdAttachment === \"\")\r\n $scope.errorMessagePopup += \"Veuillez inserer une image<br/>\";\r\n\r\n if ($scope.carouselPicture.Position === undefined || $scope.carouselPicture.Position === null || $scope.carouselPicture.Position === \"\")\r\n $scope.errorMessagePopup += \"Veuillez renseigner la position de l'image<br/>\";\r\n else if (($scope.lstCarouselPicture.length === 0 && ($scope.carouselPicture.Position < 0 || $scope.carouselPicture.Position > $scope.lstCarouselPicture.length + 1) ||\r\n ($scope.carouselPicture.IdCarouselPicture !== undefined && $scope.lstCarouselPicture.length > 0 && ($scope.carouselPicture.Position < 0 || $scope.carouselPicture.Position > $scope.lstCarouselPicture.length)\r\n\t\t\t\t)))\r\n \t\t\t$scope.errorMessagePopup += \"La position doit être de 1 <br/>\";\r\n else if ($scope.lstCarouselPicture.length > 0 && ($scope.carouselPicture.Position < 0 || $scope.carouselPicture.Position > ($scope.lstCarouselPicture.length + 1)))\r\n $scope.errorMessagePopup += \"La position doit être comprise entre 1 et \" + ($scope.lstCarouselPicture.length + 1) + \"<br/>\";\r\n\r\n \t\tif ($scope.errorMessagePopup !== \"\") {\r\n \t\t\t$scope.errorMessagePopup = $sce.trustAsHtml($scope.errorMessagePopup);\r\n \t\t\treturn false;\r\n \t\t}\r\n \t\treturn true;\r\n \t};\r\n\r\n $scope.SaveCarouselPicture = function () {\r\n carouselPictureService.PostCarouselPicture($scope.carouselPicture, function (data, status) {\r\n \t\t\tif (status !== null) {\r\n \t\t\t\tif (status == 400) {\r\n \t\t\t\t\t$scope.errorMessagePopup = $sce.trustAsHtml(data[0].errors[0].Message);\r\n \t\t\t\t\t$scope.openPopUp();\r\n \t\t\t\t\treturn false;\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t\telse { \r\n $scope.carouselPicture = {};\r\n $scope.successMessage = \"Votre image a bien été enregistrée\";\r\n $scope.GetCarouselPicture();\r\n \t\t\t}\r\n \t\t\treturn true;\r\n });\r\n \t};\r\n\r\n $scope.DeleteCarouselPicture = function (item) {\r\n \t\t$scope.InitMessage();\r\n carouselPictureService.DeleteCarouselPicture(item.IdCarouselPicture, function (data, status) {\r\n \t\t\tif (status !== null) {\r\n \t\t\t\tif (status == 400)\r\n \t\t\t\t\t$scope.errorMessage = data[0].errors[0].Message;\r\n \t\t\t\telse\r\n \t\t\t\t\t$scope.errorMessage = status;\r\n \t\t\t} else {\r\n $scope.carouselPicture = {};\r\n $scope.successMessage = \"Votre image a bien été supprimé\";\r\n $scope.GetCarouselPicture();\r\n \t\t\t}\r\n }); \r\n \t};\r\n\r\n\r\n \t$scope.GetData = function (pageNo) {\r\n \t\t$scope.pageNo = pageNo;\r\n $scope.GetCarouselPicture();\r\n \t};\r\n\r\n \t$scope.Sort = function (sortKey, reverse) {\r\n \t\t$scope.data.sortKey = sortKey;\r\n \t\t$scope.data.reverse = reverse;\r\n $scope.GetCarouselPicture();\r\n \t};\r\n\r\n \t$scope.$watch(\"searchText\", function (newValue, oldValue) {\r\n \t\tif ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetCarouselPicture();\r\n \t});\r\n\r\n $scope.Init = function () { \r\n $scope.tableCarouselPictureDataVisible = colonnes.data.DataVisible.split(',');\r\n $scope.tableCarouselPictureLabels = colonnes.data.ColumnName.split(',');\r\n \t\t$scope.InitMessage();\r\n $scope.GetCarouselPicture();\r\n \t};\r\n\r\n \t$rootScope.onRefresh = function () {\r\n \t\t$scope.Init();\r\n \t};\r\n\r\n \t$scope.Init();\r\n }]);\r\n","AgrimarketControllers.controller('contentsController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', '$http', '$location', 'contentService', 'currentUserFactory', 'configurationFactory', '$log', '$timeout', 'enumFactory',\r\n function ($scope, $rootScope, $routeParams, $sce, $filter, $http, $location, contentService, currentUserFactory, configurationFactory, $log, $timeout, enumFactory) {\r\n\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.profileOption = [];\r\n $scope.profileOptionGroupUser = [];\r\n $scope.loading = false;\r\n $scope.isGroupUser = false;\r\n $scope.isUserRole = false;\r\n\r\n var GetProfiles = function () {\r\n contentService.GetProfiles(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n if (data !== undefined && data !== null) {\r\n $scope.profileOption = data.ProfilesList;\r\n $scope.profileOptionGroupUser = data.ProfilesGroupUser;\r\n\r\n } else {\r\n $scope.errorMessage = \"Aucun profil n'a été trouvé en base de données\";\r\n }\r\n }\r\n });\r\n };\r\n\r\n var GetContentGroupLabel = function (item) {\r\n var groupContactLabelFind;\r\n if ($scope.profileOptionGroupUser.length > 0)\r\n $scope.profileOptionGroupUser.forEach(function (groupContact) {\r\n if (groupContact.Value == item)\r\n groupContactLabelFind = groupContact.Name;\r\n });\r\n return groupContactLabelFind;\r\n };\r\n\r\n $scope.profilSelected = 0;\r\n $scope.profilDico = \"Gnrl_\" + 0;\r\n var initMenu = function () {\r\n getListIcoName();\r\n $scope.menu = {};\r\n $scope.menu.IdMenu = -1;\r\n $scope.menu.IdProfile = -1;\r\n $scope.menu.IcoName = \"\";\r\n $scope.menu.Pages = [];\r\n $scope.action = \"Ajouter\";\r\n $scope.Title = \"Ajouter un menu\";\r\n $scope.LabelButton = \"Ajouter\";\r\n initMenuMessage();\r\n $scope.indexSelected = null;\r\n };\r\n\r\n var initMenuMessage = function () {\r\n $scope.errorMenuMessage = \"\";\r\n $scope.successMenuMessage = \"\";\r\n $scope.errorMenuMessageHtml = \"\";\r\n $scope.errorMessage = \"\";\r\n };\r\n\r\n var init = function () {\r\n initMenu();\r\n GetProfiles();\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.profilSelected = 0;\r\n $scope.profilDico = \"Gnrl_\" + 0;\r\n if ($rootScope.resetMenu === undefined) { // si on c'est la première fois qu'on arrive sur la page\r\n $rootScope.contents = [];\r\n contentService.GetContents(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data !== undefined && data !== null) {\r\n $rootScope.contents = data;\r\n reloadContent();\r\n $rootScope.showDetails = [];\r\n\r\n contentService.LoadAllGroupContact(function (dataGp, statusGp) {\r\n if (statusGp !== null) {\r\n if (statusGp === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(dataGp[0].errors[0].Message);\r\n } else {\r\n var groupContactToSearch = dataGp;\r\n $rootScope.contents.forEach(function (item, index) {\r\n var isGroupcontactLabel = false;\r\n //Menu Item\r\n if (item.IdGroupContacts && item.IdRoles) {\r\n if ((item.IdGroupContacts.length === 0 && item.IdRoles.length === 0) || item.IdGroupContacts.length > 1 || item.IdRoles.length > 1) {\r\n $rootScope.contents[index].ProfilLabel = \"Tous\";\r\n } else {\r\n groupContactToSearch.forEach(function (itemGp) {\r\n if (itemGp.IdGroupContact == item.IdGroupContacts[0]) {\r\n $rootScope.contents[index].ProfilLabel = itemGp.FullName;\r\n isGroupcontactLabel = true;\r\n }\r\n });\r\n if (!isGroupcontactLabel) {\r\n if (item.IdRoles[0] == enumFactory.Roles.User) {\r\n $rootScope.contents[index].ProfilLabel = \"Agriculteur\";\r\n } else {\r\n $rootScope.contents[index].ProfilLabel = \"TC\";\r\n }\r\n }\r\n }\r\n }\r\n //Page Item\r\n if (item.Pages && item.Pages.length > 0){\r\n item.Pages.forEach(function (itemPage, indexPage) {\r\n isGroupcontactLabel = false;\r\n if (itemPage.IdRoles && itemPage.IdGroupContacts) {\r\n if ((itemPage.IdGroupContacts.length === 0 && itemPage.IdRoles.length === 0) || itemPage.IdGroupContacts.length > 1 || itemPage.IdRoles.length > 1)\r\n $rootScope.contents[index].Pages[indexPage].ProfilLabel = \"Tous\";\r\n else {\r\n groupContactToSearch.forEach(function (itemPageGp) {\r\n if (itemPageGp.IdGroupContact == itemPage.IdGroupContacts[0]) {\r\n $rootScope.contents[index].Pages[indexPage].ProfilLabel = itemPageGp.FullName;\r\n isGroupcontactLabel = true;\r\n }\r\n });\r\n if (!isGroupcontactLabel) {\r\n if (itemPage.IdRoles[0] == enumFactory.Roles.User)\r\n $rootScope.contents[index].Pages[indexPage].ProfilLabel = \"Agriculteur\";\r\n else {\r\n $rootScope.contents[index].Pages[indexPage].ProfilLabel = \"TC\";\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n \r\n $rootScope.showDetails[index] = false;\r\n });\r\n }\r\n });\r\n }\r\n }\r\n });\r\n } else {\r\n $rootScope.resetMenu = undefined;\r\n }\r\n };\r\n\r\n var reloadContent = function () {\r\n if ($rootScope.contents !== undefined && $rootScope.contents !== null) {\r\n $rootScope.contents = $filter('orderBy')($rootScope.contents, \"Position\");\r\n\r\n $rootScope.contents.forEach(function (item) {\r\n item.Pages = $filter('orderBy')(item.Pages, \"Position\");\r\n });\r\n }\r\n };\r\n\r\n $scope.ChangeHomeDefault = function (indexMenu, indexPage) {\r\n $rootScope.contents[indexMenu].Pages.forEach(function (page, index) {\r\n if (index == indexPage) {\r\n page.HomeDefault = true;\r\n } else {\r\n page.HomeDefault = false;\r\n }\r\n });\r\n };\r\n\r\n $scope.ChangePosition = function (positionarray) {\r\n if (positionarray.End == positionarray.Start)\r\n return false;\r\n\r\n var result = angular.copy($rootScope.contents);\r\n var detail = [];\r\n\r\n positionarray.End.forEach(function (item, indexM) {\r\n var menuPos = JSON.parse(item);\r\n result[menuPos.menuId].Position = indexM + 1;\r\n detail[indexM] = $rootScope.showDetails[menuPos.menuId];\r\n\r\n result[menuPos.menuId].Pages = [];\r\n\r\n if (menuPos.children !== undefined && menuPos.children !== null) {\r\n menuPos.children.forEach(function (pagePos, indexP) {\r\n var separator = pagePos.pageId.indexOf('_');\r\n var indexPage = parseInt(pagePos.pageId.substring(separator + 1));\r\n var indexMenu = parseInt(pagePos.pageId.substring(0, separator));\r\n var page = angular.copy($rootScope.contents[indexMenu].Pages[indexPage]);\r\n page.Position = indexP + 1;\r\n\r\n //on doit decocher la page par defaut si celle-ci change de menu afin d'avoir toujours une seule page par defaut par menu\r\n if (indexMenu != menuPos.menuId) {\r\n page.HomeDefault = false;\r\n }\r\n\r\n result[menuPos.menuId].Pages.push(page);\r\n });\r\n }\r\n });\r\n\r\n $rootScope.contents = result;\r\n $rootScope.showDetails = detail;\r\n reloadContent();\r\n $scope.$apply();\r\n\r\n return true;\r\n };\r\n\r\n $scope.SavePosition = function () {\r\n $scope.loading = true;\r\n initMenuMessage();\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n contentService.SavePosition($rootScope.contents, function (data, status) {\r\n if (status !== null) {\r\n $scope.loading = false;\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.loading = false;\r\n $scope.successMessage = \"Modifications enregistrées\";\r\n }\r\n });\r\n };\r\n\r\n $scope.ChangeIcoName = function (index, icoNameOv) {\r\n $scope.menu.IcoName = icoNameOv;\r\n $rootScope.listIcoName.forEach(function (item, indexIco) {\r\n if (index == indexIco) {\r\n item.IsChecked = true;\r\n } else {\r\n item.IsChecked = false;\r\n }\r\n });\r\n };\r\n\r\n $scope.UpdateRoleAndGroupUser = function () {\r\n $scope.menu.IdRoles = [];\r\n $scope.menu.IdGroupContacts = [];\r\n $scope.menu.ProfilLabel = $filter('filter')($scope.profileOption, { Value: $scope.menu.IdProfile }, true)[0].Name;\r\n if ($scope.menu.IdProfile === \"Gnrl_\" + 0) {\r\n $scope.menu.IdRoles.push(0);\r\n $scope.menu.IdGroupContacts.push(0);\r\n } else {\r\n if ($scope.menu.IdProfile == \"User_\" + enumFactory.Roles.User)\r\n $scope.menu.IdRoles.push(enumFactory.Roles.User);\r\n else {\r\n if ($scope.menu.IdProfile == \"User_\" + enumFactory.Roles.TC)\r\n $scope.menu.IdRoles.push(enumFactory.Roles.TC);\r\n else\r\n $scope.menu.IdGroupContacts.push(parseInt($scope.menu.IdProfile.split(\"_\")[1]));\r\n }\r\n }\r\n };\r\n\r\n var getListIcoName = function () {\r\n $rootScope.listIcoName = [];\r\n $rootScope.listIcoName.push({ Num: 1, IcoName: \"ico-dashboard\", IcoNameOver: \"ico-dashboard\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 2, IcoName: \"ico-gear\", IcoNameOver: \"ico-gear\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 3, IcoName: \"ico-labels\", IcoNameOver: \"ico-offers\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 4, IcoName: \"ico-calculator\", IcoNameOver: \"ico-simulation\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 5, IcoName: \"ico-help\", IcoNameOver: \"ico-help\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 6, IcoName: \"ico-edition\", IcoNameOver: \"ico-edition-mode\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 7, IcoName: \"ico-contracts\", IcoNameOver: \"ico-contracts\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 8, IcoName: \"ico-content-edit\", IcoNameOver: \"ico-edition-contenu\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 9, IcoName: \"ico-commitments\", IcoNameOver: \"icon-commitments\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 10, IcoName: \"ico-simple-group-2\", IcoNameOver: \"ico-benchmark\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 11, IcoName: \"ico-alert\", IcoNameOver: \"ico-alerts\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 12, IcoName: \"ico-card\", IcoNameOver: \"ico-agri\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 13, IcoName: \"ico-quit\", IcoNameOver: \"ico-deconnection\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 14, IcoName: \"ico-person\", IcoNameOver: \"ico-admin\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 15, IcoName: \"ico-check-2\", IcoNameOver: \"ico-check\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 16, IcoName: \"ico-commodities\", IcoNameOver: \"ico-commodities\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 17, IcoName: \"ico-customers\", IcoNameOver: \"ico-customers\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 18, IcoName: \"ico-talk\", IcoNameOver: \"ico-dialog\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 19, IcoName: \"ico-favicon\", IcoNameOver: \"ico-favorites\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 20, IcoName: \"ico-graf-3\", IcoNameOver: \"ico-graf\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 21, IcoName: \"ico-graf\", IcoNameOver: \"ico-graf2\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 22, IcoName: \"ico-info\", IcoNameOver: \"ico-info\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 23, IcoName: \"ico-alert-3\", IcoNameOver: \"ico-warning\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 24, IcoName: \"ico-packet\", IcoNameOver: \"ico-appros\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 25, IcoName: \"ico-graf-2\", IcoNameOver: \"ico-quotes\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 26, IcoName: \"ico-euro\", IcoNameOver: \"ico-comptes\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 27, IcoName: \"ico-grape-leaf\", IcoNameOver: \"ico-grape-leaf\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 28, IcoName: \"ico-weather\", IcoNameOver: \"ico-weather\", IsChecked: false });\r\n\r\n if ($rootScope.paramIsSynoaCoop) {\r\n $rootScope.listIcoName.push({ Num: 29, IcoName: \"ico-synoa\", IcoNameOver: \"ico-synoa\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 30, IcoName: \"ico-sso-nutrition-animale\", IcoNameOver: \"ico-sso-nutrition-animale\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 31, IcoName: \"ico-synoaContracts\", IcoNameOver: \"ico-synoaContracts\", IsChecked: false });\r\n }\r\n if ($rootScope.paramNameCoop == enumFactory.Coops.Creully) {\r\n $rootScope.listIcoName.push({ Num: 32, IcoName: \"ico-creully-1\", IcoNameOver: \"ico-creully-1\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 33, IcoName: \"ico-creully-2\", IcoNameOver: \"ico-creully-2\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 34, IcoName: \"ico-creully-3\", IcoNameOver: \"ico-creully-3\", IsChecked: false });\r\n $rootScope.listIcoName.push({ Num: 35, IcoName: \"ico-creully-4\", IcoNameOver: \"ico-creully-4\", IsChecked: false });\r\n }\r\n\r\n };\r\n\r\n $scope.cancelMenu = function () {\r\n initMenu();\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n };\r\n\r\n $scope.checkMenu = function () {\r\n\r\n $scope.errorMenuMessage = \"\";\r\n $scope.successMenuMessage = \"\";\r\n $scope.errorMenuMessageHtml = \"\";\r\n\r\n if ($scope.menu.IdProfile === undefined || $scope.menu.IdProfile === \"\" || $scope.menu.IdProfile === null || $scope.menu.IdProfile == -1)\r\n $scope.errorMenuMessage += \"Veuillez sélectionner un profil. <br/>\";\r\n\r\n if ($scope.menu.Label === undefined || $scope.menu.Label === \"\" || $scope.menu.Label === null)\r\n $scope.errorMenuMessage += \"Veuillez renseigner un nom. <br/>\";\r\n else if ($scope.menu.Label.length > 50)\r\n $scope.errorMenuMessage += \"Veuillez renseigner un nom de 50 caractères maximum. <br/>\";\r\n\r\n if ($scope.menu.IcoName === undefined || $scope.menu.IcoName === \"\" || $scope.menu.IcoName === null)\r\n $scope.errorMenuMessage += \"Veuillez sélectionner un pictogramme. <br/>\";\r\n\r\n if ($scope.errorMenuMessage !== \"\") {\r\n $scope.errorMenuMessageHtml = $sce.trustAsHtml($scope.errorMenuMessage);\r\n return false;\r\n }\r\n $scope.saveMenu();\r\n return true;\r\n };\r\n\r\n $scope.editElement = function (index) {\r\n var element = $rootScope.contents[index];\r\n if (element.IdMenu)\r\n $scope.editMenu(index);\r\n else\r\n $scope.EditPage(-1, index);\r\n };\r\n\r\n $scope.editMenu = function (index) {\r\n initMenuMessage();\r\n $scope.menu = {};\r\n $scope.action = \"Modifier\";\r\n $scope.Title = \"Modifier un menu\";\r\n $scope.LabelButton = \"Modifier\";\r\n $scope.indexSelected = index;\r\n $scope.menu = angular.copy($rootScope.contents[index]);\r\n \r\n var itemFilter = $filter('filter')($rootScope.listIcoName, { \"IcoName\": $scope.menu.IcoName }, true)[0];\r\n $scope.ChangeIcoName(itemFilter.Num - 1, $scope.menu.IcoName);\r\n\r\n if (($scope.menu.IdRoles.length > 1 || $scope.menu.IdGroupContacts.length > 1) || ($scope.menu.IdRoles.length === 0 && $scope.menu.IdGroupContacts.length === 0))\r\n $scope.menu.IdProfile = \"Gnrl_\" + 0;\r\n else {\r\n if ($scope.menu.IdRoles.length == 1) {\r\n $scope.menu.IdProfile = \"User_\" + $scope.menu.IdRoles[0];\r\n } else {\r\n if ($scope.menu.IdGroupContacts.length == 1) {\r\n $scope.menu.IdProfile = \"GroupUser_\" + $scope.menu.IdGroupContacts[0];\r\n }\r\n }\r\n }\r\n };\r\n\r\n $scope.saveMenu = function () {\r\n\r\n $scope.UpdateRoleAndGroupUser();\r\n\r\n if ($scope.action === \"Ajouter\" && $rootScope.contents !== null && $rootScope.contents !== undefined && $rootScope.contents.length >= 8)\r\n $scope.errorMenuMessageHtml = $sce.trustAsHtml(\"Il est impossible d'ajouter plus de 8 menus.\");\r\n else {\r\n var action = $scope.action;\r\n\r\n if (action === \"Ajouter\") {\r\n $scope.menu.Position = $rootScope.contents.length + 1;\r\n $rootScope.contents.push($scope.menu);\r\n initMenu();\r\n $scope.successMenuMessage = \"Votre menu a bien été pris en compte.\";\r\n } else {\r\n $rootScope.contents[$scope.indexSelected] = angular.copy($scope.menu);\r\n initMenu();\r\n $scope.successMenuMessage = \"Vos modifications ont bien été prises en compte.\";\r\n }\r\n\r\n reloadContent();\r\n }\r\n };\r\n\r\n $scope.DeleteContent = function (index, openPopUp, modalTitle, type, indexParent) {\r\n initMenu();\r\n $scope.modalTitle = modalTitle;\r\n $scope.indexSelected = index;\r\n $scope.indexParent = indexParent;\r\n $scope.typeDeleted = type;\r\n\r\n if ($scope.typeDeleted === \"Menu\") {\r\n $scope.textPopUpDelete = \"Êtes-vous sûr de vouloir supprimer ce menu ?\";\r\n $scope.menuDelete = angular.copy($rootScope.contents[index]);\r\n }\r\n else {\r\n $scope.textPopUpDelete = \"Êtes-vous sûr de vouloir supprimer cette page ?\";\r\n }\r\n openPopUp();\r\n };\r\n\r\n $scope.ConfirmPosition = function (openPopUp, modalTitle) {\r\n var showPopUp = false;\r\n $rootScope.contents.forEach(function (item) {\r\n if (item.Pages && item.Pages.length > 0) {\r\n if (item.IdRoles.length == 1) { //Si on a qu'un seul rôle dans la liste on regarde si les pages ont le même rôle sinon on affichera une pop-up\r\n var idRoleMenu = item.IdRoles[0];\r\n item.Pages.forEach(function (itemPage) {\r\n if (itemPage.IdRoles.length > 0 && $.inArray(idRoleMenu, itemPage.IdRoles) == -1) {//Si la page à un role qui n'est pas celui du menu \r\n showPopUp = true;\r\n }\r\n });\r\n }//group utilisateur\r\n else if (item.IdGroupContacts.length == 1) { //Si on a qu'un seul GroupContact dans la liste on regarde si les pages ont le même GroupContact sinon on affichera une pop-up\r\n var idGroupContactMenu = item.IdGroupContacts[0];\r\n item.Pages.forEach(function (itemPage) {\r\n if (itemPage.IdGroupContacts.length > 0 && $.inArray(idGroupContactMenu, itemPage.IdGroupContacts) == -1) {//Si la page à un groupContact qui n'est pas celui du menu \r\n showPopUp = true;\r\n }\r\n });\r\n }\r\n }\r\n });\r\n if (!showPopUp) {\r\n $scope.SavePosition();\r\n }\r\n else {\r\n initMenu();\r\n $scope.modalTitle = modalTitle;\r\n $scope.textPopUpConfirm = \"Certaines pages ont un profil différent du menu dans lequel elles se situent. Êtes-vous sûr de vouloir sauvegarder ces positions ?\";\r\n openPopUp();\r\n }\r\n };\r\n\r\n $scope.DeleteConfContent = function () {\r\n if ($scope.typeDeleted === \"Menu\") {\r\n if ($scope.menuDelete.Pages !== null && $scope.menuDelete.Pages !== undefined && $scope.menuDelete.Pages.length > 0) {\r\n $scope.errorMessage = $sce.trustAsHtml(\"Impossible de supprimer ce menu car il est lié à une ou plusieurs pages.\");\r\n }\r\n else {\r\n $rootScope.contents.splice($scope.indexSelected, 1);\r\n $rootScope.contents.forEach(function (item, index) {\r\n $rootScope.contents[index].Position = index + 1;\r\n });\r\n reloadContent();\r\n }\r\n }\r\n else {\r\n $rootScope.contents[$scope.indexParent].Pages.splice($scope.indexSelected, 1);\r\n $rootScope.contents[$scope.indexParent].Pages.forEach(function (item, index) {\r\n $rootScope.contents[$scope.indexParent].Pages[index].Position = index + 1;\r\n });\r\n reloadContent();\r\n }\r\n };\r\n\r\n $scope.SubId = function (item) {\r\n $scope.isUserRole = false;\r\n $scope.isGroupUser = false;\r\n\r\n if (item.split(\"_\")[0] === \"GroupUser\")\r\n $scope.isGroupUser = true;\r\n else if (item.split(\"_\")[0] == \"User\")\r\n $scope.isUserRole = true;\r\n\r\n $scope.profilSelected = parseInt(item.split(\"_\")[1]);\r\n };\r\n\r\n $scope.AddPage = function () {\r\n $location.path('/admin/contents/content/savePage/-1/-1');\r\n };\r\n $scope.EditPage = function (indexMenu, indexPage) {\r\n $location.path('/admin/contents/content/savePage/' + indexMenu + '/' + indexPage);\r\n };\r\n\r\n if (!$rootScope.ModuleNews.Active)\r\n $location.path('/admin/parameters/global');\r\n\r\n init();\r\n\r\n }]);\r\n","AgrimarketControllers.controller('savePageController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', '$http', '$location', 'enumFactory', 'contentService', 'configurationFactory',\r\n function ($scope, $rootScope, $routeParams, $sce, $filter, $http, $location, enumFactory, contentService, configurationFactory) {\r\n\r\n $scope.indexPage = $routeParams.indexPage;\r\n $scope.indexMenuOrigine = $routeParams.indexMenu == -1 ? undefined : +$routeParams.indexMenu;\r\n $scope.roles = enumFactory.Roles;\r\n $scope.profils = enumFactory.Profiles;\r\n $scope.enumTypePage = enumFactory.TypePages;\r\n $scope.enumTypePageAccess = enumFactory.TypePageAccess;\r\n $rootScope.resetMenu = false;\r\n $scope.profileOptionPage = [];\r\n $scope.typePages = [];\r\n $scope.typePageAccess = [];\r\n $scope.menus = angular.copy($rootScope.contents);\r\n if ($scope.menus) {\r\n $scope.menus.forEach(function (m, index){\r\n m.IndexMenuOrigin = index;\r\n });\r\n }\r\n $scope.menus = $filter('filter')($scope.menus, function(m){ return m.IdMenu; }, true);\r\n\r\n var GetDatasForPageContent = function () {\r\n contentService.GetDatasForPageContent(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data !== undefined && data !== null) {\r\n $scope.profileOptionPage = data.profiles.ProfilesList;\r\n $scope.profileOptionFilter = angular.copy($scope.profileOptionPage);\r\n $scope.typePages = data.typePages;\r\n $scope.typePageAccess = data.typePagesAccess;\r\n $scope.urlTags = data.urlTags;\r\n }\r\n }\r\n });\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n Init();\r\n };\r\n\r\n var InitMessage = function () {\r\n $scope.pageErrorMessage = \"\";\r\n };\r\n\r\n $scope.ChangeIcoName = function (index, icoNameOv) {\r\n $scope.page.IcoName = icoNameOv;\r\n $rootScope.listIcoName.forEach(function (item, indexIco) {\r\n item.IsChecked = index == indexIco;\r\n });\r\n };\r\n\r\n var Init = function () {\r\n InitMessage();\r\n if ($scope.indexPage === undefined || $scope.indexPage === null || $scope.indexPage === \"-1\") { //nouvelle page\r\n $scope.blocTitle = \"Création d'une page de contenu\";\r\n $scope.page = { Publied: \"true\", IdTypePage: $scope.enumTypePage.Content };\r\n } else { //modifier une page\r\n $scope.blocTitle = \"Modification d'une page de contenu\";\r\n $scope.page = $scope.indexMenuOrigine || $scope.indexMenuOrigine === 0 ? angular.copy($rootScope.contents[$scope.indexMenuOrigine].Pages[$scope.indexPage]) : angular.copy($rootScope.contents[$scope.indexPage]);\r\n $scope.page.Publied = $scope.page.Publied ? \"true\" : \"false\";\r\n $scope.page.IndexMenu = $scope.indexMenuOrigine;\r\n if (($scope.page.IdRoles.length > 1 || $scope.page.IdGroupContacts.length > 1) || ($scope.page.IdRoles.length === 0 && $scope.page.IdGroupContacts.length === 0)) {\r\n $scope.page.IdProfile = \"Gnrl_\" + 0;\r\n } else {\r\n //Profil user\r\n if ($scope.page.IdRoles.length == 1)\r\n $scope.page.IdProfile = \"User_\" + $scope.page.IdRoles[0];\r\n else {\r\n //group User\r\n if ($scope.page.IdGroupContacts.length == 1)\r\n $scope.page.IdProfile = \"GroupUser_\" + $scope.page.IdGroupContacts[0];\r\n }\r\n }\r\n var itemFilter = $filter('filter')($rootScope.listIcoName, { \"IcoName\": $scope.page.IcoName }, true)[0];\r\n if (itemFilter) {\r\n $scope.ChangeIcoName(itemFilter.Num - 1, $scope.page.IcoName);\r\n }\r\n }\r\n GetDatasForPageContent();\r\n for (i = 0; i < $rootScope.showDetails.length; ++i) $rootScope.showDetails[i] = false;\r\n };\r\n\r\n $scope.AddTag = function () {\r\n $scope.page.UrlLink += $scope.tagselected;\r\n };\r\n\r\n $scope.UploadImage = function (data) {\r\n CKEDITOR.instances.Content.insertHtml(\"<img src='\" + $filter('uploadLinkInline')(data.PrivateLabel) + \"'>\");\r\n };\r\n\r\n $scope.UploadAttachments = function (data) { \r\n CKEDITOR.instances.Content.insertHtml(\"{{Attachment|\" + data.IdAttachment + \"|\" + $scope.fileName + \"}}\");\r\n };\r\n\r\n $scope.SavePage = function () {\r\n InitMessage();\r\n if (!$scope.page.IdProfile)\r\n $scope.pageErrorMessage += \"Veuillez renseigner le profil concerné.<br/>\";\r\n else {\r\n $scope.page.IdRoles = [];\r\n $scope.page.IdGroupContacts = [];\r\n $scope.page.ProfilLabel = $filter('filter')($scope.profileOptionPage, { Value: $scope.page.IdProfile }, true)[0].Name;\r\n \r\n if ($scope.page.IdProfile === \"Gnrl_\" + 0) {\r\n $scope.page.IdRoles.push(0);\r\n $scope.page.IdGroupContacts.push(0);\r\n } else {\r\n if ($scope.page.IdProfile === \"User_\" + $scope.roles.User)\r\n $scope.page.IdRoles.push($scope.roles.User);\r\n else {\r\n if ($scope.page.IdProfile === \"User_\" + $scope.roles.TC)\r\n $scope.page.IdRoles.push($scope.roles.TC);\r\n else\r\n $scope.page.IdGroupContacts.push(parseInt($scope.page.IdProfile.split(\"_\")[1]));\r\n }\r\n }\r\n }\r\n \r\n if (!$scope.page.Label)\r\n $scope.pageErrorMessage += \"Veuillez renseigner un titre.<br/>\";\r\n\r\n if ($scope.page.IdTypePage == $scope.enumTypePage.DirectUrl && $scope.page.AvailableOnWebSite && !$scope.page.IdTypePageAccess)\r\n $scope.pageErrorMessage += \"Veuillez renseigner un type d'accès.<br/>\";\r\n\r\n if ($scope.page.IdTypePage == $scope.enumTypePage.DirectUrl && (!$scope.page.UrlLink || !$scope.page.UrlLink.trim()))\r\n $scope.pageErrorMessage += \"Veuillez renseigner un lien URL.<br/>\";\r\n \r\n if ($scope.page.IndexMenu === null || $scope.page.IndexMenu === undefined || +$scope.page.IndexMenu === -1) { // Si page sans menu\r\n $scope.page.IdMenu = null;\r\n\r\n if (!$scope.page.IcoName)\r\n $scope.pageErrorMessage += \"Veuillez sélectionner un pictogramme.<br/>\";\r\n }\r\n else\r\n $scope.page.AvailableOnApp = false;\r\n\r\n if ($scope.page.IdTypePage == $scope.enumTypePage.Content)\r\n $scope.page.IdTypePageAccess = null;\r\n else if ($scope.page.IdTypePage == $scope.enumTypePage.DirectUrl && $scope.page.IdTypePageAccess == $scope.enumTypePageAccess.Page)\r\n $scope.page.TargetLink = \"_blank\";\r\n\r\n if ($scope.pageErrorMessage !== \"\") {\r\n $scope.pageErrorMessage = $sce.trustAsHtml($scope.pageErrorMessage);\r\n return false;\r\n }\r\n\r\n $scope.page.Publied = $scope.page.Publied == \"true\";\r\n\r\n if ($scope.indexPage === undefined || $scope.indexPage === null || $scope.indexPage === \"-1\") { // nouvelle page\r\n if ($scope.page.IndexMenu || $scope.page.IndexMenu === 0) {\r\n $scope.page.Position = $rootScope.contents[$scope.page.IndexMenu].Pages.length + 1;\r\n $rootScope.contents[$scope.page.IndexMenu].Pages.push($scope.page);\r\n $rootScope.showDetails[$scope.page.IndexMenu] = true;\r\n }\r\n else {\r\n $scope.page.Position = $rootScope.contents.length + 1;\r\n $rootScope.contents.push($scope.page);\r\n }\r\n }\r\n else { // edition de page\r\n if ($scope.indexMenuOrigine === $scope.page.IndexMenu) { // si on a pas changé le menu de la page\r\n if ($scope.page.IndexMenu || $scope.page.IndexMenu === 0) {\r\n $rootScope.contents[$scope.indexMenuOrigine].Pages[$scope.indexPage] = $scope.page;\r\n $rootScope.showDetails[$scope.indexMenuOrigine] = true;\r\n }\r\n else\r\n $rootScope.contents[$scope.indexPage] = $scope.page;\r\n }\r\n else { // si le menu de la page a changé\r\n if ($scope.page.IndexMenu || $scope.page.IndexMenu === 0) {\r\n $scope.page.Position = $rootScope.contents[$scope.page.IndexMenu].Pages.length + 1;\r\n $rootScope.contents[$scope.page.IndexMenu].Pages.push($scope.page);\r\n var newContentIndex = !$scope.indexMenuOrigine && $scope.indexPage < $scope.page.IndexMenu ? $scope.page.IndexMenu-1 : $scope.page.IndexMenu;\r\n $rootScope.showDetails[newContentIndex] = true;\r\n }\r\n else {\r\n $scope.page.Position = $rootScope.contents.length + 1;\r\n $rootScope.contents.push($scope.page);\r\n }\r\n\r\n if ($scope.indexMenuOrigine)\r\n $rootScope.contents[$scope.indexMenuOrigine].Pages.splice($scope.indexPage, 1);\r\n else\r\n $rootScope.contents.splice($scope.indexPage, 1);\r\n }\r\n }\r\n\r\n $scope.Cancel();\r\n return true;\r\n };\r\n\r\n $scope.$watch('page.IndexMenu + profileOptionPage', function () {\r\n if (!$scope.profileOptionFilter) return;\r\n\r\n var filterGeneral = angular.copy($scope.profileOptionFilter);\r\n\r\n if ($scope.page.IndexMenu === null || $scope.page.IndexMenu === undefined || +$scope.page.IndexMenu === -1){ // sans menu\r\n if ($scope.profileOptionPage.length !== filterGeneral.length)\r\n $scope.profileOptionPage = filterGeneral;\r\n if ($scope.indexPage === undefined || $scope.indexPage === null || $scope.indexPage === \"-1\" || $filter('filter')($scope.profileOptionPage, {Value: $scope.page.IdProfile}, true)[0] === undefined)\r\n $scope.page.IdProfile = \"Gnrl_\" + 0;\r\n }\r\n else {\r\n if (($rootScope.contents[$scope.page.IndexMenu].IdRoles.length > 0 && $rootScope.contents[$scope.page.IndexMenu].IdGroupContacts.length > 0) || ($rootScope.contents[$scope.page.IndexMenu].IdRoles.length === 0 && $rootScope.contents[$scope.page.IndexMenu].IdGroupContacts.length === 0) || $rootScope.contents[$scope.page.IndexMenu].IdRoles.length > 1) {\r\n $scope.profileOptionPage = filterGeneral;\r\n if ($scope.indexPage === undefined || $scope.indexPage === null || $scope.indexPage === \"-1\" || $filter('filter')($scope.profileOptionPage, {Value: $scope.page.IdProfile}, true)[0] === undefined)\r\n $scope.page.IdProfile = \"Gnrl_\" + 0;\r\n }\r\n else {\r\n if ($rootScope.contents[$scope.page.IndexMenu].IdRoles.length > 0) {\r\n \r\n if ($rootScope.contents[$scope.page.IndexMenu].IdRoles[0] === $scope.roles.User) {\r\n $scope.profileOptionPage = angular.copy(filterGeneral.filter(function (element) { return element.Value !== \"User_\" + $scope.roles.TC && element.Value !== \"Gnrl_\" + 0; }));\r\n }\r\n else {\r\n $scope.profileOptionPage = angular.copy(filterGeneral.filter(function (element) {\r\n return element.Value === \"User_\" + $scope.roles.TC;\r\n }));\r\n }\r\n if ($scope.indexPage === undefined || $scope.indexPage === null || $scope.indexPage === \"-1\" || $filter('filter')($scope.profileOptionPage, { Value: $scope.page.IdProfile }, true)[0] === undefined)\r\n $scope.page.IdProfile = \"User_\" + $rootScope.contents[$scope.page.IndexMenu].IdRoles[0];\r\n } else {\r\n $scope.page.IdProfile = \"GroupUser_\" + $rootScope.contents[$scope.page.IndexMenu].IdGroupContacts[0];\r\n $scope.profileOptionPage = angular.copy(filterGeneral.filter(function (element) { return element.Value === \"GroupUser_\" + $rootScope.contents[$scope.page.IndexMenu].IdGroupContacts[0]; }));\r\n }\r\n }\r\n }\r\n });\r\n\r\n $scope.Cancel = function () {\r\n $location.path('/admin/contents/content');\r\n };\r\n\r\n Init();\r\n }]);\r\n","AgrimarketControllers.controller('manageUsersController', ['$scope', '$rootScope', '$sce', '$filter', '$location', 'colonnes', 'userService', 'groupContactService', 'enumFactory', 'dateService', 'productsService', 'modulesFactory', 'compagnyService', '$timeout', 'configurationFactory',\r\n function ($scope, $rootScope, $sce, $filter, $location, colonnes, userService, groupContactService, enumFactory, dateService, productsService, modulesFactory, compagnyService, $timeout, configurationFactory) {\r\n\r\n $rootScope.lstUsersToMail = [];\r\n $scope.errorMessage = \"\";\r\n $scope.searchText = \"\";\r\n $scope.PopupDetailUserTitle = \"\";\r\n $scope.currentUser = {};\r\n $scope.max = 10;\r\n $scope.pageNo = 1;\r\n $scope.isActif = enumFactory.DropDownList.Tous;\r\n $scope.userActionsList = enumFactory.TypeUserActionsList;\r\n $scope.showButtonConfirmPopUp = true;\r\n $scope.userAction = {\r\n IdTypeAction: null,\r\n LstIdUser: [],\r\n StartSubscriptionDate: null,\r\n EndSubscriptionDate: null\r\n };\r\n $scope.data = {};\r\n $scope.data.reverse = false;\r\n $scope.data.sortKey = \"LastName\";\r\n $scope.allSelected = false;\r\n $scope.idCompagnySelected = \"\";\r\n $scope.idGroupContactSelected = \"\";\r\n $scope.addOrEditUser_PopUp_Text_IsFullAccess = $rootScope.editableObjectsFactory.EditableObjects.Admin_Manage_TC_IsFullAccess.Content;\r\n $scope.detailsUser_PopUp_Text_IsFullAccess_True = $rootScope.editableObjectsFactory.EditableObjects.detailsUser_PopUp_Text_IsFullAccess_True.Content;\r\n $scope.detailsUser_PopUp_Text_IsFullAccess_False = $rootScope.editableObjectsFactory.EditableObjects.detailsUser_PopUp_Text_IsFullAccess_False.Content;\r\n\r\n $scope.SelectAll = function () {\r\n if ($scope.allSelected) {\r\n var actif = $scope.isActif === \"-1\" ? \"\" : $scope.isActif;\r\n if (!$scope.idGroupContactSelected) $scope.idGroupContactSelected = \"\";\r\n\r\n userService.GetUserId($scope.userAction.IdRole, $scope.data.sortKey, $scope.data.reverse, $scope.searchText, actif, $scope.idCompagnySelected, $scope.idGroupContactSelected, function (data2, status2) {\r\n if (status2 !== null) {\r\n if (status2 == 400)\r\n $scope.errorMessage = data2[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = data2;\r\n } else {\r\n $scope.userAction.LstIdUser = data2;\r\n }\r\n });\r\n } else {\r\n $scope.userAction.LstIdUser = [];\r\n }\r\n };\r\n\r\n $scope.SelectUser = function (idUser) {\r\n var index = $scope.userAction.LstIdUser.indexOf(idUser);\r\n if (index >= 0) {\r\n $scope.userAction.LstIdUser.splice(index, 1);\r\n } else {\r\n $scope.userAction.LstIdUser.push(idUser);\r\n }\r\n };\r\n\r\n $scope.LoadDataUser = function (unSelectAllUsers) {\r\n if (unSelectAllUsers) {\r\n $scope.userAction.LstIdUser = [];\r\n $scope.allSelected = false;\r\n }\r\n var actif = $scope.isActif == \"-1\" ? \"\" : $scope.isActif;\r\n if (!$scope.idGroupContactSelected) $scope.idGroupContactSelected = \"\";\r\n if (!$scope.idCompagnySelected) $scope.idCompagnySelected = \"\";\r\n userService.GetUserByIdRolePaginate($scope.userAction.IdRole, $scope.max, $scope.pageNo, $scope.data.sortKey, $scope.data.reverse, $scope.searchText, actif, $scope.idCompagnySelected, $scope.idGroupContactSelected, function (data2, status2) {\r\n if (status2 !== null) {\r\n if (status2 == 400) \r\n $scope.errorMessage = data2[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = data2;\r\n } else {\r\n $scope.lstUsers = data2.ListVm;\r\n $scope.allUsers = data2.AllUsersWithoutPaginate;\r\n loadString(data2.ListVm);\r\n $scope.total = data2.Total;\r\n }\r\n });\r\n };\r\n var refreshUsers = null; // On crée un timer car si on tape trop vite dans le champ de recherche le listing ne correspond pas au nom recherché\r\n $scope.$watch(\"searchText\", function (newValue, oldValue) {\r\n if (newValue !== undefined && newValue !== null && oldValue != newValue) {\r\n if (newValue.length >= 3 || newValue.length < oldValue.length) {\r\n if (refreshUsers === null)\r\n refreshUsers = setTimeout(function () { $scope.LoadDataUser(true); }, 800);\r\n else {\r\n clearTimeout(refreshUsers);\r\n refreshUsers = setTimeout(function () { $scope.LoadDataUser(true); }, 800);\r\n }\r\n }\r\n }\r\n });\r\n\r\n if ($location.path() == \"/admin/manage/users\") {\r\n $scope.actionAdmin = \"Ajouter un agriculteur\";\r\n $scope.userCategory = \"Agriculteur\";\r\n $scope.userAction.IdRole = enumFactory.Roles.User;\r\n $scope.iCurrent = 0;\r\n $scope.userActionsList = angular.copy($filter('filter')($scope.userActionsList, function (item) {\r\n return (item.Value != enumFactory.TypeUserActions.ActiverConnexionAgri && item.Value != enumFactory.TypeUserActions.DesactiverConnexionAgri && (!$rootScope.paramBUseTableConnections || item.Value != enumFactory.TypeUserActions.EnvoyerIdentifiants));\r\n }, true));\r\n }\r\n else if ($location.path() == \"/admin/manage/tc\") {\r\n $scope.actionAdmin = \"Ajouter un TC\";\r\n $scope.userCategory = \"TC\";\r\n $scope.userAction.IdRole = enumFactory.Roles.TC;\r\n $scope.iCurrent = 1;\r\n $scope.userActionsList = angular.copy($filter('filter')($scope.userActionsList, function (item) {\r\n return (item.Value != enumFactory.TypeUserActions.ChangerDatesAbonnement && item.Value != enumFactory.TypeUserActions.GroupeUtilisateur);\r\n }, true));\r\n }\r\n else {\r\n $location.path('/');\r\n }\r\n\r\n //charge les données user en fonction de l'IdRole user\r\n $scope.LoadDataUser();\r\n\r\n var init = function () {\r\n $scope.tableDataVisible = colonnes.data.DataVisible.split(',');\r\n $scope.tableLibelle = colonnes.data.ColumnName.split(',');\r\n\r\n if ($rootScope.ModuleMultipleCompagnies.Active) {\r\n compagnyService.GetAll(function (data, status) {\r\n if (status === null)\r\n $scope.lstCompagnies = data;\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n }\r\n\r\n groupContactService.GetAll(function (data, status) {\r\n if (status === null)\r\n $scope.lstGroupContacts = data;\r\n else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n\r\n };\r\n\r\n $scope.ShowDetail = function (item, popup) {\r\n $scope.potentialAction = \"Fermer\";\r\n $scope.currentUserFactory = {};\r\n $scope.PopupDetailUserTitle = \"Détails de \" + item.FullName;\r\n $scope.currentUser = item;\r\n $scope.detailUserIsFullAccess = item.IsFullAccess ? $scope.detailsUser_PopUp_Text_IsFullAccess_True : $scope.detailsUser_PopUp_Text_IsFullAccess_False;\r\n popup();\r\n };\r\n\r\n\r\n $scope.UpdateUserPopup = function (item, index, popup) {\r\n $scope.potentialAction = \"Valider\";\r\n $scope.currentUser = {};\r\n $scope.groupContactUserList = {};\r\n $scope.errorPopupHtml = \"\";\r\n $scope.errorMessage = \"\";\r\n $scope.succesMessage = \"\";\r\n $scope.modalTitle = \"Modifier un \" + $scope.userCategory;\r\n $scope.popupAction = \"Modifier\";\r\n $scope.keyAction = \"Up\";\r\n $scope.currentUser = angular.copy(item);\r\n if (($scope.currentUser.StartDateSubscription !== null && $scope.currentUser.StartDateSubscription !== undefined)) {\r\n $scope.currentUser.StartDateSubscription = $filter('date')($scope.currentUser.StartDateSubscription, \"dd/MM/yyyy\");\r\n }\r\n if (($scope.currentUser.EndDateSubscription !== null && $scope.currentUser.EndDateSubscription !== undefined)) {\r\n $scope.currentUser.EndDateSubscription = $filter('date')($scope.currentUser.EndDateSubscription, \"dd/MM/yyyy\");\r\n }\r\n\r\n $scope.currentUser.lstCompagniesForUser = angular.copy($scope.lstCompagnies);\r\n\r\n if ($rootScope.ModuleMultipleCompagnies.Active) {\r\n $scope.currentUser.lstCompagniesForUser.forEach(function (item) {\r\n item.checked = $filter('filter')($scope.currentUser.LstIdCompagny, function (id) { return id === item.IdCompagny; }, true)[0] !== undefined;\r\n });\r\n }\r\n\r\n popup();\r\n };\r\n\r\n $scope.SaveUser = function () {\r\n if ($scope.userCategory === \"TC\") {\r\n $scope.currentUser.IdRole = parseInt(enumFactory.Roles.TC);\r\n } else {\r\n $scope.currentUser.IdRole = parseInt(enumFactory.Roles.User);\r\n $scope.currentUser.CanConnectAsUser = false;\r\n $scope.currentUser.IsFullAccess = false;\r\n }\r\n userService.SaveUser($scope.currentUser, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n if (($scope.currentUser.StartDateSubscription !== null && $scope.currentUser.StartDateSubscription !== undefined)) {\r\n $scope.currentUser.StartDateSubscription = $filter('date')($scope.currentUser.StartDateSubscription, \"dd/MM/yyyy\");\r\n }\r\n if (($scope.currentUser.EndDateSubscription !== null && $scope.currentUser.EndDateSubscription !== undefined)) {\r\n $scope.currentUser.EndDateSubscription = $filter('date')($scope.currentUser.EndDateSubscription, \"dd/MM/yyyy\");\r\n }\r\n var errorHtml = data[0].errors[0].Message;\r\n $scope.errorPopupHtml = $sce.trustAsHtml(errorHtml);\r\n $scope.openPopUpUser();\r\n }\r\n } else {\r\n switch ($scope.popupAction) {\r\n case \"Ajouter\":\r\n $scope.succesMessage = \"Votre \" + $scope.userCategory + \" a bien été pris en compte\";\r\n break;\r\n case \"Modifier\":\r\n $scope.succesMessage = \"Vos modifications ont bien été prises en compte\";\r\n break;\r\n default:\r\n }\r\n //recharge les dataUsers\r\n $scope.LoadDataUser();\r\n $scope.currentUser = {};\r\n }\r\n });\r\n };\r\n\r\n $scope.AddUserPopup = function (popup) {\r\n $scope.errorMessage = \"\";\r\n $scope.succesMessage = \"\";\r\n $scope.currentUser = {};\r\n $scope.groupContactUserList = {};\r\n $scope.errorPopupHtml = \"\";\r\n $scope.modalTitle = \"Ajouter un \" + $scope.userCategory;\r\n $scope.popupAction = \"Ajouter\";\r\n $scope.keyAction = \"Add\";\r\n $scope.currentUser.lstCompagniesForUser = angular.copy($scope.lstCompagnies);\r\n\r\n if ($rootScope.ModuleMultipleCompagnies.Active) {\r\n $scope.currentUser.lstCompagniesForUser.forEach(function (item) {\r\n item.checked = false;\r\n });\r\n }\r\n popup();\r\n };\r\n\r\n $scope.DeleteUser = function (item, index, popup) {\r\n $scope.PopupDeleteUserSelectedTitle = \"Supprimer un \" + $scope.userCategory;\r\n $scope.currentUser = angular.copy(item);\r\n $scope.checkIfOrderInExecution(popup);\r\n };\r\n\r\n $scope.checkIfOrderInExecution = function (popup) {\r\n $scope.showButtonConfirmPopUp = true;\r\n var ceOrCet = \"cet\";\r\n if ($scope.userCategory === \"TC\")\r\n ceOrCet = \"ce\";\r\n\r\n userService.CheckExistOrderUserInExecution($scope.currentUser.IdUser, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $location.path('/');\r\n }\r\n } else {\r\n if (data.length !== null && data.length > 0) {\r\n $scope.showButtonConfirmPopUp = false;\r\n var contractString = \" le contrat suivant est\";\r\n if (data.length > 1) {\r\n contractString = \" les \" + data.length + \" contrats suivants sont\";\r\n }\r\n var idsContractsInExecution = \"\";\r\n data.forEach(function (item) {\r\n idsContractsInExecution += item.IdContract.toString() + \", \";\r\n });\r\n idsContractsInExecution = idsContractsInExecution.substr(0, idsContractsInExecution.length - 2);\r\n $scope.messageConfirmPopup = \"Impossible de supprimer \" + ceOrCet + \" \" + $scope.userCategory.toLowerCase() + \" car \" + contractString + \" en cours d'exécution : \" + idsContractsInExecution + \".\";\r\n } else {\r\n $scope.messageConfirmPopup = \"Êtes-vous sûr de vouloir supprimer \" + ceOrCet + \" \" + $scope.userCategory + \"?\";\r\n }\r\n popup();\r\n }\r\n });\r\n };\r\n\r\n $scope.DeleteLogicallyUserSelected = function () {\r\n userService.DeleteLogicallyUser($scope.currentUser.IdUser, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $location.path('/');\r\n }\r\n } else {\r\n $scope.succesMessage = \"Votre suppression a bien été prise en compte\";\r\n $scope.LoadDataUser();\r\n $scope.currentUser = {};\r\n }\r\n });\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n init();\r\n };\r\n init();\r\n\r\n function loadTcUserForAutoCompletionPopUp(popup) {\r\n userService.GetUserByIdRole(enumFactory.Roles.TC, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstTc = data;\r\n $scope.selectedAutoCompleteObject = {};\r\n $scope.selectedAutoCompleteInput = '';\r\n $timeout(function () {\r\n popup();\r\n }, 0);\r\n }\r\n });\r\n }\r\n\r\n $scope.VerifAction = function (popupChangerDatesAbonnement, popupGroupeUtilisateur, popUpLinkTC) {\r\n $scope.errorMessage = $scope.succesMessage = \"\";\r\n if ($scope.userAction.IdTypeAction === null) {\r\n $scope.errorMessage = \"Veuillez sélectionner une action.\";\r\n }\r\n else if ($scope.userAction.LstIdUser.length === 0) {\r\n $scope.errorMessage = \"Veuillez sélectionner un utilisateur.\";\r\n }\r\n else if ($scope.userAction.IdTypeAction === enumFactory.TypeUserActions.ChangerDatesAbonnement) {\r\n $scope.errorMessagePopup = \"\";\r\n $scope.userAction.StartSubscriptionDate = \"\";\r\n $scope.userAction.EndSubscriptionDate = \"\";\r\n popupChangerDatesAbonnement();\r\n }\r\n else if ($scope.userAction.IdTypeAction === enumFactory.TypeUserActions.EnvoyerMail) {\r\n var lstUsersSelected = [];\r\n $scope.userAction.LstIdUser.forEach(function (idUser) {\r\n var users = $filter('filter')($scope.allUsers, function (item) { return item.IdUser === idUser; }, true);\r\n if (users.length === 1)\r\n lstUsersSelected.push(users[0]);\r\n });\r\n if (!$rootScope.Modules.ModuleMessagerie.Active) {\r\n var href = \"mailto:\";\r\n lstUsersSelected.forEach(function (user) {\r\n href += user.Mail + \";\";\r\n });\r\n window.location.href = href;\r\n $scope.LoadDataUser(true);\r\n } else {\r\n $rootScope.lstUsersToMail = lstUsersSelected;\r\n $location.path(\"/common/messenger/newmessage\");\r\n }\r\n }\r\n else if ($scope.userAction.IdTypeAction === enumFactory.TypeUserActions.GroupeUtilisateur) {\r\n $scope.errorMessagePopup = \"\";\r\n $scope.userAction.GroupUserVmSelected = {\r\n };\r\n groupContactService.GetAll(function (data) {\r\n $scope.GroupContacts = data;\r\n $scope.GroupContacts.splice(0, 0, ({ IdGroupContact: 0, Label: 'Nouveau' }));\r\n popupGroupeUtilisateur();\r\n });\r\n\r\n }\r\n else if ($scope.userAction.IdTypeAction === enumFactory.TypeUserActions.EnregistrerLiaisonTC) {\r\n $scope.errorMessagePopup = \"\";\r\n $scope.PopUpLinkTCTitle = \"Ajouter une liaison avec un TC\";\r\n loadTcUserForAutoCompletionPopUp(popUpLinkTC);\r\n }\r\n else\r\n $scope.DoSelectedAction();\r\n };\r\n\r\n $scope.VerifSubscriptionDates = function () {\r\n var jourDebut = parseInt($scope.userAction.StartSubscriptionDate.split('/')[0]);\r\n var moisDebut = parseInt($scope.userAction.StartSubscriptionDate.split('/')[1]);\r\n var anneeDebut = parseInt($scope.userAction.StartSubscriptionDate.split('/')[2]);\r\n var jourFin = parseInt($scope.userAction.EndSubscriptionDate.split('/')[0]);\r\n var moisFin = parseInt($scope.userAction.EndSubscriptionDate.split('/')[1]);\r\n var anneeFin = parseInt($scope.userAction.EndSubscriptionDate.split('/')[2]);\r\n var dateDebut = new Date(anneeDebut, moisDebut - 1, jourDebut);\r\n var dateFin = new Date(anneeFin, moisFin - 1, jourFin);\r\n\r\n if (dateDebut > dateFin) {\r\n $scope.errorMessagePopup = \"La date de début d'abonnement doit être inférieur à la date de fin.\";\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.VerifUser = function () {\r\n $scope.isDateUsing = false;\r\n $scope.isError = false;\r\n var errorDate = false;\r\n\r\n var errorsPopup = userService.VerifUserLight($scope.currentUser);\r\n\r\n if ($scope.currentUser.Login === undefined || $scope.currentUser.Login === \"\" || $scope.currentUser.Login === null) {\r\n errorsPopup += \"<li>Veuillez renseigner un identifiant</li>\";\r\n if (!$scope.isError)\r\n $scope.isError = true;\r\n }\r\n \r\n if ($rootScope.parambUseLoginSecondary && !$scope.currentUser.LoginSecondary) {\r\n errorsPopup += \"<li>Veuillez renseigner un identifiant secondaire</li>\";\r\n if (!$scope.isError)\r\n $scope.isError = true;\r\n }\r\n\r\n if (($scope.currentUser.StartDateSubscription !== null && $scope.currentUser.StartDateSubscription !== undefined && $scope.currentUser.StartDateSubscription !== \"\")) {\r\n var regexDate = /^(\\d{2}\\/){2}\\d{4}$/;\r\n $scope.isDateUsing = true;\r\n if ((!(regexDate.test($scope.currentUser.StartDateSubscription))) || (!dateService.VerifDateIsCalendar($scope.currentUser.StartDateSubscription))) {\r\n if (!$scope.isDateUsing) {\r\n $scope.isDateUsing = true;\r\n }\r\n errorsPopup += \"<li>Veuillez renseigner une date de début d'abonnement valide (format attendu dd/MM/YYYY)</li>\";\r\n if (!$scope.isError)\r\n $scope.isError = true;\r\n if (!errorDate)\r\n errorDate = true;\r\n }\r\n }\r\n if ($scope.currentUser.EndDateSubscription !== null && $scope.currentUser.EndDateSubscription !== undefined && $scope.currentUser.EndDateSubscription !== \"\") {\r\n if (!$scope.isDateUsing) {\r\n $scope.isDateUsing = true;\r\n }\r\n if ((!dateService.VerifDateIsCalendar($scope.currentUser.EndDateSubscription) || (!dateService.VerifDateIsCalendar($scope.currentUser.EndDateSubscription)))) {\r\n errorsPopup += \"<li>Veuillez renseigner une date de fin d'abonnement valide (format attendu dd/MM/YYYY)</li>\";\r\n if (!$scope.isError)\r\n $scope.isError = true;\r\n if (!errorDate)\r\n errorDate = true;\r\n }\r\n }\r\n if (!errorDate) {\r\n if (($scope.currentUser.StartDateSubscription !== null && $scope.currentUser.StartDateSubscription !== undefined && $scope.currentUser.StartDateSubscription !== \"\") && ($scope.currentUser.EndDateSubscription !== null && $scope.currentUser.EndDateSubscription !== undefined && $scope.currentUser.EndDateSubscription !== \"\")) {\r\n if (!dateService.compareDate($scope.currentUser.StartDateSubscription, $scope.currentUser.EndDateSubscription)) {\r\n errorsPopup += \"<li>La date de début d'abonnement doit être inférieur à la date de fin</li>\";\r\n if (!$scope.isError)\r\n $scope.isError = true;\r\n }\r\n }\r\n }\r\n\r\n if ($scope.currentUser.IsEnabled === undefined || $scope.currentUser.IsEnabled === \"\") {\r\n errorsPopup += \"<li>Veuillez renseigner l'accès extranet</li>\";\r\n if (!$scope.isError)\r\n $scope.isError = true;\r\n }\r\n\r\n $scope.currentUser.LstIdCompagny = [];\r\n if ($rootScope.ModuleMultipleCompagnies.Active) {\r\n $scope.currentUser.lstCompagniesForUser.forEach(function (item) {\r\n if (item.checked)\r\n $scope.currentUser.LstIdCompagny.push(item.IdCompagny);\r\n });\r\n }\r\n\r\n if ($rootScope.ModuleMultipleCompagnies.Active && $scope.currentUser.LstIdCompagny.length === 0) {\r\n errorsPopup += \"<li>Veuillez sélectionner au moins une société</li>\";\r\n if (!$scope.isError)\r\n $scope.isError = true;\r\n }\r\n\r\n if ($scope.isError) {\r\n $scope.errorPopupHtml = $sce.trustAsHtml(errorsPopup);\r\n return false;\r\n } else {\r\n if ($scope.isDateUsing) {\r\n if (($scope.currentUser.StartDateSubscription !== null && $scope.currentUser.StartDateSubscription !== undefined && $scope.currentUser.StartDateSubscription !== \"\")) {\r\n $scope.currentUser.StartDateSubscription = dateService.ConvertDateToDateAPI($scope.currentUser.StartDateSubscription);\r\n }\r\n if ($scope.currentUser.EndDateSubscription !== null && $scope.currentUser.EndDateSubscription !== undefined && $scope.currentUser.EndDateSubscription !== \"\") {\r\n $scope.currentUser.EndDateSubscription = dateService.ConvertDateToDateAPI($scope.currentUser.EndDateSubscription);\r\n }\r\n }\r\n return true;\r\n }\r\n };\r\n\r\n $scope.VerifGroupeUtilisateur = function () {\r\n if ($scope.userAction.GroupUserVmSelected.Id !== 0 && !$scope.userAction.GroupUserVmSelected.Id) {\r\n $scope.errorMessagePopup = \"Veuillez sélectionner ou créer un groupe.\";\r\n return false;\r\n }\r\n\r\n if ($scope.userAction.GroupUserVmSelected.Id === 0 && !$scope.userAction.GroupUserVmSelected.Name) {\r\n $scope.errorMessagePopup = \"Le libellé du groupe est obligatoire.\";\r\n return false;\r\n }\r\n\r\n if ($scope.userAction.GroupUserVmSelected.Name === \"Nouveau\" || $scope.userAction.GroupUserVmSelected.Name === \"Sélectionnez...\") {\r\n $scope.errorMessagePopup = \"Merci de saisir un autre libellé.\";\r\n return false;\r\n }\r\n\r\n if ($scope.GroupContacts && $scope.GroupContacts.filter(function (element) { return element.Label === $scope.userAction.GroupUserVmSelected.Name; }).length > 0) {\r\n $scope.errorMessagePopup = \"Le libellé du groupe existe déjà .\";\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.DoSelectedAction = function () {\r\n userService.DoUsersAction($scope.userAction, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n else {\r\n switch ($scope.userAction.IdTypeAction) {\r\n case enumFactory.TypeUserActions.EnvoyerIdentifiants:\r\n $scope.succesMessage = $rootScope.editableObjectsFactory.EditableObjects.Tc_ManageTCUsers_SendIdentifiersSuccessMessage.Content;\r\n break;\r\n case enumFactory.TypeUserActions.ActiverAcces:\r\n $scope.succesMessage = \"Le(s) compte(s) ont été activé(s) avec succès\";\r\n break;\r\n case enumFactory.TypeUserActions.DesactiverAcces:\r\n $scope.succesMessage = \"Le(s) compte(s) ont été désactivé(s) avec succès\";\r\n break;\r\n case enumFactory.TypeUserActions.ChangerDatesAbonnement:\r\n $scope.succesMessage = \"Les dates d'abonnement ont été modifiées avec succès\";\r\n break;\r\n case enumFactory.TypeUserActions.GroupeUtilisateur:\r\n $scope.succesMessage = \"Le groupe a été attribué avec succès\";\r\n break;\r\n case enumFactory.TypeUserActions.ActiverConnexionAgri:\r\n $scope.succesMessage = \"La connexion pour un agriculteur a été activé avec succès\";\r\n break;\r\n case enumFactory.TypeUserActions.DesactiverConnexionAgri:\r\n $scope.succesMessage = \"La connexion pour un agriculteur a été désactivé avec succès\";\r\n break;\r\n case enumFactory.TypeUserActions.EnregistrerLiaisonTC:\r\n $scope.selectedAutoCompleteObject = {};\r\n $scope.selectedAutoCompleteInput = '';\r\n $scope.succesMessage = \"Les liaisons avec le TC ont été ajouté avec succès\";\r\n break;\r\n }\r\n $scope.LoadDataUser(true);\r\n }\r\n });\r\n };\r\n\r\n function loadString(users) { //solution temporaire en attendant de trouver une solution à la directive pour afficher les sous-objets\r\n users.forEach(function (item) {\r\n if (item.LstGroupContacts && item.LstGroupContacts.length > 0) {\r\n item.GroupContactsString = '<ul>';\r\n item.LstGroupContacts.forEach(function (itemGrp) {\r\n item.GroupContactsString += '<li>' + itemGrp + \"</li>\";\r\n });\r\n item.GroupContactsString += '</ul>';\r\n }\r\n\r\n if (item.TcUsers && item.TcUsers.length > 0) {\r\n item.TcUsersString = '<ul>';\r\n item.TcUsers.forEach(function (tc) {\r\n item.TcUsersString += '<li>' + tc.FullName + \"</li>\";\r\n });\r\n item.TcUsersString += '</ul>';\r\n\r\n }\r\n\r\n });\r\n }\r\n\r\n $scope.getData = function (pageNo) {\r\n $scope.pageNo = pageNo;\r\n $scope.LoadDataUser();\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.data.sortKey = sortKey;\r\n $scope.data.reverse = reverse;\r\n $scope.LoadDataUser();\r\n };\r\n\r\n $scope.AddLinkTC = function (user, index, popup) {\r\n $scope.errorMessagePopup = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.PopUpLinkTCTitle = \"Ajouter une liaison avec un TC\";\r\n $scope.currentUser = user;\r\n loadTcUserForAutoCompletionPopUp(popup);\r\n };\r\n\r\n $scope.VerifLinkTC = function () {\r\n $scope.errorMessagePopup = \"\";\r\n if (!$scope.selectedAutoCompleteInput) {\r\n $scope.errorMessagePopup = \"Impossible d'ajouter un TC vide.\";\r\n }\r\n else if (!$scope.selectedAutoCompleteObject.originalObject) {\r\n $scope.errorMessagePopup = \"Impossible d'ajouter un TC qui n'existe pas dans la base de données.\";\r\n }\r\n\r\n if ($scope.errorMessagePopup.length > 0) {\r\n return false;\r\n } else {\r\n return true;\r\n }\r\n };\r\n\r\n $scope.SaveLinkTC = function () {\r\n $scope.userAction.IdTcUser = $scope.selectedAutoCompleteObject.originalObject.IdUser;\r\n $scope.DoSelectedAction();\r\n };\r\n\r\n $scope.VerifAndSaveLinkTCTable = function () {\r\n $scope.errorMessagePopup = \"\";\r\n $scope.successMessage = \"\";\r\n if (!$scope.selectedAutoCompleteInput) {\r\n $scope.errorMessagePopup = \"Impossible d'ajouter un TC vide.\";\r\n }\r\n else if (!$scope.selectedAutoCompleteObject.originalObject) {\r\n $scope.errorMessagePopup = \"Impossible d'ajouter un TC qui n'existe pas dans la base de données.\";\r\n }\r\n else if ($scope.currentUser.TcUsers && $scope.currentUser.TcUsers.filter(function (elementTc) {\r\n return elementTc.IdUser === $scope.selectedAutoCompleteObject.originalObject.IdUser;\r\n }).length > 0) {\r\n $scope.errorMessagePopup = \"Le TC est déjà lié à cet utilisateur.\";\r\n }\r\n if ($scope.errorMessagePopup.length === 0) {\r\n userService.SaveLinkTc($scope.currentUser.IdUser, $scope.selectedAutoCompleteObject.originalObject.IdUser, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessagePopup = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.selectedAutoCompleteObject = {};\r\n $scope.selectedAutoCompleteInput = '';\r\n $scope.LoadDataUser(true);\r\n $scope.successMessage = \"La liaison avec le TC a bien été ajoutée.\";\r\n $scope.currentUser.TcUsers = data;\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.DeleteLinkTc = function (user, idTcUser) {\r\n $scope.errorMessagePopup = \"\";\r\n $scope.successMessage = \"\";\r\n userService.DeleteLinkTc(user.IdUser, idTcUser, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessagePopup = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.successMessage = \"La liaison entre l'agriculteur et le TC a bien été supprimée\";\r\n $scope.currentUser.TcUsers = data;\r\n user.TcUsers = data;\r\n }\r\n });\r\n };\r\n\r\n $scope.ExportUsers = function () {\r\n var actif = $scope.isActif == \"-1\" ? \"\" : $scope.isActif;\r\n if (!$scope.idCompagnySelected) $scope.idCompagnySelected = \"\";\r\n if (!$scope.searchText) $scope.searchText = \"\";\r\n if (!$scope.idGroupContactSelected) $scope.idGroupContactSelected = \"\";\r\n\r\n var downloadPath = configurationFactory.Url['Api'] + 'User/GetUsersXls/' +\r\n '?idRole=' + $scope.userAction.IdRole +\r\n '&idLanguage=' + $rootScope.language.IdLanguage +\r\n '&isActif=' + actif +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n '&idGroupContact=' + $scope.idGroupContactSelected +\r\n '&searchText=' + $scope.searchText +\r\n '&sortKey=' + $scope.data.sortKey +\r\n '&reverse=' + $scope.data.reverse;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n }]);\r\n","AgrimarketControllers.controller('manageGroupUsersController', [\r\n\t'$scope', '$routeParams', '$sce', 'groupContactService', '$location', 'userService', 'enumFactory', '$filter', '$timeout', 'parametersFactory', '$rootScope', function ($scope, $routeParams, $sce, groupContactService, $location, userService, enumFactory, $filter, $timeout, parametersFactory, $rootScope) {\r\n\r\n\t$scope.parambActiveOfferGroupContactIncidence = parametersFactory.Parameters.bActiveOfferGroupContactIncidence.Value === \"1\";\r\n\t$scope.dataAngucomplete = $rootScope.paramBDisplaySocialReasonInManageGroupUsers ? \"IdExt,SocialReason\" : \"IdExt,FullName\";\r\n\r\n\t $scope.Init = function () {\r\n\t\t$scope.formAddGroupUser = { groupUser: {} };\r\n\t\tinitFormAddGroupUser();\r\n\r\n\t\tgroupContactService.GetAllForManage(function (data, status) {\r\n\t\t\tif (status !== null) {\r\n\t\t\t\tif (status === 400)\r\n\t\t\t\t\t$scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n\t\t\t} else {\r\n\t\t\t\t$scope.lstGroupUsers = data;\r\n\t\t\t $scope.showDetails = [];\r\n\t\t\t $scope.lstGroupUsers.forEach(function (item, index) {\r\n\t\t\t if (item.HadUser)\r\n\t\t\t $scope.lstGroupUsers[index].LstUserVms.push({ FullName : \"\", SocialReason : \"\", Loading : true});\r\n\t\t\t\t $scope.showDetails[index] = false;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tuserService.GetUserByIdRole(enumFactory.Roles.User, function (data, status) {\r\n\t\t\tif (status !== null) {\r\n\t\t\t\tif (status === 400)\r\n\t\t\t\t\t$scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n\t\t\t} else {\r\n\t\t\t\t$scope.lstUsers = data;\r\n\t\t\t}\r\n\t\t});\r\n\t };\r\n\r\n $scope.ShowDetailUser = function(index) {\r\n\r\n\r\n var group = $scope.lstGroupUsers[index];\r\n\r\n if (group.lstGroupUsers === undefined || group.lstGroupUsers === null || group.lstGroupUsers.length === 0)\r\n groupContactService.GetUserForGroup(group.IdGroupContact, function(data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstGroupUsers[index].LstUserVms = data;\r\n }\r\n });\r\n };\r\n\r\n\t$scope.SaveFormAddGroupUser = function () {\r\n\t if ($scope.CheckFormAddGroupUserValues()) {\r\n\r\n\t if ($scope.formAddGroupUser.ActionType == \"new\") {\r\n\t $scope.formAddGroupUser.groupUser.IdGroupContact = 0;\r\n\t $scope.lstGroupUsers.push($scope.formAddGroupUser.groupUser);\r\n\t } else if ($scope.formAddGroupUser.ActionType == \"edit\" && $scope.lstGroupUsers[$scope.formAddGroupUser.index] !== undefined && $scope.lstGroupUsers[$scope.formAddGroupUser.index] !== null && $scope.lstGroupUsers[$scope.formAddGroupUser.index] !== \"\") {\r\n $scope.lstGroupUsers[$scope.formAddGroupUser.index].Label = $scope.formAddGroupUser.groupUser.Label;\r\n $scope.lstGroupUsers[$scope.formAddGroupUser.index].Incidence = $scope.formAddGroupUser.groupUser.Incidence;\r\n\t }\r\n\r\n\t groupContactService.SaveGroupContact($scope.formAddGroupUser.groupUser, function (data, status) {\r\n\t if (status !== null) {\r\n\t if (status == 400) {\r\n\t $scope.errorMessage = data[0].errors[0].Message;\r\n\t }\r\n\t }\r\n\t else {\r\n\t \tif ($scope.formAddGroupUser.ActionType == \"new\") {\r\n\t\t\t $scope.formAddGroupUser.groupUser.IdGroupContact = data.IdGroupContact;\r\n\t $scope.formAddGroupUser.successMessage = \"Le groupe a bien été ajouté en base de données.\";\r\n\t } else {\r\n\t $scope.formAddGroupUser.successMessage = \"Le groupe a bien été modifié en base de données.\";\r\n\t }\r\n\t \r\n\t var oldIndex = $scope.formAddGroupUser.index;\r\n\t sortLstGroupUsers();\r\n\t var newIndex = $scope.lstGroupUsers.indexOf($filter('filter')($scope.lstGroupUsers, { Label: $scope.formAddGroupUser.groupUser.Label }, true)[0]);//Il faut le faire après avoir ordonner la liste\r\n\t var bshowDetailsOldIndex = $scope.showDetails[oldIndex];\r\n\r\n\t //Permet de garder les états des différents groupes déplier ou replier en tenant compte des index\r\n\t if (oldIndex < newIndex) {\r\n\t for (var i = oldIndex; i < newIndex; i++) {\r\n\t $scope.showDetails[i] = $scope.showDetails[i + 1];\r\n\t }\r\n\t }\r\n\t else if (newIndex < oldIndex) {\r\n\t for (var j = oldIndex; j > newIndex; j--) {\r\n\t $scope.showDetails[j] = $scope.showDetails[j - 1];\r\n\t }\r\n\t }\r\n\t \r\n\t $scope.showDetails[newIndex] = bshowDetailsOldIndex;\r\n\r\n\t $scope.formAddGroupUser.groupUser = {};\r\n\t initFormAddGroupUser();\r\n\t }\r\n\t });\r\n\t }\r\n\t};\r\n\r\n\t$scope.CancelFormAddGroupUser = function () {\r\n\t initMessage();\r\n\t initFormAddGroupUser();\r\n\t\t$scope.formAddGroupUser.groupUser = {};\r\n\t};\r\n\r\n\t$scope.CheckFormAddGroupUserValues = function () {\r\n\t initMessage();\r\n\t \r\n\t\tif (!$scope.formAddGroupUser.groupUser.Label) {\r\n\t\t\t$scope.formAddGroupUser.errorMessage = \"Veuillez saisir un libellé.\";\r\n }\r\n\r\n\t\tif (!$scope.formAddGroupUser.groupUser.Incidence)\r\n\t\t\t$scope.formAddGroupUser.groupUser.Incidence = 0;\r\n\r\n if (isNaN($scope.formAddGroupUser.groupUser.Incidence)) {\r\n $scope.formAddGroupUser.errorMessage = \"L'incidence n'est pas valide.\";\r\n }\r\n\r\n\t\tif ($scope.formAddGroupUser.action === 'Ajouter' && $scope.lstGroupUsers && $scope.lstGroupUsers.filter(function (element) { return element.Label === $scope.formAddGroupUser.groupUser.Label; }).length > 0) {\r\n\t\t\t$scope.formAddGroupUser.errorMessage = \"Le libellé du groupe existe déjà .\";\r\n\t\t}\r\n\r\n\t\tif ($scope.formAddGroupUser.errorMessage !== \"\") {\r\n\t\t\t$scope.formAddGroupUser.errorMessageHtml = $sce.trustAsHtml($scope.formAddGroupUser.errorMessage);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn true;\r\n };\r\n\r\n\tvar initMessage = function () {\r\n\t $scope.formAddGroupUser.errorMessage = \"\";\r\n\t $scope.formAddGroupUser.successMessage = \"\";\r\n\t $scope.formAddGroupUser.errorMessageHtml = \"\";\r\n\t $scope.successMessage = '';\r\n\t $scope.errorMessage = '';\r\n\t};\r\n\t \r\n\tvar initFormAddGroupUser = function () {\r\n\t $scope.formAddGroupUser.title = \"Ajouter un groupe\";\r\n\t $scope.formAddGroupUser.action = \"Ajouter\";\r\n\t $scope.formAddGroupUser.ActionType = \"new\";\r\n\t};\r\n\t \r\n\tvar sortLstGroupUsers = function () {\r\n\t $scope.lstGroupUsers.sort(function (a, b) {//On ré-ordonne par ordre alphabétique à chaque fois que l'on ajoute un nouveau groupe\r\n\t if (a.Label.toLowerCase() < b.Label.toLowerCase())\r\n\t return -1;\r\n\t if (a.Label.toLowerCase() > b.Label.toLowerCase())\r\n\t return 1;\r\n\t return 0;\r\n\t });\r\n\t};\r\n\t \r\n\t$scope.AddUserPopup = function (openPopUp, modalTitle, indexGroup, id) {\r\n\t initMessage();\r\n\t\t$scope.modalTitle = modalTitle;\r\n\t\t$scope.indexGroup = indexGroup;\r\n\t $scope.idGroupContactToSave = id;\r\n\t\t$scope.groupUserSelected = $scope.lstGroupUsers[indexGroup];\r\n\t\t$scope.errorMessage = '';\r\n\t\t$scope.successMessage = '';\r\n\t\t$scope.selectedAutoCompleteObject = {};\r\n\t\t$scope.selectedAutoCompleteInput = '';\r\n\t\t$timeout(function() {\r\n\t\t openPopUp();\r\n\t\t}, 0);\r\n\t};\r\n\r\n\t$scope.AddUserConf = function () {\r\n\t\tif (!$scope.selectedAutoCompleteInput) {\r\n\t\t\t$scope.errorMessage = $sce.trustAsHtml(\"Impossible d'ajouter un utilisateur vide.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!$scope.selectedAutoCompleteObject.originalObject) {\r\n\t\t\t$scope.errorMessage = $sce.trustAsHtml(\"Impossible d'ajouter un utilisateur qui n'existe pas dans la base de données.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ($scope.groupUserSelected.LstUserVms && $scope.groupUserSelected.LstUserVms.filter(function(element) { return element.IdUser === $scope.selectedAutoCompleteObject.originalObject.IdUser; }).length > 0) {\r\n\t\t\t$scope.errorMessage = $sce.trustAsHtml(\"L'utilisateur est déjà dans le groupe.\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif ($scope.groupUserSelected.LstUserVms === undefined)\r\n\t\t $scope.groupUserSelected.LstUserVms = [];\r\n\r\n\t\tgroupContactService.AddUserInGroupContact($scope.idGroupContactToSave, $scope.selectedAutoCompleteObject.originalObject.IdUser, function (data, status) {\r\n\t if (status !== null) {\r\n\t if (status == 400) {\r\n\t $scope.errorMessage = data[0].errors[0].Message;\r\n\t }\r\n\t } else {\r\n\t $scope.groupUserSelected.LstUserVms.push(data);\r\n\t }\r\n\t });\r\n\t \r\n\t\t$scope.showDetails[$scope.indexGroup] = true;\r\n\t\t$scope.selectedAutoCompleteObject = {};\r\n\t\t$scope.selectedAutoCompleteInput = '';\r\n\t};\r\n\t \r\n\t$scope.EditGroupUser = function (index, groupUser) {\r\n\t initMessage();\r\n\t $scope.formAddGroupUser.title = \"Modifier un groupe\";\r\n\t $scope.formAddGroupUser.action = \"Modifier\";\r\n\t $scope.formAddGroupUser.ActionType = \"edit\";\r\n\t $scope.formAddGroupUser.index = index;\r\n\t $scope.formAddGroupUser.groupUser = angular.copy(groupUser);\r\n\t};\r\n\r\n\t$scope.DeletePopup = function (indexUser, openPopUp, modalTitle, type, indexGroup, idGroupContact, idUser) {\r\n\t initMessage();\r\n\t\t$scope.modalTitle = modalTitle;\r\n\t\t$scope.indexUser = indexUser;\r\n\t\t$scope.indexGroup = indexGroup;\r\n\t\t$scope.idGroupContactToDelete = idGroupContact;\r\n\t\t$scope.idUserToDelete = idUser;\r\n\t\t$scope.typeDeleted = type;\r\n\t\t$scope.groupUserSelected = $scope.lstGroupUsers[indexGroup];\r\n\t\t$scope.errorMessage = '';\r\n\t\t$scope.successMessage = '';\r\n\r\n\t\tif (type === \"groupUser\") {\r\n\t\t\t$scope.textPopUpDelete = \"Êtes-vous sûr de vouloir supprimer ce groupe ?\";\r\n\t\t}\r\n\t\telse {\r\n\t\t\t$scope.textPopUpDelete = \"Êtes-vous sûr de vouloir supprimer cet utilisateur du groupe ?\";\r\n\t\t}\r\n\t\topenPopUp();\r\n\t};\r\n\r\n\t$scope.DeleteConf = function() {\r\n\t\tif ($scope.typeDeleted === \"groupUser\") {\r\n\t\t\tgroupContactService.DeleteGroupContact($scope.idGroupContactToDelete, function (data, status) {\r\n\t\t\t if (status !== null) {\r\n\t\t\t if (status == 400) {\r\n\t\t\t $scope.errorMessage = data[0].errors[0].Message;\r\n\t\t\t }\r\n\t\t\t } else {\r\n\t\t\t $scope.successMessage = $sce.trustAsHtml(\"Le groupe a été supprimé avec succés.\");\r\n\t\t\t $scope.showDetails[$scope.indexGroup] = false;\r\n\t\t\t $scope.lstGroupUsers.splice($scope.indexGroup, 1);\r\n\t\t\t }\r\n\t\t\t}); \r\n\t\t} else {\r\n\t\t groupContactService.RemoveUserInGroupContact($scope.idGroupContactToDelete, $scope.idUserToDelete, function (data, status) {\r\n\t\t if (status !== null) {\r\n\t\t if (status == 400) {\r\n\t\t $scope.errorMessage = data[0].errors[0].Message;\r\n\t\t } \r\n\t\t } else {\r\n\t\t $scope.successMessage = $sce.trustAsHtml(\"L'utilisateur a été supprimé avec succés.\");\r\n\t\t $scope.groupUserSelected.LstUserVms.splice($scope.indexUser, 1);\r\n\t\t }\r\n\t\t }); \r\n\t\t}\r\n\t};\r\n \r\n\t$scope.Init();\r\n\t \r\n}]);\r\n","AgrimarketControllers.controller('infoMarketHashtagriController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', '$location', 'categoryInfoMarketService', 'elementInfoMarketHomePageService', 'elementInfoMarketHomePageQuoteService', 'enumFactory','quoteCashHashtagriService', 'quoteFutureHashtagriService', 'blocDispositionService', 'writingContentInfoMarketService', '$q','groupContactService',\r\n function ($scope, $rootScope, $routeParams, $sce, $filter, $location, categoryInfoMarketService, elementInfoMarketHomePageService, elementInfoMarketHomePageQuoteService, enumFactory, quoteCashHashtagriService, quoteFutureHashtagriService, blocDispositionService, writingContentInfoMarketService, $q, groupContactService) {\r\n\r\n $scope.initLstGroupContactAvailables = [];\r\n $scope.tmpGroupContacts1 = [];\r\n $scope.tmpGroupContacts2 = [];\r\n\r\n $scope.lstCatInfoMarket = [];\r\n $scope.lstElementInfoMarketHomePage = [];\r\n $scope.lstNumDispositionBlocHashtagri = [];\r\n\r\n $scope.lstProductsWSD = [];\r\n $scope.lstProductsWSDSelected = [];\r\n\r\n $scope.lstMarketWSD = [];\r\n $scope.lstMarketExpiriesWSDSelected = [];\r\n $scope.lstMarketExpiriesVM = [];\r\n\r\n $scope.ParamNumDispositionBlocHashtagri = {};\r\n\r\n $scope.counterCatInfoMarketActif = 0;\r\n $scope.filterMarketExpiries = {};\r\n $scope.filterProductWSD = {};\r\n $scope.paramsQuotesFuture = {};\r\n $scope.paramsQuotesCash = {};\r\n\r\n var newProductTextSelected = {\r\n IDProducts: 0,\r\n LabelledProducts: 'Sélectionnez',\r\n MarketsWsd: []\r\n };\r\n\r\n var newMarketTextSelected = {\r\n IdMarkets: 0,\r\n LabelledMarket: 'Sélectionnez',\r\n ListExpiryVm: []\r\n };\r\n\r\n $scope.idQuotesInfoMarketHomePage = enumFactory.ElementsInfoMarketHomePage.Quotes.IdElementInfoMarketHomePage;\r\n\r\n $scope.contentBlocDispositions = enumFactory.ContentBlocDispositions;\r\n $scope.viewMode = $routeParams.typeView;\r\n\r\n $scope.lstPopupQuotes = [];\r\n \r\n /**************** Propriétés Contenu OS *********************/\r\n\r\n $scope.filterValue = {\r\n FirstLoad: true,\r\n ItemsPerPage: 10,\r\n SortKey: \"\",\r\n Reverse: false,\r\n CurrentPageNo: 1,\r\n IdWritingContentInfoMarketSelected: \"\",\r\n SearchContentString: \"\"\r\n };\r\n\r\n /**************** Fin Propriétés Contenu OS *********************/\r\n\r\n $scope.ResetMessages = function () {\r\n\r\n $scope.catInfoMarketerrorMessage = \"\";\r\n $scope.catInfoMarketsuccessMessage = \"\";\r\n\r\n $scope.homePageInfoMarketerrorMessage = \"\";\r\n $scope.homePageInfoMarketsuccessMessage = \"\";\r\n\r\n $scope.quotesDisplayErrorMessage = \"\";\r\n $scope.quotesDisplayeSuccessMessage = \"\";\r\n\r\n $scope.quotesCashErrorMessage = \"\";\r\n $scope.quotesCashSuccessMessage = \"\";\r\n\r\n $scope.quotesFutureErrorMessage = \"\";\r\n $scope.quotesFutureSuccessMessage = \"\";\r\n\r\n $rootScope.successMessageContentInfosMarket = $scope.successMessageContentInfosMarket = \"\";\r\n $scope.errorMessageContentInfosMarket = \"\";\r\n };\r\n /*\r\n * ONGLET CONTENU\r\n *\r\n *\r\n */\r\n\r\n $scope.GetCategoryInfosMarket = function () {\r\n categoryInfoMarketService.GetCategoryInfosMarket(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = data;\r\n } else {\r\n $scope.lstCatInfoMarket = data;\r\n\r\n $scope.lstCatInfoMarket.forEach(function (element) {\r\n element.lstGroupContactAvailables = angular.copy($scope.initLstGroupContactAvailables);\r\n $.each(element.GroupContacts, function (index, item) {\r\n var pos = element.lstGroupContactAvailables.map(function (e) { return e.IdGroupContact; }).indexOf(item.IdGroupContact);\r\n element.lstGroupContactAvailables.splice(pos, 1);\r\n });\r\n });\r\n\r\n $scope.lstCatInfoMarket.forEach(function (item) {\r\n if (item.IsActif) {\r\n $scope.counterCatInfoMarketActif++;\r\n }\r\n });\r\n }\r\n });\r\n };\r\n\r\n $scope.GetElementInfoMarketHomePage = function () {\r\n elementInfoMarketHomePageService.GetElementInfoMarketHomePage(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = data;\r\n }\r\n else {\r\n $scope.lstElementInfoMarketHomePage = data;\r\n }\r\n });\r\n };\r\n\r\n function checkIsUniqueOrder(collection, cible) {\r\n var filterCheck = angular.copy(collection);\r\n var isOk = true;\r\n filterCheck.forEach(function (item) {\r\n if (item.IsActif && item.OrderDisplay && item.IdCategoryInfoMarket !== cible.IdCategoryInfoMarket) {\r\n if (item.OrderDisplay === cible.OrderDisplay) {\r\n isOk = false;\r\n return;\r\n }\r\n }\r\n });\r\n return isOk;\r\n }\r\n\r\n $scope.DisplayOrderInput = function (item) {\r\n if (!item.IsActif) {\r\n item.OrderDisplay = null;\r\n $scope.counterCatInfoMarketActif--;\r\n } else {\r\n $scope.counterCatInfoMarketActif++;\r\n }\r\n };\r\n\r\n $scope.AllowOneChoice = function (idElementInfoMarketHomePageActif) {\r\n $scope.lstElementInfoMarketHomePage.forEach(function (item) {\r\n \r\n if (item.IdElementInfoMarketHomePage === idElementInfoMarketHomePageActif) {\r\n if (item.IsActif === true) {\r\n item.IsActif = true;\r\n } \r\n else {\r\n item.IsActif = false;\r\n }\r\n } \r\n else\r\n item.IsActif = false;\r\n });\r\n };\r\n\r\n $scope.CheckParamCategoriesInfoMarket = function () {\r\n var error;\r\n $scope.ResetMessages();\r\n $scope.lstCatInfoMarket.forEach(function (item) {\r\n if (item.IsActif && item.OrderDisplay) {\r\n if (item.OrderDisplay > $scope.lstCatInfoMarket.length || item.OrderDisplay > $scope.counterCatInfoMarketActif) {\r\n error = \"Un ou plusieurs emplacement(s) ne sont pas ordonné(s) correctement\";\r\n }\r\n if (item.OrderDisplay <= 0) {\r\n error = \"Les emplacements doivent être supérieur à zéro\";\r\n }\r\n\r\n if (!checkIsUniqueOrder($scope.lstCatInfoMarket, item)) {\r\n error = \"Un ou plusieurs emplacement(s) ne sont pas ordonné(s) correctement\";\r\n }\r\n }\r\n });\r\n if ((error)) {\r\n $scope.catInfoMarketerrorMessage = $sce.trustAsHtml(error);\r\n return false;\r\n } else {\r\n $scope.SaveCatInfoMarketParameters();\r\n return true;\r\n }\r\n };\r\n\r\n $scope.SaveCatInfoMarketParameters = function () {\r\n categoryInfoMarketService.SaveCategoryInfoMarket($scope.lstCatInfoMarket, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.catInfoMarketerrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.catInfoMarketsuccessMessage = \"Modifications enregistrées\";\r\n }\r\n });\r\n };\r\n\r\n $scope.SaveHomePageInfoMarketParameters = function () {\r\n $scope.ResetMessages();\r\n elementInfoMarketHomePageService.SaveElementInfoMarketHomePage($scope.lstElementInfoMarketHomePage, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.homePageInfoMarketerrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.homePageInfoMarketsuccessMessage = \"Modifications enregistrées\";\r\n }\r\n });\r\n };\r\n\r\n $scope.OpenAndInitPopupCategVisibilities = function (openPopupCategVisibilitiesFn, categ) {\r\n $scope.popupCategVisibilitiesErrorMessage = \"\";\r\n\r\n $scope.currentCategBeforeChanged = angular.copy(categ);\r\n $scope.currentCateg = categ;\r\n\r\n openPopupCategVisibilitiesFn();\r\n };\r\n\r\n $scope.SavePopupCategVisibilities = function () {\r\n var lstIdGroupContacts = [];\r\n $scope.currentCateg.GroupContacts.forEach(function (element) {\r\n lstIdGroupContacts.push(element.IdGroupContact);\r\n });\r\n\r\n categoryInfoMarketService.SaveGroupContactsOfCategoryInfoMarket($scope.currentCateg.IdCategoryInfoMarket, lstIdGroupContacts, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.popupCategVisibilitiesErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n $scope.openPopupCategVisibilities();\r\n }\r\n } else {\r\n\r\n $scope.popupCategVisibilitiesErrorMessage = \"\";\r\n }\r\n });\r\n\r\n };\r\n\r\n $scope.CancelPopupCategVisibilies = function () {\r\n $scope.currentCateg.lstGroupContactAvailables = $scope.currentCategBeforeChanged.lstGroupContactAvailables;\r\n $scope.currentCateg.GroupContacts = $scope.currentCategBeforeChanged.GroupContacts;\r\n };\r\n\r\n $scope.toogleAllElementsLeft = function () {\r\n $scope.allCategVisibilitiesLeft = !$scope.allCategVisibilitiesLeft;\r\n $.each($scope.currentCateg.lstGroupContactAvailables, function (index, item) {\r\n item.checked = $scope.allCategVisibilitiesLeft;\r\n });\r\n };\r\n\r\n $scope.toogleAllElementsRight = function () {\r\n $scope.allCategVisibilitiesRight = !$scope.allCategVisibilitiesRight;\r\n $.each($scope.currentCateg.GroupContacts, function (index, item) {\r\n item.checked = $scope.allCategVisibilitiesRight;\r\n });\r\n };\r\n\r\n $scope.ListToSelectedGroupCategVisibilities = function () {\r\n $scope.allCategVisibilitiesLeft = false;\r\n $scope.allCategVisibilitiesRight = false;\r\n\r\n // On envoi tous les éléments sélectionnés dans la liste de droite\r\n $.each($scope.currentCateg.lstGroupContactAvailables, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.currentCateg.GroupContacts.push(item);\r\n }\r\n });\r\n\r\n // On supprime de la liste de gauche, tous les éléments envoyés\r\n $.each($scope.currentCateg.GroupContacts, function (index, item) {\r\n var indexItem = $scope.currentCateg.lstGroupContactAvailables.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.currentCateg.lstGroupContactAvailables.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $scope.SelectedToListGroupCategVisibilities = function () {\r\n $scope.allCategVisibilitiesLeft = false;\r\n $scope.allCategVisibilitiesRight = false;\r\n\r\n // On envoi tous les éléments sélectionnés dans la liste de gauche\r\n $.each($scope.currentCateg.GroupContacts, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.currentCateg.lstGroupContactAvailables.push(item);\r\n }\r\n });\r\n\r\n // On supprime de la liste de droite, tous les éléments envoyés\r\n $.each($scope.currentCateg.lstGroupContactAvailables, function (index, item) {\r\n var indexItem = $scope.currentCateg.GroupContacts.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.currentCateg.GroupContacts.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n /*\r\n * ONGLET COTATIONS BLOC DISPOSITION\r\n *\r\n *\r\n */\r\n\r\n $scope.GetBlocDispositions = function () {\r\n blocDispositionService.GetBlocDispositions(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.quotesDisplayErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstBlocDispositions = data;\r\n }\r\n });\r\n };\r\n\r\n $scope.SaveBlocDispositions = function () {\r\n $scope.ResetMessages();\r\n blocDispositionService.SaveBlocDispositions($scope.lstBlocDispositions, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.quotesDisplayErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.quotesDisplayeSuccessMessage = \"Modifications enregistrées\";\r\n }\r\n });\r\n };\r\n\r\n $scope.OpenAndInitPopupContentBlocDispositions = function (openPopupContentBlocDispositionsFn, bloc) {\r\n $scope.popupContentBlocDispositionsErrorMessage = \"\";\r\n\r\n blocDispositionService.GetContentBlocDispositionById(bloc.IdContentBlocDisposition,function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.popupContentBlocDispositionsErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.currentContentBlocDisposition = data;\r\n\r\n $scope.currentContentBlocDisposition.lstGroupContactAvailables = angular.copy($scope.initLstGroupContactAvailables);\r\n $.each($scope.currentContentBlocDisposition.GroupContacts, function (index, item) {\r\n \r\n var pos = $scope.currentContentBlocDisposition.lstGroupContactAvailables.map(function (e) { return e.IdGroupContact; }).indexOf(item.IdGroupContact);\r\n $scope.currentContentBlocDisposition.lstGroupContactAvailables.splice(pos, 1);\r\n });\r\n\r\n }\r\n });\r\n\r\n openPopupContentBlocDispositionsFn();\r\n };\r\n\r\n $scope.ListToSelectedGroupContentBlocDispositions = function () {\r\n $scope.allContentBlocDispositionsLeft = false;\r\n $scope.allContentBlocDispositionsRight = false;\r\n\r\n $.each($scope.currentContentBlocDisposition.lstGroupContactAvailables, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.currentContentBlocDisposition.GroupContacts.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.currentContentBlocDisposition.GroupContacts, function (index, item) {\r\n var indexItem = $scope.currentContentBlocDisposition.lstGroupContactAvailables.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.currentContentBlocDisposition.lstGroupContactAvailables.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $scope.SelectedToListGroupContentBlocDispositions = function () {\r\n $scope.allContentBlocDispositionsLeft = false;\r\n $scope.allContentBlocDispositionsRight = false;\r\n\r\n // On envoi tous les éléments sélectionnés dans la liste de gauche\r\n $.each($scope.currentContentBlocDisposition.GroupContacts, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.currentContentBlocDisposition.lstGroupContactAvailables.push(item);\r\n }\r\n });\r\n\r\n // On supprime de la liste de droite, tous les éléments envoyés\r\n $.each($scope.currentContentBlocDisposition.lstGroupContactAvailables, function (index, item) {\r\n var indexItem = $scope.currentContentBlocDisposition.GroupContacts.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.currentContentBlocDisposition.GroupContacts.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $scope.toogleAllElementsLeftBloc = function () {\r\n $scope.allContentBlocDispositionsLeft = !$scope.allContentBlocDispositionsLeft;\r\n $.each($scope.currentContentBlocDisposition.lstGroupContactAvailables, function (index, item) {\r\n item.checked = $scope.allContentBlocDispositionsLeft;\r\n });\r\n };\r\n\r\n $scope.toogleAllElementsRightBloc = function () {\r\n $scope.allContentBlocDispositionsRight = !$scope.allContentBlocDispositionsRight;\r\n $.each($scope.currentContentBlocDisposition.GroupContacts, function (index, item) {\r\n item.checked = $scope.allContentBlocDispositionsRight;\r\n });\r\n };\r\n\r\n $scope.SavePopupContentBlocDispositions = function () {\r\n var lstIdGroupContacts = [];\r\n $scope.currentContentBlocDisposition.GroupContacts.forEach(function (element) {\r\n lstIdGroupContacts.push(element.IdGroupContact);\r\n });\r\n\r\n blocDispositionService.SaveGroupContactsOfContentBlocDisposition($scope.currentContentBlocDisposition.IdContentBlocDisposition, lstIdGroupContacts, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.popupContentBlocDispositionsErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n $scope.openPopupContentBlocDispositions();\r\n }\r\n } else {\r\n\r\n $scope.popupContentBlocDispositionsErrorMessage = \"\";\r\n }\r\n });\r\n\r\n };\r\n /*\r\n * ONGLET COTATIONS BLOC PHYSIQUE\r\n *\r\n *\r\n */\r\n $scope.GetCashMarketsFromWsdApi = function (callbackFn) {\r\n quoteCashHashtagriService.GetCashMarketsFromWsdApi(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.quotesCashErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstProductsWSD = data;\r\n\r\n if ($filter('filter')($scope.lstProductsWSD, { IDProducts: newProductTextSelected.IDProducts }, true)[0] === undefined)\r\n $scope.lstProductsWSD.unshift(newProductTextSelected);\r\n\r\n $scope.filterProductWSD.itemCash = $scope.lstProductsWSD[0];\r\n callbackFn();\r\n }\r\n });\r\n };\r\n\r\n $scope.GetCashMarketsSelected = function () {\r\n quoteCashHashtagriService.GetCashMarketsSelected(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.quotesCashErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstProductsWSDSelected = data;\r\n $scope.paramsQuotesCash.ShowDetail = true;\r\n }\r\n });\r\n };\r\n\r\n function checkIsProductAllReadySelected(collection, cible) {\r\n var filterCheck = angular.copy(collection);\r\n var isExist = false;\r\n filterCheck.forEach(function (item) {\r\n if (item.IDProducts === cible.IDProducts) {\r\n isExist = true;\r\n return;\r\n }\r\n });\r\n return isExist;\r\n }\r\n\r\n $scope.AddProductWSD = function () {\r\n $scope.ResetMessages();\r\n if ($scope.filterProductWSD.itemCash && $scope.filterProductWSD.itemCash.IDProducts > 0) {\r\n if (!checkIsProductAllReadySelected($scope.lstProductsWSDSelected, $scope.filterProductWSD.itemCash)) {\r\n if ($scope.filterProductWSD.itemCash.MarketsWsd) {\r\n $scope.lstProductsWSDSelected.push($scope.filterProductWSD.itemCash);\r\n }\r\n }\r\n if ($filter('filter')($scope.lstProductsWSDSelected, { IDProducts: $scope.filterProductWSD.itemCash.IDProducts }, true)[0] !== undefined) {\r\n var productSelected = $filter('filter')($scope.lstProductsWSDSelected, { IDProducts: $scope.filterProductWSD.itemCash.IDProducts }, true)[0];\r\n if (!productSelected.showCashDetail)\r\n productSelected.showCashDetail = true;\r\n }\r\n }\r\n };\r\n\r\n $scope.SaveCashMarkets = function () {\r\n $scope.ResetMessages();\r\n if ($scope.lstProductsWSDSelected) {\r\n quoteCashHashtagriService.SaveCashMarkets($scope.lstProductsWSDSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.quotesCashErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.RefreshView('C');\r\n }\r\n });\r\n }\r\n };\r\n\r\n /*\r\n * ONGLET COTATIONS BLOC FUTURE\r\n *\r\n *\r\n */\r\n $scope.GetFutureMarketsExpiriesFromWsdApi = function (callbackFn) {\r\n quoteFutureHashtagriService.GetFutureMarketsExpiriesFromWsdApi(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.quotesFutureErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstMarketWSD = data;\r\n if ($filter('filter')($scope.lstMarketWSD, { IdMarkets: newMarketTextSelected.IdMarkets }, true)[0] === undefined)\r\n $scope.lstMarketWSD.unshift(newMarketTextSelected);\r\n\r\n $scope.filterMarketExpiries.IdMarket = newMarketTextSelected.IdMarkets;\r\n callbackFn();\r\n }\r\n });\r\n };\r\n\r\n $scope.GetFutureMarketExpiriesSelected = function () {\r\n quoteFutureHashtagriService.GetFutureMarketExpiriesSelected(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.quotesFutureErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstMarketExpiriesWSDSelected = data;\r\n $scope.paramsQuotesFuture.ShowDetail = true;\r\n }\r\n });\r\n };\r\n\r\n $scope.AddMarketExipryWSD = function () {\r\n $scope.ResetMessages();\r\n if ($scope.filterMarketExpiries.IdMarket && $scope.filterMarketExpiries.expiry && $scope.filterMarketExpiries.expiry.IdExpiry > 0) {\r\n if ($filter('filter')($scope.lstMarketExpiriesWSDSelected, { IdMarkets: $scope.filterMarketExpiries.IdMarket }, true)[0] !== undefined) {\r\n var marketExpiriesSelectedFind = $filter('filter')($scope.lstMarketExpiriesWSDSelected, { IdMarkets: $scope.filterMarketExpiries.IdMarket }, true)[0];\r\n if (!marketExpiriesSelectedFind.showFutureDetail)\r\n marketExpiriesSelectedFind.showFutureDetail = true;\r\n if ($filter('filter')(marketExpiriesSelectedFind.ListExpiryVm, { IdExpiry: $scope.filterMarketExpiries.expiry.IdExpiry }, true)[0] === undefined) {\r\n $filter('filter')($scope.lstMarketExpiriesWSDSelected, { IdMarkets: $scope.filterMarketExpiries.IdMarket }, true)[0].ListExpiryVm.push($scope.filterMarketExpiries.expiry);\r\n }\r\n } else {\r\n var newMarketExipries = {\r\n IdMarkets: $scope.filterMarketExpiries.IdMarket,\r\n LabelledMarket: $filter('filter')($scope.lstMarketWSD, { IdMarkets: $scope.filterMarketExpiries.IdMarket }, true)[0].LabelledMarket,\r\n ListExpiryVm: []\r\n };\r\n newMarketExipries.ListExpiryVm.push($scope.filterMarketExpiries.expiry);\r\n newMarketExipries.showFutureDetail = true;\r\n $scope.lstMarketExpiriesWSDSelected.push(newMarketExipries);\r\n }\r\n }\r\n };\r\n\r\n $scope.DeleteExpirySelected = function (idMarket, idExpiry) {\r\n $scope.ResetMessages();\r\n if (idMarket && idExpiry && idMarket > 0 && idExpiry > 0) {\r\n if ($filter('filter')($scope.lstMarketExpiriesWSDSelected, { IdMarkets: idMarket }, true)[0] !== undefined) {\r\n $filter('filter')($scope.lstMarketExpiriesWSDSelected, { IdMarkets: idMarket }, true)[0].ListExpiryVm.forEach(function (item, index) {\r\n if (item.IdExpiry === idExpiry) {\r\n $filter('filter')($scope.lstMarketExpiriesWSDSelected, { IdMarkets: idMarket }, true)[0].ListExpiryVm.splice(index, 1);\r\n return;\r\n }\r\n });\r\n\r\n if ($filter('filter')($scope.lstMarketExpiriesWSDSelected, { IdMarkets: idMarket }, true)[0] !== undefined) {\r\n if ($filter('filter')($scope.lstMarketExpiriesWSDSelected, { IdMarkets: idMarket }, true)[0].ListExpiryVm.length === 0)\r\n $scope.lstMarketExpiriesWSDSelected.forEach(function (item, indexMarket) {\r\n if (item.IdMarkets === idMarket) {\r\n $scope.lstMarketExpiriesWSDSelected.splice(indexMarket, 1);\r\n return;\r\n }\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n $scope.DeletePanelSelected = function (id, locat) {\r\n $scope.ResetMessages();\r\n if (id && id > 0) {\r\n if (locat === 'F') {\r\n $scope.lstMarketExpiriesWSDSelected.forEach(function (item, indexMarket) {\r\n if (item.IdMarkets === id) {\r\n $scope.lstMarketExpiriesWSDSelected.splice(indexMarket, 1);\r\n return;\r\n }\r\n });\r\n } else if (locat === 'C') {\r\n $scope.lstProductsWSDSelected.forEach(function (item, indexProduct) {\r\n if (item.IDProducts === id) {\r\n $scope.lstProductsWSDSelected.splice(indexProduct, 1);\r\n return;\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n $scope.SaveFutureMarketsExpiries = function () {\r\n $scope.ResetMessages();\r\n if ($scope.lstMarketExpiriesWSDSelected) {\r\n quoteFutureHashtagriService.SaveFutureMarketsExpiries($scope.lstMarketExpiriesWSDSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.quotesFutureErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.RefreshView('F');\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.InitExpiries = function () {\r\n $scope.filterMarketExpiries.expiry = null;\r\n $scope.filterMarketExpiries.init = false;\r\n $scope.lstMarketExpiriesVM = [];\r\n\r\n var newExpiryTextSelected = {\r\n IdExpiry: 0,\r\n LabelledExpiry: 'Sélectionnez'\r\n };\r\n\r\n if ($scope.filterMarketExpiries.IdMarket && $scope.filterMarketExpiries.IdMarket > 0) {\r\n if ($filter('filter')($scope.lstMarketWSD, { IdMarkets: $scope.filterMarketExpiries.IdMarket }, true)[0] !== undefined) {\r\n $scope.lstMarketExpiriesVM = $filter('filter')($scope.lstMarketWSD, { IdMarkets: $scope.filterMarketExpiries.IdMarket }, true)[0].ListExpiryVm;\r\n }\r\n }\r\n\r\n if ($filter('filter')($scope.lstMarketExpiriesVM, { IdExpiry: newExpiryTextSelected.IdExpiry }, true)[0] === undefined)\r\n $scope.lstMarketExpiriesVM.unshift(newExpiryTextSelected);\r\n\r\n $scope.filterMarketExpiries.expiry = newExpiryTextSelected;\r\n };\r\n\r\n var resetPopupQuotes = function () {\r\n $scope.lstPopupQuotes = [];\r\n for (var i = 0; i < 3; i++) {\r\n var popupQuoteToPush = { TypeLocatSelected: '', ProductWsdSelected: null, ExpiryWsdSelected: null, MarketCashWsdSelected: null, MarketFutureWsdSelected: null };\r\n $scope.lstPopupQuotes.push(popupQuoteToPush);\r\n }\r\n };\r\n\r\n $scope.ResetSubListsByTypeLocatPopupQuotes = function (index) {\r\n $scope.lstPopupQuotes[index].ProductWsdSelected = $scope.lstProductsWSD[0];\r\n $scope.lstPopupQuotes[index].MarketFutureWsdSelected = $scope.lstMarketWSD[0];\r\n $scope.lstPopupQuotes[index].ExpiryWsdSelected = { LabelledExpiry: \"Sélectionnez\", IdExpiry: \"\" };\r\n $scope.lstPopupQuotes[index].MarketCashWsdSelected = { MarketNameFR: \"Sélectionnez\", IdMarket: \"\" };\r\n };\r\n\r\n var setValuesPopupQuotes = function () {\r\n $scope.lstTypeLocats = [{ Label: 'Aucun', Value: '' }, { Label: 'Future', Value: 'F' }, { Label: 'Physique', Value: 'C' }];\r\n $scope.GetCashMarketsFromWsdApi(function callback() { $scope.GetFutureMarketsExpiriesFromWsdApi($scope.GetPopupQuotes); });\r\n };\r\n\r\n $scope.OpenAndInitPopupQuotes = function (openPopupQuotesFn) {\r\n $scope.popupQuotesErrorMessage = \"\";\r\n resetPopupQuotes();\r\n setValuesPopupQuotes();\r\n openPopupQuotesFn();\r\n };\r\n\r\n $scope.GetPopupQuotes = function () {\r\n elementInfoMarketHomePageQuoteService.GetAllElementInfoMarketHomePageQuotes(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else\r\n $scope.errorMessage = data;\r\n } else {\r\n for (var i = 0; i < 3; i++) {\r\n $scope.ResetSubListsByTypeLocatPopupQuotes(i);\r\n }\r\n\r\n for (var iData = 0; iData < data.length; iData++) {\r\n $scope.lstPopupQuotes[iData].TypeLocatSelected = data[iData].TypeLocat;\r\n switch (data[iData].TypeLocat) {\r\n case 'F':\r\n var marketFutureInList = $filter('filter')($scope.lstMarketWSD, { IdMarkets: data[iData].IdMarketWSD }, true)[0];\r\n if (marketFutureInList) {\r\n $scope.toggleToNextExpiryChecked = data[iData].ToggleToNextExpiry;\r\n $scope.lstPopupQuotes[iData].MarketFutureWsdSelected = marketFutureInList;\r\n var expiryInList = $filter('filter')(marketFutureInList.ListExpiryVm, { IdExpiry: data[iData].IdExpiryWSD }, true)[0];\r\n if (expiryInList) {\r\n $scope.lstPopupQuotes[iData].ExpiryWsdSelected = expiryInList;\r\n }\r\n }\r\n break;\r\n case 'C':\r\n var productInList = $filter('filter')($scope.lstProductsWSD, { IDProducts: data[iData].IdProductWSD }, true)[0];\r\n if (productInList) {\r\n $scope.lstPopupQuotes[iData].ProductWsdSelected = productInList;\r\n var marketCashInList = $filter('filter')(productInList.MarketsWsd, { IdMarket: data[iData].IdMarketWSD }, true)[0];\r\n if (marketCashInList) {\r\n $scope.lstPopupQuotes[iData].MarketCashWsdSelected = marketCashInList;\r\n }\r\n }\r\n break;\r\n default:\r\n }\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.SavePopupQuotes = function () {\r\n var error = $scope.CheckPopupQuotesBeforeSave();\r\n\r\n if (error !== \"\") {\r\n $scope.popupQuotesErrorMessage = error;\r\n return false;\r\n } else {\r\n var lstElementInfoMarketHomePageQuotes = [];\r\n for (var i = 0; i < $scope.lstPopupQuotes.length; i++) {\r\n if ($scope.lstPopupQuotes[i].TypeLocatSelected === 'C') {\r\n var elementInfoMarketHomePageQuoteC = {\r\n TypeLocat: $scope.lstPopupQuotes[i].TypeLocatSelected,\r\n IdProductWSD: $scope.lstPopupQuotes[i].ProductWsdSelected.IDProducts,\r\n IdMarketWSD: $scope.lstPopupQuotes[i].MarketCashWsdSelected.IdMarket,\r\n OrderPosition: i + 1\r\n };\r\n lstElementInfoMarketHomePageQuotes.push(elementInfoMarketHomePageQuoteC);\r\n } else if ($scope.lstPopupQuotes[i].TypeLocatSelected === 'F') {\r\n var elementInfoMarketHomePageQuoteF = {\r\n TypeLocat: $scope.lstPopupQuotes[i].TypeLocatSelected,\r\n IdExpiryWSD: $scope.lstPopupQuotes[i].ExpiryWsdSelected.IdExpiry,\r\n IdMarketWSD: $scope.lstPopupQuotes[i].MarketFutureWsdSelected.IdMarkets,\r\n OrderPosition: i + 1,\r\n ToggleToNextExpiry: $scope.toggleToNextExpiryChecked\r\n };\r\n lstElementInfoMarketHomePageQuotes.push(elementInfoMarketHomePageQuoteF);\r\n }\r\n }\r\n\r\n elementInfoMarketHomePageQuoteService.SaveListElementInfoMarketHomePageQuotes(lstElementInfoMarketHomePageQuotes, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.popupQuotesErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n $scope.openPopupQuotes();\r\n }\r\n } else {\r\n $scope.popupQuotesErrorMessage = \"\";\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.CheckPopupQuotesBeforeSave = function () {\r\n var error = \"\";\r\n $scope.lstPopupQuotes.forEach(function (item, index) {\r\n if (item.TypeLocatSelected === 'C' && (!item.ProductWsdSelected || item.ProductWsdSelected.IDProducts === 0 || !item.MarketCashWsdSelected || !item.MarketCashWsdSelected.IdMarket)) {\r\n error += \"Veuillez saisir le produit et la parité pour la cotation n°\" + (index + 1) + \"<br />\";\r\n } else if (item.TypeLocatSelected === 'F' && (!item.MarketFutureWsdSelected || item.MarketFutureWsdSelected.IdMarkets === 0 || !item.ExpiryWsdSelected || !item.ExpiryWsdSelected.IdExpiry)) {\r\n error += \"Veuillez saisir le produit et l'échéance pour la cotation n°\" + (index + 1) + \"<br />\";\r\n }\r\n });\r\n if (error) {\r\n error = $sce.trustAsHtml(error);\r\n }\r\n return error;\r\n };\r\n\r\n /*\r\n * ONGLET CONTENU OS\r\n *\r\n *\r\n */\r\n\r\n if (!$rootScope.ModuleHashtagri.Active)\r\n $location.path('/admin/parameters/global');\r\n\r\n if ($rootScope.successMessageContentInfosMarket)\r\n $scope.successMessageContentInfosMarket = $scope.successMessageContentInfosMarket;\r\n\r\n $scope.AddContentInfoMarket = function () {\r\n $location.path('/admin/contents/infoMarketHashtagri/saveContentInfoMarket/-1');\r\n };\r\n\r\n $scope.UpDateContentInfoMarket = function (idWritingContentInfoMarket) {\r\n $location.path('/admin/contents/infoMarketHashtagri/saveContentInfoMarket/' + idWritingContentInfoMarket);\r\n };\r\n\r\n $scope.GetWritingContentInfoMarketSelected = function (contentSelected) {\r\n if (contentSelected) {\r\n $scope.filterValue.IdWritingContentInfoMarketSelected = contentSelected.originalObject.Id;\r\n $scope.FilterWritingContentInfoMarket();\r\n }\r\n };\r\n\r\n $scope.SearchContentByAutoComplete = function (searchString, timeoutPromise) {\r\n var defered = $q.defer();\r\n writingContentInfoMarketService.GetItemsContentsByAutoComplete(searchString, timeoutPromise, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n defered.reject(status);\r\n } \r\n\r\n } else {\r\n defered.resolve(data);\r\n }\r\n\r\n });\r\n return defered.promise;\r\n };\r\n\r\n $scope.FilterWritingContentInfoMarket = function () {\r\n $scope.errorMessageContentInfosMarket = \"\";\r\n LoadWritingContentInfoMarket();\r\n\r\n };\r\n\r\n $scope.GetData = function (pageNo) {\r\n $scope.filterValue.CurrentPageNo = pageNo;\r\n $scope.FilterWritingContentInfoMarket();\r\n };\r\n\r\n $scope.TabSortKey = function (Property) {\r\n $scope.filterValue.Reverse = !$scope.filterValue.Reverse;\r\n $scope.filterValue.SortKey = Property;\r\n if (!$scope.filterValue.FirstLoad) {\r\n $scope.FilterWritingContentInfoMarket();\r\n }\r\n };\r\n\r\n $scope.OpenPopUpDeleteContent = function(showPopup, idWritingContentInfoMarket) {\r\n $rootScope.successMessageContentInfosMarket = $scope.successMessageContentInfosMarket = \"\";\r\n $scope.errorMessageContentInfosMarket = \"\";\r\n $scope.idWritingContentInfoMarketToDeleted = idWritingContentInfoMarket;\r\n showPopup();\r\n };\r\n\r\n $scope.DeleteWritingContentInfoMarket = function() {\r\n if ($scope.idWritingContentInfoMarketToDeleted)\r\n writingContentInfoMarketService.DeleteContentInfoMarket($scope.idWritingContentInfoMarketToDeleted, function(data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.errorMessageContentInfosMarket = data[0].errors[0].Message;\r\n } \r\n } else {\r\n $scope.successMessageContentInfosMarket = \"Le contenu a bien été supprimé.\";\r\n $scope.idWritingContentInfoMarketToDeleted = \"\";\r\n $scope.FilterWritingContentInfoMarket();\r\n }\r\n return true;\r\n });\r\n };\r\n\r\n $scope.$watch('filterValue.SearchContentString', function (newValue, oldValue) {\r\n if (!$scope.filterValue.FirstLoad && ((!newValue) || newValue.length >= 3 && !$scope.filterValue.IdWritingContentInfoMarketSelected)) {\r\n $scope.filterValue.IdWritingContentInfoMarketSelected = \"\";\r\n $scope.FilterWritingContentInfoMarket();\r\n }\r\n });\r\n\r\n var LoadWritingContentInfoMarket = function () {\r\n writingContentInfoMarketService.GetContentsInfoMarketByFilter($scope.filterValue.IdWritingContentInfoMarketSelected, $scope.filterValue.SearchContentString, $scope.filterValue.ItemsPerPage, $scope.filterValue.CurrentPageNo, $scope.filterValue.SortKey, $scope.filterValue.Reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessageContentInfosMarket = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.writingContentsInfoMarket = data.WritingContentsInfoMarketVm;\r\n $scope.totalContents = data.TotalItem;\r\n $scope.filterValue.FirstLoad = false;\r\n }\r\n });\r\n };\r\n\r\n //COMMON\r\n $scope.RefreshView = function (locat) {\r\n switch (locat) {\r\n case 'F':\r\n $scope.lstMarketExpiriesWSDSelected.forEach(function (market, index) {\r\n if (market.ListExpiryVm.length === 0)\r\n $scope.lstMarketExpiriesWSDSelected.splice(index, 1);\r\n });\r\n $scope.quotesFutureSuccessMessage = \"Modifications enregistrées\";\r\n break;\r\n case 'C':\r\n $scope.lstProductsWSDSelected.forEach(function (product, index) {\r\n var counterPariteChecked = 0;\r\n product.MarketsWsd.forEach(function (market, indexMarket) {\r\n if (market.IsSelected)\r\n counterPariteChecked++;\r\n });\r\n if (counterPariteChecked === 0)\r\n $scope.lstProductsWSDSelected.splice(index, 1);\r\n });\r\n $scope.quotesCashSuccessMessage = \"Modifications enregistrées\";\r\n break;\r\n default:\r\n }\r\n };\r\n\r\n var Init = function () {\r\n\r\n groupContactService.GetAll(function (data, status) {\r\n if (status === null) {\r\n $scope.initLstGroupContactAvailables = data;\r\n } else if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n\r\n if ($scope.viewMode === \"contentsInfoMarket\") {\r\n $rootScope.successMessageContentInfosMarket = $scope.successMessageContentInfosMarket = \"\";\r\n $scope.GetCategoryInfosMarket();\r\n $scope.GetElementInfoMarketHomePage();\r\n resetPopupQuotes();\r\n } else if ($scope.viewMode === \"quotesInfoMarket\") {\r\n $rootScope.successMessageContentInfosMarket = $scope.successMessageContentInfosMarket = \"\";\r\n $scope.showCashDetail = false;\r\n $scope.filterMarketExpiries.init = true;\r\n $scope.GetCashMarketsFromWsdApi(function () { });\r\n $scope.GetCashMarketsSelected();\r\n $scope.GetBlocDispositions();\r\n $scope.GetFutureMarketsExpiriesFromWsdApi(function () { });\r\n $scope.GetFutureMarketExpiriesSelected();\r\n\r\n } else if ($scope.viewMode === \"writingContentInfoMarket\") {\r\n LoadWritingContentInfoMarket();\r\n }\r\n };\r\n\r\n\r\n Init(false);\r\n }]);\r\n","AgrimarketControllers.controller('saveContentInfoMarketController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', '$http', '$location', 'typeBlockEditableService', 'writingContentInfoMarketService', 'enumFactory', 'parametersService', 'dateService', 'configurationFactory', 'parametersFactory',\r\n function ($scope, $rootScope, $routeParams, $sce, $filter, $http, $location, typeBlockEditableService, writingContentInfoMarketService, enumFactory, parametersService, dateService, configurationFactory, parametersFactory) {\r\n\r\n $scope.writingContentInfoMarket = {};\r\n $scope.viewMode = \"saveContentInfoMarket\";\r\n $scope.enumTypeBlockEditables = enumFactory.TypeBlockEditables;\r\n $scope.pushNotificationEnabled = parametersFactory.Parameters.GoogleConsoleCloudServiceFilename.Value ;\r\n\r\n var init = function () {\r\n $scope.forceLoad = false;\r\n $scope.writingContentInfoMarketErrorMessage = \"\";\r\n $rootScope.successMessageContentInfosMarket = \"\";\r\n $scope.TypeBlockEditables = [];\r\n\r\n typeBlockEditableService.GetTypeBlockEditable(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.writingContentInfoMarketErrorMessage = data[0].errors[0].Message;\r\n } \r\n } else {\r\n $scope.typeBlockEditables = data;\r\n }\r\n });\r\n\r\n if ($routeParams.idWritingContentInfoMarket == -1) {\r\n $scope.blocTitle = \"Création d'un contenu\";\r\n $scope.action = \"Créer\";\r\n $scope.forceLoad = true;\r\n }\r\n else {\r\n writingContentInfoMarketService.GetContentInfoMarketById($routeParams.idWritingContentInfoMarket, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.writingContentInfoMarketErrorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.writingContentInfoMarket = data;\r\n $scope.writingContentInfoMarket.StartPublication = $filter('date')($scope.writingContentInfoMarket.StartPublication, \"dd/MM/yyyy\");\r\n $scope.writingContentInfoMarket.EndPublication = $filter('date')($scope.writingContentInfoMarket.EndPublication, \"dd/MM/yyyy\");\r\n $scope.blocTitle = \"Modification d'un contenu\";\r\n $scope.action = \"Modifier\";\r\n $scope.forceLoad = true;\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.checkWritingContentInfoMarket = function () {\r\n $scope.writingContentInfoMarketErrorMessage = \"\";\r\n $rootScope.successMessageContentInfosMarket = \"\";\r\n var startPublicationVerif = false;\r\n var endPublicationVerif = false;\r\n var maxNbCharacters = 300;\r\n var dateDay = $filter('date')(new Date(), \"dd/MM/yyyy\");\r\n var regexDate = /^(\\d{2}\\/){2}\\d{4}$/;\r\n\r\n if (!$scope.writingContentInfoMarket.Title)\r\n $scope.writingContentInfoMarketErrorMessage = \"Veuillez renseigner un titre pour le contenu.\";\r\n\r\n if (!$scope.writingContentInfoMarket.Content) {\r\n if ($scope.writingContentInfoMarketErrorMessage)\r\n $scope.writingContentInfoMarketErrorMessage += \"<br/>\";\r\n\r\n $scope.writingContentInfoMarketErrorMessage += \"Veuillez renseigner un contenu.\";\r\n }\r\n\r\n if (!$scope.writingContentInfoMarket.IdTypeBlockEditable) {\r\n if ($scope.writingContentInfoMarketErrorMessage)\r\n $scope.writingContentInfoMarketErrorMessage += \"<br/>\";\r\n\r\n $scope.writingContentInfoMarketErrorMessage += \"Veuillez choisir un type de bloc éditable sur lequel doit apparaître le contenu.\";\r\n } else {\r\n if (Number($scope.writingContentInfoMarket.IdTypeBlockEditable) === enumFactory.TypeBlockEditables.Bandeau && $scope.writingContentInfoMarket.Content && $scope.writingContentInfoMarket.Content.length > maxNbCharacters) {\r\n if ($scope.writingContentInfoMarketErrorMessage)\r\n $scope.writingContentInfoMarketErrorMessage += \"<br/>\";\r\n\r\n $scope.writingContentInfoMarketErrorMessage += \"Votre contenu est trop long pour être présenté dans le bloc bandeau, Veuillez le réduire ou changer de type de bloc.\";\r\n }\r\n }\r\n\r\n if (!$scope.writingContentInfoMarket.StartPublication) {\r\n if ($scope.writingContentInfoMarketErrorMessage)\r\n $scope.writingContentInfoMarketErrorMessage += \"<br/>\";\r\n\r\n $scope.writingContentInfoMarketErrorMessage += \"Veuillez renseigner une date de début de publication pour le contenu.\";\r\n } else {\r\n if ((!(regexDate.test($scope.writingContentInfoMarket.StartPublication))) || (!dateService.VerifDateIsCalendar($scope.writingContentInfoMarket.StartPublication))) {\r\n if ($scope.writingContentInfoMarketErrorMessage)\r\n $scope.writingContentInfoMarketErrorMessage += \"<br/>\";\r\n\r\n $scope.writingContentInfoMarketErrorMessage += \"Veuillez renseigner une date de début de publication valide pour le contenu valide (format attendu dd/MM/YYYY).\";\r\n } else\r\n startPublicationVerif = true;\r\n }\r\n\r\n if (!$scope.writingContentInfoMarket.EndPublication) {\r\n if ($scope.writingContentInfoMarketErrorMessage)\r\n $scope.writingContentInfoMarketErrorMessage += \"<br/>\";\r\n\r\n $scope.writingContentInfoMarketErrorMessage += \"Veuillez renseigner une date de fin de publication pour le contenu.\";\r\n } else {\r\n if ((!(regexDate.test($scope.writingContentInfoMarket.EndPublication))) || (!dateService.VerifDateIsCalendar($scope.writingContentInfoMarket.EndPublication))) {\r\n if ($scope.writingContentInfoMarketErrorMessage)\r\n $scope.writingContentInfoMarketErrorMessage += \"<br/>\";\r\n\r\n $scope.writingContentInfoMarketErrorMessage += \"Veuillez renseigner une date de fin de publication valide pour le contenu valide (format attendu dd/MM/YYYY).\";\r\n } else\r\n endPublicationVerif = true;\r\n }\r\n\r\n if (startPublicationVerif && endPublicationVerif) {\r\n\r\n if (!dateService.compareDateOverride(dateDay, $scope.writingContentInfoMarket.EndPublication) && $routeParams.idWritingContentInfoMarket == -1) {\r\n if ($scope.writingContentInfoMarketErrorMessage)\r\n $scope.writingContentInfoMarketErrorMessage += \"<br/>\";\r\n\r\n $scope.writingContentInfoMarketErrorMessage += \"Veuillez renseigner une date de fin de publication posterieur à la date du jour.\";\r\n }\r\n\r\n if (!dateService.compareDate($scope.writingContentInfoMarket.StartPublication, $scope.writingContentInfoMarket.EndPublication)) {\r\n if ($scope.writingContentInfoMarketErrorMessage)\r\n $scope.writingContentInfoMarketErrorMessage += \"<br/>\";\r\n\r\n $scope.writingContentInfoMarketErrorMessage += \"Veuillez renseigner une date de début de publication anterieur à la date de fin de publication.\";\r\n }\r\n }\r\n\r\n if ($scope.writingContentInfoMarketErrorMessage)\r\n return false;\r\n\r\n $scope.saveContentInfoMarket();\r\n return true;\r\n };\r\n\r\n $scope.saveContentInfoMarket = function () {\r\n $scope.writingContentInfoMarketErrorMessage = \"\";\r\n $rootScope.successMessageContentInfosMarket = \"\";\r\n\r\n $scope.writingContentInfoMarket.StartPublication = dateService.ConvertDateToDateAPI($scope.writingContentInfoMarket.StartPublication);\r\n $scope.writingContentInfoMarket.EndPublication = dateService.ConvertDateToDateAPI($scope.writingContentInfoMarket.EndPublication);\r\n $scope.writingContentInfoMarket.Id = $routeParams.idWritingContentInfoMarket == -1 ? 0 : $routeParams.idWritingContentInfoMarket;\r\n\r\n writingContentInfoMarketService.SaveContentInfoMarket($scope.writingContentInfoMarket, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.writingContentInfoMarket.StartPublication = $filter('date')($scope.writingContentInfoMarket.StartPublication, \"dd/MM/yyyy\");\r\n $scope.writingContentInfoMarket.EndPublication = $filter('date')($scope.writingContentInfoMarket.EndPublication, \"dd/MM/yyyy\");\r\n $scope.writingContentInfoMarketErrorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n if ($routeParams.idWritingContentInfoMarket == -1)\r\n $rootScope.successMessageContentInfosMarket = \"Votre contenu a bien été pris en compte.\";\r\n else\r\n $rootScope.successMessageContentInfosMarket = \"Vos modifications ont bien été prises en compte.\";\r\n\r\n\r\n $location.path('admin/contents/infoMarketHashtagri/view/writingContentInfoMarket');\r\n }\r\n });\r\n };\r\n\r\n $scope.Cancel = function () {\r\n $location.path('admin/contents/infoMarketHashtagri/view/writingContentInfoMarket');\r\n };\r\n\r\n $scope.NbCharactersWriting = function() {\r\n if ($scope.writingContentInfoMarket.IdTypeBlockEditable && Number($scope.writingContentInfoMarket.IdTypeBlockEditable) === enumFactory.TypeBlockEditables.Bandeau && $scope.writingContentInfoMarket.Content)\r\n return \"Nombre de caractères y compris balises HTML :\" + $scope.writingContentInfoMarket.Content.length;\r\n };\r\n\r\n $scope.UploadImage = function (data) {\r\n CKEDITOR.instances.txtContent.insertHtml(\"<img src='\" + $filter('uploadLinkInline')(data.PrivateLabel) + \"'>\");\r\n };\r\n\r\n $scope.changeTypeBlockEditable = function () {\r\n if ($scope.writingContentInfoMarket.IdTypeBlockEditable === $scope.enumTypeBlockEditables.Bandeau && $scope.writingContentInfoMarket.Content && $scope.writingContentInfoMarket.Content.indexOf(\"<img src=\") >= 0)\r\n $scope.writingContentInfoMarket.Content.match(/<img [^>]*src=\"[^\"]*\"[^>]*>/gm).forEach(function (item) {\r\n $scope.writingContentInfoMarket.Content = $scope.writingContentInfoMarket.Content.replace(item, '');\r\n });\r\n };\r\n\r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('notificationsController', ['$scope', '$rootScope', '$sce', 'notificationsService', 'colonnesNotifications', 'enumFactory',\r\n function ($scope, $rootScope, $sce, notificationsService, colonnesNotifications, enumFactory) {\r\n\r\n $scope.Init = function () {\r\n $scope.tableNotificationsDataVisible = colonnesNotifications.data.DataVisible.split(',');\r\n $scope.tableNotificationsLibelle = colonnesNotifications.data.ColumnName.split(',');\r\n $scope.titlePopupDelete = $rootScope.editableObjectsFactory.EditableObjects.Admin_Notifications_PopupDelete_Title.Content;\r\n $scope.enumFactory = enumFactory;\r\n $scope.max = 10;\r\n $scope.pageNo = 1;\r\n $scope.reverse = false;\r\n $scope.sortKey = \"\";\r\n $scope.GetNotifications();\r\n };\r\n\r\n $scope.GetNotifications = function () {\r\n $scope.loading = true;\r\n notificationsService.GetNotificationsPaginate($scope.max, $scope.pageNo, $scope.sortKey, $scope.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.notifications = data.ListVm;\r\n $scope.total = data.Total;\r\n $scope.loading = false;\r\n }\r\n });\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.sortKey = sortKey;\r\n $scope.reverse = reverse;\r\n $scope.GetNotifications();\r\n };\r\n\r\n $scope.GetData = function (pageNo) {\r\n $scope.pageNo = pageNo;\r\n $scope.GetNotifications();\r\n };\r\n\r\n $scope.DeleteNotification = function (idNotification) {\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n notificationsService.DeleteNotification(idNotification, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } \r\n } else {\r\n $scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.Admin_Notifications_MessageDelete.Content;\r\n $scope.Init();\r\n }\r\n });\r\n };\r\n\r\n $scope.Init();\r\n $rootScope.onRefresh = function () { $scope.Init(); };\r\n }]);\r\n","AgrimarketControllers.controller('saveNotificationController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', 'notificationsService',\r\n function ($scope, $rootScope, $routeParams, $sce, $filter, notificationsService) {\r\n\r\n $scope.Init = function () {\r\n $scope.tmpGroupContactsLeft = [];\r\n $scope.tmpGroupContactsRight = [];\r\n $scope.showActionButtons = true;\r\n $scope.tmpTcsLeft = [];\r\n $scope.tmpTcsRight = [];\r\n $scope.lstTypeSends = [\r\n { bSendDelayed: false, Label: $rootScope.editableObjectsFactory.EditableObjects.Admin_Notifications_Create_TypeSendImmediate.Content },\r\n { bSendDelayed: true, Label: $rootScope.editableObjectsFactory.EditableObjects.Admin_Notifications_Create_TypeSendDelayed.Content}\r\n ];\r\n\r\n $scope.GetNotification();\r\n };\r\n\r\n $scope.GetNotification = function () {\r\n notificationsService.GetNotificationById($routeParams.idNotification, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.notification = data;\r\n $scope.notification.DateSend = $filter('date')($scope.notification.DateSend, 'dd/MM/yyyy');\r\n }\r\n });\r\n };\r\n\r\n $scope.Save = function () {\r\n $scope.showActionButtons = false;\r\n if ($scope.notification.DateSend) {\r\n var tabDateSend = $scope.notification.DateSend.split('/');\r\n $scope.notification.DateSend = new Date(tabDateSend[2] + \"-\" + tabDateSend[1] + \"-\" + tabDateSend[0]).toISOString();\r\n }\r\n\r\n notificationsService.Save($scope.notification, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n $scope.showActionButtons = true;\r\n } else {\r\n $rootScope.goTo('/admin/contents/notifications');\r\n }\r\n });\r\n };\r\n\r\n // Gestion des groupes de contacts\r\n $scope.toogleAllElementsLeft = function () {\r\n $scope.allSelectedLeft = !$scope.allSelectedLeft;\r\n $.each($scope.notification.LstGroupContacts, function (index, item) {\r\n item.checked = $scope.allSelectedLeft;\r\n });\r\n };\r\n\r\n $scope.toogleAllElementsRight = function () {\r\n $scope.allSelectedRight = !$scope.allSelectedRight;\r\n $.each($scope.notification.LstGroupContactSelecteds, function (index, item) {\r\n item.checked = $scope.allSelectedRight;\r\n });\r\n };\r\n\r\n $scope.AddToSelectedGroups = function () {\r\n $scope.allSelectedLeft = false;\r\n $scope.allSelectedRight = false;\r\n\r\n $.each($scope.notification.LstGroupContacts, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.notification.LstGroupContactSelecteds.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.notification.LstGroupContactSelecteds, function (index, item) {\r\n var indexItem = $scope.notification.LstGroupContacts.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.notification.LstGroupContacts.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $scope.DeleteInSelectedGroups = function () {\r\n $scope.allSelectedLeft = false;\r\n $scope.allSelectedRight = false;\r\n\r\n $.each($scope.notification.LstGroupContactSelecteds, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.notification.LstGroupContacts.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.notification.LstGroupContacts, function (index, item) {\r\n var indexItem = $scope.notification.LstGroupContactSelecteds.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.notification.LstGroupContactSelecteds.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n // Gestion des techniciens\r\n $scope.toogleAllElementsLeftTc = function () {\r\n $scope.allSelectedTcsLeft = !$scope.allSelectedTcsLeft;\r\n $.each($scope.notification.LstTcs, function (index, item) {\r\n item.checked = $scope.allSelectedTcsLeft;\r\n });\r\n };\r\n\r\n $scope.toogleAllElementsRightTc = function () {\r\n $scope.allSelectedTcsRight = !$scope.allSelectedTcsRight;\r\n $.each($scope.notification.LstTcsSelecteds, function (index, item) {\r\n item.checked = $scope.allSelectedTcsRight;\r\n });\r\n };\r\n\r\n $scope.AddToSelectedTcs = function () {\r\n $scope.allSelectedTcsLeft = false;\r\n $scope.allSelectedTcsRight = false;\r\n\r\n $.each($scope.notification.LstTcs, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.notification.LstTcsSelecteds.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.notification.LstTcsSelecteds, function (index, item) {\r\n var indexItem = $scope.notification.LstTcs.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.notification.LstTcs.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $scope.DeleteInSelectedTcs = function () {\r\n $scope.allSelectedTcsLeft = false;\r\n $scope.allSelectedTcsRight = false;\r\n\r\n $.each($scope.notification.LstTcsSelecteds, function (index, item) {\r\n if (item.checked) {\r\n item.checked = false;\r\n $scope.notification.LstTcs.push(item);\r\n }\r\n });\r\n\r\n $.each($scope.notification.LstTcs, function (index, item) {\r\n var indexItem = $scope.notification.LstTcsSelecteds.indexOf(item);\r\n if (indexItem !== -1)\r\n $scope.notification.LstTcsSelecteds.splice(indexItem, 1);\r\n });\r\n };\r\n\r\n $scope.Init();\r\n }]);\r\n","AgrimarketControllers.controller('portfolioController', [\r\n '$scope', '$rootScope', '$filter', '$sce', 'portfolioService', '$routeParams', 'contractsColumns', 'ordersColumns', 'wsdApiService',\r\n 'typeContractsService', 'productsService', 'ceremisApiService', 'coverService', 'enumFactory', 'athenaOrdersService',\r\n function ($scope, $rootScope, $filter, $sce, portfolioService, $routeParams, contractsColumns, ordersColumns, wsdApiService,\r\n typeContractsService, productsService, ceremisApiService, coverService, enumFactory, athenaOrdersService) {\r\n\r\n $scope.markets = [];\r\n $scope.expiries = [];\r\n $scope.enumOrderTypes = enumFactory.AthenaOrderTypes;\r\n $scope.enumOrderStates = enumFactory.AthenaOrderStates;\r\n $scope.viewMode = $routeParams.typeView;\r\n $scope.IsUneal = $rootScope.paramNameCoop === enumFactory.Coops.Uneal;\r\n $scope.init = function () {\r\n\r\n wsdApiService.GetMarketsWSDToEuronext(function (data, status) {\r\n $scope.markets = data;\r\n });\r\n\r\n $scope.filters = {\r\n startDate: \"\",\r\n endDate: \"\",\r\n reverse: false,\r\n page: 1,\r\n itemsPerPage: 10\r\n };\r\n $scope.$watch(\"filters\", function (newValue, oldValue) {\r\n if (oldValue.idMarket !== newValue.idMarket) {\r\n $scope.filters.idExpiry = undefined;\r\n if (newValue.idMarket !== undefined) {\r\n wsdApiService.GetExpiriesWSDByIdMarket(newValue.idMarket, function (data, status) {\r\n $scope.expiries = data.Expiries;\r\n });\r\n }\r\n }\r\n if ($scope.HandleFiltersChange !== undefined)\r\n $scope.HandleFiltersChange(newValue, oldValue);\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue)) {\r\n $scope.fetch();\r\n }\r\n }, true);\r\n\r\n switch ($scope.viewMode) {\r\n case \"contracts\":\r\n $scope.contractsKeys = contractsColumns.data.DataVisible.split(',');\r\n $scope.contractsColumns = contractsColumns.data.ColumnName.split(',');\r\n $scope.varieties = [{ Label: 'Aucune', IdVariety: undefined }];\r\n\r\n $scope.HandleFiltersChange = function (newValue, oldValue) {\r\n if (oldValue.idProduct !== newValue.idProduct) {\r\n $scope.filters.idVariety = undefined;\r\n if (newValue.idProduct !== undefined) {\r\n var selectedProduct = $rootScope.products.find(function (p) {\r\n return p.IdProduct === newValue.idProduct;\r\n });\r\n $scope.varieties = $scope.varities = [{ Label: 'Aucune', IdVariety: undefined }];\r\n selectedProduct.Varieties.forEach(function (x) { $scope.varieties.push(x); });\r\n }\r\n else {\r\n $scope.varieties = [{ Label: 'Aucune', IdVariety: undefined }];\r\n }\r\n }\r\n };\r\n\r\n $scope.fetch = $scope.getContracts;\r\n\r\n typeContractsService.GetTypeContracts(function (data) {\r\n $scope.contractTypes = [\r\n { Label: 'Aucun', IdTypeContract: undefined }\r\n ];\r\n data.forEach(function (x) { $scope.contractTypes.push(x); });\r\n });\r\n\r\n productsService.GetAllProducts(function (data) {\r\n $scope.products = [\r\n { Label: 'Aucun', IdProduct: undefined }\r\n ];\r\n data.forEach(function (x) { $scope.products.push(x); });\r\n });\r\n\r\n portfolioService.GetContractStatuses(function (data) {\r\n $scope.contractStatuses = [\r\n { Label: 'Aucun', IdStatus: undefined }\r\n ];\r\n data.forEach(function (x) { $scope.contractStatuses.push(x); });\r\n });\r\n\r\n $scope.showContractDetails = function (contract, show) {\r\n $scope.contractDetailsTitle = \"Ordres couvrant le contrat \" + contract.IdContract;\r\n $scope.orders = contract.Orders;\r\n show();\r\n };\r\n\r\n break;\r\n case \"orders\":\r\n // Orders\r\n $scope.ordersKeys = ordersColumns.data.DataVisible.split(',');\r\n $scope.ordersColumns = ordersColumns.data.ColumnName.split(',');\r\n\r\n $scope.orderTypes = [\r\n enumFactory.AthenaOrderTypes.Market,\r\n enumFactory.AthenaOrderTypes.Limit\r\n ];\r\n\r\n portfolioService.GetOrderStatuses(function (data, status) {\r\n $scope.orderStatuses = [{ Label: 'Aucun', IdStatus: undefined }];\r\n data.forEach(function (x) { $scope.orderStatuses.push(x); });\r\n });\r\n\r\n $scope.directions = [\r\n { label: 'Vente', id: 'v' },\r\n { label: 'Achat', id: 'a' }\r\n ];\r\n\r\n $scope.origins = [\r\n { label: 'Aucun', id: undefined },\r\n { label: 'Couverture de contrat', id: 'Couverture de contrat' },\r\n { label: 'Ordre seul', id: 'Ordre seul' }\r\n ];\r\n\r\n $scope.fetch = $scope.getOrders;\r\n\r\n $scope.showOrderDetails = function (order, show) {\r\n $scope.orderDetailsTitle = \"Contrats couverts par l'ordre \" + order.IdOrder;\r\n $scope.contracts = order.Contracts;\r\n $scope.selectedOrder = order;\r\n show();\r\n };\r\n\r\n break;\r\n }\r\n $scope.fetch();\r\n };\r\n\r\n $scope.GetData = function (page) {\r\n $scope.filters.page = page;\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.filters.sortKey = sortKey;\r\n $scope.filters.reverse = reverse;\r\n };\r\n $scope.getContracts = function () {\r\n var params = {};\r\n Object.assign(params, $scope.filters);\r\n params.startDate = toDate($scope.filters.startDate);\r\n params.endDate = toDate($scope.filters.endDate);\r\n portfolioService.GetContracts(params, function (data, status) {\r\n $scope.contracts = angular.copy(data.Page);\r\n $scope.contractsTotal = data.Total;\r\n });\r\n };\r\n\r\n $scope.getOrders = function () {\r\n var params = {};\r\n Object.assign(params, $scope.filters);\r\n params.startDate = toDate($scope.filters.startDate);\r\n params.endDate = toDate($scope.filters.endDate);\r\n portfolioService.GetOrders(params, function (data, status) {\r\n $scope.orders = angular.copy(data.Page);\r\n $scope.ordersTotal = data.Total;\r\n });\r\n };\r\n\r\n $scope.OpenPopUpOrder = function (openPopup) {\r\n $scope.openPopupOrder = openPopup;\r\n $scope.orderPopUp = {};\r\n $scope.popupOrderErrorMessage = \"\";\r\n $scope.modalTitle = $rootScope.editableObjectsFactory.EditableObjects.ModalTitleAddOrder.Content;\r\n $scope.marketsPopUp = $scope.markets;\r\n\r\n if ($scope.IsUneal)\r\n filterMarketsWsdByOffersCeremis();\r\n\r\n getAccounts();\r\n openPopup();\r\n };\r\n\r\n $scope.openPopUpOrderRestart = function (order, openPopup) {\r\n $scope.modalTitle = $rootScope.editableObjectsFactory.EditableObjects.ModalTitleRestartOrder.Content + \" \" + order.IdOrder;\r\n $scope.openPopupOrder = openPopup;\r\n $scope.orderPopUp = {};\r\n $scope.loadPopUpOrder(order);\r\n $scope.popupOrderErrorMessage = \"\";\r\n $scope.marketsPopUp = $scope.markets;\r\n $scope.orderPopUp.IdOfferBuiltPrice = order.IdOfferBuiltPrice;\r\n\r\n if ($scope.IsUneal)\r\n filterMarketsWsdByOffersCeremis();\r\n\r\n getAccounts();\r\n openPopup();\r\n };\r\n\r\n $scope.loadPopUpOrder = function (order) {\r\n $scope.orderPopUp.IdOrder = order.IdOrder;\r\n $scope.orderPopUp.IdExt = order.IdExt;\r\n $scope.orderPopUp.IdMarketWsd = order.IdMarket;\r\n $scope.GetExpiriesForPopUp(order.IdMarket);\r\n $scope.orderPopUp.IdExpiryWsd = order.IdExpiry;\r\n $scope.orderPopUp.IdAccount = order.IdAccount;\r\n $scope.orderPopUp.IdOrderType = order.OrderTypeId;\r\n $scope.orderPopUp.Price = order.TargetPrice;\r\n $scope.orderPopUp.EndDate = order.ExpireDate;\r\n $scope.orderPopUp.Direction = order.DirectionId;\r\n $scope.orderPopUp.Qty = order.lotNumber;\r\n };\r\n\r\n $scope.GetExpiriesForPopUp = function (idMarket) {\r\n if (idMarket) {\r\n wsdApiService.GetExpiriesWSDByIdMarket(idMarket, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.popupOrderErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.expiriesPopUp = data.Expiries;\r\n\r\n if ($scope.IsUneal) {\r\n $scope.lstExpiryTmp = [];\r\n $.each($scope.expiriesPopUp, function (index, item) {\r\n if ($scope.lstOffersCeremis.indexOf($filter('filter')($scope.lstOffersCeremis, { \"IdExpiryWSD\": Number(item.IdExpiry) }, true)[0]) !== -1) {\r\n $scope.lstExpiryTmp.push(item);\r\n }\r\n });\r\n $scope.expiriesPopUp = $scope.lstExpiryTmp;\r\n }\r\n }\r\n });\r\n }\r\n else\r\n $scope.expiriesPopUp = [];\r\n };\r\n\r\n $scope.SavePopupOrder = function () {\r\n $scope.orderPopUp.EndDate = toDate($scope.orderPopUp.EndDate);\r\n athenaOrdersService.PostAthenaOrderVm($scope.orderPopUp, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400) {\r\n $scope.popupOrderErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n $scope.openPopupOrder();\r\n }\r\n }\r\n else\r\n $scope.init();\r\n });\r\n };\r\n\r\n function filterMarketsWsdByOffersCeremis() {\r\n ceremisApiService.GetOffersCeremis(\"\", function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.popupOrderErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstOffersCeremis = data;\r\n $scope.lstmarketTmp = [];\r\n $.each($scope.marketsPopUp, function (index, item) {\r\n if ($scope.lstOffersCeremis.indexOf($filter('filter')($scope.lstOffersCeremis, { \"IdMarketWSD\": Number(item.IdMarket) }, true)[0]) !== -1) {\r\n $scope.lstmarketTmp.push(item);\r\n }\r\n });\r\n $scope.marketsPopUp = $scope.lstmarketTmp;\r\n }\r\n });\r\n }\r\n\r\n function getAccounts() {\r\n coverService.GetAllAccounts(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.popupOrderErrorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else\r\n $scope.lstAccounts = data;\r\n });\r\n }\r\n\r\n $scope.$watch(\"orderPopUp.Qty\", function (newValue, oldValue) {\r\n if (newValue && !isNaN(newValue))\r\n $scope.textConversionTon = $rootScope.editableObjectsFactory.EditableObjects.Admin_Routing_Orders_TextConversionTon.Content.replace(\"[qty]\", newValue * 50);\r\n else\r\n $scope.textConversionTon = \"\";\r\n }, true);\r\n\r\n function toDate(date) {\r\n if (!date) return undefined;\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(date.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n return moment(currentDate).format('YYYY/MM/DD');\r\n }\r\n\r\n $scope.init();\r\n\r\n $rootScope.onRefresh = function () {\r\n $scope.init();\r\n };\r\n }]);","AgrimarketControllers.controller('userOfferController', ['$scope', '$rootScope', '$location', 'configurationFactory', 'offerService', 'enumFactory', '$routeParams', 'colonnesOffersFirmUser', 'colonnesOffersCommitmentUser', 'colonnesOffersFirmTc', 'colonnesOffersCommitmentTc', 'colonnesOffersOptionUser', 'colonnesOffersOptionTc', 'smsAlertService', 'colonnesOffersBlankContract', 'userService', 'colonnesOffersCommitmentSurfaceUser', 'colonnesOffersCommitmentSurfaceTc', 'colonnesOffersMultiCropsUser', 'colonnesOffersMultiCropsTc',\r\n function ($scope, $rootScope, $location, configurationFactory, offerService, enumFactory, $routeParams, colonnesOffersFirmUser, colonnesOffersCommitmentUser, colonnesOffersFirmTc, colonnesOffersCommitmentTc, colonnesOffersOptionUser, colonnesOffersOptionTc, smsAlertService, colonnesOffersBlankContract, userService, colonnesOffersCommitmentSurfaceUser, colonnesOffersCommitmentSurfaceTc, colonnesOffersMultiCropsUser, colonnesOffersMultiCropsTc) {\r\n $scope.viewMode = $routeParams.typeOffer;\r\n $scope.idContractCommitment = $routeParams.idContractCommitment;\r\n $scope.quantity = $routeParams.quantity;\r\n $scope.targetPrice = $routeParams.targetPrice;\r\n $scope.idTypeFixationOnlyTargetPrice = $routeParams.idTypeFixationOnlyTargetPrice;\r\n $scope.idFirstComponentContractOrContractBase = $routeParams.idFirstComponentContractOrContractBase;\r\n $scope.enumFactory = enumFactory;\r\n $scope.enumTypeOffer = enumFactory.TypeOffer;\r\n $rootScope.offer = {};\r\n $scope.Product = { IdProduct: null };\r\n $scope.offersOpen = [];\r\n $scope.maxOffers = 10;\r\n $scope.pageNo = 1;\r\n $scope.allowUserToSubscribreToday = false;\r\n $scope.userNotSelected = $rootScope.CurrentUserRole === \"TC\" && ($rootScope.selectedClientFromTc === undefined || $rootScope.selectedClientFromTc === null);\r\n $scope.data = { reverse: false, sortKey: \"Order\" };\r\n $scope.IsModuleOptionActive = $rootScope.Modules.ModuleOption.Active;\r\n $scope.IsModuleBlankContractActive = $rootScope.Modules.ModuleContratVierge.Active;\r\n $scope.IsModuleMultiCropsActive = $rootScope.Modules.ModuleMultiCampagne.Active;\r\n $scope.enumTypeFixations = enumFactory.TypeFixations;\r\n $scope.lstProducts = [];\r\n var setFilters = true;\r\n $scope.Offer_SellLegendIcoIsVisible = $rootScope.editableObjectsFactory.EditableObjects.Offer_Sell.IsVisible || $rootScope.modeEdition;\r\n $scope.Offer_TargetPriceLegendIcoIsVisible = $rootScope.editableObjectsFactory.EditableObjects.Offer_TargetPrice.IsVisible || $rootScope.modeEdition;\r\n $scope.Offer_AlertLegendIcoIsVisible = $rootScope.editableObjectsFactory.EditableObjects.Offer_Alert.IsVisible || $rootScope.modeEdition;\r\n\r\n if (!$rootScope.paramSelectTcUserGlobally)\r\n $rootScope.selectedClientFromTcForSubscribe = undefined;\r\n\r\n var AllowUserToSubscribreToday = function () {\r\n offerService.AllowUserToSubscribreToday(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.allowUserToSubscribreToday = false;\r\n } else {\r\n $scope.allowUserToSubscribreToday = data === \"true\";\r\n }\r\n });\r\n };\r\n\r\n var Init = function () {\r\n if ($rootScope.CurrentUserRole === \"User\") {\r\n // Offres fermes\r\n $scope.tableOfferFirmDataVisible = colonnesOffersFirmUser.data.DataVisible.split(',');\r\n $scope.tableOfferFirmLibelle = colonnesOffersFirmUser.data.ColumnName.split(',');\r\n\r\n // Offres Multi campagnes\r\n $scope.tableOfferMultiCropsDataVisible = colonnesOffersMultiCropsUser.data.DataVisible.split(',');\r\n $scope.tableOfferMultiCropsLibelle = colonnesOffersMultiCropsUser.data.ColumnName.split(',');\r\n\r\n // Offres d'engagements\r\n $scope.tableOfferCommitmentDataVisible = colonnesOffersCommitmentUser.data.DataVisible.split(',');\r\n $scope.tableOfferCommitmentLibelle = colonnesOffersCommitmentUser.data.ColumnName.split(',');\r\n\r\n // Offres d'option\r\n $scope.tableOfferOptionDataVisible = colonnesOffersOptionUser.data.DataVisible.split(',');\r\n $scope.tableOfferOptionLibelle = colonnesOffersOptionUser.data.ColumnName.split(',');\r\n\r\n // Offres d'engagements de surface\r\n $scope.tableOfferCommitmentSurfaceDataVisible = colonnesOffersCommitmentSurfaceUser.data.DataVisible.split(',');\r\n $scope.tableOfferCommitmentSurfaceLibelle = colonnesOffersCommitmentSurfaceUser.data.ColumnName.split(',');\r\n\r\n\r\n } else if ($rootScope.CurrentUserRole === \"TC\") {\r\n // Offres fermes\r\n $scope.tableOfferFirmDataVisible = colonnesOffersFirmTc.data.DataVisible.split(',');\r\n $scope.tableOfferFirmLibelle = colonnesOffersFirmTc.data.ColumnName.split(',');\r\n\r\n // Offres Multi campagnes\r\n $scope.tableOfferMultiCropsDataVisible = colonnesOffersMultiCropsTc.data.DataVisible.split(',');\r\n $scope.tableOfferMultiCropsLibelle = colonnesOffersMultiCropsTc.data.ColumnName.split(',');\r\n\r\n // Offres d'engagements\r\n $scope.tableOfferCommitmentDataVisible = colonnesOffersCommitmentTc.data.DataVisible.split(',');\r\n $scope.tableOfferCommitmentLibelle = colonnesOffersCommitmentTc.data.ColumnName.split(',');\r\n\r\n // Offres d'option\r\n $scope.tableOfferOptionDataVisible = colonnesOffersOptionTc.data.DataVisible.split(',');\r\n $scope.tableOfferOptionLibelle = colonnesOffersOptionTc.data.ColumnName.split(',');\r\n\r\n // Offres contrat vierge\r\n $scope.tableOfferBlankContractDataVisible = colonnesOffersBlankContract.data.DataVisible.split(',');\r\n $scope.tableOfferBlankContractLibelle = colonnesOffersBlankContract.data.ColumnName.split(',');\r\n\r\n // Offres d'engagements de surface\r\n $scope.tableOfferCommitmentSurfaceDataVisible = colonnesOffersCommitmentSurfaceTc.data.DataVisible.split(',');\r\n $scope.tableOfferCommitmentSurfaceLibelle = colonnesOffersCommitmentSurfaceTc.data.ColumnName.split(',');\r\n }\r\n\r\n if (!$scope.userNotSelected) {\r\n var index = $scope.tableOfferFirmDataVisible.indexOf('GroupContacts;liste');\r\n if (index !== -1) {\r\n $scope.tableOfferFirmDataVisible.splice(index, 1);\r\n $scope.tableOfferFirmLibelle.splice(index, 1);\r\n }\r\n }\r\n $scope.GetOffersOpen();\r\n AllowUserToSubscribreToday();\r\n };\r\n\r\n $scope.AsChangedCrop = function () {\r\n // On reset les filtres\r\n setFilters = true;\r\n $scope.Product.IdProduct = null;\r\n $scope.pageNo = 1;\r\n $scope.GetOffersOpen();\r\n };\r\n\r\n $scope.AsChangedProduct = function () {\r\n $scope.pageNo = 1;\r\n $scope.GetOffersOpen();\r\n };\r\n\r\n $scope.GoToSubscribe = function () {\r\n if ($scope.offerSelected.IdTypeOffer === $scope.enumTypeOffer.Engagement || $scope.offerSelected.IdTypeOffer === $scope.enumTypeOffer.EngagementSurface)\r\n $rootScope.idTypeCommitmentSelected = $scope.offerSelected.IdTypeCommitment;\r\n else\r\n $rootScope.idTypeCommitmentSelected = null;\r\n\r\n switch ($scope.idTypeFixation) {\r\n case enumFactory.TypeFixations.Base.IdTypeFixation:\r\n $location.path('/user/subscribe/contractBase/' + ($scope.idContractCommitment ? $scope.idContractCommitment : '') + '/' + ($scope.idFirstComponentContractOrContractBase ? $scope.idFirstComponentContractOrContractBase : '') + '/' + ($scope.quantity ? $scope.quantity : '') + '/' + ($scope.targetPrice ? $scope.targetPrice : ''));\r\n break;\r\n case enumFactory.TypeFixations.Future.IdTypeFixation:\r\n case enumFactory.TypeFixations.GlobalPrice.IdTypeFixation:\r\n $location.path('/user/subscribe/contractFirm/' + ($scope.idContractCommitment ? $scope.idContractCommitment : '') + '/' + $scope.idTypeFixation + '/' + ($scope.idFirstComponentContractOrContractBase ? $scope.idFirstComponentContractOrContractBase : '') + '/' + ($scope.quantity ? $scope.quantity : '') + '/' + ($scope.targetPrice ? $scope.targetPrice : ''));\r\n break;\r\n default:\r\n if ($scope.offerSelected.IdTypeOffer === $scope.enumTypeOffer.EngagementSurface)\r\n $location.path('/user/subscribe/contractSurfaceCommitment');\r\n else\r\n $location.path('/user/subscribe/contractCommitment');\r\n break;\r\n }\r\n };\r\n\r\n $scope.GoToSubscribeOption = function (offer, idExpiry, idTypeOrder) {\r\n $rootScope.offerSelected = {\r\n IdOfferSelected: offer.IdOffer,\r\n IdProductSelected: offer.IdProduct,\r\n IdExpirySelected: idExpiry,\r\n IdTypeOptionSelected: offer.IdTypeOption,\r\n IdTypeOrderSelected: idTypeOrder,\r\n IdCropSelected: $rootScope.crop.IdCrop\r\n };\r\n $location.path('/user/subscribe/contractoption/');\r\n };\r\n\r\n $scope.GoToSubscribeBlankContract = function () {\r\n $location.path('/user/subscribe/contractBlank/');\r\n };\r\n\r\n $scope.GoToSubscribeMultiCropsContract = function () {\r\n $location.path('/user/subscribe/contractMultiCrops/');\r\n };\r\n\r\n $scope.SubscribeActionClick = function (offer, idExpiry, idTypeOrder, idTypeFixation, openPopUp) {\r\n if (offer) {\r\n $rootScope.idOfferSelected = !offer.IdOffer ? offer.IdOfferParent : offer.IdOffer;\r\n $scope.offerSelected = offer;\r\n $rootScope.idExpirySelected = idExpiry;\r\n }\r\n if (idTypeOrder)\r\n $rootScope.idTypeOrderSelected = idTypeOrder;\r\n if (idTypeFixation)\r\n $scope.idTypeFixation = idTypeFixation;\r\n\r\n // Si le TC a déjà sélectionner sélectionné son agri on peux rediriger vers la souscription\r\n if ($rootScope.selectedClientFromTcForSubscribe || $rootScope.CurrentUserRole === \"User\") {\r\n if ($scope.offerSelected.IdTypeOffer === $scope.enumTypeOffer.Option)\r\n $scope.GoToSubscribeOption();\r\n else if ($scope.offerSelected.IdTypeOffer === $scope.enumTypeOffer.ContratVierge)\r\n $scope.GoToSubscribeBlankContract();\r\n else if ($scope.offerSelected.IdTypeOffer === $scope.enumTypeOffer.MultiCampagne)\r\n $scope.GoToSubscribeMultiCropsContract();\r\n else\r\n $scope.GoToSubscribe();\r\n }\r\n else // Sinon on ouvre la popUp de sélection des agris du TC\r\n openPopUp();\r\n };\r\n\r\n $scope.SubmitPopUpTcUsers = function () {\r\n userService.SaveClientSelectedFromTC($rootScope.selectedClientFromTcForSubscribe.IdUser, false, function (data, status) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.SubscribeActionClick();\r\n }\r\n });\r\n };\r\n\r\n\r\n\r\n $scope.SetSelectedClientFromTc = function (client) {\r\n $rootScope.selectedClientFromTcForSubscribe = client;\r\n };\r\n\r\n $scope.GetOffersOpen = function () {\r\n $scope.loading = true;\r\n offerService.GetDataOfferPaginateWithFilter($rootScope.crop.IdCrop, $routeParams.typeOffer, $scope.Product.IdProduct ? $scope.Product.IdProduct : '', $scope.idContractCommitment ? $scope.idContractCommitment : '', $scope.maxOffers, $scope.pageNo, $scope.data.sortKey, $scope.data.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.offersOpen = [];\r\n data.LstOfferOpenVm.forEach(function (item) {\r\n\r\n item.showAllExpiryOffer = true;\r\n item.urlAttachment = configurationFactory.Url['Api'] + 'Upload/GetInlineAttachment?p=' + item.AttachmentPrivateLabel;\r\n\r\n var actionFuturePrice = item.MarketPrice > 0;\r\n var actionGlobalPrice = item.GlobalPrice > 0;\r\n\r\n if ($rootScope.parambActivedSubscribeOfferWithZeroPrice == \"1\") {\r\n if (item.MarketPrice == 0) actionFuturePrice = item.MarketPrice == 0;\r\n if (item.GlobalPrice == 0) actionGlobalPrice = item.GlobalPrice == 0;\r\n }\r\n\r\n item.showFixationBaseActionSold = item.BasePriceWithCurrencyUnit && item.CanSoldBase && item.TypeFixationTypeOrders.SoldBase;\r\n item.showFixationBaseActionTargetPrice = item.BasePriceWithCurrencyUnit && item.CanTargetPriceBase && item.TypeFixationTypeOrders.TargetPriceBase;\r\n item.showFixationBaseActions = item.showFixationBaseActionSold || item.showFixationBaseActionTargetPrice;\r\n\r\n item.showFixationFuturePriceActionSold = actionFuturePrice && !item.CanNotSubscribeFuture && item.CanSold && item.TypeFixationTypeOrders.SoldFuture;\r\n item.showFixationFuturePriceActionTargetPrice = actionFuturePrice && !item.CanNotSubscribeFuture && item.CanTargetPrice && item.TypeFixationTypeOrders.TargetPriceFuture;\r\n item.showFixationFuturePriceActions = item.showFixationFuturePriceActionSold || item.showFixationFuturePriceActionTargetPrice;\r\n\r\n item.showFixationGlobalPriceActionSold = actionGlobalPrice && item.CanSold && item.TypeFixationTypeOrders.SoldGlobalPrice;\r\n item.showFixationGlobalPriceActionTargetPrice = actionGlobalPrice && item.CanTargetPrice && item.TypeFixationTypeOrders.TargetPriceGlobalPrice;\r\n item.showFixationGlobalPriceActions = item.showFixationGlobalPriceActionSold || item.showFixationGlobalPriceActionTargetPrice;\r\n\r\n if (item.QuotesExpiryOfferManagerVM && item.QuotesExpiryOfferManagerVM.length > 0) {\r\n item.QuotesExpiryOfferManagerVM.forEach(function (exp) {\r\n\r\n exp.showFixationBaseActionSold = exp.BasePriceWithCurrencyUnit && exp.CanSoldBase && item.TypeFixationTypeOrders.SoldBase;\r\n exp.showFixationBaseActionTargetPrice = exp.BasePriceWithCurrencyUnit && exp.CanTargetPriceBase && item.TypeFixationTypeOrders.TargetPriceBase;\r\n exp.showFixationBaseActions = exp.showFixationBaseActionSold || exp.showFixationBaseActionTargetPrice;\r\n\r\n exp.showFixationFuturePriceActionSold = exp.Price > 0 && !item.CanNotSubscribeFuture && exp.CanSold && item.TypeFixationTypeOrders.SoldFuture;\r\n exp.showFixationFuturePriceActionTargetPrice = exp.Price > 0 && !item.CanNotSubscribeFuture && exp.CanTargetPrice && item.TypeFixationTypeOrders.TargetPriceFuture;\r\n exp.showFixationFuturePriceActions = exp.showFixationFuturePriceActionSold || exp.showFixationFuturePriceActionTargetPrice;\r\n\r\n exp.showFixationGlobalPriceActionSold = exp.PriceUser > 0 && exp.CanSold && item.TypeFixationTypeOrders.SoldGlobalPrice;\r\n exp.showFixationGlobalPriceActionTargetPrice = exp.PriceUser > 0 && exp.CanTargetPrice && item.TypeFixationTypeOrders.TargetPriceGlobalPrice;\r\n exp.showFixationGlobalPriceActions = exp.showFixationGlobalPriceActionSold || exp.showFixationGlobalPriceActionTargetPrice;\r\n });\r\n }\r\n $scope.offersOpen.push(item);\r\n });\r\n $scope.total = data.Total;\r\n $scope.isAlertSmsActive = data.IsAlertSmsActive;\r\n\r\n if (setFilters) {\r\n $scope.lstProducts = data.LstProduct;\r\n setFilters = false;\r\n }\r\n\r\n $scope.loading = false;\r\n\r\n // if ($scope.idTypeFixationOnlyTargetPrice) { //cas où on vient du dupliquer de la suivi contrat v2\r\n // if ($scope.offersOpen.length === 1 && $scope.offersOpen[0].QuotesExpiryOfferManagerVM.length === 0) {\r\n // $scope.GoToSubscribe($scope.offersOpen[0], $scope.offersOpen[0].IdFirstExpiry, enumFactory.TypeOrders.Prixobjectif.IdTypeOrder, Number($scope.idTypeFixationOnlyTargetPrice));\r\n // }\r\n // }\r\n }\r\n });\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.data.sortKey = sortKey;\r\n $scope.data.reverse = reverse;\r\n $scope.GetOffersOpen();\r\n };\r\n\r\n $scope.GetData = function (pageNo) {\r\n $scope.pageNo = pageNo;\r\n $scope.GetOffersOpen();\r\n };\r\n\r\n $scope.SetLimitsAlertSmsPopUp = function (idExpiry, limitMin, limitMax, openPopUp) {\r\n $scope.popupSmsAlertErrorMessage = \"\";\r\n offerService.GetOfferPrice(idExpiry, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.expirySelected = {\r\n idExpiry: idExpiry,\r\n price: data.FinalPrice,\r\n symbol: data.Symbol,\r\n limitMin: limitMin,\r\n limitMax: limitMax\r\n };\r\n openPopUp();\r\n }\r\n });\r\n\r\n };\r\n\r\n $scope.ChkSmsAlertIsValid = function () {\r\n $scope.popupSmsAlertErrorMessage = smsAlertService.CheckSmsAlertIsValid($scope.expirySelected.limitMax, $scope.expirySelected.limitMin, $scope.expirySelected.price);\r\n\r\n if ($scope.popupSmsAlertErrorMessage !== \"\") {\r\n return false;\r\n }\r\n else {\r\n return true;\r\n }\r\n };\r\n\r\n $scope.SaveSmsAlertLimit = function () {\r\n if (!$scope.expirySelected.limitMin)\r\n $scope.expirySelected.limitMin = \"\";\r\n if (!$scope.expirySelected.limitMax)\r\n $scope.expirySelected.limitMax = \"\";\r\n\r\n smsAlertService.SaveUserExpirySmsLimits($scope.expirySelected.idExpiry, $scope.expirySelected.limitMin, $scope.expirySelected.limitMax, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n Init();\r\n }\r\n });\r\n };\r\n\r\n $rootScope.onRefresh = function () { Init(); };\r\n Init();\r\n }]);\r\n","AgrimarketControllers.controller('userContractsFirmMonitoringController', ['$scope', '$rootScope', '$routeParams', 'configurationFactory',\r\n 'contractsService', 'cropsService', '$location', '$sce', '$filter', 'enumFactory', 'colonnesValidated', 'colonnesPriced', 'colonnesCanceled', 'colonnesPending', 'colonnesDelayedSigning','parametersFactory','currentUserFactory',\r\n function ($scope, $rootScope, $routeParams, configurationFactory, contractsService, cropsService, $location, $sce, $filter, enumFactory, colonnesValidated, colonnesPriced, colonnesCanceled, colonnesPending, colonnesDelayedSigning, parametersFactory, currentUserFactory) {\r\n\r\n }]);\r\n","AgrimarketControllers.controller('userContractsBaseMonitoringController', ['$scope', '$rootScope', '$routeParams', 'configurationFactory',\r\n 'contractBaseService', 'cropsService', '$location', '$sce', '$filter', 'enumFactory', 'colonnesContractsBaseValidated', 'colonnesContractsBasePriced', 'colonnesContractsBaseCanceled', 'colonnesContractsBasePending',\r\n function ($scope, $rootScope, $routeParams, configurationFactory, contractBaseService, cropsService, $location, $sce, $filter, enumFactory, colonnesContractsBaseValidated, colonnesContractsBasePriced, colonnesContractsBaseCanceled, colonnesContractsBasePending) {\r\n\r\n var idTabContracts;\r\n\r\n var Init = function () { \r\n $scope.idCropSelected = $rootScope.crop.IdCrop;\r\n $scope.viewMode = $routeParams.typeContract;\r\n\r\n $scope.max = 10;\r\n\r\n $scope.dataSort = { reverse: true, sortKey: \"IdContractBase\" };\r\n\r\n $scope.validatedPageNo = 1;\r\n $scope.pendingPageNo = 1;\r\n $scope.pricedPageNo = 1;\r\n $scope.canceledPageNo = 1; \r\n\r\n $scope.LabelAll = $rootScope.editableObjectsFactory.EditableObjects.All.Content;\r\n\r\n $scope.colonnesValidatedVisible = colonnesContractsBaseValidated.data.DataVisible.split(',');\r\n $scope.colonnesValidatedLibelle = colonnesContractsBaseValidated.data.ColumnName.split(',');\r\n\r\n $scope.colonnesPendingVisible = colonnesContractsBasePending.data.DataVisible.split(',');\r\n $scope.colonnesPendingLibelle = colonnesContractsBasePending.data.ColumnName.split(',');\r\n\r\n $scope.colonnesPricedVisible = colonnesContractsBasePriced.data.DataVisible.split(',');\r\n $scope.colonnesPricedLibelle = colonnesContractsBasePriced.data.ColumnName.split(',');\r\n\r\n $scope.colonnesCanceledVisible = colonnesContractsBaseCanceled.data.DataVisible.split(',');\r\n $scope.colonnesCanceledLibelle = colonnesContractsBaseCanceled.data.ColumnName.split(',');\r\n\r\n $scope.titleTargetBasePricePopUp = $rootScope.editableObjectsFactory.EditableObjects.User_ContractBaseMonitoring_PopupChangeTargetPrice_Title.Content;\r\n\r\n $scope.selectedIdContract = \"\";\r\n $scope.dateFilter = \"\";\r\n\r\n $scope.$watch(\"dateSelected\", function (newValue) {\r\n if (newValue === \"\")\r\n $scope.dateFilter = \"\";\r\n else if (newValue) {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format yyyy/mm/dd pour l'envoyer à l'API.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.dateFilter = converDate.format('YYYY/MM/DD');\r\n }\r\n });\r\n\r\n $scope.$watch(\"dateFilter\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetContractsWithFilter(1);\r\n });\r\n\r\n GetContractsFilters();\r\n };\r\n\r\n var GetContractsFilters = function () {\r\n $scope.loading = true;\r\n $scope.idProductSelected = \"\";\r\n $scope.selectedIdContract = \"\"; \r\n $scope.dateSelected = \"\";\r\n $scope.idTypeOrderSelected = \"\"; \r\n \r\n contractBaseService.GetFiltersWithContractsBaseByCrop($scope.idCropSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.lstProducts = data.LstProductFilterVm; \r\n $scope.lstTypeOrders = data.LstTypeOrderFilterVm; \r\n\r\n if ($scope.lstProducts.length === 1)\r\n $scope.idProductSelected = $scope.lstProducts[0].IdProduct;\r\n else if ($scope.lstProducts.length > 1)\r\n $scope.lstProducts.unshift({ IdProduct: \"\", ProductLabel: $scope.LabelAll }); \r\n\r\n if ($scope.lstTypeOrders.length === 1)\r\n $scope.idTypeOrderSelected = $scope.lstTypeOrders[0].IdTypeOrder;\r\n else if ($scope.lstTypeOrders.length > 1)\r\n $scope.lstTypeOrders.unshift({ IdTypeOrder: \"\", TypeOrderLabel: $scope.LabelAll }); \r\n\r\n $scope.GetContractsWithFilter(1);\r\n\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.GetContractsWithFilter = function (pagenum) {\r\n $scope.loading = true;\r\n\r\n if ($scope.viewMode === \"validated\")\r\n contractBaseService.GetContractsBasePaginate(enumFactory.ContractState.Valide, $scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, \"\", \"\", $scope.idTypeOrderSelected, $scope.max, pagenum, $scope.dataSort.sortKey, $scope.dataSort.reverse, function (data, status) { \r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalValidated = data.Total;\r\n $scope.contractsValidated = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n else if ($scope.viewMode === \"priced\")\r\n contractBaseService.GetContractsBasePaginate(enumFactory.ContractState.AttenteValidation, $scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, \"\", \"\", $scope.idTypeOrderSelected, $scope.max, pagenum, $scope.dataSort.sortKey, $scope.dataSort.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalPriced = data.Total;\r\n $scope.contractsPriced = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n else if ($scope.viewMode === \"canceled\")\r\n contractBaseService.GetContractsBasePaginate(enumFactory.ContractState.Annulé, $scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, \"\", \"\", $scope.idTypeOrderSelected,$scope.max, pagenum, $scope.dataSort.sortKey, $scope.dataSort.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalCanceled = data.Total;\r\n $scope.contractsCanceled = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n else if ($scope.viewMode === \"pending\")\r\n contractBaseService.GetContractsBasePaginate(enumFactory.ContractState.AttenteDernierComposant, $scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, \"\", \"\", $scope.idTypeOrderSelected, $scope.max, pagenum, $scope.dataSort.sortKey, $scope.dataSort.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalPending = data.Total;\r\n $scope.contractsPending = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.dataSort.sortKey = sortKey;\r\n $scope.dataSort.reverse = reverse;\r\n $scope.GetContractsWithFilter(1);\r\n };\r\n\r\n $scope.CancelContractPopUp = function (contractSelected, index, showPopUpContract) {\r\n $scope.PopUpMessageDeleteContract = \"\";\r\n $scope.MessageDeleteContractBaseTargetPrice = $rootScope.editableObjectsFactory.EditableObjects.MessageDeleteContractBaseTargetPrice.Content;\r\n $scope.CanceledContract = $rootScope.editableObjectsFactory.EditableObjects.CanceledContract.Content;\r\n\r\n $scope.PopupCanceledContractsSelectedTitle = $scope.CanceledContract + \" \" + contractSelected.IdContractBase;\r\n\r\n if (contractSelected !== undefined)\r\n $scope.PopUpMessageDeleteContract = $scope.MessageDeleteContractBaseTargetPrice;\r\n\r\n showPopUpContract(contractSelected);\r\n };\r\n\r\n $scope.CancelContract = function (element) {\r\n contractBaseService.UpdateContractBase(element, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.successMessage = $scope.CancelContractSuccessMessage;\r\n GetContractsFilters();\r\n }\r\n });\r\n };\r\n\r\n $scope.ChangeTargetBasePricePopUp = function (currentContract, index, openPopUp) {\r\n $scope.selectedContract = currentContract;\r\n $scope.targetBasePriceErrorMessage = \"\";\r\n $scope.ActionType = \"edit\";\r\n openPopUp();\r\n };\r\n\r\n $scope.ChkTargetBasePriceIsValid = function () {\r\n $scope.targetBasePriceErrorMessage = \"\";\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.ErrorTargetPriceMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_UserContractsBaseMonitoring_MessageTargetPrice.Content;\r\n $scope.ErrorPriceMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_UserContractsBaseMonitoring_BasePriceMessage.Content;\r\n $scope.TargetPriceCompareErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_UserContractsBaseMonitoring_TargetBasePriceCompareMessage.Content;\r\n $scope.TargetPriceCompareErrorMessage2 = $rootScope.editableObjectsFactory.EditableObjects.Currency.Content;\r\n $scope.ChangeTargetPriceSuccessMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_UserContractsBaseMonitoring_ChangeTargetBasePriceMessage.Content;\r\n $scope.CancelContractSuccessMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_UserContractsBaseMonitoring_CancelContractBaseMessage.Content;\r\n\r\n\r\n if (!$scope.selectedContract.hasOwnProperty(\"NewTargetBasePrice\") || $scope.selectedContract.NewTargetBasePrice === null) {\r\n $scope.targetBasePriceErrorMessage = $scope.ErrorTargetPriceMessage;\r\n $scope.selectedContract.NewTargetBasePrice = null;\r\n return false;\r\n } else {\r\n $scope.selectedContract.NewTargetBasePrice = $scope.selectedContract.NewTargetBasePrice.replace(\",\", \".\");\r\n if (!parseFloat($scope.selectedContract.NewTargetBasePrice)) {\r\n $scope.targetBasePriceErrorMessage = $scope.ErrorPriceMessage;\r\n return false;\r\n } else {\r\n $scope.selectedContract.NewTargetBasePrice = Number($scope.selectedContract.NewTargetBasePrice);\r\n }\r\n if ($scope.selectedContract.NewTargetBasePrice <= $scope.selectedContract.OfferBasePriceUpdated) {\r\n $scope.targetBasePriceErrorMessage = $scope.TargetPriceCompareErrorMessage + \" \" + $scope.selectedContract.OfferBasePriceUpdated + \" \" + $scope.TargetPriceCompareErrorMessage2;\r\n $scope.selectedContract.NewTargetBasePrice = null;\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n $scope.ChangeTargetBasePrice = function () {\r\n contractBaseService.UpdateContractBase($scope.selectedContract, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.successMessage = $scope.ChangeTargetPriceSuccessMessage;\r\n GetContractsFilters();\r\n }\r\n });\r\n };\r\n\r\n $scope.HistoContractPopUp = function (currentContract, openPopUpHisto) {\r\n $scope.ModalTitleContractBaseHisto = $rootScope.editableObjectsFactory.EditableObjects.ModalTitleContractBaseHisto.Content;\r\n contractBaseService.GetHistoContractBase(currentContract.IdInit, currentContract.IdCrop, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstHistoContract = data;\r\n $scope.ModalTitle = $scope.ModalTitleContractBase;\r\n openPopUpHisto();\r\n }\r\n });\r\n };\r\n\r\n $scope.GoToSubscribe = function (contract, idTypeOrder) {\r\n $rootScope.idOfferSelected = contract.IdOffer;\r\n $rootScope.idExpirySelected = contract.IdExpiry;\r\n $rootScope.idTypeOrderSelected = idTypeOrder;\r\n $rootScope.idTypeCommitmentSelected = null;\r\n $location.path('/user/subscribe/contractFirm//2/'+contract.IdContractBase);\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n Init();\r\n };\r\n\r\n $scope.AsChangedCrop = function () {\r\n Init();\r\n };\r\n\r\n Init();\r\n }]);\r\n ","AgrimarketControllers.controller('userContractsOptionMonitoringController', ['$scope', '$rootScope', '$routeParams', 'configurationFactory',\r\n 'contractsOptionService', '$sce', '$filter', 'colonnesContractsOptionExpired', 'colonnesContractsOptionPending',\r\n function ($scope, $rootScope, $routeParams, configurationFactory, contractsOptionService, $sce, $filter, colonnesContractsOptionExpired, colonnesContractsOptionPending) {\r\n\r\n \r\n }]);\r\n ","AgrimarketControllers.controller('subscribeContractOptionController', ['$scope', '$rootScope', '$location', 'enumFactory', 'configurationFactory', 'currentUserFactory', 'offerService', 'contractsOptionService', 'parametersService', 'contractsService', '$filter', 'conditionsService', 'signatureService', 'typeOrdersService', 'targetPriceService', 'colonnesStrikeOption', 'parametersFactory', '$sce',\r\n function ($scope, $rootScope, $location, enumFactory, configurationFactory, currentUserFactory, offerService, contractsOptionService, parametersService, contractsService, $filter, conditionsService, signatureService, typeOrdersService, targetPriceService, colonnesStrikeOption, parametersFactory, $sce) {\r\n\r\n var init = function () {\r\n goToStep(\"Strike\");\r\n\r\n // Tableau strike d'option\r\n $scope.tableStrikeOptionDataVisible = colonnesStrikeOption.data.DataVisible.split(',');\r\n $scope.tableStrikeOptionLibelle = colonnesStrikeOption.data.ColumnName.split(',');\r\n $scope.data = { reverse: true, sortKey: \"IdStrike\", pageNo: 1, maxItems: 10 };\r\n\r\n $scope.idOfferOption = $rootScope.offerSelected.IdOfferSelected;\r\n $scope.errorMessage = \"\";\r\n $scope.currentContract = {};\r\n $scope.currentContract.tonnageCurrent = 0;\r\n $scope.currentContract.isCGChecked = false;\r\n $scope.showUrlUtilConditionAttachment = false;\r\n $scope.showUrlSellConditionAttachment = false;\r\n $scope.selectedConnection = {\r\n Connection: {}\r\n };\r\n $scope.signatureYouSign = {};\r\n $scope.showListChooseContact = false;\r\n $scope.moduleYousignIsActive = $rootScope.ModuleSignatureElectroniqueYouSign.Active;\r\n $scope.mobileNumberToSendSms = $rootScope.selectedClientFromTc ? $rootScope.selectedClientFromTc.MobileNumber : currentUserFactory.Connection ? currentUserFactory.Connection.MobileNumber : currentUserFactory.User.MobileNumber;\r\n $scope.signingEnabled = ($scope.moduleYousignIsActive || $rootScope.ModuleElectronicSignature.Active) && $rootScope.activateSignature;\r\n $scope.listConnection = [];\r\n $scope.showConfirmButton = true;\r\n $scope.termsAndConditions = {\r\n isChecked: false\r\n };\r\n\r\n $scope.security = {\r\n Code: \"\"\r\n };\r\n $scope.firstSendSmsMessageDelayedSigning = false;\r\n\r\n\r\n $scope.idContractOption = 0;\r\n\r\n parametersService.GetParameters(function (dataParam, statusParam) {\r\n if (statusParam !== undefined && statusParam !== null) {\r\n if (statusParam === 400) {\r\n $scope.loginErrorMessage = dataParam[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.Parameters = dataParam;\r\n\r\n if (!$scope.Parameters.FileTermCondition.Value)\r\n $scope.showUrlSellConditionAttachment = false;\r\n else {\r\n $scope.urlSellConditionAttachment = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + $scope.Parameters.FileTermCondition.Value;\r\n $scope.showUrlSellConditionAttachment = true;\r\n }\r\n\r\n if (!$scope.Parameters.FileTermeUse.Value)\r\n $scope.showUrlUtilConditionAttachment = false;\r\n else {\r\n $scope.urlUtilConditionAttachment = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + $scope.Parameters.FileTermeUse.Value;\r\n $scope.showUrlUtilConditionAttachment = true;\r\n }\r\n }\r\n });\r\n\r\n $scope.LoadDataForSubscription();\r\n\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.data.sortKey = sortKey;\r\n $scope.data.reverse = reverse;\r\n $scope.LoadDataForSubscription();\r\n };\r\n\r\n $scope.GetData = function (pageNo) {\r\n $scope.data.pageNo = pageNo;\r\n $scope.LoadDataForSubscription();\r\n };\r\n\r\n $scope.SelectStrike = function (idStrike) {\r\n $scope.strikes.forEach(function (item) {\r\n if (item.IdStrike == idStrike) {\r\n item.IsChecked = true;\r\n } else {\r\n item.IsChecked = false;\r\n }\r\n });\r\n };\r\n\r\n $scope.LoadDataForSubscription = function () {\r\n $scope.loading = true;\r\n contractsOptionService.GetDataForSubscribeOption($rootScope.offerSelected.IdExpirySelected, $scope.data.maxItems, $scope.data.pageNo, $scope.data.sortKey, $scope.data.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.Offer = data.Offer;\r\n $scope.signingEnabled = $scope.signingEnabled && $scope.Offer.ContractSigningEnabled;\r\n $scope.total = data.Total;\r\n $scope.strikes = data.Strikes;\r\n $rootScope.marketPriceForStrike = data.Offer.Quote;\r\n $scope.loading = false;\r\n }\r\n });\r\n };\r\n\r\n $scope.GoToContractualisation = function () {\r\n $scope.errorStrikeMessage = \"\";\r\n var strike = $filter('filter')($scope.strikes, { IsChecked: true }, true)[0];\r\n if (strike) {\r\n goToStep(\"Contractualisation\");\r\n $scope.errorContractualisationMessage = \"\";\r\n $scope.selectedStrike = strike;\r\n } else {\r\n $scope.errorStrikeMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_StrikeOption_NotSelected.Content;\r\n }\r\n };\r\n\r\n $scope.GoToValidation = function () {\r\n if ($scope.CheckContractualisation())\r\n goToStep(\"Validation\");\r\n };\r\n\r\n $scope.ConfirmValidation = function () {\r\n $scope.showConfirmButton = false;\r\n $scope.errorSignatureMessage = \"\";\r\n $scope.isConfirmed = true;\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n\r\n if ($rootScope.idConnectionLogged)\r\n $scope.selectedConnection.Connection.IdConnection = $rootScope.idConnectionLogged;\r\n\r\n // Vérification de l'acceptation des condition générale de vente\r\n if (!$scope.termsAndConditions.isChecked) {\r\n $scope.errorValidationMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseAcceptGeneralConditionsOfSaleBeforeValidation.Content;\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n\r\n // Création de la vm du contrat\r\n var newContractOptionVm = getContractOptionVm();\r\n\r\n if ($scope.step === \"Validation\") {\r\n //Gestion des contacts\r\n if ($scope.signingEnabled && parametersFactory.Parameters.bUseTableConnections.Value === \"1\" && !$scope.selectedConnection.Connection.IdConnection)\r\n getListConnections();\r\n // Envoi signature YOUSIGN\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkContractAndSendSmsForYouSign(newContractOptionVm);\r\n // // Envoi signature SANS TIERS DE CONFIANCE\r\n else if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active) {\r\n $scope.firstSendSmsMessageDelayedSigning = true;\r\n $scope.SendSecurityCode();\r\n }\r\n else\r\n SaveNewContratOption(newContractOptionVm);\r\n }\r\n else if ($scope.step === \"SignatureSms\") {\r\n // Vérification du code pour signature SANS TIERS DE CONFIANCE et sauvegarde du contrat\r\n if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active)\r\n checkSmsCodeAndSaveContractForWithoutThirdParty(newContractOptionVm);\r\n // Vérification du code pour signature YOUSIGN et mise à jour du contrat\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkSmsCodeForYouSign();\r\n }\r\n };\r\n\r\n $scope.CheckContractualisation = function () {\r\n\r\n if ($scope.currentContract.tonnageCurrent === undefined || $scope.currentContract.tonnageCurrent === null || $scope.currentContract.tonnageCurrent === 0) {\r\n $scope.errorContractualisationMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterTonnage.Content;\r\n return false;\r\n }\r\n\r\n if ($scope.currentContract.tonnageCurrent <= 0) {\r\n $scope.errorContractualisationMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterPositiveNumber.Content;\r\n return false;\r\n }\r\n\r\n if ($scope.Offer.CommitmentMin !== null && $scope.currentContract.tonnageCurrent < $scope.Offer.CommitmentMin) {\r\n $scope.errorContractualisationMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterTonnageSuperirorOrEqual.Content + $scope.Offer.CommitmentMin + $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_Tonne.Content;\r\n return false;\r\n }\r\n\r\n if ($scope.Offer.CommitmentMax !== null && $scope.currentContract.tonnageCurrent > $scope.Offer.CommitmentMax) {\r\n $scope.errorContractualisationMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterTonnageInferiorOrEqual.Content + $scope.Offer.CommitmentMax + $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_Tonne.Content;\r\n return false;\r\n }\r\n\r\n if ($scope.Offer.QuantityLeft !== null && $scope.currentContract.tonnageCurrent > $scope.Offer.QuantityLeft) {\r\n $scope.errorContractualisationMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_TonnageIsLimitedOnThisOffer.Content + $scope.Offer.QuantityLeft + $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_Tonne.Content;\r\n return false;\r\n }\r\n\r\n if ($scope.Offer.Quotity !== null && $scope.currentContract.tonnageCurrent % $scope.Offer.Quotity !== 0) {\r\n $scope.errorContractualisationMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterTonnageRespectingQuotity.Content + $scope.Offer.Quotity + \".\";\r\n return false;\r\n }\r\n\r\n if ($scope.Offer.SubscriptionCapacity && $scope.Offer.SubscriptionCapacity < $scope.currentContract.tonnageCurrent) {\r\n $scope.errorContractualisationMessage = $rootScope.editableObjectsFactory.EditableObjects.Contract_Option_OfferOptionCapacity_Error.Content;\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n $scope.ValidateConnection = function () {\r\n if (!$scope.selectedConnection.Connection.IdConnection) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.ChooseContacte_OfferSubscribe_ListEmpty.Content;\r\n return;\r\n }\r\n $scope.showConfirmButton = false;\r\n $scope.isConfirmed = true;\r\n $scope.errorMessage = \"\";\r\n $scope.mobileNumberToSendSms = $scope.selectedConnection.Connection.MobileNumber;\r\n\r\n // Création de la vm du contrat\r\n var newContractOptionVm = getContractOptionVm();\r\n\r\n if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active) {\r\n $scope.firstSendSmsMessageDelayedSigning = true;\r\n $scope.SendSecurityCode();\r\n }\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkContractAndSendSmsForYouSign(newContractOptionVm);\r\n };\r\n\r\n $scope.SendSecurityCode = function () {\r\n $scope.security.Code = \"\";\r\n $scope.errorSignatureMessage = \"\";\r\n\r\n if ($rootScope.ModuleElectronicSignature.Active && $rootScope.activateSignature) {\r\n var idConnection = $scope.selectedConnection.Connection && $scope.selectedConnection.Connection.IdConnection ? $scope.selectedConnection.Connection.IdConnection : \"\";\r\n signatureService.SendSmsElectronicSignatureForOption(idConnection, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.security.Code = \"\";\r\n $scope.isConfirmed = false;\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n\r\n if (!$scope.firstSendSmsMessageDelayedSigning)\r\n $scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_OfferSubscribe_CodeResend.Content;\r\n else\r\n $scope.successMessage = \"\";\r\n\r\n $scope.firstSendSmsMessageDelayedSigning = false;\r\n goToStep(\"SignatureSms\");\r\n }\r\n });\r\n }\r\n else if ($scope.moduleYousignIsActive && $rootScope.activateSignature) {\r\n signatureService.ResendCodeYouSign($scope.signatureYouSign.Signature.MemberId, $scope.signatureYouSign.Signature.ProcedureId, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n if (data) {\r\n $scope.newAuthenticationId = data.AuthenticationId;\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_OfferSubscribe_CodeResend.Content;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n var SaveNewContratOption = function (contractOptionVm) {\r\n $scope.isConfirmed = true;\r\n contractsOptionService.SaveNewContractOption(contractOptionVm, function (data, status) {\r\n $scope.errorSignatureMessage = \"\";\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n } else {\r\n $scope.idContractOption = data.idContractOption;\r\n $scope.hashContractOption = data.hashContractOption;\r\n $scope.isConfirmed = false;\r\n goToStep(\"Confirmation\");\r\n }\r\n });\r\n };\r\n\r\n $scope.Cancel = function () {\r\n $location.path(\"user/offers/view/\" + enumFactory.TypeOffer.Option);\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n init();\r\n };\r\n\r\n function goToStep(step) {\r\n $scope.step = step;\r\n moveVehicle();\r\n }\r\n\r\n function getContractOptionVm() {\r\n return {\r\n IdOffer: $scope.idOfferOption,\r\n IdExpiry: $rootScope.offerSelected.IdExpirySelected,\r\n IdStrike: $scope.selectedStrike.IdStrike,\r\n Quantity: $scope.currentContract.tonnageCurrent,\r\n Prime: $scope.selectedStrike.Prime,\r\n Cost: $scope.selectedStrike.Cost,\r\n Variation: $scope.selectedStrike.Variation,\r\n StrikeValue: $scope.selectedStrike.Strike,\r\n DateLimitExercice: $scope.selectedStrike.ExerciceDate,\r\n IdCrop: $rootScope.offerSelected.IdCropSelected,\r\n IdTypeOption: $rootScope.offerSelected.IdTypeOptionSelected,\r\n IdProduct: $rootScope.offerSelected.IdProductSelected,\r\n IdConnection: $scope.selectedConnection.Connection.IdConnection\r\n };\r\n }\r\n\r\n function checkContractAndSendSmsForYouSign(newContractOptionVm) {\r\n contractsOptionService.SaveNewContractOptionAndSendSmsYouSign(newContractOptionVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n }\r\n } else {\r\n $scope.isConfirmed = true;\r\n $scope.idContractOption = data.IdContractOption;\r\n $scope.hashContractOption = data.HashContractOption;\r\n GetPdfContractOption($scope.idContractOption, $scope.hashContractOption);\r\n if (data) {\r\n if (data.CanAvoidSigning) {\r\n $scope.showConfirmButton = true;\r\n $scope.isConfirmed = false; \r\n goToStep(\"Confirmation\");\r\n }\r\n else {\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n $scope.signatureYouSign = data;\r\n $scope.isConfirmed = false;\r\n goToStep(\"SignatureSms\");\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getListConnections() {\r\n signatureService.GetListConnection($rootScope.selectedClientFromTcForSubscribe.IdUser, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.listConnection = data;\r\n if ($scope.listConnection.length === 0)\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.ChooseContacte_OfferSubscribe_ListEmpty_NoBinding_Contacte.Content;\r\n else if ($scope.listConnection.length === 1)\r\n {\r\n $scope.selectedConnection.Connection.IdConnection = $scope.listConnection[0].IdConnection;\r\n $scope.ValidateConnection();\r\n return;\r\n }\r\n $scope.isConfirmed = false;\r\n $scope.showListChooseContact = true;\r\n $scope.showConfirmButton = true;\r\n goToStep(\"SignatureSms\");\r\n }\r\n });\r\n }\r\n\r\n function checkSmsCodeAndSaveContractForWithoutThirdParty(newContractOptionVm) {\r\n var idContractOption = \"\";\r\n if ($scope.idContractOption)\r\n idContractOption = $scope.idContractOption;\r\n signatureService.CheckSecurityCodeOption($scope.security.Code, idContractOption, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorSignatureMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n SaveNewContratOption(newContractOptionVm);\r\n }\r\n });\r\n }\r\n\r\n function checkSmsCodeForYouSign() {\r\n $scope.isConfirmed = true;\r\n $scope.showConfirmButton = false;\r\n signatureService.SignatureWithCodeYouSign($scope.signatureYouSign.Signature.FilesIds[0], $scope.newAuthenticationId ? $scope.newAuthenticationId : $scope.signatureYouSign.Signature.AuthenticationId, $scope.security.Code, null, $scope.signatureYouSign.Signature.MemberId, $scope.signatureYouSign.Signature.ProcedureId, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorSignatureMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n if (data && (data === \"true\" || data === \"1\")) {\r\n $scope.errorSignatureMessage = \"\";\r\n $scope.isConfirmed = false;\r\n goToStep(\"Confirmation\");\r\n }\r\n else {\r\n $scope.successMessage = \"\";\r\n $scope.showConfirmButton = true;\r\n $scope.isConfirmed = false;\r\n if (!$scope.security.Code)\r\n $scope.errorSignatureMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterCodeReceivedBySms.Content;\r\n else\r\n $scope.errorSignatureMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_CodeEnteredNotCorrespondToCodeSended.Content;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function GetPdfContractOption (idContractOption, hashContractOption) {\r\n if (idContractOption && hashContractOption) {\r\n $scope.contractOptionUrlPdf = $sce.trustAsResourceUrl($filter('pdfLinkContractOption')({k: idContractOption, h: hashContractOption})) ;\r\n }\r\n }\r\n \r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('userContractsCommitmentMonitoringController', ['$scope', '$rootScope', '$routeParams', '$http', '$filter', '$location', \"currentUserFactory\", 'configurationFactory',\r\n 'contractsService', 'cropsService', 'athenaOrdersService', '$log', '$timeout', '$sce', 'parametersFactory', 'enumFactory', 'userTableService', 'colonnesContractsCommitmentValidated',\r\n function ($scope, $rootScope, $routeParams, $http, $filter, $location, currentUserFactory, configurationFactory, contractsService, cropsService, athenaOrdersService, $log, $timeout, $sce,\r\n parametersFactory, enumFactory, userTableService, colonnesContractsCommitmentValidated) {\r\n\r\n \r\n }]);\r\n","AgrimarketControllers.controller('userContractsSurfaceCommitmentMonitoringController', ['$scope', '$rootScope', '$routeParams', '$filter', 'configurationFactory',\r\n 'contractsService', '$sce', 'colonnesContractsSurfaceCommitmentValidated',\r\n function ($scope, $rootScope, $routeParams, $filter, configurationFactory, contractsService, $sce, colonnesContractsSurfaceCommitmentValidated) {\r\n\r\n \r\n }]);\r\n","AgrimarketControllers.controller('dashboardController', [\r\n '$scope', '$rootScope', '$http', '$filter', '$location', '$sce', 'dashboardService',\r\n 'enumFactory', 'quoteService', 'quoteCashHashtagriService', 'configurationFactory', 'carouselPictureService', '$timeout',\r\n function ($scope, $rootScope, $http, $filter, $location, $sce, dashboardService, enumFactory, quoteService, quoteCashHashtagriService, configurationFactory, carouselPictureService, $timeout) {\r\n\r\n if (!$rootScope.ModuleNews || !$rootScope.ModuleNews.Active)\r\n $location.path(\"/\");\r\n\r\n \r\n }]);\r\n","AgrimarketControllers.controller('deliveryController', [\r\n '$scope', '$rootScope', '$location', '$filter', 'deliveriesService', 'parametersFactory', 'configurationFactory', 'colonnes', 'currentUserFactory',\r\n function ($scope, $rootScope, $location, $filter, deliveriesService, parametersFactory, configurationFactory, colonnes, currentUserFactory) {\r\n\r\n if (!$rootScope.ModuleMyAccount.Active)\r\n $location.path('/login');\r\n\r\n \r\n }\r\n]);","AgrimarketControllers.controller('commandsController', [\r\n '$scope', 'enumFactory', 'colonnes', '$rootScope', '$location', 'commandService', 'parametersFactory', 'configurationFactory', 'currentUserFactory', '$routeParams', '$filter',\r\n function ($scope, enumFactory, colonnes, $rootScope, $location, commandService, parametersFactory, configurationFactory, currentUserFactory, $routeParams, $filter) {\r\n\r\n if (!$rootScope.ModuleMyAccount.Active)\r\n $location.path('/login');\r\n\r\n \r\n }\r\n]);","AgrimarketControllers.controller('requestPricesController', [\r\n\t'$scope', '$rootScope', '$routeParams', '$http', '$filter', '$location', '$sce', 'colonnesCart', 'categoryArticleService', 'articleService', 'enumFactory', 'configurationFactory', '$timeout', '$q',\r\n function ($scope, $rootScope, $routeParams, $http, $filter, $location, $sce, colonnesCart, categoryArticleService, articleService, enumFactory, configurationFactory, $timeout, $q) {\r\n\r\n if (!$rootScope.Modules.ModuleRequestPrices.Active)\r\n $location.path('/login');\r\n\r\n $scope.typeRequest = enumFactory.TypeRequest;\r\n $scope.typeRequestList = enumFactory.TypeRequestList;\r\n\r\n $scope.Init = function () {\r\n $scope.categories = [];\r\n $scope.families = [];\r\n $scope.articles = [];\r\n $scope.resultsFilter = [];\r\n $scope.filter = {};\r\n $scope.articlesSelected = [];\r\n $scope.articlesCateg = [];\r\n $scope.cart = [];\r\n\r\n if ($rootScope.cart) {\r\n $scope.cart = $rootScope.cart;\r\n $rootScope.cart = null;\r\n }\r\n\r\n $scope.request = {};\r\n $scope.Edit = false;\r\n\t $scope.tableCartDataVisible = colonnesCart.data.DataVisible.split(',');\r\n\t $scope.tableCartLabels = colonnesCart.data.ColumnName.split(',');\r\n $scope.max = 10;\r\n\r\n categoryArticleService.GetCategoryArticle(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data !== null) {\r\n $scope.categories = data;\r\n }\r\n }\r\n });\r\n\r\n articleService.GetArticles(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data !== null) {\r\n $scope.articles = data;\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.FilterCateg = function () {\r\n\r\n $scope.articlesCateg = [];\r\n $scope.families = [];\r\n $scope.articlesSelected = [];\r\n $scope.filter.Name = null;\r\n $scope.Edit = false;\r\n\r\n if ($scope.filter.Categ) {\r\n\r\n $scope.articlesCateg = [];\r\n $scope.families = [];\r\n\r\n $scope.articles.forEach(function (article) {\r\n if (article.IdCategoryArticle == $scope.filter.Categ) {\r\n\r\n $scope.articlesSelected.push(article);\r\n $scope.articlesCateg.push(article);\r\n\r\n var find = false;\r\n\r\n $scope.families.forEach(function (family) {\r\n if (family.IdFamilyArticle == article.FamilyArticle.IdFamilyArticle) {\r\n find = true;\r\n return;\r\n }\r\n });\r\n\r\n if (!find) {\r\n $scope.families.push(article.FamilyArticle);\r\n }\r\n\r\n }\r\n });\r\n if ($scope.families.length == 1) {\r\n $scope.families = [];\r\n }\r\n }\r\n\r\n };\r\n\r\n $scope.FilterFamily = function () {\r\n $scope.Edit = false;\r\n $scope.filter.Name = null;\r\n\r\n if ($scope.filter.Family) {\r\n $scope.articlesSelected = $filter('filter')($scope.articlesCateg, { \"IdFamilyArticle\": $scope.filter.Family }, true);\r\n } else {\r\n $scope.articlesSelected = $scope.articlesCateg;\r\n }\r\n\r\n };\r\n\r\n $scope.Cancel = function () {\r\n $scope.families = [];\r\n $scope.articlesSelected = [];\r\n $scope.articlesCateg = [];\r\n $scope.request = {};\r\n };\r\n\r\n $scope.Valide = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n\r\n if (!$scope.request.ArticleSelected) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_RequestPrices_NoArticleSelected.Content;\r\n return;\r\n }\r\n\r\n if (!$scope.request.Quantity) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_RequestPrices_PleaseEnterQuantity.Content;\r\n return;\r\n }\r\n\r\n if (isNaN($scope.request.Quantity)) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_RequestPrices_PleaseEnterValidQuantity.Content;\r\n return;\r\n }\r\n\r\n if ($scope.request.Quantity < $scope.request.ArticleSelected.MinimumSell) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_RequestPrices_PleaseEnterQuantityMinimum.Content + $scope.request.ArticleSelected.MinimumSell;\r\n return;\r\n }\r\n\r\n if ($scope.request.ArticleSelected.MultipleSell !== 0 && $scope.request.Quantity % $scope.request.ArticleSelected.MultipleSell !== 0) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_RequestPrices_PleaseEnterQuantityMultiple.Content + $scope.request.ArticleSelected.MultipleSell;\r\n return;\r\n }\r\n\r\n if (!$scope.request.IdTypeRequestArticle) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_RequestPrices_PleaseChooseTypeRequest.Content;\r\n return;\r\n }\r\n\r\n if ($scope.request.IdTypeRequestArticle === $scope.typeRequest.Disponibilite && (!$scope.request.DeliveryDate)) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_RequestPrices_PleaseEnterDeliveryDate.Content;\r\n return;\r\n }\r\n\r\n if ($scope.request.IdTypeRequestArticle === $scope.typeRequest.Disponibilite && !$scope.isDate($scope.request.DeliveryDate)) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_RequestPrices_PleaseEnterValidDate.Content;\r\n return;\r\n }\r\n\r\n if ($scope.request.IdTypeRequestArticle === $scope.typeRequest.Disponibilite && !$scope.VerifDate($scope.request.DeliveryDate)) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_RequestPrices_DateMustBeSuperiorThanCurrentDate.Content;\r\n return;\r\n }\r\n\r\n if ($scope.request.IdTypeRequestArticle !== $scope.typeRequest.Disponibilite) {\r\n $scope.request.DeliveryDate = null;\r\n }\r\n else {\r\n \tvar datePattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n \t$scope.request.DeliveryDate = new Date($scope.request.DeliveryDate.replace(datePattern, '$3-$2-$1'));\r\n }\r\n\r\n var typeRequestArticleSelected = $filter('filter')($scope.typeRequestList, { \"Value\": $scope.request.IdTypeRequestArticle }, true)[0];\r\n\r\n if ($scope.Edit)\r\n \t$scope.cart[$scope.index] = { IdArticle: $scope.request.ArticleSelected.IdArticle, ArticleLabel: $scope.request.ArticleSelected.Label, IdTypeRequestArticle: typeRequestArticleSelected.Value, TypeRequestArticleLabel: typeRequestArticleSelected.Name, Quantity: $scope.request.Quantity, DeliveryDate: $scope.request.DeliveryDate, Article: $scope.request.ArticleSelected };\r\n else\r\n \t$scope.cart.push({ IdArticle: $scope.request.ArticleSelected.IdArticle, ArticleLabel: $scope.request.ArticleSelected.Label, IdTypeRequestArticle: typeRequestArticleSelected.Value, TypeRequestArticleLabel: typeRequestArticleSelected.Name, Quantity: $scope.request.Quantity, DeliveryDate: $scope.request.DeliveryDate, Article: $scope.request.ArticleSelected });\r\n\r\n $scope.request = {};\r\n };\r\n\r\n $scope.isDate = function (input) {\r\n var yearToCheck = input.split('/')[2];\r\n var monthToCheck = input.split('/')[1] - 1; // 0-based... so 1 = february\r\n var dateToCheck = input.split('/')[0];\r\n var dateObj = new Date(yearToCheck, monthToCheck, dateToCheck);\r\n if (dateObj.getFullYear() == yearToCheck && dateObj.getMonth() == monthToCheck && dateObj.getDate() == dateToCheck) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n };\r\n\r\n $scope.VerifDate = function (input) {\r\n var yearToCheck = input.split('/')[2];\r\n var monthToCheck = input.split('/')[1] - 1; // 0-based... so 1 = february\r\n var dateToCheck = input.split('/')[0];\r\n var dateObj = new Date(yearToCheck, monthToCheck, dateToCheck);\r\n if (dateObj <= new Date()) {\r\n return false;\r\n }\r\n return true;\r\n };\r\n\r\n $scope.Send = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n articleService.PostArticles($scope.cart, $rootScope.skin.css, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.User_RequestPrices_Succes.Content;\r\n $scope.cart = [];\r\n }\r\n });\r\n };\r\n\r\n $scope.EditCart = function (item, index) {\r\n \t$scope.request = angular.copy(item);\r\n\t $scope.request.DeliveryDate = $filter('date')($scope.request.DeliveryDate, 'dd/MM/yyyy');\r\n\t $scope.request.ArticleSelected = item.Article;\r\n $scope.articlesSelected = [];\r\n $scope.articlesSelected[0] = item.Article;\r\n $scope.Edit = true;\r\n $scope.index = index;\r\n };\r\n\r\n $scope.RemoveCart = function (item, index) {\r\n $scope.cart = $scope.cart.splice(index, 0);\r\n };\r\n\r\n $scope.SaveAndRedirect = function (path) {\r\n $rootScope.cart = $scope.cart;\r\n $location.path(path);\r\n };\r\n\r\n $scope.SelectArticle = function (article) {\r\n $scope.request.ArticleSelected = article;\r\n };\r\n\r\n $scope.GetArticleSelected = function (articleSelected) {\r\n if (articleSelected) {\r\n $scope.articlesSelected = [];\r\n $scope.articlesSelected.push(articleSelected.originalObject);\r\n $scope.Edit = false;\r\n }\r\n };\r\n\r\n $scope.search = function (userInputString, timeoutPromise) {\r\n $scope.articlesSelected = [];\r\n var defered = $q.defer();\r\n var t = articleService.FindArticle(userInputString, timeoutPromise, function (data, status) { });\r\n t.then(function (result) {\r\n if (result.status != 200)\r\n defered.reject(status);\r\n else {\r\n defered.resolve(result.data);\r\n $scope.articlesSelected = result.data;\r\n }\r\n });\r\n return defered.promise;\r\n };\r\n\r\n $scope.focusOut = function () {\r\n if (!$scope.request.SearchString)\r\n $scope.articlesSelected = [];\r\n };\r\n\r\n $scope.Init();\r\n }\r\n]);\r\n\r\n","AgrimarketControllers.controller('monitoringRequestController', [\r\n\t'$scope', '$rootScope', '$routeParams', '$http', '$filter', '$location', '$sce', 'colonnes', 'articleService',\r\nfunction ($scope, $rootScope, $routeParams, $http, $filter, $location, $sce, colonnes, articleService) {\r\n\r\n\tif (!$rootScope.Modules.ModuleRequestPrices.Active)\r\n\t\t$location.path('/login');\r\n\r\n\t$scope.Init = function () {\r\n\t\t$scope.tableDataVisible = colonnes.data.DataVisible.split(',');\r\n\t\t$scope.tableDataLabels = colonnes.data.ColumnName.split(',');\r\n\t\t$scope.searchText = \"\";\r\n\t\t$scope.data = { reverse: true, sortKey: \"RequestDate\" };\r\n\t\t$scope.pageNo = 1;\r\n\t\t$scope.max = 10;\r\n\t\t$scope.GetUserArticles();\r\n\t};\r\n\r\n\t$scope.GetUserArticles = function() {\r\n\t\tarticleService.GetUserArticlesWithFilter($scope.searchText, $scope.max, $scope.pageNo, $scope.data.sortKey, $scope.data.reverse, function(data, status) {\r\n\t\t\tif (status !== null) {\r\n\t\t\t\tif (status === 400)\r\n\t\t\t\t\t$scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n\t\t\t} else {\r\n\t\t\t\t$scope.userArticles = data.ListVm;\r\n\t\t\t\t$scope.total = data.Total;\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\r\n\t$scope.GetData = function (pageNo) {\r\n\t\t$scope.pageNo = pageNo;\r\n\t\t$scope.GetUserArticles();\r\n\t};\r\n\r\n\t$scope.Sort = function (sortKey, reverse) {\r\n\t\t$scope.data.sortKey = sortKey;\r\n\t\t$scope.data.reverse = reverse;\r\n\t\t$scope.GetUserArticles();\r\n\t};\r\n\r\n\t$scope.$watch(\"searchText\", function (newValue, oldValue) {\r\n\t\tif ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n\t\t\t$scope.GetUserArticles();\r\n\t});\r\n\r\n\t$scope.SaveAndRedirect = function (path) {\r\n\t\t$location.path(path);\r\n\t};\r\n\r\n\t$scope.Init();\r\n}\r\n]);","AgrimarketControllers.controller('outstandingsController', [\r\n\t'$rootScope', '$location',\r\n\tfunction ($rootScope, $location) {\r\n\r\n\t\tif (!$rootScope.ModuleMyAccount.Active)\r\n\t\t\t$location.path('/');\r\n\t\t\r\n\t}\r\n]);","AgrimarketControllers.controller('contentUserController', ['$scope', '$rootScope', '$http', '$location', '$sce', 'currentUserFactory', 'configurationFactory', '$log', '$timeout', 'contentService', '$routeParams',\r\n function ($scope, $rootScope, $http, $location, $sce, currentUserFactory, configurationFactory, $log, $timeout, contentService, $routeParams) {\r\n\r\n if (!$rootScope.ModuleNews.Active)\r\n $location.path('/');\r\n\r\n var idPage = $routeParams.IdPage;\r\n $scope.errorMessage = \"\";\r\n\r\n var Init = function() {\r\n contentService.GetPageContent(idPage, function(data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage =data[0].errors[0].Message;\r\n } else {\r\n if (data !== undefined && data !== null) {\r\n $scope.content = data;\r\n \r\n $scope.content.CurrentPage.Content = $sce.trustAsHtml($scope.content.CurrentPage.Content);\r\n $scope.content.CurrentPage.UrlLink = $sce.trustAsResourceUrl($scope.content.CurrentPage.UrlLink);\r\n }\r\n }\r\n });\r\n };\r\n\r\n Init();\r\n\r\n }]);\r\n","AgrimarketControllers.controller('billsController', [\r\n '$scope', '$rootScope', '$filter', '$location', 'colonnes', 'billsService', 'configurationFactory', 'parametersFactory', 'currentUserFactory', 'enumFactory',\r\n function ($scope, $rootScope, $filter, $location, colonnes, billsService, configurationFactory, parametersFactory, currentUserFactory, enumFactory) {\r\n\r\n if (!$rootScope.ModuleMyAccount.Active)\r\n $location.path('/');\r\n\r\n\r\n \r\n }\r\n]);","AgrimarketControllers.controller('accountstatementController', [\r\n '$scope', '$sce', '$rootScope', 'userService', 'configurationFactory', 'uploadService', 'dateService', function ($scope, $sce, $rootScope, userService, configurationFactory, uploadService, dateService) {\r\n\r\n $scope.Init = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.selectedAutoCompleteObject = {};\r\n $scope.selectedAutoCompleteInput = '';\r\n $scope.accountStatementfilter = {};\r\n $scope.prefixNumDocument = '';\r\n $scope.prefixDateUpdDateDocument = 'Le ';\r\n $scope.currentAccountStatementUrlPdf = null;\r\n $scope.keyMenu = 'Menu_User_Account_AccountStatement';\r\n\r\n $scope.search = {\r\n BeginDate: null,\r\n EndDate: null\r\n };\r\n\r\n userService.GetAccountStateUser(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n var errorMessage = data[0].errors[0].Message + \"</br>.\";\r\n $scope.errorMessage = $sce.trustAsHtml(errorMessage);\r\n }\r\n } else {\r\n $scope.lstDocuments = $scope.documentsfilter = data;\r\n }\r\n });\r\n };\r\n\r\n $scope.GetPdfDocument = function (item) {\r\n if (item) {\r\n $scope.idDocumentDisplay = item.IdDocument;\r\n $scope.currentDocumentUrlPdf = $sce.trustAsResourceUrl(item.Link);\r\n }\r\n };\r\n\r\n $scope.$watch(\"selectedAutoCompleteInput\",\r\n function (newValue) {\r\n if (newValue !== undefined && newValue !== null) {\r\n $scope.Filter();\r\n }\r\n });\r\n\r\n $scope.$watch(\r\n \"search.BeginDate\",\r\n function (newValue) {\r\n if (newValue === \"\" || newValue === undefined || newValue === null) {\r\n $scope.dateFilterBegin = \"\";\r\n }\r\n else {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format dd/mm/yyyy.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.dateFilterBegin = converDate.format('DD/MM/YYYY');\r\n }\r\n });\r\n\r\n $scope.$watch(\r\n \"search.EndDate\",\r\n function (newValue) {\r\n if (newValue === \"\" || newValue === undefined || newValue === null) {\r\n $scope.dateFilterEnd = \"\";\r\n }\r\n else {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format dd/mm/yyyy.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.dateFilterEnd = converDate.format('DD/MM/YYYY');\r\n }\r\n });\r\n\r\n $scope.$watch(\r\n \"dateFilterBegin\",\r\n function (newValue) {\r\n if (newValue !== undefined && newValue !== null) {\r\n $scope.Filter();\r\n }\r\n });\r\n\r\n $scope.$watch(\r\n \"dateFilterEnd\",\r\n function (newValue) {\r\n if (newValue !== undefined && newValue !== null) {\r\n $scope.Filter();\r\n }\r\n });\r\n\r\n\r\n\r\n $scope.Filter = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.currentDocumentUrlPdf = null;\r\n var filterGeneral = angular.copy($scope.lstDocuments);\r\n\r\n if ($scope.selectedAutoCompleteInput !== undefined && $scope.selectedAutoCompleteInput !== null && $scope.selectedAutoCompleteInput !== \"\") {\r\n filterGeneral = filterGeneral.filter(function (element) {\r\n if (checkElement(element.NumDocument, $scope.selectedAutoCompleteInput)) {\r\n return element;\r\n }\r\n return null;\r\n });\r\n }\r\n if ($scope.dateFilterBegin !== \"\" && $scope.dateFilterBegin) {\r\n filterGeneral = filterGeneral.filter(function (element) {\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(element.DateDocument.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n var dateElementBegin = converDate.format('DD/MM/YYYY');\r\n\r\n if (!dateService.compareDate(dateElementBegin, $scope.dateFilterBegin))\r\n return element;\r\n else\r\n return null;\r\n });\r\n }\r\n\r\n if ($scope.dateFilterEnd !== \"\" && $scope.dateFilterEnd) {\r\n filterGeneral = filterGeneral.filter(function (element) {\r\n\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(element.DateDocument.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n var dateElementEnd = converDate.format('DD/MM/YYYY');\r\n\r\n if (!dateService.compareDate($scope.dateFilterEnd, dateElementEnd))\r\n return element;\r\n else\r\n return null;\r\n });\r\n }\r\n $scope.documentsfilter = filterGeneral;\r\n };\r\n\r\n function checkElement(attr, string) {\r\n if (attr.indexOf(string) !== -1)\r\n return true;\r\n else return false;\r\n }\r\n\r\n $scope.Init();\r\n }]);","AgrimarketControllers.controller('contributionsController', [\r\n '$scope', '$rootScope', '$location', 'colonnes', 'contributionsService', 'configurationFactory', 'parametersFactory', 'currentUserFactory',\r\n function ($scope, $rootScope, $location, colonnes, contributionsService, configurationFactory, parametersFactory, currentUserFactory) {\r\n\r\n if (!$rootScope.ModuleMyAccount.Active)\r\n $location.path('/');\r\n\r\n \r\n }\r\n]);","AgrimarketControllers.controller('manageUsersOfTcController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', '$http', '$location', 'newsService', 'colonnes', 'userTableService', 'userService', 'enumFactory',\r\n function ($scope, $rootScope, $routeParams, $sce, $filter, $http, $location, newsService, colonnes, userTableService, userService, enumFactory) {\r\n\r\n $scope.searchText = \"\";\r\n $scope.currentUser = {};\r\n $scope.max = 10;\r\n $scope.actions = \"\";\r\n $scope.isActif = enumFactory.DropDownList.Tous;\r\n\r\n var Init = function () {\r\n $scope.tableUsersDatasVisible = colonnes.data.DataVisible.split(',');\r\n $scope.tableUsersLabels = colonnes.data.ColumnName.split(',');\r\n $scope.data = { reverse: false, sortKey: \"Login\" };\r\n $scope.pageNo = 1;\r\n $scope.GetData($scope.pageNo);\r\n };\r\n\r\n\r\n $scope.GetData = function (pageNo) {\r\n $scope.pageNo = pageNo;\r\n $scope.users = $filter('filter')($rootScope.lstClientsFromTc, function (val) {\r\n if (val.FullName.toLowerCase().indexOf($scope.searchText) > -1 ||\r\n val.Login.toLowerCase().indexOf($scope.searchText) > -1)\r\n if ($scope.isActif === enumFactory.DropDownList.Tous || val.IsEnabled.toString() === $scope.isActif)\r\n return true;\r\n return false;\r\n }, true);\r\n $scope.users = $filter('orderBy')($scope.users, $scope.data.sortKey, $scope.data.reverse);\r\n $scope.total = angular.copy($scope.users.length);\r\n\r\n $scope.users = $scope.users.slice(($scope.pageNo - 1) * $scope.max);\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.data.sortKey = sortKey;\r\n $scope.data.reverse = reverse;\r\n $scope.GetData($scope.pageNo);\r\n };\r\n\r\n $scope.$watch(\"searchText\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue)) {\r\n $scope.GetData($scope.pageNo);\r\n }\r\n });\r\n\r\n $scope.SendIndentifiersPopUp = function (idUserSelected, showPopUp) {\r\n $scope.idUserSelectedForSendIdentifiers = idUserSelected;\r\n $scope.succesMessage = \"\";\r\n showPopUp();\r\n };\r\n\r\n $scope.SendIdentifiersToUser = function () {\r\n $scope.userAction = {\r\n IdTypeAction : enumFactory.TypeUserActions.EnvoyerIdentifiants,\r\n LstIdUser: [$scope.idUserSelectedForSendIdentifiers]\r\n };\r\n\r\n userService.DoUsersAction($scope.userAction, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n else\r\n $scope.succesMessage = $rootScope.editableObjectsFactory.EditableObjects.Tc_ManageTCUsers_SendIdentifiersSuccessMessage.Content;\r\n });\r\n };\r\n\r\n $scope.UpdateUserPopup = function (user, popup) {\r\n $scope.errorPopupHtml = \"\";\r\n $scope.succesMessage = \"\";\r\n $scope.modalTitle = $rootScope.editableObjectsFactory.EditableObjects.Tc_ManageTCUsers_PopupTitleModifyUser.Content;\r\n $scope.currentUser = angular.copy(user);\r\n popup();\r\n };\r\n\r\n $scope.VerifUser = function () {\r\n var errorsPopup = userService.VerifUserLight($scope.currentUser);\r\n\r\n if (errorsPopup) {\r\n $scope.errorPopupHtml = $sce.trustAsHtml(errorsPopup);\r\n return false;\r\n }\r\n else\r\n return true;\r\n };\r\n\r\n $scope.SaveUser = function () {\r\n userService.UpdateUserInfosByTc($scope.currentUser, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorPopupHtml = $sce.trustAsHtml(data[0].errors[0].Message);\r\n }\r\n } else {\r\n $scope.succesMessage = $rootScope.editableObjectsFactory.EditableObjects.Tc_ManageTCUsers_UpdateUSersInfosSuccessMessage.Content;\r\n $scope.currentUser = {};\r\n $rootScope.lstClientsFromTc = data;\r\n Init();\r\n }\r\n });\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n Init();\r\n };\r\n\r\n Init();\r\n }]);\r\n","AgrimarketControllers.controller('manageContractsOfTcUsersController', ['$scope', '$rootScope', '$routeParams', '$filter', 'configurationFactory',\r\n 'contractsService', '$sce', '$location', 'enumFactory', 'columnsValidated', 'columnsPriced', 'columnsCanceled', 'columnsPending', 'columnsDelayedSigning', 'userService', 'parametersFactory',\r\n function ($scope, $rootScope, $routeParams, $filter, configurationFactory, contractsService, $sce, $location, enumFactory, columnsValidated, columnsPriced, columnsCanceled, columnsPending, columnsDelayedSigning, userService, parametersFactory) {\r\n\r\n var idTabContracts;\r\n\r\n var Init = function () {\r\n // Contracts validés\r\n $scope.tableValidatedDataVisible = columnsValidated.data.DataVisible.split(',');\r\n $scope.tableValidatedLibelle = columnsValidated.data.ColumnName.split(',');\r\n\r\n // Contracts en attente\r\n $scope.tablePendingDataVisible = columnsPending.data.DataVisible.split(',');\r\n $scope.tablePendingLibelle = columnsPending.data.ColumnName.split(',');\r\n\r\n // Contracts en attente de signature\r\n $scope.tableDelayedSigningDataVisible = columnsDelayedSigning.data.DataVisible.split(',');\r\n $scope.tableDelayedSigningLibelle = columnsDelayedSigning.data.ColumnName.split(',');\r\n\r\n // Contracts prix objectif\r\n $scope.tablePricedDataVisible = columnsPriced.data.DataVisible.split(',');\r\n $scope.tablePricedLibelle = columnsPriced.data.ColumnName.split(',');\r\n\r\n // Contracts annulés\r\n $scope.tableCanceledDataVisible = columnsCanceled.data.DataVisible.split(',');\r\n $scope.tableCanceledLibelle = columnsCanceled.data.ColumnName.split(',');\r\n\r\n // Gestion du trie de l'onglet Validés\r\n $scope.dataValidated = { reverse: true, sortKey: \"IdContract\" };\r\n\r\n // Gestion du trie de l'onglet En attente\r\n $scope.dataPending = { reverse: true, sortKey: \"IdContract\" };\r\n\r\n // Gestion du trie de l'onglet En attente de signature\r\n $scope.dataDelayedSigning = { reverse: true, sortKey: \"DelayedSigning\" };\r\n\r\n // Gestion du trie de l'onglet Validés\r\n $scope.dataPriced = { reverse: true, sortKey: \"IdContract\" };\r\n\r\n // Gestion du trie de l'onglet Validés\r\n $scope.dataCanceled = { reverse: true, sortKey: \"IdContract\" };\r\n\r\n // Paginations onglets\r\n $scope.validatedPageNo = 1;\r\n $scope.pendingPageNo = 1;\r\n $scope.pricedPageNo = 1;\r\n $scope.canceledPageNo = 1;\r\n $scope.delayedSigningPageNo = 1;\r\n\r\n $scope.max = 10;\r\n $scope.idCropSelected = Number(parametersFactory.Parameters.DefaultCrop.Value);\r\n $scope.idProductSelected = \"\";\r\n $scope.idTypeOrderContractSelected = \"\";\r\n $scope.idTypeFixationSelected = \"\";\r\n $scope.idCompagnySelected = \"\";\r\n $scope.dateFilter = \"\";\r\n $scope.viewMode = $routeParams.typeContract;\r\n $scope.idProductSelected = \"\";\r\n $scope.idTypeOrderSelected = \"\";\r\n $scope.idTypeFixationSelected = \"\";\r\n $scope.dateSelected = \"\";\r\n $rootScope.isTcSigningForUser = false;\r\n $scope.isTCAuthorizedToSignInModeDelayed = $rootScope.paramIsTcAuthorizedToSigningInModeDelayed == \"1\";\r\n\r\n if ($scope.viewMode === \"validated\")\r\n idTabContracts = enumFactory.TabContract.Validated;\r\n else if ($scope.viewMode === \"priced\")\r\n idTabContracts = enumFactory.TabContract.Priced;\r\n else if ($scope.viewMode === \"canceled\")\r\n idTabContracts = enumFactory.TabContract.Canceled;\r\n else if ($scope.viewMode === \"pending\")\r\n idTabContracts = enumFactory.TabContract.Pending;\r\n else if ($scope.viewMode === \"delayedSigning\")\r\n idTabContracts = enumFactory.TabContract.delayedSigning;\r\n\r\n GetFiltersWithContracts();\r\n };\r\n\r\n $scope.$watch(\"selectedIdContract\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetContractsWithFilter();\r\n });\r\n\r\n $scope.$watch(\"selectedUserFullName\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetContractsWithFilter();\r\n });\r\n\r\n $scope.$watch(\"selectedNameOffer\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetContractsWithFilter();\r\n });\r\n\r\n $scope.$watch(\"dateFilter\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetContractsWithFilter();\r\n });\r\n\r\n $scope.$watch(\"dateSelected\", function (newValue) {\r\n if (newValue === \"\")\r\n $scope.dateFilter = \"\";\r\n else if (newValue) {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format dd/mm/yyyy.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.dateFilter = converDate.format('YYYY/MM/DD');\r\n }\r\n });\r\n\r\n var GetFiltersWithContracts = function () {\r\n if (!$scope.idCropSelected) $scope.idCropSelected = \"\";\r\n if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n if (!$scope.idTypeContractSelected) $scope.idTypeContractSelected = \"\";\r\n $scope.idProductSelected = \"\";\r\n $scope.selectedIdContract = \"\";\r\n $scope.selectedUserFullName = \"\";\r\n $scope.selectedNameOffer = \"\";\r\n $scope.idTypeContractSelected = \"\";\r\n $scope.idTypeOrderSelected = \"\";\r\n $scope.idTypeFixationSelected = \"\";\r\n $scope.dateSelected = \"\";\r\n $scope.loading = true;\r\n var labelAll = $rootScope.editableObjectsFactory.EditableObjects.All.Content;\r\n contractsService.GetFiltersWithUserContractsByCropAndTabContract(idTabContracts, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.lstTypeContracts = data.LstTypeContractFilterVm;\r\n $scope.lstProducts = data.LstProductFilterVm;\r\n $scope.lstTypeOrders = data.LstTypeOrderFilterVm;\r\n $scope.lstTypeFixations = data.LstTypeFixationFilterVm;\r\n $scope.lstCrops = data.LstCrops;\r\n\r\n if ($scope.lstProducts.length === 1)\r\n $scope.idProductSelected = $scope.lstProducts[0].IdProduct;\r\n else if ($scope.lstProducts.length > 1)\r\n $scope.lstProducts.unshift({ IdProduct: \"\", ProductLabel: labelAll });\r\n\r\n if ($scope.lstTypeOrders.length === 1)\r\n $scope.idTypeOrderSelected = $scope.lstTypeOrders[0].IdTypeOrder;\r\n else if ($scope.lstTypeOrders.length > 1)\r\n $scope.lstTypeOrders.unshift({ IdTypeOrder: \"\", TypeOrderLabel: labelAll });\r\n\r\n if ($scope.lstCrops.length === 1)\r\n $scope.idCropSelected = $scope.lstCrops[0].IdCrop;\r\n else if ($scope.lstCrops.length > 1)\r\n $scope.lstCrops.unshift({ IdCrop: \"\", Label: $rootScope.editableObjectsFactory.EditableObjects.AllItems_F.Content });\r\n\r\n if ($scope.lstTypeContracts.length === 1)\r\n $scope.idTypeContractSelected = $scope.lstTypeContracts[0].IdTypeContract;\r\n else if ($scope.lstTypeContracts.length > 1)\r\n $scope.lstTypeContracts.unshift({ IdTypeContract: \"\", TypeContractLabel: labelAll });\r\n\r\n if ($scope.lstTypeFixations.length === 1)\r\n $scope.idTypeFixationSelected = $scope.lstTypeFixations[0].Id;\r\n else if ($scope.lstTypeFixations.length > 1)\r\n $scope.lstTypeFixations.unshift({ Id: \"\", Label: labelAll });\r\n\r\n $scope.GetContractsWithFilter();\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.GetContractsWithFilter = function () {\r\n if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n if (!$scope.selectedUserFullName) $scope.selectedUserFullName = \"\";\r\n if (!$scope.selectedNameOffer) $scope.selectedNameOffer = \"\";\r\n $scope.loading = true;\r\n if ($scope.viewMode === \"validated\")\r\n contractsService.GetUserValidatedContractsPaginate($scope.idCropSelected, $scope.idProductSelected, $scope.idTypeOrderSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedUserFullName, $scope.max, $scope.validatedPageNo, $scope.dataValidated.sortKey, $scope.dataValidated.reverse, $scope.selectedNameOffer, $scope.idTypeContractSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.total = data.Total;\r\n $scope.contracts = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n else if ($scope.viewMode === \"priced\")\r\n contractsService.GetUserPricedContractsPaginate($scope.idCropSelected, $scope.idProductSelected, $scope.idTypeOrderSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedUserFullName, $scope.idTypeFixationSelected, $scope.max, $scope.pricedPageNo, $scope.dataPriced.sortKey, $scope.dataPriced.reverse, $scope.selectedNameOffer, $scope.idTypeContractSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.total = data.Total;\r\n $scope.contracts = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n else if ($scope.viewMode === \"canceled\")\r\n contractsService.GetUserCanceledContractsPaginate($scope.idCropSelected, $scope.idProductSelected, $scope.idTypeOrderSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedUserFullName, $scope.max, $scope.canceledPageNo, $scope.dataCanceled.sortKey, $scope.dataCanceled.reverse, $scope.selectedNameOffer, $scope.idTypeContractSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.total = data.Total;\r\n $scope.contracts = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n else if ($scope.viewMode === \"pending\")\r\n contractsService.GetUserPendingContractsPaginate($scope.idCropSelected, $scope.idProductSelected, $scope.idTypeOrderSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedUserFullName, $scope.max, $scope.validatedPageNo, $scope.dataValidated.sortKey, $scope.dataValidated.reverse, $scope.selectedNameOffer, $scope.idTypeContractSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.total = data.Total;\r\n $scope.contracts = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n else if ($scope.viewMode === \"delayedSigning\")\r\n contractsService.GetUserDelayedSigningContractsPaginate($scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedUserFullName, $scope.max, $scope.delayedSigningPageNo, $scope.dataDelayedSigning.sortKey, $scope.dataDelayedSigning.reverse, $scope.selectedNameOffer, $scope.idTypeContractSelected, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.total = data.Total;\r\n $scope.contracts = data.ListVm;\r\n $scope.loading = false;\r\n }\r\n });\r\n };\r\n\r\n $scope.CancelContractPopUp = function (contractSelected, index, showPopUpContract) {\r\n $scope.PopUpMessageDeleteContract = \"\";\r\n $scope.PopupCanceledContractsSelectedTitle = \"Annulation du contrat n° \" + contractSelected.IdContract;\r\n $scope.MessageDeleteContractFirmTargetPrice = $rootScope.editableObjectsFactory.EditableObjects.MessageDeleteContractFirmTargetPrice.Content;\r\n if (contractSelected !== undefined)\r\n $scope.PopUpMessageDeleteContract = $scope.MessageDeleteContractFirmTargetPrice;\r\n\r\n showPopUpContract(contractSelected);\r\n };\r\n\r\n $scope.ChangeTargetPricePopUp = function (currentContract, index, openPopUp) {\r\n $scope.selectedContract = currentContract;\r\n $scope.targetPriceErrorMessage = \"\";\r\n $scope.titleTargetPricePopUp = $rootScope.editableObjectsFactory.EditableObjects.User_ManageContractsOfTcUsers_PopupChangeTargetPrice_Title.Content;\r\n $scope.ActionType = \"edit\";\r\n openPopUp();\r\n };\r\n\r\n $scope.HistoContractPopUp = function (currentContract, index, openPopUpHisto) {\r\n contractsService.GetHistoContract(currentContract.IdInit, currentContract.IdCrop, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstHistoContract = data;\r\n $scope.ModalTitle = \"Historique du contrat\";\r\n openPopUpHisto();\r\n }\r\n });\r\n };\r\n\r\n $scope.ChkTargetPriceIsValid = function () {\r\n $scope.targetPriceErrorMessage = \"\";\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.ErrorTargetPriceMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_UserContractsFirmMonitoring_MessageTargetPrice.Content;\r\n $scope.ErrorPriceMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_UserContractsFirmMonitoring_PriceMessage.Content;\r\n $scope.TargetPriceCompareErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_UserContractsFirmMonitoring_TargetPriceCompareMessage.Content;\r\n $scope.TargetPriceCompareErrorMessage2 = $rootScope.editableObjectsFactory.EditableObjects.Currency.Content;\r\n $scope.ChangeTargetPriceSuccessMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_UserContractsFirmMonitoring_ChangeTargetPriceMessage.Content;\r\n $scope.CancelContractSuccessMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_UserContractsFirmMonitoring_CancelContractMessage.Content;\r\n $scope.paramAuthorizeTargetPriceUnderOfferPrice = parametersFactory.Parameters.bAuthorizeTargetPriceUnderOfferPrice.Value === \"1\";\r\n\r\n if (!$scope.selectedContract.hasOwnProperty(\"NewTargetPrice\") || $scope.selectedContract.NewTargetPrice === null || $scope.selectedContract.NewTargetPrice < 0) {\r\n $scope.targetPriceErrorMessage = $scope.ErrorTargetPriceMessage;\r\n $scope.selectedContract.NewTargetPrice = null;\r\n return false;\r\n } else {\r\n $scope.selectedContract.NewTargetPrice = $scope.selectedContract.NewTargetPrice.replace(\",\", \".\");\r\n if (!parseFloat($scope.selectedContract.NewTargetPrice)) {\r\n $scope.errorPriceMessage = $scope.ErrorPriceMessage;\r\n return false;\r\n } else {\r\n $scope.selectedContract.NewTargetPrice = Number($scope.selectedContract.NewTargetPrice);\r\n }\r\n if (!$scope.paramAuthorizeTargetPriceUnderOfferPrice && $scope.selectedContract.NewTargetPrice < $scope.selectedContract.OfferPriceUpdated) { // Remplacement de OfferPrice par OfferPriceUpdated car OfferPrice est à null\r\n $scope.targetPriceErrorMessage = $scope.TargetPriceCompareErrorMessage + ' ' + $scope.selectedContract.OfferPriceUpdated + ' ' + $scope.TargetPriceCompareErrorMessage2;\r\n $scope.selectedContract.NewTargetPrice = null;\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n $scope.ChangeTargetPrice = function () {\r\n contractsService.UpdateContract($scope.selectedContract, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.successMessage = $scope.ChangeTargetPriceSuccessMessage;\r\n GetFiltersWithContracts();\r\n }\r\n });\r\n\r\n };\r\n\r\n $scope.CancelContract = function (element) {\r\n contractsService.UpdateContract(element, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.successMessage = $scope.CancelContractSuccessMessage;\r\n GetFiltersWithContracts();\r\n }\r\n });\r\n };\r\n\r\n $scope.GetDataOrSort = function (sortKey, reverse, pageNo) {\r\n if ($scope.viewMode === \"validated\") {\r\n if (pageNo) $scope.validatedPageNo = pageNo;\r\n if (sortKey) $scope.dataValidated.sortKey = sortKey;\r\n if (reverse !== null) $scope.dataValidated.reverse = reverse;\r\n }\r\n else if ($scope.viewMode === \"priced\") {\r\n if (pageNo) $scope.pricedPageNo = pageNo;\r\n if (sortKey) $scope.dataPriced.sortKey = sortKey;\r\n if (reverse !== null) $scope.dataPriced.reverse = reverse;\r\n }\r\n else if ($scope.viewMode === \"canceled\") {\r\n if (pageNo) $scope.canceledPageNo = pageNo;\r\n if (sortKey) $scope.dataCanceled.sortKey = sortKey;\r\n if (reverse !== null) $scope.dataCanceled.reverse = reverse;\r\n }\r\n else if ($scope.viewMode === \"pending\") {\r\n if (pageNo) $scope.pendingPageNo = pageNo;\r\n if (sortKey) $scope.dataPending.sortKey = sortKey;\r\n if (reverse !== null) $scope.dataPending.reverse = reverse;\r\n }\r\n else if ($scope.viewMode === \"delayedSigning\") {\r\n if (pageNo) $scope.delayedSigningPageNo = pageNo;\r\n if (sortKey) $scope.dataDelayedSigning.sortKey = sortKey;\r\n if (reverse !== null) $scope.dataDelayedSigning.reverse = reverse;\r\n }\r\n $scope.GetContractsWithFilter();\r\n };\r\n\r\n $scope.ExportValidatedContracts = function () {\r\n var downloadPath = configurationFactory.Url['Api'] + 'Contracts/GetValidatedContractsXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&idTypeOrder=' + $scope.idTypeOrderContractSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n '&idContractBaseStr=' + $scope.selectedIdContractBase +\r\n '&idLanguage=' + $rootScope.language.IdLanguage +\r\n '&nameOffer=' + $scope.selectedNameOffer +\r\n '&idTypeContractSelected=' + $scope.idTypeContractSelected;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n $scope.ExportPricedContracts = function () {\r\n var downloadPath = configurationFactory.Url['Api'] + 'Contracts/GetPricedContractsXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&idTypeOrder=' + $scope.idTypeOrderContractSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n '&idLanguage=' + $rootScope.language.IdLanguage +\r\n '&idTypeFixation=' + $scope.idTypeFixationSelected +\r\n '&nameOffer=' + $scope.selectedNameOffer +\r\n '&idTypeContractSelected=' + $scope.idTypeContractSelected;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n $scope.ExportCanceledContracts = function () {\r\n var downloadPath = configurationFactory.Url['Api'] + 'Contracts/GetCanceledContractsXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&idTypeOrder=' + $scope.idTypeOrderContractSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n '&idLanguage=' + $rootScope.language.IdLanguage +\r\n '&nameOffer=' + $scope.selectedNameOffer +\r\n '&idTypeContractSelected=' + $scope.idTypeContractSelected;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n $scope.ExportPendingContracts = function () {\r\n var downloadPath = configurationFactory.Url['Api'] + 'Contracts/GetPendingContractsXls/' +\r\n '?idCrop=' + $scope.idCropSelected +\r\n '&idProduct=' + $scope.idProductSelected +\r\n '&idTypeOrder=' + $scope.idTypeOrderContractSelected +\r\n '&date=' + $scope.dateFilter +\r\n '&idContractStr=' + $scope.selectedIdContract +\r\n '&numClient=' + $scope.selectedIdClient +\r\n '&idCompagny=' + $scope.idCompagnySelected +\r\n '&idLanguage=' + $rootScope.language.IdLanguage +\r\n '&nameOffer=' + $scope.selectedNameOffer +\r\n '&idTypeContractSelected=' + $scope.idTypeContractSelected;\r\n window.open(downloadPath, '_blank', '');\r\n };\r\n\r\n $scope.GoToSubscribeDelayedSigning = function (contract) {\r\n $rootScope.goToDelayedSigning = true;\r\n $rootScope.idContractForDelayedSigning = contract.IdContract;\r\n $rootScope.hasSmsCodeSigningAlreadySend = contract.HasSmsCodeSigningAlreadySend;\r\n $rootScope.selectedClientFromTc = $filter('filter')($rootScope.lstClientsFromTc, { IdUser: contract.IdUser }, true)[0];\r\n userService.SaveClientSelectedFromTC($rootScope.selectedClientFromTc.IdUser, true, function (data, status) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n });\r\n $rootScope.isTcSigningForUser = true;\r\n if (contract.IdTypeContract == enumFactory.TypeContract.Ferme)\r\n $location.path('/user/subscribe/contractFirm/');\r\n else if (contract.IdTypeContract == enumFactory.TypeContract.ContratVierge)\r\n $location.path('/user/subscribe/contractBlank/');\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n Init();\r\n };\r\n\r\n Init();\r\n }]);\r\n","AgrimarketControllers.controller('manageContractsBaseOfTcUserController', ['$scope', '$rootScope', '$routeParams', 'configurationFactory',\r\n 'contractBaseService', 'cropsService', '$location', '$sce', '$filter', 'enumFactory', 'colonnesContractsBaseValidated', 'colonnesContractsBasePriced', 'colonnesContractsBaseCanceled', 'colonnesContractsBasePending',\r\n function ($scope, $rootScope, $routeParams, configurationFactory, contractBaseService, cropsService, $location, $sce, $filter, enumFactory, colonnesContractsBaseValidated, colonnesContractsBasePriced, colonnesContractsBaseCanceled, colonnesContractsBasePending) {\r\n\r\n var idTabContracts;\r\n\r\n var Init = function () { \r\n $scope.viewMode = $routeParams.typeContract;\r\n\r\n $scope.max = 10;\r\n\r\n $scope.dataSort = { reverse: true, sortKey: \"IdContractBase\" };\r\n\r\n $scope.validatedPageNo = 1;\r\n $scope.pendingPageNo = 1;\r\n $scope.pricedPageNo = 1;\r\n $scope.canceledPageNo = 1; \r\n\r\n $scope.idTypeOrderSelected = \"\"; \r\n\r\n $scope.LabelAll = $rootScope.editableObjectsFactory.EditableObjects.All.Content;\r\n\r\n $scope.colonnesValidatedVisible = colonnesContractsBaseValidated.data.DataVisible.split(',');\r\n $scope.colonnesValidatedLibelle = colonnesContractsBaseValidated.data.ColumnName.split(',');\r\n\r\n $scope.colonnesPendingVisible = colonnesContractsBasePending.data.DataVisible.split(',');\r\n $scope.colonnesPendingLibelle = colonnesContractsBasePending.data.ColumnName.split(',');\r\n\r\n $scope.colonnesPricedVisible = colonnesContractsBasePriced.data.DataVisible.split(',');\r\n $scope.colonnesPricedLibelle = colonnesContractsBasePriced.data.ColumnName.split(',');\r\n\r\n $scope.colonnesCanceledVisible = colonnesContractsBaseCanceled.data.DataVisible.split(',');\r\n $scope.colonnesCanceledLibelle = colonnesContractsBaseCanceled.data.ColumnName.split(',');\r\n\r\n $scope.dateFilter = \"\";\r\n $scope.$watch(\"dateSelected\", function (newValue) {\r\n if (newValue === \"\")\r\n $scope.dateFilter = \"\";\r\n else if (newValue) {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format yyyy/mm/dd pour l'envoyer à l'API.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.dateFilter = converDate.format('YYYY/MM/DD');\r\n }\r\n });\r\n\r\n $scope.$watch(\"dateFilter\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetContractsWithFilter(1);\r\n });\r\n\r\n $scope.selectedIdContract = \"\";\r\n $scope.$watch(\"selectedIdContract\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.GetContractsWithFilter(1);\r\n });\r\n \r\n $scope.GetContractsFilters();\r\n }; \r\n\r\n $scope.GetContractsFilters = function () {\r\n $scope.idCropSelected = \"\";\r\n $scope.idProductSelected = \"\";\r\n $scope.selectedIdContract = \"\"; \r\n $scope.idTypeOrderSelected = \"\"; \r\n if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n $scope.dateSelected = \"\"; \r\n var labelAll = $rootScope.editableObjectsFactory.EditableObjects.All.Content; \r\n contractBaseService.GetFiltersWithContractsBase( function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.lstProducts = data.LstProductFilterVm; \r\n $scope.lstTypeOrders = data.LstTypeOrderFilterVm; \r\n $scope.lstCrops = data.LstCropsVm; \r\n\r\n if ($scope.lstProducts.length === 1)\r\n $scope.idProductSelected = $scope.lstProducts[0].IdProduct;\r\n else if ($scope.lstProducts.length > 1)\r\n $scope.lstProducts.unshift({ IdProduct: \"\", ProductLabel: $scope.LabelAll }); \r\n\r\n if ($scope.lstTypeOrders.length === 1)\r\n $scope.idTypeOrderSelected = $scope.lstTypeOrders[0].IdTypeOrder;\r\n else if ($scope.lstTypeOrders.length > 1)\r\n $scope.lstTypeOrders.unshift({ IdTypeOrder: \"\", TypeOrderLabel: labelAll }); \r\n\r\n if ($scope.lstCrops.length === 1)\r\n $scope.idCropSelected = $scope.lstCrops[0].Id;\r\n else if ($scope.lstCrops.length > 1)\r\n $scope.lstCrops.unshift({ Id: \"\", Label: $rootScope.editableObjectsFactory.EditableObjects.AllItems_F.Content });\r\n\r\n $scope.GetContractsWithFilter(1);\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.GetContractsWithFilter = function (pagenum) { \r\n if ($scope.viewMode === \"validated\")\r\n contractBaseService.GetContractsBasePaginate(enumFactory.ContractState.Valide, $scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, \"\", $scope.idTypeOrderSelected, $scope.max, pagenum, $scope.dataSort.sortKey, $scope.dataSort.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalValidated = data.Total;\r\n $scope.contractsValidated = data.ListVm;\r\n }\r\n });\r\n else if ($scope.viewMode === \"priced\")\r\n contractBaseService.GetContractsBasePaginate(enumFactory.ContractState.AttenteValidation, $scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, \"\", $scope.idTypeOrderSelected, $scope.max, pagenum, $scope.dataSort.sortKey, $scope.dataSort.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalPriced = data.Total;\r\n $scope.contractsPriced = data.ListVm;\r\n }\r\n });\r\n else if ($scope.viewMode === \"canceled\")\r\n contractBaseService.GetContractsBasePaginate(enumFactory.ContractState.Annulé, $scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, \"\", $scope.idTypeOrderSelected, $scope.max, pagenum, $scope.dataSort.sortKey, $scope.dataSort.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalCanceled = data.Total;\r\n $scope.contractsCanceled = data.ListVm;\r\n }\r\n });\r\n else if ($scope.viewMode === \"pending\")\r\n contractBaseService.GetContractsBasePaginate(enumFactory.ContractState.AttenteDernierComposant, $scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, \"\", $scope.idTypeOrderSelected, $scope.max, pagenum, $scope.dataSort.sortKey, $scope.dataSort.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalPending = data.Total;\r\n $scope.contractsPending = data.ListVm;\r\n }\r\n });\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.dataSort.sortKey = sortKey;\r\n $scope.dataSort.reverse = reverse;\r\n $scope.GetContractsWithFilter(1);\r\n };\r\n\r\n\r\n $scope.CancelContractPopUp = function (contractSelected, index, showPopUpContract) {\r\n $scope.PopUpMessageDeleteContract = \"\";\r\n $scope.MessageDeleteContractBaseTargetPrice = $rootScope.editableObjectsFactory.EditableObjects.MessageDeleteContractBaseTargetPrice.Content;\r\n $scope.CanceledContract = $rootScope.editableObjectsFactory.EditableObjects.CanceledContract.Content;\r\n\r\n $scope.PopupCanceledContractsSelectedTitle = $scope.CanceledContract + \" \" + contractSelected.IdContractBase;\r\n\r\n if (contractSelected !== undefined)\r\n $scope.PopUpMessageDeleteContract = $scope.MessageDeleteContractBaseTargetPrice;\r\n\r\n showPopUpContract(contractSelected);\r\n };\r\n\r\n $scope.CancelContract = function (element) {\r\n contractBaseService.UpdateContractBase(element, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.successMessage = $scope.CancelContractSuccessMessage;\r\n $scope.GetContractsFilters();\r\n }\r\n });\r\n };\r\n\r\n $scope.ChangeTargetBasePricePopUp = function (currentContract, index, openPopUp) {\r\n $scope.selectedContract = currentContract;\r\n $scope.targetBasePriceErrorMessage = \"\";\r\n $scope.titleTargetPricePopUp = $rootScope.editableObjectsFactory.EditableObjects.User_ContractBaseMonitoring_PopupChangeTargetPrice_Title.Content;\r\n $scope.ActionType = \"edit\";\r\n openPopUp();\r\n };\r\n\r\n $scope.ChkTargetBasePriceIsValid = function () {\r\n $scope.targetBasePriceErrorMessage = \"\";\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.ErrorTargetPriceMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_UserContractsBaseMonitoring_MessageTargetPrice.Content;\r\n $scope.ErrorPriceMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_UserContractsBaseMonitoring_BasePriceMessage.Content;\r\n $scope.TargetPriceCompareErrorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_UserContractsBaseMonitoring_TargetBasePriceCompareMessage.Content;\r\n $scope.TargetPriceCompareErrorMessage2 = $rootScope.editableObjectsFactory.EditableObjects.Currency.Content;\r\n $scope.ChangeTargetPriceSuccessMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_UserContractsBaseMonitoring_ChangeTargetBasePriceMessage.Content;\r\n $scope.CancelContractSuccessMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_UserContractsBaseMonitoring_CancelContractBaseMessage.Content;\r\n\r\n if (!$scope.selectedContract.hasOwnProperty(\"NewTargetBasePrice\") || $scope.selectedContract.NewTargetBasePrice === null) {\r\n $scope.targetBasePriceErrorMessage = $scope.ErrorTargetPriceMessage;\r\n $scope.selectedContract.NewTargetBasePrice = null;\r\n return false;\r\n } else {\r\n $scope.selectedContract.NewTargetBasePrice = $scope.selectedContract.NewTargetBasePrice.replace(\",\", \".\");\r\n if (!parseFloat($scope.selectedContract.NewTargetBasePrice)) {\r\n $scope.targetBasePriceErrorMessage = $scope.ErrorPriceMessage;\r\n return false;\r\n } else {\r\n $scope.selectedContract.NewTargetBasePrice = Number($scope.selectedContract.NewTargetBasePrice);\r\n }\r\n if ($scope.selectedContract.NewTargetBasePrice <= $scope.selectedContract.OfferBasePriceUpdated) {\r\n $scope.targetBasePriceErrorMessage = TargetPriceCompareErrorMessage + \" \" + $scope.selectedContract.OfferBasePriceUpdated + \" \" + $scope.TargetPriceCompareErrorMessage2;\r\n $scope.selectedContract.NewTargetBasePrice = null;\r\n return false;\r\n }\r\n }\r\n return true;\r\n };\r\n\r\n $scope.ChangeTargetBasePrice = function () {\r\n contractBaseService.UpdateContractBase($scope.selectedContract, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.successMessage = $scope.ChangeTargetPriceSuccessMessage;\r\n $scope.GetContractsFilters();\r\n }\r\n });\r\n };\r\n\r\n $scope.HistoContractPopUp = function (currentContract, openPopUpHisto) {\r\n $scope.ModalTitleContractBaseHisto = $rootScope.editableObjectsFactory.EditableObjects.ModalTitleContractBaseHisto.Content;\r\n contractBaseService.GetHistoContractBase(currentContract.IdInit, currentContract.IdCrop, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.lstHistoContract = data;\r\n $scope.ModalTitle = $scope.ModalTitleContractBase;\r\n openPopUpHisto();\r\n }\r\n });\r\n };\r\n\r\n Init();\r\n }]);\r\n","AgrimarketControllers.controller('manageContractsCommitmentOfTcUserController', ['$scope', '$rootScope', '$routeParams', 'configurationFactory',\r\n 'contractsService', 'cropsService', '$location', '$sce', '$filter', 'enumFactory', 'colonnesContractsCommitmentValidated',\r\n function ($scope, $rootScope, $routeParams, configurationFactory, contractsService, cropsService, $location, $sce, $filter, enumFactory, colonnesContractsCommitmentValidated) { \r\n\r\n var Init = function () {\r\n $scope.viewMode = $routeParams.typeContract;\r\n\r\n // Contracts engagement valider\r\n $scope.tableContractsCommitmentValidatedDataVisible = colonnesContractsCommitmentValidated.data.DataVisible.split(',');\r\n $scope.tableContractsCommitmentValidatedLibelle = colonnesContractsCommitmentValidated.data.ColumnName.split(',');\r\n\r\n $scope.idCropSelected = \"\";//$rootScope.crop.IdCrop;\r\n $scope.idProductSelected = \"\";\r\n $scope.dateFilter = \"\";\r\n $scope.dateSelected = \"\";\r\n $scope.selectedIdContract = \"\";\r\n $scope.selectedIdClient = \"\";\r\n $scope.idTypeCommitmentContractSelected = \"\";\r\n $scope.idCompagnySelected = \"\"; \r\n $scope.selectedClient = {};\r\n\r\n $scope.dataValidated = { reverse: true, sortKey: \"IdContract\" };\r\n $scope.max = 10;\r\n $scope.validatedPageNo = 1;\r\n\r\n $scope.$watch(\"selectedIdContract\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.getContractsCommitmentWhithFilter(1);\r\n });\r\n\r\n\r\n $scope.$watch(\"dateSelected\", function (newValue) {\r\n if (newValue === \"\")\r\n $scope.dateFilter = \"\";\r\n else if (newValue) {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format yyyy/mm/dd pour l'envoyer à l'API.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.dateFilter = converDate.format('YYYY/MM/DD');\r\n }\r\n });\r\n\r\n $scope.$watch(\"dateFilter\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.getContractsCommitmentWhithFilter(1);\r\n });\r\n\r\n $scope.InitialiseFilters();\r\n \r\n };\r\n\r\n $scope.InitialiseFilters = function () {\r\n $scope.idCropSelected = \"\";\r\n $scope.idProductSelected = \"\";\r\n $scope.selectedIdContract = \"\";\r\n $scope.idTypeCommitmentContractSelected = \"\";\r\n $scope.selectedIdClient = \"\";\r\n $scope.dateSelected = \"\";\r\n\r\n var labelAll = $rootScope.editableObjectsFactory.EditableObjects.All.Content;\r\n\r\n contractsService.GetFiltersWithContractsCommitment(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.lstProducts = data.LstProductFilterVm;\r\n $scope.lstTypeCommitments = data.LstTypeCommitmentFilterVm;\r\n $scope.lstCrops = data.LstCropsVm;\r\n\r\n if ($scope.lstProducts.length === 1)\r\n $scope.idProductSelected = $scope.lstProducts[0].IdProduct;\r\n else if ($scope.lstProducts.length > 1)\r\n $scope.lstProducts.unshift({ IdProduct: \"\", ProductLabel: labelAll });\r\n\r\n if ($scope.lstTypeCommitments.length === 1)\r\n $scope.idTypeCommitmentContractSelected = $scope.lstTypeCommitments[0].IdTypeCommitment;\r\n else if ($scope.lstTypeCommitments.length > 1)\r\n $scope.lstTypeCommitments.unshift({ IdTypeCommitment: \"\", LabelTypeCommitment: labelAll });\r\n\r\n if ($scope.lstCrops.length === 1)\r\n $scope.idCropSelected = $scope.lstCrops[0].IdCrop;\r\n else if ($scope.lstCrops.length > 1)\r\n $scope.lstCrops.unshift({ Id: \"\", Label: $rootScope.editableObjectsFactory.EditableObjects.AllItems_F.Content });\r\n\r\n $scope.getContractsCommitmentWhithFilter(1);\r\n }\r\n }\r\n });\r\n };\r\n\r\n\r\n $scope.getContractsCommitmentWhithFilter = function (pagenum) {\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n contractsService.GetContractsCommitmentValidatedPaginate($scope.idCropSelected, $scope.idProductSelected, $scope.idTypeCommitmentContractSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, $scope.max, pagenum, $scope.dataValidated.sortKey, $scope.dataValidated.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalValidated = data.Total;\r\n $scope.contractsCommitmentValidated = data.ListVm;\r\n\r\n data.ListVm.forEach(function (contract) {\r\n $scope.allContractsInView.push(contract);\r\n });\r\n }\r\n });\r\n }; \r\n\r\n Init();\r\n }]);\r\n","AgrimarketControllers.controller('manageContractsSurfaceCommitmentOfTcUserController', ['$scope', '$rootScope', '$routeParams', 'configurationFactory',\r\n 'contractsService', '$sce', 'colonnesContractsSurfaceCommitmentValidated',\r\n function ($scope, $rootScope, $routeParams, configurationFactory, contractsService, $sce, colonnesContractsSurfaceCommitmentValidated) { \r\n\r\n var Init = function () {\r\n $scope.viewMode = $routeParams.typeContract;\r\n\r\n\r\n // Contracts engagement surface valider\r\n $scope.tableContractsSurfaceCommitmentValidatedDataVisible = colonnesContractsSurfaceCommitmentValidated.data.DataVisible.split(',');\r\n $scope.tableContractsSurfaceCommitmentValidatedLibelle = colonnesContractsSurfaceCommitmentValidated.data.ColumnName.split(',');\r\n\r\n $scope.idCropSelected = \"\";\r\n $scope.idProductSelected = \"\";\r\n $scope.dateFilter = \"\";\r\n $scope.dateSelected = \"\";\r\n $scope.selectedIdContract = \"\";\r\n $scope.selectedIdClient = \"\";\r\n $scope.idCompagnySelected = \"\"; \r\n $scope.selectedClient = {};\r\n\r\n $scope.dataValidated = { reverse: true, sortKey: \"IdContract\" };\r\n $scope.max = 10;\r\n $scope.validatedPageNo = 1;\r\n\r\n $scope.$watch(\"selectedIdContract\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.getContractsSurfaceCommitmentWhithFilter(1);\r\n });\r\n\r\n\r\n $scope.$watch(\"dateSelected\", function (newValue) {\r\n if (newValue === \"\")\r\n $scope.dateFilter = \"\";\r\n else if (newValue) {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format yyyy/mm/dd pour l'envoyer à l'API.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.dateFilter = converDate.format('YYYY/MM/DD');\r\n }\r\n });\r\n\r\n $scope.$watch(\"dateFilter\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n $scope.getContractsSurfaceCommitmentWhithFilter(1);\r\n });\r\n\r\n $scope.InitialiseFilters();\r\n \r\n };\r\n\r\n $scope.InitialiseFilters = function () {\r\n $scope.idCropSelected = \"\";\r\n $scope.idProductSelected = \"\";\r\n $scope.selectedIdContract = \"\";\r\n $scope.selectedIdClient = \"\";\r\n $scope.dateSelected = \"\";\r\n\r\n var labelAll = $rootScope.editableObjectsFactory.EditableObjects.All.Content;\r\n\r\n contractsService.GetFiltersWithContractsSurfaceCommitment(function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n if (data) {\r\n $scope.lstProducts = data.LstProductFilterVm;\r\n $scope.lstCrops = data.LstCropsVm;\r\n\r\n if ($scope.lstProducts.length === 1)\r\n $scope.idProductSelected = $scope.lstProducts[0].IdProduct;\r\n else if ($scope.lstProducts.length > 1)\r\n $scope.lstProducts.unshift({ IdProduct: \"\", ProductLabel: labelAll });\r\n\r\n if ($scope.lstCrops.length === 1)\r\n $scope.idCropSelected = $scope.lstCrops[0].IdCrop;\r\n else if ($scope.lstCrops.length > 1)\r\n $scope.lstCrops.unshift({ Id: \"\", Label: $rootScope.editableObjectsFactory.EditableObjects.AllItems_F.Content });\r\n\r\n $scope.getContractsSurfaceCommitmentWhithFilter(1);\r\n }\r\n }\r\n });\r\n };\r\n\r\n\r\n $scope.getContractsSurfaceCommitmentWhithFilter = function (pagenum) {\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n if (!$scope.selectedIdContract) $scope.selectedIdContract = \"\";\r\n if (!$scope.selectedIdClient) $scope.selectedIdClient = \"\";\r\n contractsService.GetContractsSurfaceCommitmentValidatedPaginate($scope.idCropSelected, $scope.idProductSelected, $scope.dateFilter, $scope.selectedIdContract, $scope.selectedIdClient, $scope.idCompagnySelected, $scope.max, pagenum, $scope.dataValidated.sortKey, $scope.dataValidated.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalValidated = data.Total;\r\n $scope.contractsSurfaceCommitmentValidated = data.ListVm;\r\n\r\n data.ListVm.forEach(function (contract) {\r\n $scope.allContractsInView.push(contract);\r\n });\r\n }\r\n });\r\n }; \r\n\r\n Init();\r\n }]);\r\n","AgrimarketControllers.controller('userManagementController', [\r\n '$scope', '$rootScope', '$routeParams', '$http', '$location', 'userInfosService', 'userCropCapitalService','parametersFactory',\r\n\tfunction ($scope, $rootScope, $routeParams, $http, $location, userInfosService, userCropCapitalService, parametersFactory) {\r\n\t\tif ($rootScope.CurrentUserRole !== 'User')\r\n\t\t\t$location.path('/login');\r\n\r\n $scope.viewMode = $routeParams.typeTab;\r\n $scope.isModuleAlertesSmsActive = $rootScope.Modules.ModuleAlertesSms.Active;\r\n\r\n\t\tvar Init = function () {\r\n\t\t\tuserInfosService.GetUserInfos(function (data, status) {\r\n\t\t\t\tif (status !== null) {\r\n\t\t\t\t\tif (status == 400)\r\n\t\t\t\t\t\t$scope.errorMessage = data[0].errors[0].Message;\r\n\t\t\t\t}\r\n $scope.userInfos = data;\r\n\t\t\t\t$scope.bAuthorizeUserEmailModification = parametersFactory.Parameters.bAuthorizeUserEmailModification.Value == '1';\r\n\t\t\t\t$scope.bCanUserEditInformations = parametersFactory.Parameters.bCanUserEditInformations.Value == '1';\r\n\t\t\t});\r\n\r\n\t\t\tif ($rootScope.bDisplayCapitalSocial) {\r\n\t\t\t userCropCapitalService.GetUserCropCapital(function (data, status) {\r\n\t\t\t if (status !== null) {\r\n\t\t\t if (status == 400)\r\n\t\t\t $scope.errorMessage = data[0].errors[0].Message;\r\n\t\t\t }\r\n\t\t\t $scope.userCropCapitals = data;\r\n\t\t\t });\r\n } \r\n\t\t};\r\n \r\n\t\t$scope.SaveUserInfos = function() {\r\n\t\t\tif ($scope.CheckUserInfos()) {\r\n\t\t\t\tuserInfosService.SaveUserInfos($scope.userInfos, function (data, status) {\r\n\t\t\t\t\tif (status !== null) {\r\n\t\t\t\t\t\tif (status == 400)\r\n\t\t\t\t\t\t\t$scope.errorMessage = data[0].errors[0].Message;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n $scope.succesMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_UserInfos_InformationHasBeenSaved.Content;\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t$scope.CheckUserInfos = function () {\r\n\t\t\t$scope.errorMessage = $scope.succesMessage = \"\";\r\n\t\t\tif ($scope.userInfos.Mail === \"\" || $scope.userInfos.Mail.indexOf('@') < 0 || $scope.userInfos.Mail.indexOf('.') < 0) {\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.Error_UserInfos_PleaseEnterValidMail.Content + \"<br/>\";\r\n\t\t\t}\r\n\t\t\tif (!$scope.userInfos.MobileNumber) {\r\n $scope.errorMessage += $rootScope.editableObjectsFactory.EditableObjects.Error_UserInfos_PleaseEnterMobileNumber.Content + \"<br/>\";\r\n\t\t\t}\r\n\t\t\tif ($scope.errorMessage === \"\")\r\n\t\t\t\treturn true;\r\n\t\t\treturn false;\r\n };\r\n\r\n $scope.SaveUserAdditionalService = function () {\r\n userInfosService.SaveUserAdditionalService($scope.userInfos, function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n else\r\n $scope.succesMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_UserInfos_InformationHasBeenSaved.Content;\r\n });\r\n };\r\n\r\n\t\tInit();\r\n\t}\r\n]);","AgrimarketControllers.controller('commitmentsController', [\r\n '$scope', '$rootScope', '$routeParams', '$http', '$location', 'contractsService', '$filter', 'colonnesTypeCommitments', 'colonnesContractTypeCommitmentAndProduct', 'colonnesContractProduct', 'colonnesContractTypeCommitment',\r\n 'enumFactory', 'colonnesListFixationsByIdCommitment',\r\n function ($scope, $rootScope, $routeParams, $http, $location, contractsService, $filter, colonnesTypeCommitments, colonnesContractTypeCommitmentAndProduct, colonnesContractProduct, colonnesContractTypeCommitment, enumFactory, colonnesListFixationsByIdCommitment) {\r\n\r\n if ($rootScope.ModuleEngagementALaMasse.Active) {\r\n $location.path('/user/commitmentsAll');\r\n }\r\n // IFRAME\r\n }\r\n]);","AgrimarketControllers.controller('commitmentsAllController', [\r\n '$scope', '$rootScope', '$routeParams', '$http', '$location', 'contractsService', '$filter', 'colonnesCropProductTonnages', 'enumFactory',\r\n function ($scope, $rootScope, $routeParams, $http, $location, contractsService, $filter, colonnesCropProductTonnages, enumFactory) {\r\n //appel iframe\r\n}\r\n]);","AgrimarketControllers.controller('documentsController', [\r\n '$scope', '$sce', '$rootScope', '$filter', 'userService', 'configurationFactory', 'dateService', 'signatureService', 'currentUserFactory', function ($scope, $sce, $rootScope, $filter, userService, configurationFactory, dateService, signatureService, currentUserFactory) {\r\n\r\n $scope.Init = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.selectedAutoCompleteObject = {};\r\n $scope.selectedAutoCompleteInput = '';\r\n $scope.documentsfilter = {};\r\n $scope.prefixDateUpdDateDocument = 'Le ';\r\n $scope.currentDocumentUrlPdf = null;\r\n $scope.keyMenu = 'Menu_User_Documents';\r\n\r\n $scope.selectedConnection = {};\r\n $scope.signatureYouSign = {};\r\n $scope.moduleYousignIsActive = $rootScope.ModuleSignatureElectroniqueYouSign.Active;\r\n $scope.listConnection = [];\r\n $scope.showConfirmButton = true;\r\n $scope.user = currentUserFactory.User;\r\n $scope.security = {\r\n Code: \"\"\r\n };\r\n\r\n $scope.search = {\r\n BeginDate: null,\r\n EndDate: null\r\n };\r\n\r\n userService.GetDocumentsUser($rootScope.crop.IdCrop, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n var errorMessage = data[0].errors[0].Message + \"</br>.\";\r\n $scope.errorMessage = $sce.trustAsHtml(errorMessage);\r\n }\r\n } else {\r\n $scope.lstAllDocumentsByCrop = $scope.lstDocuments = $scope.documentsfilter = data.Documents;\r\n $scope.lstDocumentsCategories = data.DocumentsCategories;\r\n\r\n if ($scope.lstDocumentsCategories.length > 0)\r\n $scope.idDocumentCategorySelected = $scope.lstDocumentsCategories[0].Id;\r\n\r\n $scope.Filter();\r\n }\r\n });\r\n };\r\n\r\n $scope.ShowPopUpSignature = function (idDocument, openPopUpSignature) {\r\n $scope.successMessage = \"\";\r\n $scope.errorMessageSignature = \"\";\r\n openPopUpSignature();\r\n sendSecurityCode(idDocument);\r\n };\r\n\r\n function sendSecurityCode(idDocument) {\r\n signatureService.SendSmsForDocumentSignature(idDocument, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessageSignature = data[0].errors[0].Message;\r\n }\r\n } else {\r\n if (data) {\r\n $scope.signatureYouSign = data;\r\n }\r\n }\r\n });\r\n }\r\n\r\n $scope.CheckSmsForYouSign = function (cancelSignaturePopUp) {\r\n $scope.showConfirmButton = false;\r\n $scope.errorMessageSignature = \"\";\r\n signatureService.SignatureWithCodeYouSign($scope.signatureYouSign.Signature.FilesIds[0], $scope.newAuthenticationId ? $scope.newAuthenticationId : $scope.signatureYouSign.Signature.AuthenticationId, $scope.security.Code, \"\", $scope.selectedConnection, $scope.signatureYouSign.Signature.MemberId, $scope.signatureYouSign.Signature.ProcedureId, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessageSignature = data[0].errors[0].Message;\r\n $scope.showConfirmButton = true;\r\n }\r\n }\r\n else {\r\n if (data && (data === \"true\" || data === \"1\")) {\r\n $scope.errorMessageSignature = \"\";\r\n cancelSignaturePopUp();\r\n $scope.Init();\r\n }\r\n else {\r\n $scope.showConfirmButton = true;\r\n $scope.successMessage = \"\";\r\n if (!$scope.security.Code) {\r\n $scope.errorMessageSignature = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterCodeReceivedBySms.Content;\r\n }\r\n else\r\n $scope.errorMessageSignature = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_CodeEnteredNotCorrespondToCodeSended.Content;\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.ResendSecurityCodeYouSign = function () {\r\n $scope.errorMessageSignature = \"\";\r\n signatureService.ResendCodeYouSign($scope.signatureYouSign.Signature.MemberId, $scope.signatureYouSign.Signature.ProcedureId, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessageSignature = data[0].errors[0].Message;\r\n }\r\n }\r\n else {\r\n if (data) {\r\n $scope.newAuthenticationId = data.AuthenticationId;\r\n $scope.errorMessageSignature = \"\";\r\n $scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_OfferSubscribe_CodeResend.Content;\r\n }\r\n }\r\n });\r\n };\r\n\r\n $scope.GetPdfDocument = function (item) {\r\n if (item) {\r\n $scope.idDocumentDisplay = item.IdDocument;\r\n $scope.currentDocumentUrlPdf = $sce.trustAsResourceUrl($filter('pdfLinkDocument')({k: item.IdDocument, h: item.Hash})) ;\r\n\r\n }\r\n };\r\n\r\n $scope.$watch(\"selectedAutoCompleteInput\",\r\n function (newValue) {\r\n if (newValue !== undefined && newValue !== null) {\r\n $scope.Filter();\r\n }\r\n });\r\n\r\n $scope.$watch(\r\n \"search.BeginDate\",\r\n function (newValue) {\r\n if (newValue === \"\" || newValue === undefined || newValue === null) {\r\n $scope.dateFilterBegin = \"\";\r\n }\r\n else {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format dd/mm/yyyy.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.dateFilterBegin = converDate.format('DD/MM/YYYY');\r\n }\r\n });\r\n\r\n $scope.$watch(\r\n \"search.EndDate\",\r\n function (newValue) {\r\n if (newValue === \"\" || newValue === undefined || newValue === null) {\r\n $scope.dateFilterEnd = \"\";\r\n }\r\n else {\r\n //permet de gérer l'internalisation de tout les formats des dates possibles.\r\n //Au final nous faisons en sorte de la retrouvé au format dd/mm/yyyy.\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(newValue.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n $scope.dateFilterEnd = converDate.format('DD/MM/YYYY');\r\n }\r\n });\r\n\r\n $scope.$watch(\r\n \"dateFilterBegin\",\r\n function (newValue) {\r\n if (newValue !== undefined && newValue !== null) {\r\n $scope.Filter();\r\n }\r\n });\r\n\r\n $scope.$watch(\r\n \"dateFilterEnd\",\r\n function (newValue) {\r\n if (newValue !== undefined && newValue !== null) {\r\n $scope.Filter();\r\n }\r\n });\r\n\r\n\r\n $scope.Filter = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.currentDocumentUrlPdf = null;\r\n var filterGeneral = angular.copy($scope.lstAllDocumentsByCrop);\r\n\r\n if ($scope.idDocumentCategorySelected) {\r\n filterGeneral = $filter('filter')(filterGeneral, { IdDocumentCategory: $scope.idDocumentCategorySelected }, true);\r\n }\r\n\r\n if ($scope.selectedAutoCompleteInput) {\r\n filterGeneral = filterGeneral.filter(function (element) {\r\n if (checkElement(element.NumDocument, $scope.selectedAutoCompleteInput)) {\r\n return element;\r\n }\r\n return null;\r\n });\r\n }\r\n\r\n if ($scope.dateFilterBegin) {\r\n filterGeneral = filterGeneral.filter(function (element) {\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(element.DateDocument.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n var dateElementBegin = converDate.format('DD/MM/YYYY');\r\n\r\n if (!dateService.compareDate(dateElementBegin, $scope.dateFilterBegin))\r\n return element;\r\n else\r\n return null;\r\n });\r\n }\r\n\r\n if ($scope.dateFilterEnd) {\r\n filterGeneral = filterGeneral.filter(function (element) {\r\n\r\n var pattern = /(\\d{2})\\/(\\d{2})\\/(\\d{4})/;\r\n var dt = new Date(element.DateDocument.replace(pattern, '$3-$2-$1'));\r\n var currentDate = new Date(dt.toString());\r\n var converDate = moment(currentDate);\r\n var dateElementEnd = converDate.format('DD/MM/YYYY');\r\n\r\n if (!dateService.compareDate($scope.dateFilterEnd, dateElementEnd))\r\n return element;\r\n else\r\n return null;\r\n });\r\n }\r\n\r\n $scope.documentsfilter = $scope.lstDocuments = filterGeneral;\r\n\r\n if ($scope.documentsfilter && $scope.documentsfilter.length > 0)\r\n $scope.idDocumentCategorySelected = $scope.documentsfilter[0].IdDocumentCategory;\r\n };\r\n\r\n function checkElement(attr, string) {\r\n if (attr.toLowerCase().indexOf(string.toLowerCase()) !== -1)\r\n return true;\r\n else return false;\r\n }\r\n\r\n $scope.AsChangedCrop = function () {\r\n $scope.Init();\r\n };\r\n\r\n $scope.Init();\r\n }]);","AgrimarketControllers.controller('marketinfostUserController', ['$scope', '$rootScope', 'marketinfosUserHashtagriService', '$location', '$q', '$filter', 'quoteService', 'quoteCashHashtagriService', 'quoteForexHashtagriService', 'parametersFactory', 'blocDispositionService', 'enumFactory', '$sce',\r\n function ($scope, $rootScope, marketinfosUserHashtagriService, $location, $q, $filter, quoteService, quoteCashHashtagriService, quoteForexHashtagriService, parametersFactory, blocDispositionService, enumFactory, $sce) {\r\n\r\n }]);\r\n","AgrimarketControllers.controller('redirectOuiFieldController', ['$scope', '$rootScope', '$window', 'parametersFactory', 'authenticationService',\r\n function ($scope, $rootScope, $window, parametersFactory, authenticationService) {\r\n\r\n $scope.errorMessage = '';\r\n authenticationService.RedirectOnOuiField($rootScope.User.IdExt ,function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n var splitParam = parametersFactory.Parameters.OuiFieldParameter.Value.split(';');\r\n localStorage.setItem(\"guid\",data.Guid);\r\n $window.location.href = (splitParam[1] + data.Token);\r\n }\r\n });\r\n }\r\n]);\r\n","AgrimarketControllers.controller('subscribeContractBaseController', ['$scope', '$rootScope', '$location', 'currentUserFactory', 'enumFactory', 'configurationFactory', 'parametersFactory', '$routeParams', 'offerService', 'parametersService', 'contractsService', '$filter', 'conditionsService', 'colonnesContractTypeCommitmentAndProduct', 'signatureService', 'contractingDelayService', 'typeOrdersService', 'colonnesContractFutureCompatibles', 'targetPriceService', 'contractBaseService', 'userService', 'dateService', '$sce',\r\n function ($scope, $rootScope, $location, currentUserFactory, enumFactory, configurationFactory, parametersFactory, $routeParams, offerService, parametersService, contractsService, $filter, conditionsService, colonnesContractTypeCommitmentAndProduct, signatureService, contractingDelayService, typeOrdersService, colonnesContractFutureCompatibles, targetPriceService, contractBaseService, userService, dateService, $sce) {\r\n\r\n var init = function () {\r\n\r\n $scope.paramsCompatibleCommitments = { reverse: false, sortKey: \"IdContract\", maxContracts: 10, pageNo: 1 };\r\n $scope.paramsCompatibleFutures = { reverse: false, sortKey: \"IdContract\", maxContracts: 10, pageNo: 1 };\r\n $scope.IsUneal = $rootScope.paramNameCoop === enumFactory.Coops.Uneal ? true : false;\r\n $scope.selectedVariety = {};\r\n $scope.selectedConnection = {\r\n Connection: {}\r\n };\r\n $scope.listConnection = [];\r\n $scope.isSell = false;\r\n $scope.signatureYouSign = {};\r\n $scope.isObjective = false;\r\n $scope.showListChooseContact = false;\r\n $scope.checkValidCondition = false;\r\n $scope.showUrlSellConditionAttachment = false;\r\n $scope.showUrlUtilConditionAttachment = false;\r\n $scope.idContractCommitment = $routeParams.idContractCommitment;\r\n $scope.idContractFuture = $routeParams.idContractFuture;\r\n $scope.enumTypeCommitment = enumFactory.TypeCommitment;\r\n $scope.enumTypeOfferCommitment = enumFactory.TypeOfferCommitment;\r\n $scope.enumTypeTargetPriceMessage = enumFactory.TypeTargetPriceMessage;\r\n $scope.user = currentUserFactory.User;\r\n $scope.mobileNumberToSendSms = $rootScope.selectedClientFromTc ? $rootScope.selectedClientFromTc.MobileNumber : currentUserFactory.Connection ? currentUserFactory.Connection.MobileNumber : $scope.user.MobileNumber;\r\n $scope.withConditions = true;\r\n $scope.isModuleAlertesSmsActive = $rootScope.Modules.ModuleAlertesSms.Active;\r\n $scope.enumRoles = enumFactory.Roles;\r\n $scope.effortBaseTcEnabled = false;\r\n $scope.tcEffortInputIsDelta = parametersFactory.Parameters.TcEffortInputMode.Value == 'DELTA';\r\n $scope.enumTypeEffortTc = enumFactory.TypeEffortTc;\r\n $scope.quantity = $routeParams.quantity;\r\n $scope.targetPrice = $routeParams.targetPrice;\r\n $scope.enumFactory = enumFactory;\r\n $scope.moduleYousignIsActive = $rootScope.ModuleSignatureElectroniqueYouSign.Active;\r\n $scope.showConfirmButton = true;\r\n $scope.enumRoles = enumFactory.Roles;\r\n $scope.bUseDepositVolume = (parametersFactory.Parameters.bActiveDepositVolume.Value === \"1\" && !!parametersFactory.Parameters.IdsOperationForDepositVolume);\r\n\r\n $scope.targetPriceNotification = {\r\n IsMail: true\r\n };\r\n $scope.termsAndConditions = {\r\n isChecked: false\r\n };\r\n $scope.security = {\r\n Code: \"\"\r\n };\r\n $scope.counter = {\r\n start: false,\r\n pause: false\r\n };\r\n\r\n if ($rootScope.User.IdRole === $scope.enumRoles.TC && $rootScope.User.EffortBaseTcEnabled) { //Si on est un TC et qu'il y a des efforts de base possible alors le TC à le droit de saisir un effort\r\n $scope.effortBaseTcEnabled = true;\r\n }\r\n\r\n //Prise en compte des modifications des parametres par l'Admin\r\n parametersService.GetParameters(function (dataParam, statusParam) {\r\n if (statusParam !== undefined && statusParam !== null) {\r\n if (statusParam === 400) {\r\n $scope.loginErrorMessage = dataParam[0].errors[0].Message;\r\n }\r\n } else {\r\n parametersFactory.Parameters = dataParam;\r\n $scope.paramCanChooseTargetPriceMessage = parametersFactory.Parameters.CanChooseTargetPriceMessage.Value === \"1\";\r\n $scope.paramDisplaySurfaceYield = parametersFactory.Parameters.DisplaySurfaceYield.Value === \"1\";\r\n\r\n if (!parametersFactory.Parameters.FileTermCondition.Value)\r\n $scope.showUrlSellConditionAttachment = false;\r\n else {\r\n $scope.urlSellConditionAttachment = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + parametersFactory.Parameters.FileTermCondition.Value;\r\n $scope.showUrlSellConditionAttachment = true;\r\n }\r\n\r\n if (!parametersFactory.Parameters.FileTermeUse.Value)\r\n $scope.showUrlUtilConditionAttachment = false;\r\n else {\r\n $scope.urlUtilConditionAttachment = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + parametersFactory.Parameters.FileTermeUse.Value;\r\n $scope.showUrlUtilConditionAttachment = true;\r\n }\r\n }\r\n });\r\n\r\n if ($rootScope.idOfferSelected) {\r\n // Récupération de l'offre à souscrire\r\n offerService.GetOfferByIdAndIdExpiry($rootScope.idOfferSelected, $rootScope.idExpirySelected, \"\", function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.resumeOffer = data;\r\n $scope.ProductQuantityLeftDepositToSellFunction();\r\n\r\n $scope.signingEnabled = ($scope.moduleYousignIsActive || $rootScope.ModuleElectronicSignature.Active) && $rootScope.activateSignature && $scope.resumeOffer.ContractSigningEnabled;\r\n\r\n if ($scope.targetPrice) {\r\n $scope.resumeOffer.targetPriceCurrent = $scope.targetPrice;\r\n }\r\n if ($scope.quantity) {\r\n $scope.resumeOffer.tonnageCurrent = Number($scope.quantity);\r\n }\r\n ManageStepCompatibleFutures();\r\n }\r\n });\r\n } else\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_IdentifierOfOfferIsMissing.Content;\r\n };\r\n\r\n var GetCompatibleCommitments = function () {\r\n contractsService.GetCompatibleCommitmentsWithFilter($rootScope.idExpirySelected, $scope.paramsCompatibleCommitments.maxContracts, $scope.paramsCompatibleCommitments.pageNo, $scope.paramsCompatibleCommitments.sortKey, $scope.paramsCompatibleCommitments.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.lstCompatibleCommitments = data.ListVm;\r\n $scope.paramsCompatibleCommitments.total = data.Total;\r\n $scope.tableCompatibleCommitmentsDataVisible = colonnesContractTypeCommitmentAndProduct.data.DataVisible.split(',');\r\n $scope.tableCompatibleCommitmentsLibelle = colonnesContractTypeCommitmentAndProduct.data.ColumnName.split(',');\r\n }\r\n });\r\n };\r\n\r\n var GetCompatibleFutures = function () {\r\n\r\n contractsService.GetCompatibleContractFuturesWithFilter($rootScope.idExpirySelected, $scope.paramsCompatibleFutures.maxContracts, $scope.paramsCompatibleFutures.pageNo, $scope.paramsCompatibleFutures.sortKey, $scope.paramsCompatibleFutures.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n if (data.ListVm.length < 1)\r\n $scope.SelectContractFuture(null);\r\n else {\r\n $scope.lstCompatibleFutures = data.ListVm;\r\n $scope.paramsCompatibleFutures.total = data.Total;\r\n $scope.tableCompatibleFuturesDataVisible = colonnesContractFutureCompatibles.data.DataVisible.split(',');\r\n $scope.tableCompatibleFuturesLibelle = colonnesContractFutureCompatibles.data.ColumnName.split(',');\r\n goToStep(\"compatibleFutures\");\r\n }\r\n }\r\n });\r\n };\r\n\r\n var ManageStepCompatibleFutures = function () {\r\n if (!$scope.idContractFuture) {\r\n\r\n GetCompatibleFutures();\r\n } else {\r\n if ($scope.idContractFuture) {\r\n SetContractFutureByIdContractFuture($scope.idContractFuture);\r\n }\r\n else\r\n ManageStepCompatibleCommitments();\r\n }\r\n };\r\n\r\n var ManageStepCompatibleCommitments = function () {\r\n if ($scope.resumeOffer.IdTypeOfferCommitment !== $scope.enumTypeOfferCommitment.ObligerSansEngagement && !$scope.idContractCommitment) {\r\n goToStep(\"compatibleCommitments\");\r\n GetCompatibleCommitments();\r\n } else {\r\n // Récupération de l'engagement du contrat\r\n if ($scope.idContractCommitment) {\r\n SetContractCommitmentByIdContractCommitment($scope.idContractCommitment);\r\n } else {\r\n ManageStepContractualisation();\r\n }\r\n }\r\n };\r\n\r\n var ManageStepContractualisation = function () {\r\n goToStep(\"contractualisation\");\r\n $scope.withConditions = (!$scope.idContractCommitment || ($scope.contractualisationWithCommitment && !$scope.contractualisationWithCommitment.HasContractConditions)) && (!$scope.idContractFuture || ($scope.contractualisationWithFuture && !$scope.contractualisationWithFuture.HasContractConditions));\r\n\r\n //On vérifie si on doit préremplir ou pas le champ tonnage\r\n if ($rootScope.parambPreFillTonnage) {\r\n $scope.resumeOffer.tonnageCurrent = Number(GetTonnageMaxLimit());\r\n }\r\n\r\n // Initialisation du compteur pour le delai de contractualisation\r\n $scope.timeToContracting = new Date();\r\n contractingDelayService.InitialisationContractingDelay($scope.counter);\r\n\r\n // Vérification du type de prix\r\n typeOrdersService.CheckIsValidTypeOrder($rootScope.idTypeOrderSelected, function (res) {\r\n $scope.isSell = res.isSell;\r\n $scope.isObjective = res.isObjective;\r\n $scope.resumeOffer.idTypeOrder = res.idTypeOrder;\r\n $scope.errorMessage = res.errorMessage;\r\n });\r\n\r\n if ($scope.effortBaseTcEnabled) {\r\n $scope.resumeOffer.EffortBaseTc = ($scope.isSell && !$scope.idContractFuture) ? $scope.resumeOffer.BasePriceWithIncidence : ($scope.isSell && $scope.contractualisationWithFuture) ? $scope.resumeOffer.FinalPriceWithCoeffConverted : null;\r\n $scope.resumeOffer.DeltaEffortBaseTc = 0;\r\n $scope.effortBaseTcInitial = angular.copy($scope.resumeOffer.EffortBaseTc);\r\n }\r\n // Récupération des conditions particulères\r\n GetCondParts();\r\n };\r\n\r\n var SetContractCommitmentByIdContractCommitment = function (idContractCommitment) {\r\n var marketPrice = \"\";\r\n var targetPrice = \"\";\r\n\r\n if ($scope.contractualisationWithFuture) {\r\n if ($scope.contractualisationWithFuture.TargetPrice)\r\n targetPrice = $scope.contractualisationWithFuture.TargetPrice;\r\n\r\n if ($scope.contractualisationWithFuture.MarketPrice)\r\n marketPrice = $scope.contractualisationWithFuture.MarketPrice;\r\n }\r\n\r\n contractsService.GetContractCommitmentByIdContract(idContractCommitment, $scope.resumeOffer.IdOffer, $scope.resumeOffer.BasePrice, \"\", marketPrice, targetPrice, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.contractualisationWithCommitment = data;\r\n if ($scope.contractualisationWithCommitment.HasContractConditions && (!$scope.contractualisationWithFuture || ($scope.contractualisationWithFuture && !$scope.contractualisationWithFuture.HasContractConditions))) {\r\n $scope.resumeOffer.TotalConditionsValue = $scope.contractualisationWithCommitment.TotalConditionsValue;\r\n $scope.resumeOffer.FinalPrice = $scope.contractualisationWithCommitment.FinalPrice;\r\n $scope.resumeOffer.FinalPriceWithCoeffConverted = $filter('roundByDecimalAndConverter')($scope.resumeOffer.FinalPrice, $scope.resumeOffer.DecimalCurrencyUnitFinal, $scope.resumeOffer.ConverterCoeffValue);\r\n }\r\n\r\n if ($scope.idContractCommitment) {\r\n ManageStepContractualisation();\r\n }\r\n }\r\n });\r\n };\r\n\r\n var SetContractFutureByIdContractFuture = function (idContractFuture) {\r\n contractsService.GetContractFutureByIdContractFuture(idContractFuture, $scope.resumeOffer.BasePrice, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.contractualisationWithFuture = data;\r\n $scope.resumeOffer.TotalConditionsValue = $scope.contractualisationWithFuture.TotalConditions;\r\n $scope.resumeOffer.FinalPriceWithCoeffConverted = $filter('roundByDecimalAndConverter')($scope.contractualisationWithFuture.FinalPrice, $scope.resumeOffer.DecimalCurrencyUnitFinal, $scope.resumeOffer.ConverterCoeffValue);\r\n $scope.idContractCommitment = $scope.contractualisationWithFuture.IdContractCommitment;\r\n if ($scope.idContractCommitment)\r\n SetContractCommitmentByIdContractCommitment($scope.idContractCommitment);\r\n else\r\n ManageStepContractualisation();\r\n }\r\n });\r\n };\r\n\r\n var GetCondParts = function () {\r\n if ($scope.IsUneal) {\r\n conditionsService.GetBestPath($scope.resumeOffer.IdOffer, function (bestPath) {\r\n conditionsService.GetCondParts($scope.resumeOffer.IdOffer, $scope.resumeOffer.IdTree, $scope.idContractCommitment, $scope.contractualisationWithCommitment, bestPath, $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety, function (res) {\r\n $scope.errorMessage = res.errorMessage;\r\n $scope.conditionParticulars = res.conditionParticulars;\r\n });\r\n });\r\n }\r\n else {\r\n conditionsService.GetCondParts($scope.resumeOffer.IdOffer, $scope.resumeOffer.IdTree, $scope.idContractCommitment, $scope.contractualisationWithCommitment, '', $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety, function (res) {\r\n $scope.errorMessage = res.errorMessage;\r\n $scope.conditionParticulars = res.conditionParticulars;\r\n });\r\n }\r\n };\r\n\r\n var SaveNewContratBase = function (newContractBaseVm) {\r\n contractBaseService.SaveNewContractBase(newContractBaseVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n }\r\n } else {\r\n $scope.idContractBase = data.idContractBase ;\r\n $scope.hashContractBase = data.hashContractBase ;\r\n $scope.counter = {};\r\n $scope.counter.start = false;\r\n goToStep(\"confirmation\");\r\n }\r\n });\r\n };\r\n\r\n var CheckIsValidTonnageCurrent = function (tonnageMaxLimit, tonnageMaxCropProduct) {\r\n var qtyCommitmentToFix = '';\r\n if ($scope.idContractCommitment) {\r\n if ($scope.contractualisationWithFuture)\r\n qtyCommitmentToFix = $scope.contractualisationWithFuture.Quantity;\r\n else\r\n qtyCommitmentToFix = $scope.contractualisationWithCommitment.TonnageToFix;\r\n }\r\n offerService.CheckIsValidTonnageCurrent($scope.resumeOffer.tonnageCurrent, $scope.resumeOffer.TonnageMin, $scope.resumeOffer.TonnageMax, $scope.resumeOffer.QuantityLeft, $scope.resumeOffer.Quotity, qtyCommitmentToFix, $scope.resumeOffer.idTypeOrder, $scope.resumeOffer.IdTypeCover, tonnageMaxLimit, tonnageMaxCropProduct, function (error) {\r\n $scope.errorTonnageMessage = error.substring(1, error.length - 1); // Permet de supprimer les guillemets en début et fin de message\r\n if (tonnageMaxCropProduct) { //demande ducroquet deuxieme check, on laisse passer \r\n $scope.resumeOffer.MaxCropProductTonnage = null;\r\n }\r\n if ($scope.errorTonnageMessage)\r\n return;\r\n\r\n if ($scope.effortBaseTcEnabled) {\r\n\r\n var isGlobalPriceOrSecondComponent = false;\r\n var coeffValue = \"\";\r\n\r\n if ($scope.contractualisationWithFuture != null) // si fixation 2eme composante, on envoie le coeff value\r\n {\r\n coeffValue = $scope.resumeOffer.ConverterCoeffValue;\r\n isGlobalPriceOrSecondComponent = true;\r\n }\r\n else\r\n coeffValue = \"\"; //sinon, on envoie une chaine vide\r\n\r\n var totalEffort = $scope.resumeOffer.EffortBaseTc + $scope.resumeOffer.DeltaEffortBaseTc;\r\n\r\n userService.CheckEffortTc(totalEffort, $scope.effortBaseTcInitial, $scope.enumTypeEffortTc.Base, coeffValue, isGlobalPriceOrSecondComponent, $scope.resumeOffer.DecimalCurrencyUnitForComponents, function (data) {\r\n if (data.ErrorMessage) {\r\n $scope.errorEffortBaseTcMessage = data.ErrorMessage;\r\n return;\r\n }\r\n\r\n $scope.effortBaseTc = data.EffortTc;\r\n $scope.basePriceEffortBaseTc = $scope.resumeOffer.BasePrice + $scope.effortBaseTc;\r\n $scope.basePriceWithIncidenceEffortBaseTc = $scope.resumeOffer.BasePriceWithIncidence + $scope.effortBaseTc;\r\n $scope.basePriceFinalEffortBaseTc = $scope.resumeOffer.BasePriceFinal + $scope.effortBaseTc;\r\n $scope.finalPriceEffortBaseTc = $filter('roundByDecimalAndConverter')(parseFloat($scope.resumeOffer.FinalPrice) + $scope.effortBaseTc, $scope.resumeOffer.DecimalCurrencyUnitForComponents);//On fait un parsefloat car il considère comme une chaine de caractère et au lieu de faire 16+4 et afficher 20 il affiche 164 si on ne fait pas de parsefloat\r\n $scope.finalPriceWithCoeffEffortBaseTcConverted = $filter('roundByDecimalAndConverter')(parseFloat($scope.resumeOffer.FinalPrice) + $scope.effortBaseTc, $scope.resumeOffer.DecimalCurrencyUnitFinal, $scope.resumeOffer.ConverterCoeffValue);//On fait un parsefloat car il considère comme une chaine de caractère et au lieu de faire 16+4 et afficher 20 il affiche 164 si on ne fait pas de parsefloat\r\n\r\n goToStep(\"validation\");\r\n });\r\n }\r\n else {\r\n goToStep(\"validation\");\r\n }\r\n });\r\n };\r\n\r\n $scope.GetDataCompatibleFutures = function (pageNo) {\r\n $scope.paramsCompatibleFutures.pageNo = pageNo;\r\n GetCompatibleFutures();\r\n };\r\n\r\n $scope.GetDataCompatibleCommitments = function (pageNo) {\r\n $scope.paramsCompatibleCommitments.pageNo = pageNo;\r\n GetCompatibleCommitments();\r\n };\r\n\r\n $scope.SelectContractFuture = function (idContractFuture) {\r\n $scope.idContractFuture = idContractFuture;\r\n if ($scope.idContractFuture) {\r\n SetContractFutureByIdContractFuture($scope.idContractFuture);\r\n }\r\n else\r\n ManageStepCompatibleCommitments();\r\n };\r\n\r\n $scope.SelectContractCommitment = function (idContractCommitment) {\r\n $scope.idContractCommitment = idContractCommitment;\r\n if ($scope.idContractCommitment) {\r\n // Récupération de l'engagement du contrat\r\n SetContractCommitmentByIdContractCommitment($scope.idContractCommitment);\r\n // On refraichit juste le finalprice pour le cas où on sélectionne l'engagement et les cond part à afficher ou pas\r\n offerService.GetOfferByIdAndIdExpiry($rootScope.idOfferSelected, $rootScope.idExpirySelected, \"\", function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n GetCondParts();\r\n }\r\n });\r\n }\r\n ManageStepContractualisation();\r\n };\r\n\r\n var GetTonnageMaxLimit = function () {\r\n var tonnageMaxLimit = null;\r\n if ($scope.contractualisationWithCommitment && $scope.contractualisationWithFuture && !$scope.contractualisationWithFuture.IdContractCommitment)\r\n tonnageMaxLimit = Math.min($scope.contractualisationWithCommitment.TonnageToFix, $scope.contractualisationWithFuture.Quantity);\r\n else if ($scope.contractualisationWithFuture)\r\n tonnageMaxLimit = $scope.contractualisationWithFuture.Quantity;\r\n else if ($scope.contractualisationWithCommitment)\r\n tonnageMaxLimit = $scope.contractualisationWithCommitment.TonnageToFix;\r\n\r\n return tonnageMaxLimit;\r\n };\r\n\r\n $scope.Validate = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.errorTonnageMessage = \"\";\r\n $scope.errorPriceMessage = \"\";\r\n $scope.errorEffortBaseTcMessage = \"\";\r\n $rootScope.lastOfferSelected = $scope.resumeOffer.IdOffer;\r\n\r\n // Vérification des conditions particulières\r\n $scope.resumeOffer.LstGroupConditionsSelectedValues = [];\r\n if ($scope.withConditions) {\r\n $scope.errorMessage = conditionsService.CheckAndSetGroupConditions($scope.conditionParticulars, $scope.resumeOffer.LstGroupConditionsSelectedValues);\r\n if ($scope.errorMessage)\r\n return;\r\n }\r\n\r\n\r\n // Vérification de la variété\r\n if ($scope.resumeOffer.LstVarieties.length > 0 && !$scope.resumeOffer.IdVariety && (!$scope.idContractCommitment || ($scope.idContractCommitment && !$scope.contractualisationWithCommitment.HasVariety))) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterAVariety.Content;\r\n return;\r\n }\r\n else if ($scope.resumeOffer.LstVarieties.length > 0)\r\n $scope.selectedVariety = $filter('filter')($scope.resumeOffer.LstVarieties, { IdVariety: $scope.resumeOffer.IdVariety }, true)[0];\r\n\r\n // Vérification du tonnage du contrat\r\n var tonnageMaxLimit = GetTonnageMaxLimit();\r\n\r\n // Vérification du prix objectif\r\n var priceToDisplay = null;\r\n if ($scope.contractualisationWithFuture)\r\n priceToDisplay = $scope.resumeOffer.BasePrice;\r\n else\r\n priceToDisplay = $scope.resumeOffer.BasePriceWithIncidence;\r\n\r\n $scope.errorPriceMessage = targetPriceService.CheckPriceAndDateIsValid($scope.resumeOffer, $scope.idContractCommitment, $scope.contractualisationWithCommitment, priceToDisplay, false);\r\n if ($scope.errorPriceMessage)\r\n return;\r\n\r\n // Vérification du choix de notification du prix objectif\r\n $scope.errorPriceMessage = targetPriceService.CheckTargetPriceNotification($scope.resumeOffer, $scope.targetPriceNotification.IsMail, $scope.paramCanChooseTargetPriceMessage, $scope.user);\r\n if ($scope.errorPriceMessage)\r\n return;\r\n\r\n // Calcul de la somme des conditions particulières séléctionnées\r\n $scope.totalLstGroupConditionsSelectedValues = conditionsService.GetTotalLstGroupConditionsSelectedValues($scope.resumeOffer.LstGroupConditionsSelectedValues);\r\n\r\n // Calcul du prix base final\r\n $scope.resumeOffer.BasePriceFinal = ($scope.resumeOffer.targetPriceCurrent ? $scope.resumeOffer.targetPriceCurrent : priceToDisplay) + $scope.totalLstGroupConditionsSelectedValues;\r\n\r\n // Calcul du preview prix final\r\n if ($scope.isObjective) {\r\n if ($scope.contractualisationWithFuture) {\r\n var refPrice = $scope.contractualisationWithFuture.TargetPrice ? $scope.contractualisationWithFuture.TargetPrice : $scope.contractualisationWithFuture.RefPrice;\r\n var totalCondPart = $scope.totalLstGroupConditionsSelectedValues ? $scope.totalLstGroupConditionsSelectedValues : $scope.resumeOffer.TotalConditionsValue;\r\n var finalPrice = targetPriceService.GetPreviewFinalPrice($scope.resumeOffer.targetPriceCurrent, refPrice, totalCondPart);\r\n $scope.resumeOffer.FinalPriceWithCoeffConverted = $filter('roundByDecimalAndConverter')(finalPrice, $scope.resumeOffer.DecimalCurrencyUnitFinal, $scope.resumeOffer.ConverterCoeffValue);\r\n }\r\n else if ($scope.contractualisationWithCommitment) {\r\n $scope.resumeOffer.FinalPrice = targetPriceService.GetPreviewFinalPrice($scope.resumeOffer.targetPriceCurrent, null, $scope.resumeOffer.TotalConditionsValue);\r\n }\r\n }\r\n\r\n // Vérification de la date de forçage\r\n if ($rootScope.paramIsTcAuthorizedToForcedDate && $rootScope.User.IdRole === $scope.enumRoles.TC && $scope.isSell && !$scope.isObjective) {\r\n if (!$scope.resumeOffer.DateSubscriptionForcedString) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterDateForced.Content;\r\n return;\r\n }\r\n if ($scope.resumeOffer.DateSubscriptionForcedString) {\r\n if (!dateService.compareDate1SuperiorDate2(new Date(), dateService.ConvertDateToDateAPI($scope.resumeOffer.DateSubscriptionForcedString))) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterAnteriorDateForced.Content;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n\r\n // Vérification du délai de contractualisation\r\n $scope.errorMessage = contractingDelayService.VerifyContractingDelay($scope.timeToContracting);\r\n if ($scope.errorMessage) {\r\n $scope.isToLate = true;\r\n return;\r\n }\r\n\r\n CheckIsValidTonnageCurrent(tonnageMaxLimit, $scope.resumeOffer.MaxCropProductTonnage);\r\n\r\n };\r\n\r\n $scope.ValidateConnection = function () {\r\n if (!$scope.selectedConnection.Connection.IdConnection) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.ChooseContacte_OfferSubscribe_ListEmpty.Content;\r\n return;\r\n }\r\n $scope.showConfirmButton = false;\r\n $scope.isConfirmed = true;\r\n $scope.errorMessage = \"\";\r\n $scope.mobileNumberToSendSms = $scope.selectedConnection.Connection.MobileNumber;\r\n\r\n // Création de la vm du contrat\r\n var newContractBaseVm = getContractBaseVm();\r\n\r\n if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active)\r\n checkContractAndSendSmsForWithoutThirdParty(newContractBaseVm);\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkContractAndSendSmsForYouSign(newContractBaseVm);\r\n };\r\n\r\n $scope.Confirm = function () {\r\n $scope.isConfirmed = true;\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.counter.pause = true;\r\n\r\n if ($rootScope.idConnectionLogged)\r\n $scope.selectedConnection.Connection.IdConnection = $rootScope.idConnectionLogged;\r\n\r\n // Vérification de l'acceptation des condition générale de vente\r\n if (!$scope.termsAndConditions.isChecked) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseAcceptGeneralConditionsOfSaleBeforeValidation.Content;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = false;\r\n return;\r\n }\r\n\r\n // Vérification du delai de contractualisation\r\n $scope.errorMessage = contractingDelayService.VerifyContractingDelay($scope.timeToContracting);\r\n if ($scope.errorMessage) {\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n\r\n // Création de la vm du contrat\r\n var newContractBaseVm = getContractBaseVm();\r\n\r\n if ($scope.step === \"validation\") {\r\n // Gestion des contacts\r\n if ($scope.signingEnabled && parametersFactory.Parameters.bUseTableConnections.Value === \"1\" && !$scope.selectedConnection.Connection.IdConnection)\r\n getListConnections();\r\n // Envoi signature YOUSIGN\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkContractAndSendSmsForYouSign(newContractBaseVm);\r\n // Envoi signature SANS TIERS DE CONFIANCE\r\n else if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active)\r\n checkContractAndSendSmsForWithoutThirdParty(newContractBaseVm);\r\n else\r\n SaveNewContratBase(newContractBaseVm);\r\n }\r\n else if ($scope.step === \"signatureContract\") {\r\n // Vérification du code pour signature SANS TIERS DE CONFIANCE et sauvegarde du contrat\r\n if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active)\r\n checkSmsCodeAndSaveContractBaseForWithoutThirdParty(newContractBaseVm);\r\n // Vérification du code pour signature YOUSIGN et mise à jour du contrat\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkSmsCodeForYouSign();\r\n }\r\n };\r\n\r\n $scope.ConditionParticularsOnChange = function (condition) {\r\n conditionsService.ConditionParticularsOnChange($scope.resumeOffer.IdOffer, condition, '', $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety);\r\n };\r\n\r\n $scope.AutocompletConditionParticularsOnChange = function (selectedValue, condition) {\r\n condition.selectedValue = selectedValue.originalObject.IdTreeCondition;\r\n $scope.conditionSelected = condition;\r\n conditionsService.ConditionParticularsOnChange($scope.resumeOffer.IdOffer, condition, '', $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety);\r\n };\r\n\r\n $scope.AutocompleteCondPartSearch = function (str, LstOptions) {\r\n var matches = [];\r\n LstOptions.forEach(function (option) {\r\n if ((option.Label.toLowerCase().indexOf(str.toString().toLowerCase()) >= 0)) {\r\n matches.push(option);\r\n }\r\n });\r\n return matches;\r\n };\r\n\r\n $scope.inputChanged = function (str) {\r\n if ($scope.conditionSelected) {\r\n $scope.conditionSelected.LstConditionParticularsChilds = [];\r\n }\r\n };\r\n\r\n $scope.SendSecurityCode = function () {\r\n $scope.security.Code = \"\";\r\n\r\n if ($rootScope.ModuleElectronicSignature.Active && $rootScope.activateSignature) {\r\n var idConnection = $scope.selectedConnection.Connection.IdConnection ? $scope.selectedConnection.Connection.IdConnection : \"\";\r\n signatureService.SendSmsForElectronicSignature($scope.timeToContracting, \"\", idConnection, function (res) {\r\n $scope.isToLate = res.isToLate;\r\n $scope.errorMessage = res.errorMessage;\r\n $scope.successMessage = res.successMessage;\r\n });\r\n }\r\n else if ($scope.moduleYousignIsActive && $rootScope.activateSignature) {\r\n signatureService.ResendCodeYouSign($scope.signatureYouSign.Signature.MemberId, $scope.signatureYouSign.Signature.ProcedureId, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n if (data) {\r\n $scope.newAuthenticationId = data.AuthenticationId;\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_OfferSubscribe_CodeResend.Content;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.Cancel = function () {\r\n $location.path(\"user/offers/view/\" + enumFactory.TypeOffer.Ferme);\r\n };\r\n\r\n $scope.ChangeVariety = function () {\r\n if ($scope.bUseDepositVolume) {\r\n $scope.selectedVariety = $filter('filter')($scope.resumeOffer.LstVarieties, { IdVariety: $scope.resumeOffer.IdVariety }, true)[0];\r\n $scope.TextQtyLeftDepositToSell = $rootScope.editableObjectsFactory.EditableObjects.User_Subscribe_TextQtyLeftDepositToSell.Content.replace(\"[QtyLeftDeposit]\", $scope.selectedVariety.QuantityLeftDepositToSell ? $scope.selectedVariety.QuantityLeftDepositToSell : 0);\r\n }\r\n GetCondParts();\r\n };\r\n\r\n $scope.ProductQuantityLeftDepositToSellFunction = function () {\r\n if ($scope.bUseDepositVolume && $scope.resumeOffer.LstVarieties.length === 0)\r\n {\r\n $scope.TextQtyLeftDepositToSell = $rootScope.editableObjectsFactory.EditableObjects.User_Subscribe_TextQtyLeftDepositToSell.Content.replace(\"[QtyLeftDeposit]\", $scope.resumeOffer.ProductQuantityLeftDepositToSell ? $scope.resumeOffer.ProductQuantityLeftDepositToSell : 0);\r\n }\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n init();\r\n };\r\n\r\n function goToStep(step) {\r\n $scope.step = step;\r\n moveVehicle();\r\n }\r\n\r\n function getContractBaseVm() {\r\n return {\r\n IdTypeOrder: $scope.resumeOffer.idTypeOrder,\r\n IdOffer: $scope.idOfferSelected,\r\n IdCrop: $scope.resumeOffer.IdCrop,\r\n IdProduct: $scope.resumeOffer.IdProduct,\r\n Quantity: $scope.resumeOffer.tonnageCurrent,\r\n BasePrice: $scope.resumeOffer.idTypeOrder === enumFactory.TypeOrders.Vente.IdTypeOrder ? ($scope.contractualisationWithFuture ? $scope.resumeOffer.BasePrice : $scope.resumeOffer.BasePriceWithIncidence) : null, // Uniquement pour les ventes: Prix de la base de l'offre + incidences\r\n OfferBasePrice: $scope.resumeOffer.BasePrice, // Prix de la base de l'offre\r\n TargetBasePrice: !$scope.resumeOffer.targetPriceCurrent ? null : $scope.resumeOffer.targetPriceCurrent, // Uniquement pour les prix objectifs : prix saisi par l'agri lors de la souscription (donc contient les incidences)\r\n IdVariety: $scope.resumeOffer.IdVariety,\r\n LstTreeUserGroupConditionSelectedVms: $scope.resumeOffer.LstGroupConditionsSelectedValues,\r\n DateEndTargetPrice: $scope.resumeOffer.DateEndTargetPriceUser,\r\n IdOfferExpiry: $scope.resumeOffer.IdOfferExpiry,\r\n IdContractCommitment: $scope.idContractCommitment,\r\n IdTypeTargetBasePriceMessage: $scope.targetPriceNotification.IsMail ? $scope.enumTypeTargetPriceMessage.Mail : $scope.enumTypeTargetPriceMessage.Sms,\r\n IdContractFuture: $scope.idContractFuture,\r\n EffortBaseTc: $scope.effortBaseTc,\r\n PaymentDateString: $rootScope.User.IsSuperTc && $rootScope.paramNameCoop === enumFactory.Coops.Ducroquet ? $scope.resumeOffer.PaymentDateString : null,\r\n DateSubscriptionForcedString: $scope.resumeOffer.DateSubscriptionForcedString,\r\n IdConnection: $scope.selectedConnection.Connection.IdConnection\r\n };\r\n }\r\n\r\n function checkContractAndSendSmsForWithoutThirdParty(newContractBaseVm) {\r\n signatureService.CheckContractBaseAndSendSmsForElectronicSignature(newContractBaseVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.counter.pause = false;\r\n $scope.isConfirmed = false;\r\n $scope.security.Code = \"\";\r\n $scope.security.CodeSendingAway = false;\r\n $scope.showListChooseContact = false;\r\n goToStep(\"signatureContract\");\r\n }\r\n });\r\n }\r\n\r\n function checkContractAndSendSmsForYouSign(newContractBaseVm) {\r\n contractBaseService.SaveNewContractBaseAndSendSmsYouSign(newContractBaseVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n $scope.showLoader = false;\r\n }\r\n } else {\r\n $scope.isConfirmed = true;\r\n $scope.idContractBase = data.IdContractBase;\r\n $scope.hashContractBase = data.HashContractBase;\r\n GetPdfContractBase($scope.idContractBase, $scope.hashContractBase);\r\n if (data) {\r\n if (data.CanAvoidSigning) {\r\n $scope.showConfirmButton = true;\r\n $scope.counter = {};\r\n $scope.counter.start = false;\r\n goToStep(\"confirmation\");\r\n }\r\n else {\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n $scope.signatureYouSign = data;\r\n $scope.isConfirmed = false;\r\n goToStep(\"signatureContract\");\r\n }\r\n } else {\r\n $scope.showConfirmButton = true;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getListConnections() {\r\n signatureService.GetListConnection($rootScope.selectedClientFromTcForSubscribe.IdUser, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.listConnection = data;\r\n if ($scope.listConnection.length === 0)\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.ChooseContacte_OfferSubscribe_ListEmpty_NoBinding_Contacte.Content;\r\n else if ($scope.listConnection.length === 1)\r\n {\r\n $scope.selectedConnection.Connection.IdConnection = $scope.listConnection[0].IdConnection;\r\n $scope.ValidateConnection();\r\n return;\r\n }\r\n $scope.isConfirmed = false;\r\n $scope.showListChooseContact = true;\r\n goToStep(\"signatureContract\");\r\n }\r\n });\r\n }\r\n\r\n function checkSmsCodeAndSaveContractBaseForWithoutThirdParty(newContractBaseVm) {\r\n var idContractBase = \"\";\r\n if ($scope.idContractBase)\r\n idContractBase = $scope.idContractBase;\r\n \r\n signatureService.CheckSecurityCodeBase($scope.security.Code, idContractBase, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n newContractBaseVm.IsSignedWithoutThirdParty = true;\r\n SaveNewContratBase(newContractBaseVm);\r\n }\r\n });\r\n }\r\n\r\n function checkSmsCodeForYouSign() {\r\n $scope.isConfirmed = true;\r\n $scope.showConfirmButton = false;\r\n var idConnection = $scope.selectedConnection.Connection.IdConnection ? $scope.selectedConnection.Connection.IdConnection : \"\";\r\n signatureService.SignatureWithCodeYouSign($scope.signatureYouSign.Signature.FilesIds[0], $scope.newAuthenticationId ? $scope.newAuthenticationId : $scope.signatureYouSign.Signature.AuthenticationId, $scope.security.Code, idConnection, $scope.signatureYouSign.Signature.MemberId, $scope.signatureYouSign.Signature.ProcedureId, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n if (data && (data === \"true\" || data === \"1\")) {\r\n $scope.errorMessage = \"\";\r\n goToStep(\"confirmation\");\r\n }\r\n else {\r\n $scope.successMessage = \"\";\r\n $scope.showConfirmButton = true;\r\n $scope.isConfirmed = false;\r\n if (!$scope.security.Code)\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterCodeReceivedBySms.Content;\r\n else\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_CodeEnteredNotCorrespondToCodeSended.Content;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function GetPdfContractBase (idContractBase, hashContractBase) {\r\n if (idContractBase && hashContractBase) {\r\n $scope.contractBaseUrlPdf = $sce.trustAsResourceUrl($filter('pdfLinkContractBase')({k: idContractBase, h: hashContractBase})) ;\r\n }\r\n }\r\n\r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('userSubscribeContractFirmController', ['$scope', '$rootScope', '$location', 'currentUserFactory', 'enumFactory', 'configurationFactory', 'parametersFactory', '$routeParams', 'offerService', 'parametersService', 'contractsService', 'contractBaseService', 'colonnesContractBaseCompatibles', '$filter', 'conditionsService', 'colonnesContractTypeCommitmentAndProduct', 'signatureService', 'contractingDelayService', 'typeOrdersService', 'targetPriceService', 'userService', 'dateService', '$sce',\r\n function ($scope, $rootScope, $location, currentUserFactory, enumFactory, configurationFactory, parametersFactory, $routeParams, offerService, parametersService, contractsService, contractBaseService, colonnesContractBaseCompatibles, $filter, conditionsService, colonnesContractTypeCommitmentAndProduct, signatureService, contractingDelayService, typeOrdersService, targetPriceService, userService, dateService, $sce) {\r\n\r\n var init = function () {\r\n $scope.paramsCompatibleCommitments = { reverse: false, sortKey: \"IdContract\", maxContracts: 10, pageNo: 1 };\r\n $scope.paramsCompatibleBases = { reverse: false, sortKey: \"IdContractBase\", maxContracts: 10, pageNo: 1 };\r\n $scope.selectedVariety = {};\r\n $scope.isSell = false;\r\n $scope.firstSendSmsMessageDelayedSigning = false;\r\n $scope.isObjective = false;\r\n $scope.checkValidCondition = false;\r\n $scope.showUrlSellConditionAttachment = false;\r\n $scope.showUrlUtilConditionAttachment = false;\r\n $scope.idContractCommitment = $routeParams.idContractCommitment;\r\n $scope.idTypeFixation = $routeParams.idTypeFixation;\r\n $scope.enumTypeContract = enumFactory.TypeContract;\r\n $scope.enumTypeCommitment = enumFactory.TypeCommitment;\r\n $scope.enumTypeOfferCommitment = enumFactory.TypeOfferCommitment;\r\n $scope.enumTypeTargetPriceMessage = enumFactory.TypeTargetPriceMessage;\r\n $scope.enumTypeFixations = enumFactory.TypeFixations;\r\n $scope.autoFixationContractBase = false;\r\n $scope.enumRoles = enumFactory.Roles;\r\n $scope.withConditions = true;\r\n $scope.idContractBase = $routeParams.idContractBase;\r\n $scope.isGlobalFixation = Number($scope.idTypeFixation) === $scope.enumTypeFixations.GlobalPrice.IdTypeFixation;\r\n $scope.isFutureFixation = Number($scope.idTypeFixation) === $scope.enumTypeFixations.Future.IdTypeFixation;\r\n $scope.isModuleAlertesSmsActive = $rootScope.Modules.ModuleAlertesSms.Active;\r\n $scope.enumRoles = enumFactory.Roles;\r\n $scope.effortPriceTcEnabled = false;\r\n $scope.tcEffortInputIsDelta = parametersFactory.Parameters.TcEffortInputMode.Value == 'DELTA';\r\n\r\n $scope.enumTypeEffortTc = enumFactory.TypeEffortTc;\r\n $scope.quantity = $routeParams.quantity;\r\n $scope.targetPrice = $routeParams.targetPrice;\r\n $scope.enumFactory = enumFactory;\r\n $scope.selectedConnection = {\r\n Connection: {}\r\n };\r\n $scope.signatureYouSign = {};\r\n $scope.showListChooseContact = false;\r\n $scope.moduleYousignIsActive = $rootScope.ModuleSignatureElectroniqueYouSign.Active;\r\n $scope.IsUneal = $rootScope.paramNameCoop === enumFactory.Coops.Uneal ? true : false;\r\n $scope.listConnection = [];\r\n $scope.showConfirmButton = true;\r\n $scope.delayedSigning = parametersFactory.Parameters.DelayedSigning.Value === \"1\";\r\n $scope.contractValidationDisabled = true;\r\n $scope.parambActivePriceOptimizer = parametersFactory.Parameters.bActivePriceOptimizer.Value === \"1\";\r\n $scope.signingEnabled = ($scope.moduleYousignIsActive || $rootScope.ModuleElectronicSignature.Active) && $rootScope.activateSignature && (!($rootScope.paramDelayedSigning == '1' && $rootScope.User.IdRole === $scope.enumRoles.TC) || ($rootScope.User.IdRole === $scope.enumRoles.TC && $rootScope.isTcSigningForUser));\r\n $scope.showCheckedCondition = !($rootScope.paramDelayedSigning == '1' && $rootScope.User.IdRole == $scope.enumRoles.TC) || ($rootScope.User.IdRole === $scope.enumRoles.TC && $rootScope.isTcSigningForUser);\r\n $scope.showButtonSigningForTc = $rootScope.User.IdRole == $scope.enumRoles.TC && $rootScope.paramDelayedSigning && $rootScope.activateSignature && $rootScope.paramIsTCAuthorizedToSignInModeDelayed && !$rootScope.goToDelayedSigning;\r\n\r\n $scope.user = currentUserFactory.User;\r\n $scope.mobileNumberToSendSms = $rootScope.selectedClientFromTc ? $rootScope.selectedClientFromTc.MobileNumber : currentUserFactory.Connection ? currentUserFactory.Connection.MobileNumber : $scope.user.MobileNumber;\r\n $scope.bUseDepositVolume = (parametersFactory.Parameters.bActiveDepositVolume.Value === \"1\" && !!parametersFactory.Parameters.IdsOperationForDepositVolume);\r\n $scope.paramAuthorizeTargetPriceUnderOfferPrice = parametersFactory.Parameters.bAuthorizeTargetPriceUnderOfferPrice.Value === \"1\";\r\n\r\n $scope.targetPriceNotification = {\r\n IsMail: true\r\n };\r\n $scope.termsAndConditions = {\r\n isChecked: false\r\n };\r\n $scope.security = {\r\n Code: \"\"\r\n };\r\n $scope.counter = {\r\n start: false,\r\n pause: false\r\n };\r\n $scope.coverContract = {\r\n isChecked: true\r\n };\r\n if ($rootScope.User.IdRole === $scope.enumRoles.TC && $rootScope.User.EffortPriceTcEnabled && !$rootScope.isTcSigningForUser) { //Si on est un TC et qu'il y a des efforts de prix possible alors le TC à le droit de saisir un effort\r\n $scope.effortPriceTcEnabled = true;\r\n }\r\n\r\n //Prise en compte des modifications des parametres par l'Admin\r\n parametersService.GetParameters(function (dataParam, statusParam) {\r\n if (statusParam !== undefined && statusParam !== null) {\r\n if (statusParam === 400) {\r\n $scope.loginErrorMessage = dataParam[0].errors[0].Message;\r\n }\r\n } else {\r\n parametersFactory.Parameters = dataParam;\r\n $scope.paramCanChooseTargetPriceMessage = parametersFactory.Parameters.CanChooseTargetPriceMessage.Value === \"1\";\r\n $scope.paramDisplaySurfaceYield = parametersFactory.Parameters.DisplaySurfaceYield.Value === \"1\";\r\n\r\n if (!parametersFactory.Parameters.FileTermCondition.Value)\r\n $scope.showUrlSellConditionAttachment = false;\r\n else {\r\n $scope.urlSellConditionAttachment = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + parametersFactory.Parameters.FileTermCondition.Value;\r\n $scope.showUrlSellConditionAttachment = true;\r\n }\r\n\r\n if (!parametersFactory.Parameters.FileTermeUse.Value)\r\n $scope.showUrlUtilConditionAttachment = false;\r\n else {\r\n $scope.urlUtilConditionAttachment = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + parametersFactory.Parameters.FileTermeUse.Value;\r\n $scope.showUrlUtilConditionAttachment = true;\r\n }\r\n }\r\n });\r\n if ($rootScope.goToDelayedSigning && $rootScope.idContractForDelayedSigning) {\r\n $scope.isGlobalFixation = true;\r\n $rootScope.goToDelayedSigning = false;\r\n $rootScope.isTcSigningForUser = false;\r\n contractsService.GetContractForDelayedSigning($rootScope.idContractForDelayedSigning, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.resumeOffer = data;\r\n $scope.ProductQuantityLeftDepositToSellFunction();\r\n if (data.LabelVariety)\r\n $scope.selectedVariety = {\r\n Label: data.LabelVariety\r\n };\r\n $rootScope.hasSmsCodeSigningAlreadySend = data.HasSmsCodeSigningAlreadySend;\r\n $scope.isSell = data.IdTypeOrder === enumFactory.TypeOrders.Vente.IdTypeOrder;\r\n $scope.isObjective = data.IdTypeOrder === enumFactory.TypeOrders.Prixobjectif.IdTypeOrder;\r\n goToStep(\"validation\");\r\n }\r\n });\r\n } else if ($rootScope.idOfferSelected) {\r\n // Dans le cas ou il ne sagit pas d'un contrat en attente de signature, on passe nos deux params à false et null\r\n $rootScope.idContractForDelayedSigning = null;\r\n $rootScope.goToDelayedSigning = false;\r\n $rootScope.isTcSigningForUser = false;\r\n $rootScope.hasSmsCodeSigningAlreadySend = false;\r\n // Récupération de l'offre à souscrire\r\n offerService.GetOfferByIdAndIdExpiry($rootScope.idOfferSelected, $rootScope.idExpirySelected, $scope.idTypeFixation, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.resumeOffer = data;\r\n $scope.autoFixationContractBase = data.IdTypeFixationBase == enumFactory.TypeFixationBases.Automatic;\r\n $scope.ProductQuantityLeftDepositToSellFunction();\r\n $scope.contractValidationDisabled = data.ContractValidationDisabled;\r\n $scope.signingEnabled = $scope.signingEnabled && $scope.contractValidationDisabled && $scope.resumeOffer.ContractSigningEnabled;\r\n if ($scope.targetPrice) {\r\n if ($scope.isGlobalFixation)\r\n $scope.resumeOffer.targetPriceCurrent = $filter('roundByDecimalAndConverter')($scope.targetPrice, $scope.resumeOffer.DecimalCurrencyUnitFinal, $scope.resumeOffer.ConverterCoeffValue);// arrondir le targetPriceCurrent a la décimal des composantes\r\n else\r\n $scope.resumeOffer.targetPriceCurrent = $scope.targetPrice;\r\n }\r\n if ($scope.quantity) {\r\n $scope.resumeOffer.tonnageCurrent = Number($scope.quantity);\r\n }\r\n $scope.paramObligationFixingContractBaseInFirstComponent = $scope.resumeOffer.IdTypeFixationBase === enumFactory.TypeFixationBases.Obligatoire;\r\n $scope.isSubscribeTargetPriceWithBaseAcquisition = $scope.isGlobalFixation && $rootScope.idTypeOrderSelected == enumFactory.TypeOrders.Prixobjectif.IdTypeOrder && $scope.resumeOffer.TargetPriceWithBaseAcquisition;\r\n ManageStepCompatibleBases();\r\n }\r\n });\r\n } else\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_IdentifierOfOfferIsMissing.Content;\r\n };\r\n\r\n var ManageStepCompatibleBases = function () {\r\n if ($scope.isFutureFixation && !$scope.idContractBase) {\r\n GetCompatibleBases();\r\n } else {\r\n if ($scope.idContractBase) {\r\n SetContractBaseByIdContractBase($scope.idContractBase);\r\n }\r\n ManageStepCompatibleCommitments();\r\n }\r\n };\r\n\r\n var GetCompatibleBases = function () {\r\n if (!$scope.idContractCommitment)\r\n $scope.idContractCommitment = \"\";\r\n\r\n contractBaseService.GetCompatibleContractBasesWithFilter($rootScope.idExpirySelected, $scope.idContractCommitment, $scope.paramsCompatibleBases.maxContracts, $scope.paramsCompatibleBases.pageNo, $scope.paramsCompatibleBases.sortKey, $scope.paramsCompatibleBases.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n if (data.ListVm.length < 1)\r\n $scope.SelectContractBase(null);\r\n else {\r\n goToStep(\"compatibleBases\");\r\n $scope.lstCompatibleBases = data.ListVm;\r\n $scope.paramsCompatibleBases.total = data.Total;\r\n $scope.tableCompatibleBasesDataVisible = colonnesContractBaseCompatibles.data.DataVisible.split(',');\r\n $scope.tableCompatibleBasesLibelle = colonnesContractBaseCompatibles.data.ColumnName.split(',');\r\n }\r\n }\r\n });\r\n };\r\n\r\n var ManageStepCompatibleCommitments = function () {\r\n if ($scope.resumeOffer.IdTypeOfferCommitment != $scope.enumTypeOfferCommitment.ObligerSansEngagement && !$scope.idContractCommitment) {\r\n goToStep(\"compatibleCommitments\");\r\n GetCompatibleCommitments();\r\n } else {\r\n // Récupération de l'engagement du contrat\r\n if ($scope.idContractCommitment) {\r\n SetContractCommitmentByIdContractCommitment($scope.idContractCommitment);\r\n }\r\n ManageStepContractualisation();\r\n }\r\n };\r\n\r\n var GetCompatibleCommitments = function () {\r\n contractsService.GetCompatibleCommitmentsWithFilter($rootScope.idExpirySelected, $scope.paramsCompatibleCommitments.maxContracts, $scope.paramsCompatibleCommitments.pageNo, $scope.paramsCompatibleCommitments.sortKey, $scope.paramsCompatibleCommitments.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.lstCompatibleCommitments = data.ListVm;\r\n $scope.paramsCompatibleCommitments.total = data.Total;\r\n $scope.tableCompatibleCommitmentsDataVisible = colonnesContractTypeCommitmentAndProduct.data.DataVisible.split(',');\r\n $scope.tableCompatibleCommitmentsLibelle = colonnesContractTypeCommitmentAndProduct.data.ColumnName.split(',');\r\n }\r\n });\r\n };\r\n\r\n var ManageStepContractualisation = function () {\r\n goToStep(\"contractualisation\");\r\n $scope.withConditions = (!$scope.idContractCommitment || ($scope.contractualisationWithCommitment && !$scope.contractualisationWithCommitment.HasContractConditions)) && (!$scope.idContractBase || ($scope.contractualisationWithBase && !$scope.contractualisationWithBase.HasContractConditions));\r\n\r\n //On vérifie si on doit préremplir ou pas le champ tonnage\r\n if ($rootScope.parambPreFillTonnage) {\r\n $scope.resumeOffer.tonnageCurrent = Number(GetTonnageMaxLimit());\r\n }\r\n\r\n // Initialisation du compteur pour le delai de contractualisation\r\n $scope.timeToContracting = new Date();\r\n\r\n if (!$rootScope.idContractForDelayedSigning)\r\n contractingDelayService.InitialisationContractingDelay($scope.counter);\r\n\r\n // Vérification du type de prix\r\n typeOrdersService.CheckIsValidTypeOrder($rootScope.idTypeOrderSelected, function (res) {\r\n $scope.isSell = res.isSell;\r\n $scope.isObjective = res.isObjective;\r\n $scope.resumeOffer.idTypeOrder = res.idTypeOrder;\r\n $scope.errorMessage = res.errorMessage;\r\n });\r\n\r\n\r\n if ($scope.isGlobalFixation || $scope.contractualisationWithBase)\r\n if ($scope.resumeOffer.NetPrice)\r\n $scope.sellPriceToDisplay = $scope.resumeOffer.GlobalPrice;\r\n else\r\n $scope.sellPriceToDisplay = $scope.resumeOffer.GlobalPriceWithCoeffConverted;\r\n else\r\n $scope.sellPriceToDisplay = ($scope.resumeOffer.FinalPrice ? $scope.resumeOffer.FinalPrice : $scope.resumeOffer.RefPrice);\r\n\r\n $scope.sellPriceCurrencyToDisplay = ($scope.isGlobalFixation || $scope.contractualisationWithBase) ? $scope.resumeOffer.CurrencyUnitFinal : $scope.resumeOffer.CurrencyUnitForComponents;\r\n\r\n if ($scope.effortPriceTcEnabled) {\r\n $scope.resumeOffer.EffortPriceTc = $scope.sellPriceToDisplay;\r\n $scope.resumeOffer.DeltaEffortPriceTc = 0;\r\n }\r\n\r\n // Récupération des conditions particulères\r\n GetCondParts();\r\n };\r\n\r\n var SetContractCommitmentByIdContractCommitment = function (idContractCommitment) {\r\n var basePrice = \"\";\r\n var targetBasePrice = \"\";\r\n\r\n if ($scope.contractualisationWithBase) {\r\n if ($scope.contractualisationWithBase.TargetBasePrice)\r\n targetBasePrice = $scope.contractualisationWithBase.TargetBasePrice;\r\n else if ($scope.contractualisationWithBase.OfferBasePrice)\r\n basePrice = $scope.contractualisationWithBase.OfferBasePrice;\r\n }\r\n else if ($scope.isGlobalFixation)\r\n basePrice = $scope.resumeOffer.BasePrice;\r\n\r\n contractsService.GetContractCommitmentByIdContract(idContractCommitment, $scope.resumeOffer.IdOffer, basePrice, targetBasePrice, $scope.resumeOffer.MarketPrice, \"\", function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.contractualisationWithCommitment = data;\r\n $scope.resumeOffer.tonnageCurrent = $scope.contractualisationWithCommitment.TonnageToFix;\r\n\r\n if ($scope.contractualisationWithCommitment.HasVariety) {\r\n $scope.resumeOffer.IdVariety = $scope.contractualisationWithCommitment.IdVariety;\r\n }\r\n\r\n if ($scope.contractualisationWithCommitment.HasContractConditions && (!$scope.contractualisationWithBase || ($scope.contractualisationWithBase && !$scope.contractualisationWithBase.HasContractConditions))) {\r\n $scope.resumeOffer.TotalConditionsValue = $scope.contractualisationWithCommitment.TotalConditionsValue;\r\n $scope.resumeOffer.FinalPrice = $scope.contractualisationWithCommitment.FinalPrice;\r\n $scope.resumeOffer.FinalPriceWithCoeffConverted = $filter('roundByDecimalAndConverter')($scope.resumeOffer.FinalPrice, $scope.resumeOffer.DecimalCurrencyUnitFinal, $scope.resumeOffer.ConverterCoeffValue);// conversion pour l'affichage\r\n }\r\n\r\n if ($scope.idContractCommitment) {\r\n ManageStepContractualisation();\r\n }\r\n }\r\n });\r\n };\r\n\r\n var SetContractBaseByIdContractBase = function (idContractBase) {\r\n contractBaseService.GetContractBaseByIdContractBase(idContractBase, $scope.resumeOffer.MarketPrice, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.contractualisationWithBase = data;\r\n $scope.resumeOffer.BasePrice = $scope.contractualisationWithBase.BasePrice;\r\n $scope.resumeOffer.TotalConditionsValue = $scope.contractualisationWithBase.TotalConditionsValue;\r\n $scope.resumeOffer.FinalPrice = $scope.contractualisationWithBase.FinalPrice;\r\n $scope.resumeOffer.RefPrice = $scope.contractualisationWithBase.MarketPrice;\r\n $scope.resumeOffer.FinalPriceWithCoeffConverted = $filter('roundByDecimalAndConverter')($scope.resumeOffer.FinalPrice, $scope.resumeOffer.DecimalCurrencyUnitFinal, $scope.resumeOffer.ConverterCoeffValue);\r\n\r\n $scope.idContractCommitment = $scope.contractualisationWithBase.IdContractCommitment;\r\n if ($scope.idContractCommitment) {\r\n SetContractCommitmentByIdContractCommitment($scope.idContractCommitment);\r\n ManageStepContractualisation();\r\n }\r\n else {\r\n ManageStepCompatibleCommitments();\r\n }\r\n }\r\n });\r\n };\r\n\r\n var GetCondParts = function () {\r\n if (!$scope.resumeOffer.IdVariety)\r\n $scope.resumeOffer.IdVariety = '';\r\n\r\n if ($scope.parambActivePriceOptimizer) {\r\n conditionsService.GetBestPath($scope.resumeOffer.IdOffer, function (bestPath) {\r\n conditionsService.GetCondParts($scope.resumeOffer.IdOffer, $scope.resumeOffer.IdTree, $scope.idContractCommitment, $scope.contractualisationWithCommitment, bestPath, $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety, function (res) {\r\n $scope.errorMessage = res.errorMessage;\r\n $scope.conditionParticulars = res.conditionParticulars;\r\n });\r\n });\r\n }\r\n else {\r\n conditionsService.GetCondParts($scope.resumeOffer.IdOffer, $scope.resumeOffer.IdTree, $scope.idContractCommitment, $scope.contractualisationWithCommitment, '', $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety, function (res) {\r\n $scope.errorMessage = res.errorMessage;\r\n $scope.conditionParticulars = res.conditionParticulars;\r\n });\r\n }\r\n };\r\n\r\n var SaveNewContrat = function (newContractVm) {\r\n contractsService.SaveNewContract(newContractVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n }\r\n } else {\r\n $scope.idContract = data.idContract;\r\n $scope.hashContract = data.hashContract;\r\n $scope.counter = {};\r\n $scope.counter.start = false;\r\n goToStep(\"confirmation\");\r\n }\r\n });\r\n };\r\n\r\n var UpdateContract = function (idContract) {\r\n contractsService.SignContractForDelayedSigning(idContract, $scope.selectedConnection.Connection.IdConnection, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n }\r\n } else {\r\n $scope.isConfirmed = false;\r\n $scope.idContract = data.idContract;\r\n $scope.hashContract = data.hashContract;\r\n $scope.counter = {};\r\n $scope.counter.start = false;\r\n goToStep(\"confirmation\");\r\n }\r\n });\r\n };\r\n\r\n var CheckIsValidTonnageCurrent = function (tonnageMaxLimit, tonnageMaxCropProduct) {\r\n var qtyCommitmentToFix = '';\r\n if ($scope.idContractCommitment) {\r\n if ($scope.contractualisationWithBase)\r\n qtyCommitmentToFix = $scope.contractualisationWithBase.QuantityLeft;\r\n else\r\n qtyCommitmentToFix = $scope.contractualisationWithCommitment.TonnageToFix;\r\n }\r\n offerService.CheckIsValidTonnageCurrent($scope.resumeOffer.tonnageCurrent, $scope.resumeOffer.TonnageMin, $scope.resumeOffer.TonnageMax, $scope.resumeOffer.QuantityLeft, $scope.resumeOffer.Quotity, qtyCommitmentToFix, $scope.resumeOffer.idTypeOrder, $scope.resumeOffer.IdTypeCover, tonnageMaxLimit, tonnageMaxCropProduct, function (error) {\r\n $scope.errorTonnageMessage = error.substring(1, error.length - 1); // Permet de supprimer les guillemets en début et fin de message\r\n if (tonnageMaxCropProduct || tonnageMaxCropProduct === 0) { //demande ducroquet deuxieme check, on laisse passer //On est obligé d'ajouter || tonnageMaxCropProduct === 0 car sinon dans le cas où il reste 0 alors on ne rentre pas dans le if\r\n $scope.resumeOffer.MaxCropProductTonnage = null;\r\n }\r\n if ($scope.errorTonnageMessage){\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n if ($scope.effortPriceTcEnabled) {\r\n\r\n var isGlobalPriceOrSecondComponent = false;\r\n var coeffValue = \"\";\r\n\r\n if ($scope.contractualisationWithBase != null || $scope.resumeOffer.IdTypeFixation == 3) // si fixation 2eme composante ou globalFixation, on envoie le coeff value\r\n {\r\n coeffValue = $scope.resumeOffer.ConverterCoeffValue;\r\n isGlobalPriceOrSecondComponent = true;\r\n }\r\n else\r\n coeffValue = \"\"; //sinon, on envoie une chaine vide\r\n\r\n var totalEffort = $scope.resumeOffer.EffortPriceTc + $scope.resumeOffer.DeltaEffortPriceTc;\r\n\r\n userService.CheckEffortTc(totalEffort, $scope.sellPriceToDisplay, $scope.enumTypeEffortTc.Price, coeffValue, isGlobalPriceOrSecondComponent, $scope.resumeOffer.DecimalCurrencyUnitForComponents, function (data) {\r\n if (data.ErrorMessage) {\r\n $scope.errorEffortPriceTcMessage = data.ErrorMessage;\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n\r\n $scope.effortPriceTc = data.EffortTc;\r\n $scope.marketPriceEffortPriceTc = $scope.resumeOffer.MarketPrice + $scope.effortPriceTc + $scope.totalCondPart;\r\n $scope.refPriceEffortPriceTc = $scope.resumeOffer.RefPrice + $scope.effortPriceTc + $scope.totalCondPart;\r\n $scope.finalPriceEffortPriceTc = parseFloat($scope.resumeOffer.FinalPrice) + $scope.effortPriceTc + $scope.totalCondPart;//On fait un parsefloat car il considère comme une chaine de caractère et au lieu de faire 16+4 et afficher 20 il affiche 164 si on ne fait pas de parsefloat\r\n $scope.finalPriceEffortPriceTcWithCoeffConverted = $filter('roundByDecimalAndConverter')($scope.finalPriceEffortPriceTc, $scope.resumeOffer.DecimalCurrencyUnitFinal, $scope.resumeOffer.ConverterCoeffValue);\r\n\r\n $scope.isConfirmed = false;\r\n goToStep(\"validation\");\r\n });\r\n }\r\n else {\r\n $scope.isConfirmed = false;\r\n goToStep(\"validation\");\r\n }\r\n\r\n });\r\n };\r\n\r\n $scope.GetDataCompatibleBases = function (pageNo) {\r\n $scope.paramsCompatibleBases.pageNo = pageNo;\r\n GetCompatibleBases();\r\n };\r\n\r\n $scope.GetDataCompatibleCommitments = function (pageNo) {\r\n $scope.paramsCompatibleCommitments.pageNo = pageNo;\r\n GetCompatibleCommitments();\r\n };\r\n\r\n $scope.SelectContractBase = function (idContractBase) {\r\n $scope.idContractBase = idContractBase;\r\n if ($scope.idContractBase) {\r\n SetContractBaseByIdContractBase($scope.idContractBase);\r\n }\r\n else {\r\n ManageStepCompatibleCommitments();\r\n }\r\n };\r\n\r\n $scope.SelectContractCommitment = function (idContractCommitment) {\r\n\r\n $scope.idContractCommitment = idContractCommitment;\r\n if ($scope.idContractCommitment) {\r\n SetContractCommitmentByIdContractCommitment($scope.idContractCommitment);\r\n }\r\n ManageStepContractualisation();\r\n };\r\n\r\n var GetTonnageMaxLimit = function () {\r\n var tonnageMaxLimit = null;\r\n if ($scope.contractualisationWithCommitment && $scope.contractualisationWithBase && !$scope.contractualisationWithBase.IdContractCommitment)\r\n tonnageMaxLimit = Math.min($scope.contractualisationWithCommitment.TonnageToFix, $scope.contractualisationWithBase.QuantityLeft);\r\n else if ($scope.contractualisationWithBase)\r\n tonnageMaxLimit = $scope.contractualisationWithBase.QuantityLeft;\r\n else if ($scope.contractualisationWithCommitment)\r\n tonnageMaxLimit = $scope.contractualisationWithCommitment.TonnageToFix;\r\n\r\n return tonnageMaxLimit;\r\n };\r\n\r\n $scope.Validate = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.errorTonnageMessage = \"\";\r\n $scope.errorPriceMessage = \"\";\r\n $scope.errorEffortPriceTcMessage = \"\";\r\n $rootScope.lastOfferSelected = $scope.resumeOffer.IdOffer;\r\n $scope.isConfirmed = true;\r\n\r\n // Vérification des conditions particulières\r\n $scope.resumeOffer.LstGroupConditionsSelectedValues = [];\r\n if ($scope.withConditions) {\r\n $scope.errorMessage = conditionsService.CheckAndSetGroupConditions($scope.conditionParticulars, $scope.resumeOffer.LstGroupConditionsSelectedValues);\r\n if ($scope.errorMessage){\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n }\r\n\r\n // Vérification de la variété\r\n if ($scope.resumeOffer.LstVarieties.length > 0 && !$scope.resumeOffer.IdVariety && (!$scope.idContractCommitment || ($scope.idContractCommitment && !$scope.contractualisationWithCommitment.HasVariety))) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterAVariety.Content;\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n else if ($scope.resumeOffer.LstVarieties.length > 0)\r\n $scope.selectedVariety = $filter('filter')($scope.resumeOffer.LstVarieties, { IdVariety: $scope.resumeOffer.IdVariety }, true)[0];\r\n\r\n // Vérification du tonnage du contrat\r\n var tonnageMaxLimit = GetTonnageMaxLimit();\r\n\r\n // Vérification du prix objectif\r\n var targetPriceToCompare = null;\r\n if ($scope.isGlobalFixation && !$scope.isSubscribeTargetPriceWithBaseAcquisition) {\r\n targetPriceToCompare = $scope.resumeOffer.GlobalPriceWithCoeffConverted;\r\n $scope.resumeOffer.targetPriceCurrent = $filter('roundByDecimalAndConverter')($scope.resumeOffer.targetPriceCurrent, $scope.resumeOffer.DecimalCurrencyUnitFinal);// arrondir le targetPriceCurrent à la décimal final \r\n }\r\n else {\r\n targetPriceToCompare = $scope.resumeOffer.RefPrice;\r\n $scope.resumeOffer.targetPriceCurrent = $filter('roundByDecimalAndConverter')($scope.resumeOffer.targetPriceCurrent, $scope.resumeOffer.DecimalCurrencyUnitForComponents);// arrondir le targetPriceCurrent a la décimal des composantes\r\n }\r\n\r\n $scope.errorPriceMessage = targetPriceService.CheckPriceAndDateIsValid($scope.resumeOffer, $scope.idContractCommitment, $scope.contractualisationWithCommitment, targetPriceToCompare, $scope.paramAuthorizeTargetPriceUnderOfferPrice);\r\n if ($scope.errorPriceMessage)\r\n {\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n\r\n\r\n // Vérification du choix de notification du prix objectif\r\n $scope.errorPriceMessage = targetPriceService.CheckTargetPriceNotification($scope.resumeOffer, $scope.targetPriceNotification.IsMail, $scope.paramCanChooseTargetPriceMessage, $scope.user);\r\n if ($scope.errorPriceMessage){\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n\r\n // Calcul de la somme des conditions particulières séléctionnées\r\n $scope.totalLstGroupConditionsSelectedValues = conditionsService.GetTotalLstGroupConditionsSelectedValues($scope.resumeOffer.LstGroupConditionsSelectedValues);\r\n\r\n // Calcul du prix final\r\n $scope.totalCondPart = !!$scope.totalLstGroupConditionsSelectedValues && !$scope.contractualisationWithBase ? $scope.totalLstGroupConditionsSelectedValues : ($scope.resumeOffer.TotalConditionsValue ? $scope.resumeOffer.TotalConditionsValue : 0);\r\n var refPrice = \"\";\r\n if ($scope.isSell)\r\n refPrice = $scope.resumeOffer.RefPrice;\r\n else {\r\n refPrice = $scope.resumeOffer.targetPriceCurrent;\r\n }\r\n var basePrice = \"\";\r\n\r\n if ($scope.isGlobalFixation || $scope.contractualisationWithBase) {\r\n basePrice = $scope.contractualisationWithBase ? ($scope.contractualisationWithBase.TargetBasePrice ? $scope.contractualisationWithBase.TargetBasePrice : $scope.resumeOffer.BasePrice) : (($scope.isSell || $scope.isSubscribeTargetPriceWithBaseAcquisition) ? $scope.resumeOffer.BasePrice : \"\");\r\n var finalPrice = targetPriceService.GetPreviewFinalPrice(basePrice, refPrice, $scope.totalCondPart);\r\n if ($scope.resumeOffer.NetPrice)\r\n $scope.resumeOffer.FinalPriceWithCoeffConverted = $filter('roundByDecimalAndConverter')(($scope.resumeOffer.GlobalPrice + $scope.totalCondPart) ,$scope.resumeOffer.DecimalCurrencyUnitForComponents, $scope.resumeOffer.ConverterCoeffValue);// arrondir le targetPriceCurrent a la décimal des composantes\r\n else\r\n $scope.resumeOffer.FinalPriceWithCoeffConverted = $filter('roundByDecimalAndConverter')(finalPrice, $scope.resumeOffer.DecimalCurrencyUnitForComponents, $scope.resumeOffer.ConverterCoeffValue);// arrondir le targetPriceCurrent a la décimal des composantes\r\n }\r\n else if($scope.autoFixationContractBase)\r\n $scope.resumeOffer.FinalPrice = targetPriceService.GetPreviewFinalPrice($scope.resumeOffer.BasePriceWithIncidence, refPrice, $scope.totalCondPart);\r\n else\r\n $scope.resumeOffer.FinalPrice = targetPriceService.GetPreviewFinalPrice(\"\", refPrice, $scope.totalCondPart);\r\n\r\n\r\n // Vérification de la date de forçage\r\n if ($rootScope.paramIsTcAuthorizedToForcedDate && $rootScope.User.IdRole === $scope.enumRoles.TC && $scope.isSell && ($scope.isGlobalFixation || $scope.isFutureFixation)) {\r\n if (!$scope.resumeOffer.DateSubscriptionForcedString) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterDateForced.Content;\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n if ($scope.resumeOffer.DateSubscriptionForcedString) {\r\n if (!dateService.compareDate1SuperiorDate2(new Date(), dateService.ConvertDateToDateAPI($scope.resumeOffer.DateSubscriptionForcedString))) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterAnteriorDateForced.Content;\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // Vérification du délai de contractualisation\r\n if (!$rootScope.idContractForDelayedSigning) {\r\n $scope.errorMessage = contractingDelayService.VerifyContractingDelay($scope.timeToContracting);\r\n if ($scope.errorMessage) {\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n }\r\n\r\n CheckIsValidTonnageCurrent(tonnageMaxLimit, $scope.resumeOffer.MaxCropProductTonnage);\r\n\r\n };\r\n\r\n $scope.ValidateConnection = function () {\r\n if (!$scope.selectedConnection.Connection.IdConnection) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.ChooseContacte_OfferSubscribe_ListEmpty.Content;\r\n return;\r\n }\r\n $scope.showConfirmButton = false;\r\n $scope.isConfirmed = true;\r\n $scope.errorMessage = \"\";\r\n $scope.mobileNumberToSendSms = $scope.selectedConnection.Connection.MobileNumber;\r\n\r\n if ($rootScope.idContractForDelayedSigning){\r\n $scope.SendSecurityCode();\r\n $scope.firstSendSmsMessageDelayedSigning = false;\r\n $scope.counter.pause = false;\r\n $scope.isConfirmed = false;\r\n $scope.security.Code = \"\";\r\n $scope.security.CodeSendingAway = false;\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n }\r\n else {\r\n // Création de la vm du contrat\r\n var newContractVm = getContractVm();\r\n\r\n if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active)\r\n checkContractAndSendSmsForWithoutThirdParty(newContractVm);\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkContractAndSendSmsForYouSign(newContractVm);\r\n }\r\n };\r\n\r\n $scope.Confirm = function () {\r\n $scope.isConfirmed = true;\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.counter.pause = true;\r\n\r\n if ($rootScope.idConnectionLogged)\r\n $scope.selectedConnection.Connection.IdConnection = $rootScope.idConnectionLogged;\r\n\r\n // Vérification de l'acceptation des condition générale de vente\r\n if (!$scope.termsAndConditions.isChecked && $scope.showCheckedCondition) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseAcceptGeneralConditionsOfSaleBeforeValidation.Content;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = false;\r\n return;\r\n }\r\n // Vérification du delai de contractualisation\r\n if (!$rootScope.idContractForDelayedSigning) {\r\n $scope.errorMessage = contractingDelayService.VerifyContractingDelay($scope.timeToContracting);\r\n if ($scope.errorMessage) {\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n }\r\n\r\n if ($rootScope.idContractForDelayedSigning) {\r\n if (!$rootScope.hasSmsCodeSigningAlreadySend) \r\n {\r\n // Gestion des contacts\r\n if ($scope.signingEnabled && parametersFactory.Parameters.bUseTableConnections.Value === \"1\" && !$scope.selectedConnection.Connection.IdConnection)\r\n getListConnections();\r\n else\r\n $scope.SendSecurityCode();\r\n $scope.firstSendSmsMessageDelayedSigning = false;\r\n }\r\n else\r\n $scope.firstSendSmsMessageDelayedSigning = true;\r\n\r\n $scope.isConfirmed = false;\r\n goToStep(\"signatureContract\");\r\n } else {\r\n // Création de la vm du contrat\r\n var newContractVm = getContractVm();\r\n\r\n if (!$scope.contractValidationDisabled)\r\n return SaveNewContrat(newContractVm);\r\n\r\n if ($scope.step === \"validation\") {\r\n // Gestion des contacts\r\n if ($scope.signingEnabled && parametersFactory.Parameters.bUseTableConnections.Value === \"1\" && !$scope.selectedConnection.Connection.IdConnection)\r\n getListConnections();\r\n // Envoi signature YOUSIGN\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkContractAndSendSmsForYouSign(newContractVm);\r\n // Envoi signature SANS TIERS DE CONFIANCE\r\n else if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active && $scope.showCheckedCondition)\r\n checkContractAndSendSmsForWithoutThirdParty(newContractVm);\r\n else\r\n SaveNewContrat(newContractVm);\r\n }\r\n else if ($scope.step === \"signatureContract\") {\r\n // Vérification du code pour signature SANS TIERS DE CONFIANCE et sauvegarde du contrat\r\n if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active)\r\n checkSmsCodeAndSaveContractForWithoutThirdParty(newContractVm);\r\n // Vérification du code pour signature YOUSIGN et mise à jour du contrat\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkSmsCodeForYouSign();\r\n }\r\n }\r\n };\r\n\r\n $scope.UpdateContractDelayedSigning = function () {\r\n $scope.isConfirmed = true;\r\n $scope.successMessage = \"\";\r\n signatureService.CheckSecurityCodeFirmOrCommitment($scope.security.Code, $rootScope.idContractForDelayedSigning, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.errorMessage = \"\";\r\n UpdateContract($rootScope.idContractForDelayedSigning);\r\n }\r\n });\r\n };\r\n\r\n $scope.ConditionParticularsOnChange = function (condition) {\r\n conditionsService.ConditionParticularsOnChange($scope.resumeOffer.IdOffer, condition, '', $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety);\r\n };\r\n\r\n $scope.AutocompletConditionParticularsOnChange = function (selectedValue, condition) {\r\n condition.selectedValue = selectedValue.originalObject.IdTreeCondition;\r\n $scope.conditionSelected = condition;\r\n conditionsService.ConditionParticularsOnChange($scope.resumeOffer.IdOffer, condition, '', $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety);\r\n };\r\n\r\n $scope.AutocompleteCondPartSearch = function (str, LstOptions) {\r\n var matches = [];\r\n LstOptions.forEach(function (option) {\r\n if ((option.Label.toLowerCase().indexOf(str.toString().toLowerCase()) >= 0)) {\r\n matches.push(option);\r\n }\r\n });\r\n return matches;\r\n };\r\n\r\n $scope.inputChanged = function (str) {\r\n if ($scope.conditionSelected) {\r\n $scope.conditionSelected.LstConditionParticularsChilds = [];\r\n }\r\n };\r\n\r\n $scope.SetTonnageCurrent = function () {\r\n $scope.resumeOffer.tonnageCurrent = $scope.resumeOffer.surface * $scope.resumeOffer.rendement;\r\n };\r\n\r\n $scope.SendSecurityCode = function () {\r\n $scope.security.Code = \"\";\r\n\r\n if ($rootScope.ModuleElectronicSignature.Active && $rootScope.activateSignature) {\r\n var idConnection = $scope.selectedConnection.Connection.IdConnection ? $scope.selectedConnection.Connection.IdConnection : \"\";\r\n signatureService.SendSmsForElectronicSignature($scope.timeToContracting, $rootScope.idContractForDelayedSigning, idConnection, function (res) {\r\n $scope.isToLate = res.isToLate;\r\n $scope.errorMessage = res.errorMessage;\r\n if (!$scope.firstSendSmsMessageDelayedSigning)\r\n $scope.successMessage = res.successMessage;\r\n else\r\n $scope.successMessage = \"\";\r\n $scope.firstSendSmsMessageDelayedSigning = false;\r\n });\r\n }\r\n else if ($scope.moduleYousignIsActive && $rootScope.activateSignature) {\r\n signatureService.ResendCodeYouSign($scope.signatureYouSign.Signature.MemberId, $scope.signatureYouSign.Signature.ProcedureId, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n if (data) {\r\n $scope.newAuthenticationId = data.AuthenticationId;\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_OfferSubscribe_CodeResend.Content;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.Cancel = function () {\r\n $location.path(\"user/offers/view/\" + enumFactory.TypeOffer.Ferme);\r\n };\r\n\r\n $scope.ChangeVariety = function () {\r\n if ($scope.bUseDepositVolume) {\r\n $scope.selectedVariety = $filter('filter')($scope.resumeOffer.LstVarieties, { IdVariety: $scope.resumeOffer.IdVariety }, true)[0];\r\n $scope.TextQtyLeftDepositToSell = $rootScope.editableObjectsFactory.EditableObjects.User_Subscribe_TextQtyLeftDepositToSell.Content.replace(\"[QtyLeftDeposit]\", $scope.selectedVariety.QuantityLeftDepositToSell ? $scope.selectedVariety.QuantityLeftDepositToSell : (0));\r\n }\r\n GetCondParts();\r\n };\r\n $scope.ProductQuantityLeftDepositToSellFunction = function () {\r\n if ($scope.bUseDepositVolume && $scope.resumeOffer.LstVarieties.length === 0)\r\n {\r\n $scope.TextQtyLeftDepositToSell = $rootScope.editableObjectsFactory.EditableObjects.User_Subscribe_TextQtyLeftDepositToSell.Content.replace(\"[QtyLeftDeposit]\", $scope.resumeOffer.ProductQuantityLeftDepositToSell ? $scope.resumeOffer.ProductQuantityLeftDepositToSell : 0);\r\n }\r\n };\r\n\r\n $scope.GoToSubscribeDelayedSigning = function () {\r\n $rootScope.goToDelayedSigning = true;\r\n $rootScope.idContractForDelayedSigning = $scope.idContract;\r\n $rootScope.isTcSigningForUser = true;\r\n $location.path(\"/user/subscribe/contractFirm/\");\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n init();\r\n };\r\n\r\n function goToStep(step) {\r\n $scope.step = step;\r\n moveVehicle();\r\n }\r\n\r\n function getContractVm() {\r\n return {\r\n IdContractState: 1,\r\n IdTypeContract: enumFactory.TypeOffer.Ferme,\r\n IdTypeCommitment: $rootScope.idTypeCommitmentSelected,\r\n IdTypeOrder: $scope.resumeOffer.idTypeOrder,\r\n IdTypeCover: $scope.resumeOffer.IdTypeCover,\r\n IdOffer: $scope.idOfferSelected,\r\n IdCrop: $scope.resumeOffer.IdCrop,\r\n IdProduct: $scope.resumeOffer.IdProduct,\r\n Quantity: $scope.resumeOffer.tonnageCurrent,\r\n Price: $scope.isGlobalFixation && $scope.resumeOffer.idTypeOrder === enumFactory.TypeOrders.Vente.IdTypeOrder ? $scope.resumeOffer.GlobalPrice : null,\r\n OfferPrice: $scope.resumeOffer.GlobalPrice,\r\n TargetPrice: $scope.resumeOffer.targetPriceCurrent ? $scope.resumeOffer.targetPriceCurrent : null,\r\n IdVariety: $scope.resumeOffer.IdVariety,\r\n Base: $scope.isGlobalFixation ? $scope.resumeOffer.BasePrice : null,\r\n LstTreeUserGroupConditionSelectedVms: $scope.resumeOffer.LstGroupConditionsSelectedValues,\r\n DateEndTargetPrice: $scope.resumeOffer.DateEndTargetPriceUser,\r\n IdOfferExpiry: $scope.resumeOffer.IdOfferExpiry,\r\n IdContractCommitment: $scope.idContractCommitment,\r\n Surface: $scope.resumeOffer.surface,\r\n SurfaceYield: $scope.resumeOffer.rendement,\r\n IdTypeTargetPriceMessage: $scope.targetPriceNotification.IsMail ? $scope.enumTypeTargetPriceMessage.Mail : $scope.enumTypeTargetPriceMessage.Sms,\r\n IdTypeFixation: $scope.idTypeFixation,\r\n IdContractBase: $scope.idContractBase,\r\n MarketPrice: $scope.resumeOffer.MarketPrice,\r\n CoefficientChange: $scope.resumeOffer.ConverterCoeffValue, // Envoi du coefficient permettant de convertir le prix à la Devise/Unité des composantes.\r\n DecimalCurrencyUnitForComponents: $scope.resumeOffer.DecimalCurrencyUnitForComponents, // Envoi de la décimal pour arrondir le prix à la décimal des composantes.\r\n EffortPriceTc: $scope.effortPriceTcEnabled ? $scope.effortPriceTc : null,\r\n DisableContractCoverByTc: $scope.resumeOffer.ShowCheckBoxCoverContract ? !$scope.coverContract.isChecked : null,\r\n PaymentDateString: $rootScope.User.IsSuperTc && $rootScope.paramNameCoop === enumFactory.Coops.Ducroquet ? $scope.resumeOffer.PaymentDateString : null,\r\n FreeText: $scope.resumeOffer.FreeText,\r\n DateSubscriptionForcedString: $scope.resumeOffer.DateSubscriptionForcedString,\r\n IdConnection: $scope.selectedConnection.Connection.IdConnection\r\n };\r\n }\r\n\r\n function checkContractAndSendSmsForWithoutThirdParty(newContractVm) {\r\n signatureService.CheckAndSendSmsForElectronicSignature(newContractVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.counter.pause = false;\r\n $scope.isConfirmed = false;\r\n $scope.security.Code = \"\";\r\n $scope.security.CodeSendingAway = false;\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n goToStep(\"signatureContract\");\r\n }\r\n });\r\n }\r\n\r\n function checkContractAndSendSmsForYouSign(newContractVm) {\r\n contractsService.SaveNewContractAndSendSmsYouSign(newContractVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n }\r\n } else {\r\n $scope.isConfirmed = true;\r\n $scope.hashContract = data.HashContract;\r\n $scope.idContract = data.IdContract;\r\n GetPdfContract($scope.idContract, $scope.hashContract);\r\n if (data) {\r\n if (data.CanAvoidSigning) {\r\n $scope.showConfirmButton = true;\r\n $scope.counter = {};\r\n $scope.counter.start = false;\r\n goToStep(\"confirmation\");\r\n }\r\n else {\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n $scope.signatureYouSign = data;\r\n $scope.isConfirmed = false;\r\n goToStep(\"signatureContract\");\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getListConnections() {\r\n signatureService.GetListConnection($rootScope.selectedClientFromTcForSubscribe.IdUser, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.listConnection = data;\r\n if ($scope.listConnection.length === 0)\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.ChooseContacte_OfferSubscribe_ListEmpty_NoBinding_Contacte.Content;\r\n else if ($scope.listConnection.length === 1)\r\n {\r\n $scope.selectedConnection.Connection.IdConnection = $scope.listConnection[0].IdConnection;\r\n $scope.ValidateConnection();\r\n return;\r\n }\r\n $scope.isConfirmed = false;\r\n $scope.showListChooseContact = true;\r\n goToStep(\"signatureContract\");\r\n }\r\n });\r\n }\r\n\r\n function checkSmsCodeAndSaveContractForWithoutThirdParty(newContractVm) {\r\n var idContract = \"\";\r\n if ($scope.idContract)\r\n idContract = $scope.idContract;\r\n\r\n signatureService.CheckSecurityCodeFirmOrCommitment($scope.security.Code, idContract, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n newContractVm.IsSignedWithoutThirdParty = true;\r\n SaveNewContrat(newContractVm);\r\n }\r\n });\r\n }\r\n\r\n function checkSmsCodeForYouSign() {\r\n $scope.isConfirmed = true;\r\n $scope.showConfirmButton = false;\r\n var idConnection = $scope.selectedConnection.Connection.IdConnection ? $scope.selectedConnection.Connection.IdConnection : \"\";\r\n signatureService.SignatureWithCodeYouSign($scope.signatureYouSign.Signature.FilesIds[0], $scope.newAuthenticationId ? $scope.newAuthenticationId : $scope.signatureYouSign.Signature.AuthenticationId, $scope.security.Code, idConnection, $scope.signatureYouSign.Signature.MemberId, $scope.signatureYouSign.Signature.ProcedureId, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n if (data && (data === \"true\" || data === \"1\")) {\r\n $scope.errorMessage = \"\";\r\n goToStep(\"confirmation\");\r\n }\r\n else {\r\n $scope.successMessage = \"\";\r\n $scope.showConfirmButton = true;\r\n $scope.isConfirmed = false;\r\n if (!$scope.security.Code)\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterCodeReceivedBySms.Content;\r\n else\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_CodeEnteredNotCorrespondToCodeSended.Content;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function GetPdfContract (idContract, hashContract) {\r\n if (idContract && hashContract) {\r\n $scope.contractUrlPdf = $sce.trustAsResourceUrl($filter('pdfLinkContract')({k: idContract, h: hashContract})) ;\r\n }\r\n }\r\n\r\n init();\r\n }]);","AgrimarketControllers.controller('userSubscribeContractCommitmentController', ['$scope', '$rootScope', '$location', 'currentUserFactory', 'enumFactory', 'configurationFactory', 'parametersFactory', 'offerService', 'parametersService', 'contractsService', '$filter', 'signatureService', 'typeOrdersService', 'conditionsService', '$sce',\r\n function ($scope, $rootScope, $location, currentUserFactory, enumFactory, configurationFactory, parametersFactory, offerService, parametersService, contractsService, $filter, signatureService, typeOrdersService, conditionsService, $sce) {\r\n\r\n var init = function () {\r\n $scope.selectedVariety = {};\r\n $scope.checkValidCondition = false;\r\n $scope.showUrlSellConditionAttachment = false;\r\n $scope.showUrlUtilConditionAttachment = false;\r\n $scope.enumTypeCommitment = enumFactory.TypeCommitment;\r\n $scope.enumTypeOfferCommitment = enumFactory.TypeOfferCommitment;\r\n $scope.withConditions = true;\r\n $scope.enumFactory = enumFactory;\r\n $scope.selectedConnection = {\r\n Connection: {}\r\n };\r\n $scope.signatureYouSign = {};\r\n $scope.showListChooseContact = false;\r\n $scope.moduleYousignIsActive = $rootScope.ModuleSignatureElectroniqueYouSign.Active;\r\n $scope.listConnection = [];\r\n $scope.showConfirmButton = true;\r\n $scope.user = currentUserFactory.User;\r\n $scope.mobileNumberToSendSms = $rootScope.selectedClientFromTc ? $rootScope.selectedClientFromTc.MobileNumber : currentUserFactory.Connection ? currentUserFactory.Connection.MobileNumber : $scope.user.MobileNumber;\r\n $scope.bActiveSignatureOffer = parametersFactory.Parameters.bActivateSignatureOffer.Value === \"1\";\r\n\r\n $scope.termsAndConditions = {\r\n isChecked: false\r\n };\r\n $scope.security = {\r\n Code: \"\"\r\n };\r\n $scope.counter = {\r\n start: false,\r\n pause: false\r\n };\r\n\r\n //Prise en compte des modifications des parametres par l'Admin\r\n parametersService.GetParameters(function (dataParam, statusParam) {\r\n if (statusParam !== undefined && statusParam !== null) {\r\n if (statusParam === 400) {\r\n $scope.loginErrorMessage = dataParam[0].errors[0].Message;\r\n }\r\n } else {\r\n parametersFactory.Parameters = dataParam;\r\n\r\n $scope.paramDisplaySurfaceYield = parametersFactory.Parameters.DisplaySurfaceYield.Value === \"1\";\r\n\r\n if (!parametersFactory.Parameters.FileTermCondition.Value)\r\n $scope.showUrlSellConditionAttachment = false;\r\n else {\r\n $scope.urlSellConditionAttachment = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + parametersFactory.Parameters.FileTermCondition.Value;\r\n $scope.showUrlSellConditionAttachment = true;\r\n }\r\n\r\n if (!parametersFactory.Parameters.FileTermeUse.Value)\r\n $scope.showUrlUtilConditionAttachment = false;\r\n else {\r\n $scope.urlUtilConditionAttachment = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + parametersFactory.Parameters.FileTermeUse.Value;\r\n $scope.showUrlUtilConditionAttachment = true;\r\n }\r\n }\r\n });\r\n\r\n if ($rootScope.idOfferSelected) {\r\n // Récupération de l'offre à souscrire\r\n offerService.GetOfferByIdAndIdExpiry($rootScope.idOfferSelected, $rootScope.idExpirySelected, \"\", function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.resumeOffer = data;\r\n\r\n $scope.signingEnabled = ($scope.moduleYousignIsActive || $rootScope.ModuleElectronicSignature.Active) && $rootScope.activateSignature && $scope.resumeOffer.ContractSigningEnabled;\r\n\r\n // Récupération des conditions particulères\r\n GetCondParts();\r\n\r\n if (!$scope.step)\r\n goToStep(\"contractualisation\");\r\n\r\n }\r\n });\r\n } else\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_IdentifierOfOfferIsMissing.Content;\r\n };\r\n\r\n var GetCondParts = function () {\r\n conditionsService.GetCondParts($scope.resumeOffer.IdOffer, $scope.resumeOffer.IdTree, null, false, null, null, $scope.resumeOffer.IdVariety, function (res) {\r\n $scope.errorMessage = res.errorMessage;\r\n $scope.conditionParticulars = res.conditionParticulars;\r\n $scope.withConditions = res.conditionParticulars.length > 0;\r\n });\r\n };\r\n\r\n $scope.ChangeVariety = function () {\r\n GetCondParts(); \r\n };\r\n\r\n var SaveNewContrat = function (newContractVm) {\r\n contractsService.SaveNewContract(newContractVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n }\r\n } else {\r\n $scope.idContractCommitment = data.idContract;\r\n $scope.hashContract = data.hashContract; \r\n $scope.counter = {};\r\n $scope.counter.start = false;\r\n goToStep(\"confirmation\");\r\n }\r\n });\r\n };\r\n\r\n $scope.Validate = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.errorTonnageMessage = \"\";\r\n $scope.errorPriceMessage = \"\";\r\n $rootScope.lastOfferSelected = $scope.resumeOffer.IdOffer;\r\n $scope.isConfirmed = true;\r\n\r\n // Vérification des conditions particulières\r\n $scope.resumeOffer.LstGroupConditionsSelectedValues = [];\r\n if ($scope.withConditions) {\r\n $scope.errorMessage = conditionsService.CheckAndSetGroupConditions($scope.conditionParticulars, $scope.resumeOffer.LstGroupConditionsSelectedValues);\r\n if ($scope.errorMessage){\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n }\r\n\r\n // Vérification de la variété\r\n if ($scope.resumeOffer.LstVarieties.length > 0 && !$scope.resumeOffer.IdVariety) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterAVariety.Content;\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n else if ($scope.resumeOffer.LstVarieties.length > 0)\r\n $scope.selectedVariety = $filter('filter')($scope.resumeOffer.LstVarieties, { IdVariety: $scope.resumeOffer.IdVariety }, true)[0];\r\n\r\n // Vérification du tonnage du contrat\r\n offerService.CheckIsValidTonnageCurrent($scope.resumeOffer.tonnageCurrent, $scope.resumeOffer.TonnageMin, $scope.resumeOffer.TonnageMax, $scope.resumeOffer.QuantityLeft, $scope.resumeOffer.Quotity, $scope.idContractCommitment ? $scope.contractualisationWithCommitment.TonnageToFix : '', $scope.resumeOffer.idTypeOrder, $scope.resumeOffer.IdTypeCover, '', '', function (error) {\r\n $scope.errorTonnageMessage = error.substring(1, error.length - 1); // Permet de supprimer les guillemets en début et fin de message\r\n if ($scope.errorTonnageMessage){\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n \r\n $scope.isConfirmed = false;\r\n goToStep(\"validation\");\r\n });\r\n };\r\n\r\n $scope.ValidateConnection = function () {\r\n if (!$scope.selectedConnection.Connection.IdConnection) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.ChooseContacte_OfferSubscribe_ListEmpty.Content;\r\n return;\r\n }\r\n $scope.showConfirmButton = false;\r\n $scope.isConfirmed = true;\r\n $scope.errorMessage = \"\";\r\n $scope.mobileNumberToSendSms = $scope.selectedConnection.Connection.MobileNumber;\r\n\r\n // Création de la vm du contrat\r\n var newContractVm = getContractVm();\r\n\r\n if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active)\r\n checkContractAndSendSmsForWithoutThirdParty(newContractVm);\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkContractAndSendSmsForYouSign(newContractVm);\r\n };\r\n\r\n $scope.Confirm = function () {\r\n $scope.isConfirmed = true;\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.counter.pause = true;\r\n\r\n if ($rootScope.idConnectionLogged)\r\n $scope.selectedConnection.Connection.IdConnection = $rootScope.idConnectionLogged;\r\n\r\n // Vérification de l'acceptation des condition générale de vente\r\n if (!$scope.termsAndConditions.isChecked) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseAcceptGeneralConditionsOfSaleBeforeValidation.Content;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = false;\r\n return;\r\n }\r\n\r\n // Création de la vm du contrat\r\n var newContractVm = getContractVm();\r\n\r\n if ($scope.step === \"validation\") {\r\n // Gestion des contacts\r\n if ($scope.signingEnabled && parametersFactory.Parameters.bUseTableConnections.Value === \"1\" && !$scope.selectedConnection.Connection.IdConnection)\r\n getListConnections();\r\n // Envoi signature YOUSIGN\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkContractAndSendSmsForYouSign(newContractVm);\r\n // Envoi signature SANS TIERS DE CONFIANCE\r\n else if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active)\r\n checkContractAndSendSmsForWithoutThirdParty(newContractVm);\r\n else\r\n SaveNewContrat(newContractVm);\r\n }\r\n else if ($scope.step === \"signatureContract\") {\r\n // Vérification du code pour signature SANS TIERS DE CONFIANCE et sauvegarde du contrat\r\n if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active)\r\n checkSmsCodeAndSaveContractForWithoutThirdParty(newContractVm);\r\n // Vérification du code pour signature YOUSIGN et mise à jour du contrat\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkSmsCodeForYouSign();\r\n }\r\n };\r\n\r\n $scope.ConditionParticularsOnChange = function (condition) {\r\n conditionsService.ConditionParticularsOnChange($scope.resumeOffer.IdOffer, condition, null, null, $scope.resumeOffer.IdVariety);\r\n };\r\n\r\n $scope.AutocompletConditionParticularsOnChange = function (selectedValue, condition) {\r\n condition.selectedValue = selectedValue.originalObject.IdTreeCondition;\r\n $scope.conditionSelected = condition;\r\n conditionsService.ConditionParticularsOnChange($scope.resumeOffer.IdOffer, condition, null, null, $scope.resumeOffer.IdVariety);\r\n };\r\n\r\n $scope.AutocompleteCondPartSearch = function (str, LstOptions) {\r\n var matches = [];\r\n LstOptions.forEach(function (option) {\r\n if ((option.Label.toLowerCase().indexOf(str.toString().toLowerCase()) >= 0)) {\r\n matches.push(option);\r\n }\r\n });\r\n return matches;\r\n };\r\n\r\n $scope.inputChanged = function (str) {\r\n if ($scope.conditionSelected) {\r\n $scope.conditionSelected.LstConditionParticularsChilds = [];\r\n }\r\n };\r\n\r\n $scope.SetTonnageCurrent = function () {\r\n offerService.MultiplicatationForGoodDecimal( $scope.resumeOffer.surface, $scope.resumeOffer.rendement, function (res) {\r\n $scope.resumeOffer.tonnageCurrent = res;\r\n });\r\n };\r\n\r\n $scope.SendSecurityCode = function () {\r\n $scope.security.Code = \"\";\r\n\r\n if ($rootScope.ModuleElectronicSignature.Active && $rootScope.activateSignature) {\r\n var idConnection = $scope.selectedConnection.Connection.IdConnection ? $scope.selectedConnection.Connection.IdConnection : \"\";\r\n signatureService.SendSmsForElectronicSignature($scope.timeToContracting, \"\", idConnection, function (res) {\r\n $scope.isToLate = res.isToLate;\r\n $scope.errorMessage = res.errorMessage;\r\n $scope.successMessage = res.successMessage;\r\n });\r\n }\r\n else if ($scope.moduleYousignIsActive && $rootScope.activateSignature) {\r\n signatureService.ResendCodeYouSign($scope.signatureYouSign.Signature.MemberId, $scope.signatureYouSign.Signature.ProcedureId, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n if (data) {\r\n $scope.newAuthenticationId = data.AuthenticationId;\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_OfferSubscribe_CodeResend.Content;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.Cancel = function () {\r\n $location.path(\"user/offers/view/\" + enumFactory.TypeOffer.Engagement);\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n init();\r\n };\r\n\r\n function goToStep(step) {\r\n $scope.step = step;\r\n moveVehicle();\r\n }\r\n\r\n function getContractVm() {\r\n return {\r\n IdContractState: 1,\r\n IdTypeContract: enumFactory.TypeOffer.Engagement,\r\n IdTypeCommitment: $rootScope.idTypeCommitmentSelected,\r\n IdTypeOrder: enumFactory.TypeOrders.Engagement.IdTypeOrder,\r\n IdTypeCover: $scope.resumeOffer.IdTypeCover,\r\n IdOffer: $scope.idOfferSelected,\r\n IdCrop: $scope.resumeOffer.IdCrop,\r\n IdProduct: $scope.resumeOffer.IdProduct,\r\n Quantity: $scope.resumeOffer.tonnageCurrent,\r\n IdVariety: $scope.resumeOffer.IdVariety,\r\n Surface: $scope.resumeOffer.surface,\r\n SurfaceYield: $scope.resumeOffer.rendement,\r\n LstTreeUserGroupConditionSelectedVms: $scope.resumeOffer.LstGroupConditionsSelectedValues,\r\n PaymentDateString: $rootScope.User.IsSuperTc && $rootScope.paramNameCoop === enumFactory.Coops.Ducroquet ? $scope.resumeOffer.PaymentDateString : null,\r\n IdConnection: $scope.selectedConnection.Connection.IdConnection\r\n };\r\n }\r\n\r\n function checkContractAndSendSmsForWithoutThirdParty(newContractVm) {\r\n signatureService.CheckAndSendSmsForElectronicSignature(newContractVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.counter.pause = false;\r\n $scope.isConfirmed = false;\r\n $scope.security.Code = \"\";\r\n $scope.security.CodeSendingAway = false;\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n goToStep(\"signatureContract\");\r\n }\r\n });\r\n }\r\n\r\n function checkContractAndSendSmsForYouSign(newContractVm) {\r\n contractsService.SaveNewContractAndSendSmsYouSign(newContractVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n }\r\n } else {\r\n $scope.isConfirmed = true;\r\n $scope.idContractCommitment = data.IdContract;\r\n $scope.hashContract = data.HashContract;\r\n GetPdfContractCommitment($scope.idContractCommitment, $scope.hashContract);\r\n if (data) {\r\n if (data.CanAvoidSigning) {\r\n $scope.showConfirmButton = true;\r\n $scope.counter = {};\r\n $scope.counter.start = false;\r\n goToStep(\"confirmation\");\r\n }\r\n else {\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n $scope.signatureYouSign = data;\r\n $scope.isConfirmed = false;\r\n goToStep(\"signatureContract\");\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getListConnections() {\r\n signatureService.GetListConnection($rootScope.selectedClientFromTcForSubscribe.IdUser, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.listConnection = data;\r\n if ($scope.listConnection.length === 0)\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.ChooseContacte_OfferSubscribe_ListEmpty_NoBinding_Contacte.Content;\r\n else if ($scope.listConnection.length === 1)\r\n {\r\n $scope.selectedConnection.Connection.IdConnection = $scope.listConnection[0].IdConnection;\r\n $scope.ValidateConnection();\r\n return;\r\n }\r\n $scope.isConfirmed = false;\r\n $scope.showListChooseContact = true;\r\n goToStep(\"signatureContract\");\r\n }\r\n });\r\n }\r\n\r\n function checkSmsCodeAndSaveContractForWithoutThirdParty(newContractVm) {\r\n var idContract = \"\";\r\n if ($scope.idContractCommitment)\r\n idContract = $scope.idContractCommitment;\r\n\r\n signatureService.CheckSecurityCodeFirmOrCommitment($scope.security.Code, idContract, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n newContractVm.IsSignedWithoutThirdParty = true;\r\n SaveNewContrat(newContractVm);\r\n }\r\n });\r\n }\r\n\r\n function checkSmsCodeForYouSign() {\r\n $scope.isConfirmed = true;\r\n $scope.showConfirmButton = false;\r\n var idConnection = $scope.selectedConnection.Connection.IdConnection ? $scope.selectedConnection.Connection.IdConnection : \"\";\r\n signatureService.SignatureWithCodeYouSign($scope.signatureYouSign.Signature.FilesIds[0], $scope.newAuthenticationId ? $scope.newAuthenticationId : $scope.signatureYouSign.Signature.AuthenticationId, $scope.security.Code, idConnection, $scope.signatureYouSign.Signature.MemberId, $scope.signatureYouSign.Signature.ProcedureId, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n if (data && (data === \"true\" || data === \"1\")) {\r\n $scope.errorMessage = \"\";\r\n goToStep(\"confirmation\");\r\n }\r\n else {\r\n $scope.successMessage = \"\";\r\n $scope.showConfirmButton = true;\r\n $scope.isConfirmed = false;\r\n if (!$scope.security.Code)\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterCodeReceivedBySms.Content;\r\n else\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_CodeEnteredNotCorrespondToCodeSended.Content;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function GetPdfContractCommitment (idContract, hashContract) {\r\n if (idContract && hashContract) {\r\n $scope.contractCommitmentUrlPdf = $sce.trustAsResourceUrl($filter('pdfLinkContract')({k: idContract, h: hashContract})) ;\r\n }\r\n }\r\n\r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('userSubscribeContractSurfaceCommitmentController', ['$scope', '$rootScope', '$location', 'currentUserFactory', 'enumFactory', 'configurationFactory', 'parametersFactory', 'offerService', 'parametersService', 'contractsService', '$filter', 'signatureService', 'conditionsService', '$sce',\r\n function ($scope, $rootScope, $location, currentUserFactory, enumFactory, configurationFactory, parametersFactory, offerService, parametersService, contractsService, $filter, signatureService, conditionsService, $sce) {\r\n\r\n var init = function () {\r\n $scope.selectedVariety = {};\r\n $scope.checkValidCondition = false;\r\n $scope.showUrlSellConditionAttachment = false;\r\n $scope.showUrlUtilConditionAttachment = false;\r\n $scope.withConditions = true;\r\n $scope.enumFactory = enumFactory;\r\n $scope.typeOffer = enumFactory.TypeOffer.EngagementSurface;\r\n $scope.selectedConnection = {\r\n Connection: {}\r\n };\r\n $scope.signatureYouSign = {};\r\n $scope.showListChooseContact = false;\r\n $scope.moduleYousignIsActive = $rootScope.ModuleSignatureElectroniqueYouSign.Active;\r\n $scope.listConnection = [];\r\n $scope.showConfirmButton = true;\r\n $scope.user = currentUserFactory.User;\r\n $scope.mobileNumberToSendSms = $rootScope.selectedClientFromTc ? $rootScope.selectedClientFromTc.MobileNumber : currentUserFactory.Connection ? currentUserFactory.Connection.MobileNumber : $scope.user.MobileNumber;\r\n\r\n $scope.termsAndConditions = {\r\n isChecked: false\r\n };\r\n $scope.security = {\r\n Code: \"\"\r\n };\r\n $scope.counter = {\r\n start: false,\r\n pause: false\r\n };\r\n\r\n //Prise en compte des modifications des parametres par l'Admin\r\n parametersService.GetParameters(function (dataParam, statusParam) {\r\n if (statusParam !== undefined && statusParam !== null) {\r\n if (statusParam === 400) {\r\n $scope.loginErrorMessage = dataParam[0].errors[0].Message;\r\n }\r\n } else {\r\n parametersFactory.Parameters = dataParam;\r\n\r\n if (!parametersFactory.Parameters.FileTermCondition.Value)\r\n $scope.showUrlSellConditionAttachment = false;\r\n else {\r\n $scope.urlSellConditionAttachment = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + parametersFactory.Parameters.FileTermCondition.Value;\r\n $scope.showUrlSellConditionAttachment = true;\r\n }\r\n\r\n if (!parametersFactory.Parameters.FileTermeUse.Value)\r\n $scope.showUrlUtilConditionAttachment = false;\r\n else {\r\n $scope.urlUtilConditionAttachment = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + parametersFactory.Parameters.FileTermeUse.Value;\r\n $scope.showUrlUtilConditionAttachment = true;\r\n }\r\n }\r\n });\r\n\r\n if ($rootScope.idOfferSelected) {\r\n // Récupération de l'offre à souscrire\r\n offerService.GetOfferByIdAndIdExpiry($rootScope.idOfferSelected, $rootScope.idExpirySelected, \"\", function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.resumeOffer = data;\r\n $scope.SurfaceMin = data.TonnageMin;\r\n $scope.SurfaceMax = data.TonnageMax;\r\n $scope.signingEnabled = ($scope.moduleYousignIsActive || $rootScope.ModuleElectronicSignature.Active) && $rootScope.activateSignature && $scope.resumeOffer.ContractSigningEnabled;\r\n\r\n // Récupération des conditions particulères\r\n GetCondParts();\r\n\r\n if (!$scope.step)\r\n goToStep(\"contractualisation\");\r\n\r\n }\r\n });\r\n } else\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_IdentifierOfOfferIsMissing.Content;\r\n };\r\n\r\n var GetCondParts = function () {\r\n conditionsService.GetCondParts($scope.resumeOffer.IdOffer, $scope.resumeOffer.IdTree, null, false, null, null, $scope.resumeOffer.IdVariety, function (res) {\r\n $scope.errorMessage = res.errorMessage;\r\n $scope.conditionParticulars = res.conditionParticulars;\r\n $scope.withConditions = res.conditionParticulars.length > 0;\r\n });\r\n };\r\n\r\n $scope.ChangeVariety = function () {\r\n GetCondParts(); \r\n };\r\n\r\n var SaveNewContrat = function (newContractVm) {\r\n contractsService.SaveNewContract(newContractVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n }\r\n } else {\r\n $scope.idContractSurfaceCommitment= data.idContract;\r\n $scope.hashContract = data.hashContract; \r\n $scope.counter = {};\r\n $scope.counter.start = false;\r\n goToStep(\"confirmation\");\r\n }\r\n });\r\n };\r\n\r\n $scope.Validate = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.errorSurfaceMessage = \"\";\r\n $scope.errorPriceMessage = \"\";\r\n $rootScope.lastOfferSelected = $scope.resumeOffer.IdOffer;\r\n\r\n // Vérification des conditions particulières\r\n $scope.resumeOffer.LstGroupConditionsSelectedValues = [];\r\n if ($scope.withConditions) {\r\n $scope.errorMessage = conditionsService.CheckAndSetGroupConditions($scope.conditionParticulars, $scope.resumeOffer.LstGroupConditionsSelectedValues);\r\n if ($scope.errorMessage)\r\n return;\r\n }\r\n\r\n // Vérification de la variété\r\n if ($scope.resumeOffer.LstVarieties.length > 0 && !$scope.resumeOffer.IdVariety) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterAVariety.Content;\r\n return;\r\n }\r\n else if ($scope.resumeOffer.LstVarieties.length > 0)\r\n $scope.selectedVariety = $filter('filter')($scope.resumeOffer.LstVarieties, { IdVariety: $scope.resumeOffer.IdVariety }, true)[0];\r\n\r\n // Vérification des hectares du contrat\r\n offerService.CheckIsValidHectaresCurrent($scope.resumeOffer.SurfaceCurrent, $scope.SurfaceMin, $scope.SurfaceMax, $scope.resumeOffer.QuantityLeft, $scope.resumeOffer.Quotity, function (error) {\r\n $scope.errorSurfaceMessage = error.substring(1, error.length - 1); // Permet de supprimer les guillemets en début et fin de message\r\n if ($scope.errorSurfaceMessage)\r\n return;\r\n\r\n goToStep(\"validation\");\r\n });\r\n };\r\n\r\n $scope.ValidateConnection = function () {\r\n if (!$scope.selectedConnection.Connection.IdConnection) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.ChooseContacte_OfferSubscribe_ListEmpty.Content;\r\n return;\r\n }\r\n $scope.showConfirmButton = false;\r\n $scope.isConfirmed = true;\r\n $scope.errorMessage = \"\";\r\n $scope.mobileNumberToSendSms = $scope.selectedConnection.Connection.MobileNumber;\r\n\r\n // Création de la vm du contrat\r\n var newContractVm = getContractVm();\r\n\r\n if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active)\r\n checkContractAndSendSmsForWithoutThirdParty(newContractVm);\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkContractAndSendSmsForYouSign(newContractVm);\r\n };\r\n\r\n $scope.Confirm = function () {\r\n $scope.isConfirmed = true;\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.counter.pause = true;\r\n\r\n if ($rootScope.idConnectionLogged)\r\n $scope.selectedConnection.Connection.IdConnection = $rootScope.idConnectionLogged;\r\n\r\n // Vérification de l'acceptation des condition générale de vente\r\n if (!$scope.termsAndConditions.isChecked) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseAcceptGeneralConditionsOfSaleBeforeValidation.Content;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = false;\r\n return;\r\n }\r\n\r\n // Création de la vm du contrat\r\n var newContractVm = getContractVm();\r\n\r\n if ($scope.step === \"validation\") {\r\n // Gestion des contacts\r\n if ($scope.signingEnabled && parametersFactory.Parameters.bUseTableConnections.Value === \"1\" && !$scope.selectedConnection.Connection.IdConnection)\r\n getListConnections();\r\n // Envoi signature YOUSIGN\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkContractAndSendSmsForYouSign(newContractVm);\r\n // Envoi signature SANS TIERS DE CONFIANCE\r\n else if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active)\r\n checkContractAndSendSmsForWithoutThirdParty(newContractVm);\r\n else\r\n SaveNewContrat(newContractVm);\r\n }\r\n else if ($scope.step === \"signatureContract\") {\r\n // Vérification du code pour signature SANS TIERS DE CONFIANCE et sauvegarde du contrat\r\n if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active)\r\n checkSmsCodeAndSaveContractForWithoutThirdParty(newContractVm);\r\n // Vérification du code pour signature YOUSIGN et mise à jour du contrat\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkSmsCodeForYouSign();\r\n }\r\n };\r\n\r\n $scope.ConditionParticularsOnChange = function (condition) {\r\n conditionsService.ConditionParticularsOnChange($scope.resumeOffer.IdOffer, condition, null, null, $scope.resumeOffer.IdVariety);\r\n };\r\n\r\n $scope.AutocompletConditionParticularsOnChange = function (selectedValue, condition) {\r\n condition.selectedValue = selectedValue.originalObject.IdTreeCondition;\r\n $scope.conditionSelected = condition;\r\n conditionsService.ConditionParticularsOnChange($scope.resumeOffer.IdOffer, condition, null, null, $scope.resumeOffer.IdVariety);\r\n };\r\n\r\n $scope.AutocompleteCondPartSearch = function (str, LstOptions) {\r\n var matches = [];\r\n LstOptions.forEach(function (option) {\r\n if ((option.Label.toLowerCase().indexOf(str.toString().toLowerCase()) >= 0)) {\r\n matches.push(option);\r\n }\r\n });\r\n return matches;\r\n };\r\n\r\n $scope.inputChanged = function (str) {\r\n if ($scope.conditionSelected) {\r\n $scope.conditionSelected.LstConditionParticularsChilds = [];\r\n }\r\n };\r\n\r\n $scope.SendSecurityCode = function () {\r\n $scope.security.Code = \"\";\r\n\r\n if ($rootScope.ModuleElectronicSignature.Active && $rootScope.activateSignature) {\r\n var idConnection = $scope.selectedConnection.Connection.IdConnection ? $scope.selectedConnection.Connection.IdConnection : \"\";\r\n signatureService.SendSmsForElectronicSignature($scope.timeToContracting, \"\", idConnection, function (res) {\r\n $scope.isToLate = res.isToLate;\r\n $scope.errorMessage = res.errorMessage;\r\n $scope.successMessage = res.successMessage;\r\n });\r\n }\r\n else if ($scope.moduleYousignIsActive && $rootScope.activateSignature) {\r\n signatureService.ResendCodeYouSign($scope.signatureYouSign.Signature.MemberId, $scope.signatureYouSign.Signature.ProcedureId, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n if (data) {\r\n $scope.newAuthenticationId = data.AuthenticationId;\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_OfferSubscribe_CodeResend.Content;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.Cancel = function () {\r\n $location.path(\"user/offers/view/\" + enumFactory.TypeOffer.EngagementSurface);\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n init();\r\n };\r\n\r\n function goToStep(step) {\r\n $scope.step = step;\r\n moveVehicle();\r\n }\r\n\r\n function getContractVm() {\r\n return {\r\n IdContractState: 1,\r\n IdTypeContract: enumFactory.TypeContract.EngagementSurface,\r\n IdTypeOrder: enumFactory.TypeOrders.EngagementSurface.IdTypeOrder,\r\n IdTypeCover: $scope.resumeOffer.IdTypeCover,\r\n IdOffer: $scope.idOfferSelected,\r\n IdCrop: $scope.resumeOffer.IdCrop,\r\n IdProduct: $scope.resumeOffer.IdProduct,\r\n Quantity: $scope.resumeOffer.SurfaceCurrent,\r\n IdVariety: $scope.resumeOffer.IdVariety,\r\n Surface: $scope.resumeOffer.surface,\r\n LstTreeUserGroupConditionSelectedVms: $scope.resumeOffer.LstGroupConditionsSelectedValues,\r\n PaymentDateString: $rootScope.User.IsSuperTc && $rootScope.paramNameCoop === enumFactory.Coops.Ducroquet ? $scope.resumeOffer.PaymentDateString : null,\r\n IdConnection: $scope.selectedConnection.Connection.IdConnection\r\n };\r\n }\r\n\r\n function checkContractAndSendSmsForWithoutThirdParty(newContractVm) {\r\n signatureService.CheckAndSendSmsForElectronicSignature(newContractVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.counter.pause = false;\r\n $scope.isConfirmed = false;\r\n $scope.security.Code = \"\";\r\n $scope.security.CodeSendingAway = false;\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n goToStep(\"signatureContract\");\r\n }\r\n });\r\n }\r\n\r\n function checkContractAndSendSmsForYouSign(newContractVm) {\r\n contractsService.SaveNewContractAndSendSmsYouSign(newContractVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n }\r\n } else {\r\n $scope.isConfirmed = true;\r\n $scope.idContractSurfaceCommitment = data.IdContract;\r\n $scope.hashContract = data.HashContract;\r\n GetPdfContractCommitmentSurface($scope.idContractSurfaceCommitment, $scope.hashContract);\r\n if (data) {\r\n if (data.CanAvoidSigning) {\r\n $scope.showConfirmButton = true;\r\n $scope.counter = {};\r\n $scope.counter.start = false;\r\n goToStep(\"confirmation\");\r\n }\r\n else {\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n $scope.signatureYouSign = data;\r\n $scope.isConfirmed = false;\r\n goToStep(\"signatureContract\");\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getListConnections() {\r\n signatureService.GetListConnection($rootScope.selectedClientFromTcForSubscribe.IdUser, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.listConnection = data;\r\n if ($scope.listConnection.length === 0)\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.ChooseContacte_OfferSubscribe_ListEmpty_NoBinding_Contacte.Content;\r\n else if ($scope.listConnection.length === 1)\r\n {\r\n $scope.selectedConnection.Connection.IdConnection = $scope.listConnection[0].IdConnection;\r\n $scope.ValidateConnection();\r\n return;\r\n }\r\n $scope.isConfirmed = false;\r\n $scope.showListChooseContact = true;\r\n goToStep(\"signatureContract\");\r\n }\r\n });\r\n }\r\n\r\n function checkSmsCodeAndSaveContractForWithoutThirdParty(newContractVm) {\r\n var idContract = \"\";\r\n if ($scope.idContractSurfaceCommitment)\r\n idContract = $scope.idContractSurfaceCommitment;\r\n\r\n signatureService.CheckSecurityCodeFirmOrCommitment($scope.security.Code, idContract, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n newContractVm.IsSignedWithoutThirdParty = true;\r\n SaveNewContrat(newContractVm);\r\n }\r\n });\r\n }\r\n\r\n function checkSmsCodeForYouSign() {\r\n $scope.isConfirmed = true;\r\n $scope.showConfirmButton = false;\r\n var idConnection = $scope.selectedConnection.Connection.IdConnection ? $scope.selectedConnection.Connection.IdConnection : \"\";\r\n signatureService.SignatureWithCodeYouSign($scope.signatureYouSign.Signature.FilesIds[0], $scope.newAuthenticationId ? $scope.newAuthenticationId : $scope.signatureYouSign.Signature.AuthenticationId, $scope.security.Code, idConnection, $scope.signatureYouSign.Signature.MemberId, $scope.signatureYouSign.Signature.ProcedureId, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n if (data && (data === \"true\" || data === \"1\")) {\r\n $scope.errorMessage = \"\";\r\n goToStep(\"confirmation\");\r\n }\r\n else {\r\n $scope.successMessage = \"\";\r\n $scope.showConfirmButton = true;\r\n $scope.isConfirmed = false;\r\n if (!$scope.security.Code)\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterCodeReceivedBySms.Content;\r\n else\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_CodeEnteredNotCorrespondToCodeSended.Content;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function GetPdfContractCommitmentSurface (idContract, hashContract) {\r\n if (idContract && hashContract) {\r\n $scope.contractCommitmentSurfaceUrlPdf = $sce.trustAsResourceUrl($filter('pdfLinkContract')({k: idContract, h: hashContract})) ;\r\n }\r\n }\r\n\r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('userSubscribeContractBlankController', ['$scope', '$rootScope', '$location', 'enumFactory', 'configurationFactory', 'parametersFactory', 'offerService', 'parametersService', 'contractsService', '$filter', 'conditionsService', 'productsService', 'categoryOfferService', 'signatureService', 'currentUserFactory', 'wsdApiService',\r\n function ($scope, $rootScope, $location, enumFactory, configurationFactory, parametersFactory, offerService, parametersService, contractsService, $filter, conditionsService, productsService, categoryOfferService, signatureService, currentUserFactory, wsdApiService) {\r\n\r\n var init = function () {\r\n $scope.checkValidCondition = false;\r\n $scope.showUrlSellConditionAttachment = false;\r\n $scope.showUrlUtilConditionAttachment = false;\r\n $scope.urlpdf = configurationFactory.Url['Api'] + '?idcontract=';\r\n $scope.withConditions = true;\r\n $scope.delayedSigning = parametersFactory.Parameters.DelayedSigning.Value === \"1\";\r\n $scope.firstSendSmsMessageDelayedSigning = false;\r\n $scope.user = currentUserFactory.User;\r\n $scope.enumRoles = enumFactory.Roles;\r\n $scope.showCheckedCondition = !($rootScope.paramDelayedSigning == '1' && $rootScope.User.IdRole == $scope.enumRoles.TC) || ($rootScope.User.IdRole === $scope.enumRoles.TC && $rootScope.isTcSigningForUser); \r\n $scope.mobileNumberToSendSms = $rootScope.selectedClientFromTc ? $rootScope.selectedClientFromTc.MobileNumber : currentUserFactory.Connection ? currentUserFactory.Connection.MobileNumber : $scope.user.MobileNumber;\r\n $scope.showListChooseContact = false;\r\n $scope.showConfirmButton = true;\r\n $scope.orderRoutingEnabled = false;\r\n $scope.selectedConnection = {\r\n Connection: {}\r\n };\r\n $scope.termsAndConditions = {\r\n isChecked: false\r\n };\r\n $scope.security = {\r\n Code: \"\"\r\n };\r\n $scope.counter = {\r\n start: false,\r\n pause: false\r\n };\r\n\r\n //Prise en compte des modifications des parametres par l'Admin\r\n parametersService.GetParameters(function (dataParam, statusParam) {\r\n if (statusParam !== undefined && statusParam !== null) {\r\n if (statusParam === 400) {\r\n $scope.loginErrorMessage = dataParam[0].errors[0].Message;\r\n }\r\n } else {\r\n parametersFactory.Parameters = dataParam;\r\n\r\n if (!parametersFactory.Parameters.FileTermCondition.Value)\r\n $scope.showUrlSellConditionAttachment = false;\r\n else {\r\n $scope.urlSellConditionAttachment = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + parametersFactory.Parameters.FileTermCondition.Value;\r\n $scope.showUrlSellConditionAttachment = true;\r\n }\r\n\r\n if (!parametersFactory.Parameters.FileTermeUse.Value)\r\n $scope.showUrlUtilConditionAttachment = false;\r\n else {\r\n $scope.urlUtilConditionAttachment = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + parametersFactory.Parameters.FileTermeUse.Value;\r\n $scope.showUrlUtilConditionAttachment = true;\r\n }\r\n }\r\n });\r\n\r\n if ($rootScope.goToDelayedSigning && $rootScope.idContractForDelayedSigning) {\r\n $scope.isGlobalFixation = true;\r\n $rootScope.goToDelayedSigning = false;\r\n $scope.delayedSigning = false;\r\n $rootScope.isTcSigningForUser = false;\r\n contractsService.GetContractForDelayedSigning($rootScope.idContractForDelayedSigning, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.resumeOffer = data;\r\n $scope.signingEnabled = $rootScope.ModuleElectronicSignature.Active && $rootScope.activateSignature;\r\n $scope.resumeOffer.blankContractPrice = $scope.resumeOffer.FinalPrice - $scope.resumeOffer.TotalConditionsValue;\r\n $scope.selectedClientFromTcForSubscribe = $scope.resumeOffer.userOfTc;\r\n $rootScope.hasSmsCodeSigningAlreadySend = data.HasSmsCodeSigningAlreadySend;\r\n $scope.isSell = data.IdTypeOrder === enumFactory.TypeOrders.Vente.IdTypeOrder;\r\n $scope.isObjective = data.IdTypeOrder === enumFactory.TypeOrders.Prixobjectif.IdTypeOrder;\r\n goToStep(\"validation\");\r\n }\r\n });\r\n } else if ($rootScope.idOfferSelected) {\r\n $rootScope.isTcSigningForUser = false;\r\n $rootScope.idContractForDelayedSigning = null;\r\n $rootScope.goToDelayedSigning = false;\r\n $rootScope.hasSmsCodeSigningAlreadySend = false;\r\n // Récupération de l'offre à souscrire\r\n offerService.GetOfferByIdAndIdExpiry($rootScope.idOfferSelected, $rootScope.idExpirySelected, \"\", function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.resumeOffer = data;\r\n if(!$scope.showCheckedCondition){\r\n $scope.showCheckedCondition = !$scope.resumeOffer.ContractSigningEnabled;\r\n }\r\n $scope.signingEnabled = $rootScope.ModuleElectronicSignature.Active && $rootScope.activateSignature && $scope.resumeOffer.ContractSigningEnabled && ($scope.resumeOffer.ContractValidationDisabled && !$scope.delayedSigning) ;\r\n $scope.orderRoutingEnabled = parametersFactory.Parameters.bActivateOrderRoutingForBlankContract.Value === \"1\" && $scope.resumeOffer.IdTypeCover !== enumFactory.TypeCover.Manuel;\r\n \r\n if($scope.orderRoutingEnabled)\r\n GetMarkets();\r\n\r\n GetCondParts();\r\n\r\n if (!$scope.step)\r\n goToStep(\"contractualisation\");\r\n }\r\n });\r\n }\r\n else\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_IdentifierOfOfferIsMissing.Content;\r\n\r\n productsService.GetAllProducts(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else\r\n $scope.products = data;\r\n });\r\n\r\n categoryOfferService.GetAllCategoryOffers(function (data, status) {\r\n if (status !== null) {\r\n if (status == 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.categoryOffers = data;\r\n if (data.length > 0) {\r\n $scope.categoryOffers.push({ IdCategoryOffer: -1, Label: $rootScope.editableObjectsFactory.EditableObjects.None_female.Content });\r\n }\r\n }\r\n });\r\n };\r\n\r\n var GetCondParts = function () {\r\n var idProduct = $scope.resumeOffer.IdProduct;\r\n if (!idProduct && $scope.products && $scope.products.length > 0)\r\n idProduct = $scope.products[0].IdProduct;\r\n conditionsService.GetCondParts($scope.resumeOffer.IdOffer, $scope.resumeOffer.IdTree, null, false, null, $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety, function (res) {\r\n $scope.errorMessage = res.errorMessage;\r\n $scope.conditionParticulars = res.conditionParticulars;\r\n $scope.withConditions = res.conditionParticulars.length > 0;\r\n });\r\n };\r\n\r\n $scope.ChangeVariety = function () {\r\n GetCondParts(); \r\n };\r\n\r\n var SaveNewContrat = function (newContractVm) {\r\n contractsService.SaveNewContract(newContractVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n }\r\n } else {\r\n $scope.idContractBlank = data.idContract;\r\n $scope.hashContract = data.hashContract;\r\n $scope.counter = {};\r\n $scope.counter.start = false;\r\n goToStep(\"confirmation\");\r\n }\r\n });\r\n };\r\n\r\n $scope.Validate = function () {\r\n $scope.errorMessage = \"\";\r\n\r\n // Vérification des conditions particulières\r\n $scope.resumeOffer.LstGroupConditionsSelectedValues = [];\r\n if ($scope.withConditions) {\r\n $scope.errorMessage = conditionsService.CheckAndSetGroupConditions($scope.conditionParticulars, $scope.resumeOffer.LstGroupConditionsSelectedValues);\r\n if ($scope.errorMessage)\r\n return;\r\n }\r\n\r\n // Vérification du produit\r\n if (!$scope.resumeOffer.IdProduct) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterAProduct.Content;\r\n return;\r\n }\r\n\r\n // Vérification de la variété\r\n if ($scope.productSelected && $scope.productSelected.Varieties && $scope.productSelected.Varieties.length > 0 && !$scope.resumeOffer.IdVariety) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterAVariety.Content;\r\n return;\r\n }\r\n else\r\n $scope.varietySelected = $filter('filter')($scope.productSelected.Varieties, { IdVariety: $scope.resumeOffer.IdVariety }, true)[0];\r\n\r\n // Vérification de la catégorie\r\n if ($scope.categoryOffers.length > 0 && !$scope.resumeOffer.IdCategoryOffer) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterACategoryOffer.Content;\r\n return;\r\n }\r\n\r\n // Vérification du tonnage du contrat\r\n if (!$scope.resumeOffer.tonnageCurrent || isNaN($scope.resumeOffer.tonnageCurrent) || $scope.resumeOffer.tonnageCurrent <= 0) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterAValidQuantity.Content;\r\n return;\r\n }\r\n\r\n // Vérification du prix du contrat\r\n if (!$scope.resumeOffer.blankContractPrice || isNaN($scope.resumeOffer.blankContractPrice) || $scope.resumeOffer.blankContractPrice <= 0) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterAValidPrice.Content;\r\n return;\r\n }\r\n\r\n // Vérification du template\r\n if (!$scope.resumeOffer.IdTemplate && $scope.templates && $scope.templates.length > 0) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseSelectATemplate.Content;\r\n return;\r\n }\r\n else if (!$scope.resumeOffer.IdTemplate && (!$scope.templates || $scope.templates.length === 0)) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_NoTemplateInProductPleaseContactAdmin.Content;\r\n return;\r\n }\r\n\r\n // Vérification de la selection du marché d'indexation\r\n if ( $scope.orderRoutingEnabled && !$scope.resumeOffer.IdMarket) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_RoutinOrderForBlankContract_NoMarketSelected.Content;\r\n return;\r\n }\r\n\r\n // Vérification de la selection de l'échéance\r\n if ( $scope.orderRoutingEnabled && !$scope.resumeOffer.IdWsdExpiry ) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_RoutinOrderForBlankContract_NoExpirySelected.Content;\r\n return;\r\n }\r\n\r\n var finalBlankContractPrice = +$scope.resumeOffer.blankContractPrice + conditionsService.GetTotalLstGroupConditionsSelectedValues($scope.resumeOffer.LstGroupConditionsSelectedValues);\r\n $scope.finalBlankContractPrice = $filter('roundByDecimalAndConverter')(finalBlankContractPrice, $scope.resumeOffer.DecimalCurrencyUnitFinal, $scope.resumeOffer.ConverterCoeffValue);\r\n \r\n goToStep(\"validation\");\r\n };\r\n\r\n $scope.ValidateConnection = function () {\r\n if (!$scope.selectedConnection.Connection.IdConnection) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.ChooseContacte_OfferSubscribe_ListEmpty.Content;\r\n return;\r\n }\r\n $scope.showConfirmButton = false;\r\n $scope.isConfirmed = true;\r\n $scope.errorMessage = \"\";\r\n $scope.mobileNumberToSendSms = $scope.selectedConnection.Connection.MobileNumber;\r\n\r\n if ($rootScope.idContractForDelayedSigning){\r\n $scope.SendSecurityCode();\r\n $scope.firstSendSmsMessageDelayedSigning = false;\r\n $scope.counter.pause = false;\r\n $scope.isConfirmed = false;\r\n $scope.security.Code = \"\";\r\n $scope.security.CodeSendingAway = false;\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n }\r\n else {\r\n // Création de la vm du contrat\r\n var newContractVm = getContractVm();\r\n\r\n checkContractAndSendSmsForWithoutThirdParty(newContractVm);\r\n }\r\n };\r\n\r\n var UpdateContract = function (idContract) {\r\n contractsService.SignContractForDelayedSigning(idContract, $scope.selectedConnection.Connection.IdConnection, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n }\r\n } else {\r\n $scope.idContractBlank = data.idContract;\r\n $scope.hashContract = data.hashContract;\r\n $scope.counter = {};\r\n $scope.counter.start = false;\r\n goToStep(\"confirmation\");\r\n }\r\n });\r\n };\r\n\r\n $scope.Confirm = function () {\r\n $scope.isConfirmed = true;\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.counter.pause = true;\r\n\r\n if ($rootScope.idConnectionLogged)\r\n $scope.selectedConnection.Connection.IdConnection = $rootScope.idConnectionLogged;\r\n\r\n // Vérification de l'acceptation des condition générale de vente\r\n if (!$scope.termsAndConditions.isChecked && $scope.showCheckedCondition) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseAcceptGeneralConditionsOfSaleBeforeValidation.Content;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = false;\r\n return;\r\n }\r\n\r\n if ($rootScope.idContractForDelayedSigning) {\r\n if (!$rootScope.hasSmsCodeSigningAlreadySend) \r\n {\r\n // Gestion des contacts\r\n if ($scope.signingEnabled && parametersFactory.Parameters.bUseTableConnections.Value === \"1\" && !$scope.selectedConnection.Connection.IdConnection)\r\n getListConnections();\r\n else\r\n $scope.SendSecurityCode();\r\n $scope.firstSendSmsMessageDelayedSigning = false;\r\n }\r\n else\r\n $scope.firstSendSmsMessageDelayedSigning = true;\r\n\r\n $scope.isConfirmed = false;\r\n goToStep(\"signatureContract\");\r\n } else {\r\n // Création de la vm du contrat\r\n var newContractVm = getContractVm();\r\n\r\n if ($scope.step === \"validation\") {\r\n // Gestion des contacts\r\n if ($scope.signingEnabled && parametersFactory.Parameters.bUseTableConnections.Value === \"1\" && !$scope.selectedConnection.Connection.IdConnection)\r\n getListConnections();\r\n // Envoi signature SANS TIERS DE CONFIANCE\r\n else if ($scope.signingEnabled && $scope.showCheckedCondition)\r\n checkContractAndSendSmsForWithoutThirdParty(newContractVm);\r\n else\r\n SaveNewContrat(newContractVm);\r\n }\r\n // Vérification du code pour signature SANS TIERS DE CONFIANCE et sauvegarde du contrat\r\n else if ($scope.step === \"signatureContract\")\r\n checkSmsCodeAndSaveContractForWithoutThirdParty(newContractVm);\r\n }\r\n };\r\n\r\n $scope.UpdateContractDelayedSigning = function () {\r\n $scope.isConfirmed = true;\r\n signatureService.CheckSecurityCodeFirmOrCommitment($scope.security.Code, $rootScope.idContractForDelayedSigning, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else\r\n UpdateContract($rootScope.idContractForDelayedSigning);\r\n });\r\n };\r\n\r\n $scope.SendSecurityCode = function () {\r\n $scope.security.Code = \"\";\r\n var idConnection = $scope.selectedConnection.Connection.IdConnection ? $scope.selectedConnection.Connection.IdConnection : \"\";\r\n signatureService.SendSmsForElectronicSignature($scope.timeToContracting, $rootScope.idContractForDelayedSigning, idConnection, function (res) {\r\n $scope.isToLate = res.isToLate;\r\n $scope.errorMessage = res.errorMessage;\r\n if (!$scope.firstSendSmsMessageDelayedSigning)\r\n $scope.successMessage = res.successMessage;\r\n else\r\n $scope.successMessage = \"\";\r\n $scope.firstSendSmsMessageDelayedSigning = false;\r\n });\r\n };\r\n\r\n $scope.ConditionParticularsOnChange = function (condition) {\r\n var idProduct = $scope.resumeOffer.IdProduct;\r\n if (!idProduct && $scope.products && $scope.products.length > 0)\r\n idProduct = $scope.products[0].IdProduct;\r\n conditionsService.ConditionParticularsOnChange($scope.resumeOffer.IdOffer, condition, '', $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety);\r\n };\r\n\r\n $scope.AutocompletConditionParticularsOnChange = function (selectedValue, condition) {\r\n condition.selectedValue = selectedValue.originalObject.IdTreeCondition;\r\n $scope.conditionSelected = condition;\r\n var idProduct = $scope.resumeOffer.IdProduct;\r\n if (!idProduct && $scope.products && $scope.products.length > 0)\r\n idProduct = $scope.products[0].IdProduct;\r\n conditionsService.ConditionParticularsOnChange($scope.resumeOffer.IdOffer, condition, '', $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety);\r\n };\r\n\r\n $scope.AutocompleteCondPartSearch = function (str, LstOptions) {\r\n var matches = [];\r\n LstOptions.forEach(function (option) {\r\n if ((option.Label.toLowerCase().indexOf(str.toString().toLowerCase()) >= 0)) {\r\n matches.push(option);\r\n }\r\n });\r\n return matches;\r\n };\r\n\r\n $scope.inputChanged = function (str) {\r\n if ($scope.conditionSelected) {\r\n $scope.conditionSelected.LstConditionParticularsChilds = [];\r\n }\r\n };\r\n\r\n $scope.Cancel = function () {\r\n $location.path(\"user/offers/view/\" + enumFactory.TypeOffer.ContratVierge);\r\n };\r\n\r\n $scope.SelectProduct = function () {\r\n $scope.productSelected = $filter('filter')($scope.products, { IdProduct: $scope.resumeOffer.IdProduct }, true)[0];\r\n if ($scope.productSelected) {\r\n $scope.resumeOffer.IdProduct = $scope.productSelected.IdProduct;\r\n $scope.templates = $scope.resumeOffer.Templates.filter(function (t) {\r\n return $filter('filter')($scope.productSelected.Templates, { IdTemplate: t.IdTemplate }, true)[0] !== undefined;\r\n });\r\n\r\n if ($scope.templates.length === 0)\r\n $scope.resumeOffer.IdTemplate = null;\r\n else if ($scope.templates.length === 1)\r\n $scope.resumeOffer.IdTemplate = $scope.templates[0].IdTemplate;\r\n\r\n $scope.lstVarieties = [];\r\n $scope.lstVarietiesByProduct = $scope.productSelected.Varieties;\r\n if ($scope.resumeOffer.IdCompagny != null) {\r\n $scope.lstVarietiesByProduct.forEach(function (variety) {\r\n if (variety.Compagnies.length > 0) {\r\n if ($filter('filter')(variety.Compagnies, { IdCompagny: $scope.resumeOffer.IdCompagny })[0] !== undefined)\r\n $scope.lstVarieties.push(variety);\r\n }\r\n });\r\n }\r\n else\r\n $scope.lstVarietiesByProduct.forEach(function (variety) {\r\n if (variety.Compagnies.length > 0)\r\n $scope.lstVarieties.push(variety);\r\n });\r\n }\r\n else {\r\n $scope.resumeOffer.IdProduct = null;\r\n $scope.resumeOffer.IdTemplate = null;\r\n $scope.templates = [];\r\n $scope.lstVarieties = [];\r\n }\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n init();\r\n };\r\n\r\n function goToStep(step) {\r\n $scope.step = step;\r\n moveVehicle();\r\n }\r\n\r\n function getContractVm() {\r\n return {\r\n IdTypeContract: enumFactory.TypeContract.ContratVierge,\r\n IdTypeOrder: enumFactory.TypeOrders.ContratVierge.IdTypeOrder,\r\n Price: $scope.resumeOffer.blankContractPrice,\r\n IdOfferExpiry: $scope.resumeOffer.IdOfferExpiry,\r\n IdOffer: $scope.idOfferSelected,\r\n IdCrop: $scope.resumeOffer.IdCrop,\r\n IdProduct: $scope.resumeOffer.IdProduct,\r\n Quantity: $scope.resumeOffer.tonnageCurrent,\r\n IdVariety: $scope.resumeOffer.IdVariety,\r\n LstTreeUserGroupConditionSelectedVms: $scope.resumeOffer.LstGroupConditionsSelectedValues,\r\n FreeText: $scope.resumeOffer.FreeText,\r\n IdCategoryOffer: $scope.resumeOffer.IdCategoryOffer > 0 ? $scope.resumeOffer.IdCategoryOffer : null,\r\n IdTemplate: $scope.resumeOffer.IdTemplate,\r\n IdConnection: $scope.selectedConnection.Connection.IdConnection,\r\n IdWsdExpiry: $scope.resumeOffer.IdWsdExpiry\r\n };\r\n }\r\n\r\n function checkContractAndSendSmsForWithoutThirdParty(newContractVm) {\r\n signatureService.CheckAndSendSmsForElectronicSignature(newContractVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.counter.pause = false;\r\n $scope.isConfirmed = false;\r\n $scope.security.Code = \"\";\r\n $scope.security.CodeSendingAway = false;\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n goToStep(\"signatureContract\");\r\n }\r\n });\r\n }\r\n\r\n function getListConnections() {\r\n signatureService.GetListConnection($rootScope.selectedClientFromTcForSubscribe.IdUser, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.listConnection = data;\r\n if ($scope.listConnection.length === 0)\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.ChooseContacte_OfferSubscribe_ListEmpty_NoBinding_Contacte.Content;\r\n else if ($scope.listConnection.length === 1)\r\n {\r\n $scope.selectedConnection.Connection.IdConnection = $scope.listConnection[0].IdConnection;\r\n $scope.ValidateConnection();\r\n return;\r\n }\r\n $scope.isConfirmed = false;\r\n $scope.showListChooseContact = true;\r\n goToStep(\"signatureContract\");\r\n }\r\n });\r\n }\r\n\r\n function checkSmsCodeAndSaveContractForWithoutThirdParty(newContractVm) {\r\n var idContract = \"\";\r\n if ($scope.idContract)\r\n idContract = $scope.idContract;\r\n\r\n signatureService.CheckSecurityCodeFirmOrCommitment($scope.security.Code, idContract, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n newContractVm.IsSignedWithoutThirdParty = true;\r\n SaveNewContrat(newContractVm);\r\n }\r\n });\r\n }\r\n\r\n $scope.GetExpiries = function () {\r\n $scope.resumeOffer.IdWsdExpiry = null;\r\n var market = $filter('filter')($scope.lstMarkets, { IdMarket: $scope.resumeOffer.IdMarket })[0];\r\n $scope.lstExpiry = [];\r\n if(!!$scope.resumeOffer.IdMarket){\r\n wsdApiService.GetExpiriesWSDByIdMarketWithQuotes($scope.resumeOffer.IdMarket, null, market.TypeLocat, function (data, status) {\r\n if (status === null) {\r\n $scope.lstExpiry = data.Expiries;\r\n } else if (status == 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else {\r\n $scope.errorMessage = status;\r\n }\r\n });\r\n }\r\n };\r\n\r\n function GetMarkets() {\r\n wsdApiService.GetMarketsWSDToEuronext(function (data, status) {\r\n if (status === null)\r\n $scope.lstMarkets = data;\r\n else\r\n $scope.errorMessage = status;\r\n });\r\n }\r\n\r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('subscribeContractMultiCropsController', ['$scope', '$rootScope', '$location', 'currentUserFactory', 'enumFactory', 'configurationFactory', 'parametersFactory', 'offerService', 'parametersService', 'contractsService', '$filter', 'conditionsService', 'signatureService', 'contractingDelayService', 'typeOrdersService', 'targetPriceService', 'userService', '$sce',\r\n function ($scope, $rootScope, $location, currentUserFactory, enumFactory, configurationFactory, parametersFactory, offerService, parametersService, contractsService, $filter, conditionsService, signatureService, contractingDelayService, typeOrdersService, targetPriceService, userService, $sce) {\r\n\r\n var init = function () {\r\n $scope.selectedVariety = {};\r\n $scope.firstSendSmsMessageDelayedSigning = false;\r\n $scope.checkValidCondition = false;\r\n $scope.showUrlSellConditionAttachment = false;\r\n $scope.showUrlUtilConditionAttachment = false;\r\n\r\n $scope.enumRoles = enumFactory.Roles;\r\n $scope.withConditions = true;\r\n\r\n $scope.enumRoles = enumFactory.Roles;\r\n $scope.effortPriceTcEnabled = false;\r\n $scope.tcEffortInputIsDelta = parametersFactory.Parameters.TcEffortInputMode.Value == 'DELTA';\r\n $scope.enumTypeEffortTc = enumFactory.TypeEffortTc;\r\n $scope.enumFactory = enumFactory;\r\n\r\n $scope.selectedConnection = {\r\n Connection: {}\r\n };\r\n $scope.signatureYouSign = {};\r\n $scope.showListChooseContact = false;\r\n $scope.moduleYousignIsActive = $rootScope.ModuleSignatureElectroniqueYouSign.Active;\r\n $scope.IsUneal = $rootScope.paramNameCoop === enumFactory.Coops.Uneal ? true : false;\r\n $scope.listConnection = [];\r\n $scope.showConfirmButton = true;\r\n $scope.delayedSigning = parametersFactory.Parameters.DelayedSigning.Value === \"1\";\r\n $scope.contractValidationDisabled = true;\r\n \r\n $scope.signingEnabled = ($scope.moduleYousignIsActive || $rootScope.ModuleElectronicSignature.Active) && $rootScope.activateSignature && (!($rootScope.paramDelayedSigning == '1' && $rootScope.User.IdRole === $scope.enumRoles.TC) || ($rootScope.User.IdRole === $scope.enumRoles.TC && $rootScope.isTcSigningForUser));\r\n $scope.showCheckedCondition = !($rootScope.paramDelayedSigning == '1' && $rootScope.User.IdRole == $scope.enumRoles.TC) || ($rootScope.User.IdRole === $scope.enumRoles.TC && $rootScope.isTcSigningForUser);\r\n $scope.showButtonSigningForTc = $rootScope.User.IdRole == $scope.enumRoles.TC && $rootScope.paramDelayedSigning && $rootScope.activateSignature && $rootScope.paramIsTCAuthorizedToSignInModeDelayed && !$rootScope.goToDelayedSigning;\r\n\r\n $scope.user = currentUserFactory.User;\r\n $scope.mobileNumberToSendSms = $rootScope.selectedClientFromTc ? $rootScope.selectedClientFromTc.MobileNumber : currentUserFactory.Connection ? currentUserFactory.Connection.MobileNumber : $scope.user.MobileNumber;\r\n $scope.idTypeFixation = $scope.enumFactory.TypeFixations.GlobalPrice.IdTypeFixation;\r\n\r\n $scope.termsAndConditions = {\r\n isChecked: false\r\n };\r\n $scope.security = {\r\n Code: \"\"\r\n };\r\n $scope.counter = {\r\n start: false,\r\n pause: false\r\n };\r\n\r\n\r\n if ($rootScope.User.IdRole === $scope.enumRoles.TC && $rootScope.User.EffortPriceTcEnabled && !$rootScope.isTcSigningForUser) { //Si on est un TC et qu'il y a des efforts de prix possible alors le TC à le droit de saisir un effort\r\n $scope.effortPriceTcEnabled = true;\r\n }\r\n\r\n\r\n //Prise en compte des modifications des parametres par l'Admin\r\n parametersService.GetParameters(function (dataParam, statusParam) {\r\n if (statusParam !== undefined && statusParam !== null) {\r\n if (statusParam === 400) {\r\n $scope.loginErrorMessage = dataParam[0].errors[0].Message;\r\n }\r\n } else {\r\n parametersFactory.Parameters = dataParam;\r\n\r\n if (!parametersFactory.Parameters.FileTermCondition.Value)\r\n $scope.showUrlSellConditionAttachment = false;\r\n else {\r\n $scope.urlSellConditionAttachment = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + parametersFactory.Parameters.FileTermCondition.Value;\r\n $scope.showUrlSellConditionAttachment = true;\r\n }\r\n\r\n if (!parametersFactory.Parameters.FileTermeUse.Value)\r\n $scope.showUrlUtilConditionAttachment = false;\r\n else {\r\n $scope.urlUtilConditionAttachment = configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + parametersFactory.Parameters.FileTermeUse.Value;\r\n $scope.showUrlUtilConditionAttachment = true;\r\n }\r\n }\r\n });\r\n\r\n if ($rootScope.goToDelayedSigning && $rootScope.idContractForDelayedSigning) {\r\n $scope.isGlobalFixation = true;\r\n $rootScope.goToDelayedSigning = false;\r\n $rootScope.isTcSigningForUser = false;\r\n contractsService.GetContractForDelayedSigning($rootScope.idContractForDelayedSigning, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n $scope.resumeOffer = data;\r\n if (data.LabelVariety)\r\n $scope.selectedVariety = {\r\n Label: data.LabelVariety\r\n };\r\n $rootScope.hasSmsCodeSigningAlreadySend = data.HasSmsCodeSigningAlreadySend;\r\n goToStep(\"validation\");\r\n }\r\n });\r\n } else if ($rootScope.idOfferSelected) {\r\n // Dans le cas ou il ne sagit pas d'un contrat en attente de signature, on passe nos deux params à false et null\r\n $rootScope.idContractForDelayedSigning = null;\r\n $rootScope.goToDelayedSigning = false;\r\n $rootScope.isTcSigningForUser = false;\r\n $rootScope.hasSmsCodeSigningAlreadySend = false;\r\n // Récupération de l'offre à souscrire\r\n offerService.GetOfferByIdAndIdExpiry($rootScope.idOfferSelected, $rootScope.idExpirySelected, $scope.idTypeFixation, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.resumeOffer = data;\r\n $scope.contractValidationDisabled = data.ContractValidationDisabled;\r\n $scope.signingEnabled = $scope.signingEnabled && $scope.contractValidationDisabled && $scope.resumeOffer.ContractSigningEnabled ;\r\n GetCondParts();\r\n\r\n if ($scope.quantity) {\r\n $scope.resumeOffer.tonnageCurrent = Number($scope.quantity);\r\n }\r\n if ($scope.effortPriceTcEnabled) {\r\n $scope.resumeOffer.EffortPriceTc = $scope.resumeOffer.GlobalPriceWithCoeffConverted;\r\n $scope.resumeOffer.DeltaEffortPriceTc = 0;\r\n }\r\n if (!$scope.step)\r\n goToStep(\"contractualisation\");\r\n }\r\n });\r\n } else\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_IdentifierOfOfferIsMissing.Content;\r\n\r\n };\r\n\r\n var GetCondParts = function () {\r\n if ($scope.IsUneal) {\r\n conditionsService.GetBestPath($scope.resumeOffer.IdOffer, function (bestPath) {\r\n conditionsService.GetCondParts($scope.resumeOffer.IdOffer, $scope.resumeOffer.IdTree, null, false, bestPath, $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety, function (res) {\r\n $scope.errorMessage = res.errorMessage;\r\n $scope.conditionParticulars = res.conditionParticulars;\r\n });\r\n });\r\n }\r\n else {\r\n conditionsService.GetCondParts($scope.resumeOffer.IdOffer, $scope.resumeOffer.IdTree, null, false, '', $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety, function (res) {\r\n $scope.errorMessage = res.errorMessage;\r\n $scope.conditionParticulars = res.conditionParticulars;\r\n\r\n });\r\n }\r\n };\r\n\r\n $scope.ChangeVariety = function () {\r\n GetCondParts(); \r\n };\r\n\r\n var SaveNewContrat = function (newContractVm) {\r\n contractsService.SaveNewContract(newContractVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n }\r\n } else {\r\n $scope.idContract = data.idContract;\r\n $scope.hashContract = data.hashContract;\r\n $scope.counter = {};\r\n $scope.counter.start = false;\r\n goToStep(\"confirmation\");\r\n }\r\n });\r\n };\r\n\r\n var UpdateContract = function (idContract) {\r\n contractsService.SignContractForDelayedSigning(idContract, $scope.selectedConnection.Connection.IdConnection, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n }\r\n } else {\r\n $scope.isConfirmed = false; \r\n $scope.idContract = data.idContract;\r\n $scope.hashContract = data.hashContract;\r\n $scope.counter = {};\r\n $scope.counter.start = false;\r\n goToStep(\"confirmation\");\r\n }\r\n });\r\n };\r\n\r\n var CheckIsValidTonnageCurrent = function (tonnageMaxLimit, tonnageMaxCropProduct) {\r\n offerService.CheckIsValidTonnageCurrent($scope.resumeOffer.tonnageCurrent, $scope.resumeOffer.TonnageMin, $scope.resumeOffer.TonnageMax, $scope.resumeOffer.QuantityLeft, $scope.resumeOffer.Quotity, '', $scope.resumeOffer.idTypeOrder, $scope.resumeOffer.IdTypeCover, tonnageMaxLimit, tonnageMaxCropProduct, function (error) {\r\n $scope.errorTonnageMessage = error.substring(1, error.length - 1); // Permet de supprimer les guillemets en début et fin de message\r\n if (tonnageMaxCropProduct || tonnageMaxCropProduct === 0) { //demande ducroquet deuxieme check, on laisse passer //On est obligé d'ajouter || tonnageMaxCropProduct === 0 car sinon dans le cas où il reste 0 alors on ne rentre pas dans le if\r\n $scope.resumeOffer.MaxCropProductTonnage = null;\r\n }\r\n if ($scope.errorTonnageMessage)\r\n return;\r\n\r\n if ($scope.effortPriceTcEnabled) {\r\n\r\n var coeffValue = \"\";\r\n $scope.resumeOffer.EffortPriceTc = $scope.resumeOffer.EffortPriceTc != undefined? $scope.resumeOffer.EffortPriceTc : $scope.resumeOffer.GlobalPriceWithCoeffConverted;\r\n var totalEffort = $scope.resumeOffer.EffortPriceTc + $scope.resumeOffer.DeltaEffortPriceTc;\r\n\r\n userService.CheckEffortTc(totalEffort, $scope.resumeOffer.GlobalPriceWithCoeffConverted, $scope.enumTypeEffortTc.Price, coeffValue, true, $scope.resumeOffer.DecimalCurrencyUnitForComponents, function (data) {\r\n if (data.ErrorMessage) {\r\n $scope.errorEffortPriceTcMessage = data.ErrorMessage;\r\n return;\r\n }\r\n\r\n $scope.effortPriceTc = data.EffortTc;\r\n $scope.marketPriceEffortPriceTc = $scope.resumeOffer.MarketPrice + $scope.effortPriceTc + $scope.totalCondPart;\r\n $scope.refPriceEffortPriceTc = $scope.resumeOffer.RefPrice + $scope.effortPriceTc + $scope.totalCondPart;\r\n $scope.finalPriceEffortPriceTc = parseFloat($scope.resumeOffer.FinalPrice) + $scope.effortPriceTc + $scope.totalCondPart;//On fait un parsefloat car il considère comme une chaine de caractère et au lieu de faire 16+4 et afficher 20 il affiche 164 si on ne fait pas de parsefloat\r\n $scope.finalPriceEffortPriceTcWithCoeffConverted = $filter('roundByDecimalAndConverter')($scope.finalPriceEffortPriceTc, $scope.resumeOffer.DecimalCurrencyUnitFinal, $scope.resumeOffer.ConverterCoeffValue);\r\n \r\n goToStep(\"validation\");\r\n });\r\n }\r\n else { \r\n goToStep(\"validation\");\r\n }\r\n\r\n });\r\n };\r\n\r\n $scope.Validate = function () {\r\n $scope.errorMessage = \"\";\r\n $scope.errorTonnageMessage = \"\";\r\n $scope.errorPriceMessage = \"\";\r\n $scope.errorEffortPriceTcMessage = \"\";\r\n $rootScope.lastOfferSelected = $scope.resumeOffer.IdOffer;\r\n\r\n // Vérification des conditions particulières\r\n $scope.resumeOffer.LstGroupConditionsSelectedValues = [];\r\n if ($scope.withConditions) {\r\n $scope.errorMessage = conditionsService.CheckAndSetGroupConditions($scope.conditionParticulars, $scope.resumeOffer.LstGroupConditionsSelectedValues);\r\n if ($scope.errorMessage)\r\n return;\r\n }\r\n \r\n // Vérification de la variété\r\n if ($scope.resumeOffer.LstVarieties.length > 0 && !$scope.resumeOffer.IdVariety) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterAVariety.Content;\r\n return;\r\n }\r\n else if ($scope.resumeOffer.LstVarieties.length > 0)\r\n $scope.selectedVariety = $filter('filter')($scope.resumeOffer.LstVarieties, { IdVariety: $scope.resumeOffer.IdVariety }, true)[0];\r\n\r\n\r\n // Calcul de la somme des conditions particulières séléctionnées\r\n $scope.totalLstGroupConditionsSelectedValues = conditionsService.GetTotalLstGroupConditionsSelectedValues($scope.resumeOffer.LstGroupConditionsSelectedValues);\r\n\r\n // Calcul du prix final\r\n $scope.totalCondPart = !!$scope.totalLstGroupConditionsSelectedValues ? $scope.totalLstGroupConditionsSelectedValues : $scope.resumeOffer.TotalConditionsValue;\r\n $scope.totalCondPart = !!$scope.totalCondPart ? $scope.totalCondPart : 0;\r\n var finalPrice = $scope.resumeOffer.GlobalPrice + $scope.totalCondPart;\r\n $scope.resumeOffer.FinalPriceWithCoeffConverted = $filter('roundByDecimalAndConverter')(finalPrice, $scope.resumeOffer.DecimalCurrencyUnitForComponents, $scope.resumeOffer.ConverterCoeffValue);\r\n\r\n // Vérification du délai de contractualisation\r\n if (!$rootScope.idContractForDelayedSigning) {\r\n $scope.errorMessage = contractingDelayService.VerifyContractingDelay($scope.timeToContracting);\r\n if ($scope.errorMessage) {\r\n $scope.isToLate = true;\r\n return;\r\n }\r\n }\r\n\r\n // Vérification du tonnage du contrat\r\n CheckIsValidTonnageCurrent($scope.resumeOffer.tonnageCurrent, $scope.resumeOffer.MaxCropProductTonnage);\r\n\r\n };\r\n\r\n $scope.ValidateConnection = function () {\r\n if (!$scope.selectedConnection.Connection.IdConnection) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.ChooseContacte_OfferSubscribe_ListEmpty.Content;\r\n return;\r\n }\r\n $scope.showConfirmButton = false;\r\n $scope.isConfirmed = true;\r\n $scope.errorMessage = \"\";\r\n $scope.mobileNumberToSendSms = $scope.selectedConnection.Connection.MobileNumber;\r\n\r\n if ($rootScope.idContractForDelayedSigning){\r\n $scope.SendSecurityCode();\r\n $scope.firstSendSmsMessageDelayedSigning = false;\r\n $scope.counter.pause = false;\r\n $scope.isConfirmed = false;\r\n $scope.security.Code = \"\";\r\n $scope.security.CodeSendingAway = false;\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n }\r\n else {\r\n // Création de la vm du contrat\r\n var newContractVm = getContractVm();\r\n\r\n if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active)\r\n checkContractAndSendSmsForWithoutThirdParty(newContractVm);\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkContractAndSendSmsForYouSign(newContractVm);\r\n }\r\n };\r\n\r\n $scope.Confirm = function () {\r\n $scope.isConfirmed = true;\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.counter.pause = true;\r\n\r\n if ($rootScope.idConnectionLogged)\r\n $scope.selectedConnection.Connection.IdConnection = $rootScope.idConnectionLogged;\r\n\r\n // Vérification de l'acceptation des condition générale de vente\r\n if (!$scope.termsAndConditions.isChecked && $scope.showCheckedCondition) {\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseAcceptGeneralConditionsOfSaleBeforeValidation.Content;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = false;\r\n return;\r\n }\r\n // Vérification du delai de contractualisation\r\n if (!$rootScope.idContractForDelayedSigning) {\r\n $scope.errorMessage = contractingDelayService.VerifyContractingDelay($scope.timeToContracting);\r\n if ($scope.errorMessage) {\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n return;\r\n }\r\n }\r\n\r\n if ($rootScope.idContractForDelayedSigning) {\r\n if (!$rootScope.hasSmsCodeSigningAlreadySend) \r\n {\r\n // Gestion des contacts\r\n if ($scope.signingEnabled && parametersFactory.Parameters.bUseTableConnections.Value === \"1\" && !$scope.selectedConnection.Connection.IdConnection)\r\n getListConnections();\r\n else\r\n $scope.SendSecurityCode();\r\n $scope.firstSendSmsMessageDelayedSigning = false;\r\n }\r\n else\r\n $scope.firstSendSmsMessageDelayedSigning = true;\r\n \r\n $scope.isConfirmed = false;\r\n goToStep(\"signatureContract\");\r\n } else {\r\n // Création de la vm du contrat\r\n var newContractVm = getContractVm();\r\n\r\n if (!$scope.contractValidationDisabled)\r\n return SaveNewContrat(newContractVm);\r\n\r\n if ($scope.step === \"validation\") {\r\n // Gestion des contacts\r\n if ($scope.signingEnabled && parametersFactory.Parameters.bUseTableConnections.Value === \"1\" && !$scope.selectedConnection.Connection.IdConnection)\r\n getListConnections();\r\n // Envoi signature YOUSIGN\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkContractAndSendSmsForYouSign(newContractVm);\r\n // Envoi signature SANS TIERS DE CONFIANCE\r\n else if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active && $scope.showCheckedCondition)\r\n checkContractAndSendSmsForWithoutThirdParty(newContractVm);\r\n else\r\n SaveNewContrat(newContractVm);\r\n }\r\n else if ($scope.step === \"signatureContract\") {\r\n // Vérification du code pour signature SANS TIERS DE CONFIANCE et sauvegarde du contrat\r\n if ($scope.signingEnabled && $rootScope.ModuleElectronicSignature.Active)\r\n checkSmsCodeAndSaveContractForWithoutThirdParty(newContractVm);\r\n // Vérification du code pour signature YOUSIGN et mise à jour du contrat\r\n else if ($scope.signingEnabled && $scope.moduleYousignIsActive)\r\n checkSmsCodeForYouSign();\r\n }\r\n }\r\n };\r\n\r\n $scope.UpdateContractDelayedSigning = function () {\r\n $scope.isConfirmed = true;\r\n $scope.successMessage = \"\";\r\n signatureService.CheckSecurityCodeFirmOrCommitment($scope.security.Code, $rootScope.idContractForDelayedSigning, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.errorMessage = \"\";\r\n UpdateContract($rootScope.idContractForDelayedSigning);\r\n }\r\n });\r\n };\r\n\r\n $scope.ConditionParticularsOnChange = function (condition) {\r\n conditionsService.ConditionParticularsOnChange($scope.resumeOffer.IdOffer, condition, '', $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety);\r\n };\r\n\r\n $scope.AutocompletConditionParticularsOnChange = function (selectedValue, condition) {\r\n condition.selectedValue = selectedValue.originalObject.IdTreeCondition;\r\n $scope.conditionSelected = condition;\r\n conditionsService.ConditionParticularsOnChange($scope.resumeOffer.IdOffer, condition, '', $rootScope.idExpirySelected, $scope.resumeOffer.IdVariety);\r\n };\r\n\r\n $scope.AutocompleteCondPartSearch = function (str, LstOptions) {\r\n var matches = [];\r\n LstOptions.forEach(function (option) {\r\n if ((option.Label.toLowerCase().indexOf(str.toString().toLowerCase()) >= 0)) {\r\n matches.push(option);\r\n }\r\n });\r\n return matches;\r\n };\r\n\r\n $scope.inputChanged = function (str) {\r\n if ($scope.conditionSelected) {\r\n $scope.conditionSelected.LstConditionParticularsChilds = [];\r\n }\r\n };\r\n\r\n $scope.SetTonnageCurrent = function () {\r\n $scope.resumeOffer.tonnageCurrent = $scope.resumeOffer.surface * $scope.resumeOffer.rendement;\r\n };\r\n\r\n $scope.SendSecurityCode = function () {\r\n $scope.security.Code = \"\";\r\n\r\n if ($rootScope.ModuleElectronicSignature.Active && $rootScope.activateSignature) {\r\n var idConnection = $scope.selectedConnection.Connection.IdConnection ? $scope.selectedConnection.Connection.IdConnection : \"\";\r\n signatureService.SendSmsForElectronicSignature($scope.timeToContracting, $rootScope.idContractForDelayedSigning, idConnection, function (res) {\r\n $scope.isToLate = res.isToLate;\r\n $scope.errorMessage = res.errorMessage;\r\n if (!$scope.firstSendSmsMessageDelayedSigning)\r\n $scope.successMessage = res.successMessage;\r\n else\r\n $scope.successMessage = \"\";\r\n $scope.firstSendSmsMessageDelayedSigning = false;\r\n });\r\n }\r\n else if ($scope.moduleYousignIsActive && $rootScope.activateSignature) {\r\n signatureService.ResendCodeYouSign($scope.signatureYouSign.Signature.MemberId, $scope.signatureYouSign.Signature.ProcedureId, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n if (data) {\r\n $scope.newAuthenticationId = data.AuthenticationId;\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = $rootScope.editableObjectsFactory.EditableObjects.Success_OfferSubscribe_CodeResend.Content;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.Cancel = function () {\r\n $location.path(\"user/offers/view/\" + enumFactory.TypeOffer.MultiCampagne);\r\n };\r\n\r\n $scope.GoToSubscribeDelayedSigning = function () {\r\n $rootScope.goToDelayedSigning = true;\r\n $rootScope.idContractForDelayedSigning = $scope.idContract; \r\n $rootScope.isTcSigningForUser = true;\r\n $location.path(\"/user/subscribe/contractMultiCrops/\");\r\n };\r\n\r\n $rootScope.onRefresh = function () {\r\n init();\r\n };\r\n\r\n function goToStep(step) {\r\n $scope.step = step;\r\n moveVehicle();\r\n }\r\n\r\n function getContractVm() {\r\n return {\r\n IdTypeContract: enumFactory.TypeContract.MultiCampagne,\r\n IdTypeOrder: enumFactory.TypeOrders.Vente.IdTypeOrder,\r\n IdTypeCover: $scope.resumeOffer.IdTypeCover,\r\n IdOffer: $scope.idOfferSelected,\r\n IdCrop: $scope.resumeOffer.IdCrop,\r\n IdProduct: $scope.resumeOffer.IdProduct,\r\n Quantity: $scope.resumeOffer.tonnageCurrent,\r\n Price: $scope.resumeOffer.GlobalPrice,\r\n OfferPrice: $scope.resumeOffer.GlobalPrice,\r\n IdVariety: $scope.resumeOffer.IdVariety,\r\n LstTreeUserGroupConditionSelectedVms: $scope.resumeOffer.LstGroupConditionsSelectedValues,\r\n Surface: $scope.resumeOffer.surface,\r\n SurfaceYield: $scope.resumeOffer.rendement,\r\n IdTypeFixation: $scope.idTypeFixation,\r\n CoefficientChange: $scope.resumeOffer.ConverterCoeffValue, // Envoi du coefficient permettant de convertir le prix à la Devise/Unité des composantes.\r\n DecimalCurrencyUnitForComponents: $scope.resumeOffer.DecimalCurrencyUnitForComponents, // Envoi de la décimal pour arrondir le prix à la décimal des composantes.\r\n EffortPriceTc: $scope.effortPriceTcEnabled ? $scope.effortPriceTc : null,\r\n DisableContractCoverByTc: $scope.resumeOffer.ShowCheckBoxCoverContract ? !$scope.coverContract.isChecked : null,\r\n PaymentDateString: $rootScope.User.IsSuperTc && $rootScope.paramNameCoop === enumFactory.Coops.Ducroquet ? $scope.resumeOffer.PaymentDateString : null,\r\n FreeText: $scope.resumeOffer.FreeText,\r\n IdConnection: $scope.selectedConnection.Connection.IdConnection\r\n };\r\n }\r\n\r\n function checkContractAndSendSmsForWithoutThirdParty(newContractVm) {\r\n signatureService.CheckAndSendSmsForElectronicSignature(newContractVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.counter.pause = false;\r\n $scope.isConfirmed = false;\r\n $scope.security.Code = \"\";\r\n $scope.security.CodeSendingAway = false;\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n goToStep(\"signatureContract\");\r\n }\r\n });\r\n }\r\n\r\n function checkContractAndSendSmsForYouSign(newContractVm) {\r\n contractsService.SaveNewContractAndSendSmsYouSign(newContractVm, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isToLate = true;\r\n $scope.isConfirmed = false;\r\n $scope.counter.pause = true;\r\n }\r\n } else {\r\n $scope.isConfirmed = true;\r\n $scope.hashContract = data.HashContract; \r\n $scope.idContract = data.IdContract;\r\n GetPdfContractMultiCrops($scope.idContract, $scope.hashContract);\r\n if (data) {\r\n if (data.CanAvoidSigning) {\r\n $scope.showConfirmButton = true; \r\n $scope.counter = {};\r\n $scope.counter.start = false;\r\n goToStep(\"confirmation\");\r\n }\r\n else {\r\n $scope.showConfirmButton = true;\r\n $scope.showListChooseContact = false;\r\n $scope.signatureYouSign = data;\r\n $scope.isConfirmed = false;\r\n goToStep(\"signatureContract\");\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n function getListConnections() {\r\n signatureService.GetListConnection($rootScope.selectedClientFromTcForSubscribe.IdUser, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n $scope.listConnection = data;\r\n if ($scope.listConnection.length === 0)\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.ChooseContacte_OfferSubscribe_ListEmpty_NoBinding_Contacte.Content;\r\n else if ($scope.listConnection.length === 1)\r\n {\r\n $scope.selectedConnection.Connection.IdConnection = $scope.listConnection[0].IdConnection;\r\n $scope.ValidateConnection();\r\n return;\r\n }\r\n $scope.isConfirmed = false;\r\n $scope.showListChooseContact = true;\r\n goToStep(\"signatureContract\");\r\n }\r\n });\r\n }\r\n\r\n function checkSmsCodeAndSaveContractForWithoutThirdParty(newContractVm) {\r\n var idContract = \"\";\r\n if ($scope.idContract)\r\n idContract = $scope.idContract;\r\n\r\n signatureService.CheckSecurityCodeFirmOrCommitment($scope.security.Code, idContract, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n newContractVm.IsSignedWithoutThirdParty = true;\r\n SaveNewContrat(newContractVm);\r\n }\r\n });\r\n }\r\n\r\n function checkSmsCodeForYouSign() {\r\n $scope.isConfirmed = true;\r\n $scope.showConfirmButton = false;\r\n var idConnection = $scope.selectedConnection.Connection.IdConnection ? $scope.selectedConnection.Connection.IdConnection : \"\";\r\n signatureService.SignatureWithCodeYouSign($scope.signatureYouSign.Signature.FilesIds[0], $scope.newAuthenticationId ? $scope.newAuthenticationId : $scope.signatureYouSign.Signature.AuthenticationId, $scope.security.Code, idConnection, $scope.signatureYouSign.Signature.MemberId, $scope.signatureYouSign.Signature.ProcedureId, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n $scope.isConfirmed = false;\r\n }\r\n }\r\n else {\r\n if (data && (data === \"true\" || data === \"1\")) {\r\n $scope.errorMessage = \"\";\r\n goToStep(\"confirmation\");\r\n }\r\n else {\r\n $scope.successMessage = \"\";\r\n $scope.showConfirmButton = true;\r\n $scope.isConfirmed = false;\r\n if (!$scope.security.Code)\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterCodeReceivedBySms.Content;\r\n else\r\n $scope.errorMessage = $rootScope.editableObjectsFactory.EditableObjects.Error_OfferSubscribe_CodeEnteredNotCorrespondToCodeSended.Content;\r\n }\r\n }\r\n });\r\n }\r\n\r\n function GetPdfContractMultiCrops (idContract, hashContract) {\r\n if (idContract && hashContract) {\r\n $scope.contractMultiCropsUrlPdf = $sce.trustAsResourceUrl($filter('pdfLinkContract')({k: idContract, h: hashContract})) ;\r\n }\r\n }\r\n\r\n init();\r\n }]);","AgrimarketControllers.controller('userSmsAlertController', [\r\n '$scope', '$rootScope', '$location', 'colonnes', 'smsAlertService', 'offerService',\r\n function ($scope, $rootScope, $location, colonnes, smsAlertService, offerService) {\r\n\r\n if (!$rootScope.ModuleAlertesSms.Active)\r\n $location.path('/');\r\n\r\n\r\n\r\n\r\n $scope.AsChangedCrop = function () {\r\n Init();\r\n };\r\n\r\n var Init = function () {\r\n $scope.smsAlerts = [];\r\n\r\n $scope.max = 10;\r\n\r\n $scope.errorMessage = \"\";\r\n $scope.tableSmsAlertsDatasVisible = colonnes.data.DataVisible.split(',');\r\n $scope.tableSmsAlertsLabels = colonnes.data.ColumnName.split(',');\r\n $scope.data = { reverse: true, sortKey: \"IdSmsAlert\" };\r\n $scope.pageNo = 1;\r\n $scope.GetSmsAlertsPaginateWithFilter();\r\n };\r\n\r\n \r\n\r\n $scope.GetSmsAlertsPaginateWithFilter = function () {\r\n $scope.loading = true;\r\n smsAlertService.GetSmsAlertsPaginateWithFilter($rootScope.crop.IdCrop, $scope.max, $scope.pageNo, $scope.data.sortKey, $scope.data.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n else\r\n $location.path('/');\r\n }\r\n else {\r\n $scope.loading = false;\r\n $scope.listSmsAlerts = data.ListVm;\r\n $scope.total = data.Total; \r\n }\r\n });\r\n };\r\n\r\n $scope.DeleteAlertSmsPopUp = function (smsAlert, index, showPopUpDeleteAlertSms) {\r\n $scope.errorMessage = '';\r\n $scope.PopupDeleteAlertSmsSelectedTitle = $rootScope.editableObjectsFactory.EditableObjects.User_AlertSmsList_PopupDeleteAlertSms_Title.Content;\r\n showPopUpDeleteAlertSms(smsAlert);\r\n };\r\n\r\n $scope.DeleteAlertSms = function (element) {\r\n smsAlertService.DeleteAlertSms(element, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.GetSmsAlertsPaginateWithFilter();\r\n }\r\n });\r\n };\r\n\r\n $scope.EditAlertSmsPopUp = function (smsAlert, showPopUpEditAlertSms) {\r\n $scope.popupSmsAlertErrorMessage = \"\";\r\n offerService.GetOfferPrice(smsAlert.IdExpiry, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n } else {\r\n $scope.editSmsAlert = {\r\n idExpiry: smsAlert.IdExpiry,\r\n price: data.FinalPrice,\r\n symbol: data.Symbol,\r\n limitMin: smsAlert.LimitMin,\r\n limitMax: smsAlert.LimitMax\r\n };\r\n showPopUpEditAlertSms();\r\n }\r\n });\r\n };\r\n\r\n $scope.CheckSmsAlertIsValid = function () {\r\n $scope.popupSmsAlertErrorMessage = smsAlertService.CheckSmsAlertIsValid($scope.editSmsAlert.limitMax, $scope.editSmsAlert.limitMin, $scope.editSmsAlert.price);\r\n\r\n if ($scope.popupSmsAlertErrorMessage !== \"\") {\r\n return false;\r\n }\r\n else {\r\n return true;\r\n }\r\n };\r\n\r\n $scope.EditSmsAlertLimit = function () {\r\n if (!$scope.editSmsAlert.limitMin)\r\n $scope.editSmsAlert.limitMin = \"\";\r\n if (!$scope.editSmsAlert.limitMax)\r\n $scope.editSmsAlert.limitMax = \"\";\r\n\r\n smsAlertService.SaveUserExpirySmsLimits($scope.editSmsAlert.idExpiry, $scope.editSmsAlert.limitMin, $scope.editSmsAlert.limitMax, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n Init();\r\n }\r\n });\r\n };\r\n\r\n $scope.GetData = function (pageNo) {\r\n $scope.pageNo = pageNo;\r\n $scope.GetSmsAlertsPaginateWithFilter();\r\n };\r\n\r\n $scope.Sort = function (sortKey, reverse) {\r\n $scope.data.sortKey = sortKey;\r\n $scope.data.reverse = reverse;\r\n $scope.GetSmsAlertsPaginateWithFilter();\r\n };\r\n\r\n Init();\r\n\r\n }\r\n]);","AgrimarketControllers.controller('DisconnectController', ['$scope', '$rootScope', '$http', '$location', 'currentUserFactory',\r\n function ($scope, $rootScope, $http, $location, currentUserFactory) {\r\n\r\n $rootScope.currentUserRole = '';\r\n currentUserFactory.User = null;\r\n currentUserFactory.Connection = null;\r\n $rootScope.isLogged = false;\r\n $rootScope.loading = false;\r\n $rootScope.$broadcast(\"$destroy\");\r\n if (sessionStorage.getItem(\"LOG_AVIV\") && sessionStorage.getItem(\"ConnectedToBackdoor\")) {\r\n sessionStorage.clear();\r\n $location.path(\"/backdoor\");\r\n } else {\r\n sessionStorage.clear();\r\n $location.path('/login');\r\n }\r\n }]);\r\n","AgrimarketControllers.controller('messengerController', ['$scope', '$rootScope', '$routeParams', '$sce', '$filter', '$http', '$location', '$window', 'userService', 'enumFactory', 'messengerService', 'currentUserFactory', 'configurationFactory', 'parametersService', 'parametersFactory', 'userTableService', 'colonnesMessageSended', 'colonnesMessageReceived', '$route',\r\n function ($scope, $rootScope, $routeParams, $sce, $filter, $http, $location, $window, userService, enumFactory, messengerService, currentUserFactory, configurationFactory, parametersService, parametersFactory, userTableService, colonnesMessageSended, colonnesMessageReceived, $route) {\r\n\r\n $scope.errorMessage = \"\";\r\n $scope.successMessage = \"\";\r\n $scope.neutralMessage = \"\";\r\n $scope.request = {};\r\n $scope.request.searchMail = \"\";\r\n $scope.iCurrent = 0;\r\n $scope.reply = false;\r\n $scope.newMessage = {};\r\n $scope.selectedClient = {};\r\n $scope.newMessage.Receivers = [];\r\n $scope.newMessage.Attachments = [];\r\n \r\n $scope.newMessage.IdSender = currentUserFactory.User.IdUser;\r\n $scope.lstDestinataire = [];\r\n $scope.lstAttachment = [];\r\n $scope.lignes = \"\";\r\n $scope.entete = \"\";\r\n $scope.isUseCereals = false;\r\n $scope.viewMode = \"\";\r\n $scope.message = { max: null, pageNo: null };\r\n\r\n $scope.GetMessageSended = function () {\r\n messengerService.GetMessageSendedPaginate($scope.request.searchMail, $scope.message.max, $scope.message.pageNo, $scope.dataMessageSended.sortKey, $scope.dataMessageSended.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalMessage = data.Total;\r\n $scope.lstMessage = data.ListVm;\r\n }\r\n });\r\n };\r\n\r\n $scope.GetNewMessage = function () {\r\n messengerService.GetNewMessagePaginate($scope.request.searchMail, $scope.message.max, $scope.message.pageNo, $scope.dataMessageReceived.sortKey, $scope.dataMessageReceived.reverse, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n $scope.errorMessage = $sce.trustAsHtml(data[0].errors[0].Message);\r\n } else {\r\n $scope.totalMessage = data.Total;\r\n $scope.lstMessage = data.ListVm;\r\n }\r\n });\r\n };\r\n\r\n\r\n $scope.$watch(\"request.searchMail\", function (newValue, oldValue) {\r\n if ((newValue && oldValue !== newValue) || (!newValue && oldValue))\r\n if ($scope.viewMode === \"sended\") {\r\n $scope.GetMessageSended();\r\n } else if ($scope.viewMode === \"reception\") {\r\n $scope.GetNewMessage();\r\n }\r\n });\r\n\r\n var init = function () {\r\n $scope.message.max = 10;\r\n $scope.message.pageNo = 1;\r\n switch ($location.$$path) {\r\n case '/common/messenger/newmessage':\r\n case '/common/messenger/newmessage/' +$routeParams.IdMessage:\r\n $scope.viewMode = \"newmessage\";\r\n $scope.iCurrent = 1;\r\n if (enumFactory.Roles.User == currentUserFactory.User.IdRole) {\r\n parametersService.GetParameters(function (dataParam, statusParam) {\r\n if (statusParam !== undefined && statusParam !== null) {\r\n if (status == 400) {\r\n $scope.errorMessage = dataParam[0].errors[0].message;\r\n } else {\r\n $scope.errorMessage = statusParam;\r\n }\r\n } else {\r\n parametersFactory.Parameters = dataParam;\r\n var destinataires = parametersFactory.Parameters.CommonMessenger.PossibleLabels.split(';');\r\n switch (destinataires[parseInt(parametersFactory.Parameters.CommonMessenger.Value) - 1]) {\r\n case \"TC\":\r\n $scope.isUseCereals = false;\r\n if (currentUserFactory.User.TC) {\r\n $scope.lstDestinataire = currentUserFactory.User.TC;\r\n } else {\r\n $scope.neutralMessage = \"Vous n'avez pas de TC \";\r\n }\r\n break;\r\n case \"service céréales\":\r\n $scope.isUseCereals = true;\r\n $scope.lstDestinataire.push({ \"IdUser\": 0, \"FullName\": 'Service céréales' });\r\n $scope.AddReceiver($scope.lstDestinataire[0]);\r\n break;\r\n default:\r\n $scope.errorMessage = \"the recipients of farmers's message it's not available in this context\";\r\n break;\r\n }\r\n }\r\n });\r\n }\r\n\r\n if (enumFactory.Roles.TC == currentUserFactory.User.IdRole) {\r\n $scope.lstDestinataire = $rootScope.lstClientsFromTc;\r\n }\r\n if (enumFactory.Roles.Admin == currentUserFactory.User.IdRole) {\r\n if ($rootScope.lstUsersToMail && $rootScope.lstUsersToMail.length > 0) {\r\n $rootScope.lstUsersToMail.forEach(function (elem) {\r\n $scope.AddReceiver(elem);\r\n });\r\n } else\r\n userService.GetAllUser(function (data, status) {\r\n if (status === null) {\r\n data.GroupContacts.forEach(function (elem) {\r\n elem.Type = \"GROUP\";\r\n $scope.lstDestinataire.push(elem);\r\n });\r\n data.Users.forEach(function (elem) {\r\n elem.Type = \"USER\";\r\n $scope.lstDestinataire.push(elem);\r\n });\r\n return true;\r\n } else if (status == 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n return false;\r\n } else {\r\n $scope.errorMessage = status;\r\n return false;\r\n }\r\n });\r\n }\r\n\r\n if ($routeParams.IdMessage) {\r\n $scope.neutralMessage = \"\";\r\n messengerService.GetReplyMessage($routeParams.IdMessage, function (data) {\r\n if (status === undefined || status === null || status === \"\") {\r\n $scope.newMessage.Subject = \"RE: \" + data.Subject;\r\n $scope.newMessage.Content = \"\\n\\n\\n\";\r\n $scope.newMessage.Content += \"De : \" + data.Sender.FullName + \"\\n\";\r\n $scope.newMessage.Content += \"Envoyé : \" + $filter('date')(data.DateSend, \"dd/MM/yyyy HH:mm:ss\") + \"\\n\";\r\n $scope.newMessage.Content += \"À : \" + $rootScope.User.LastName + \" \" + $rootScope.User.FirstName + \"\\n\\n\";\r\n $scope.newMessage.Content += data.Content;\r\n\r\n $scope.newMessage.Receivers.push({ \"IdReceiver\": data.Sender.IdUser, \"FullName\": data.Sender.FullName });\r\n } else if (status == 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n return false;\r\n } else {\r\n $scope.errorMessage = status;\r\n return false;\r\n }\r\n\r\n });\r\n\r\n\r\n }\r\n\r\n break;\r\n case '/common/messenger/reception/':\r\n $scope.viewMode = \"reception\";\r\n $scope.iCurrent = 0;\r\n $rootScope.lstUsersToMail = [];\r\n\r\n $scope.tableMessageReceivedDataVisible = colonnesMessageReceived.data.DataVisible.split(',');\r\n $scope.tableMessageReceivedLibelle = colonnesMessageReceived.data.ColumnName.split(',');\r\n $scope.dataMessageReceived = { reverse: true, sortKey: \"IdMessage\" };\r\n $scope.GetNewMessage();\r\n\r\n break;\r\n case '/common/messenger/sended/':\r\n $scope.viewMode = \"sended\";\r\n $scope.iCurrent = 2;\r\n $rootScope.lstUsersToMail = [];\r\n\r\n $scope.tableMessageSendedDataVisible = colonnesMessageSended.data.DataVisible.split(',');\r\n $scope.tableMessageSendedLibelle = colonnesMessageSended.data.ColumnName.split(',');\r\n $scope.dataMessageSended = { reverse: true, sortKey: \"IdMessage\" };\r\n $scope.GetMessageSended();\r\n\r\n break;\r\n case '/common/messenger/read/' +$routeParams.IdMessage:\r\n $scope.viewMode = \"read\";\r\n $scope.reply = true;\r\n\r\n messengerService.GetMessage($routeParams.IdMessage, function (data) {\r\n if (status === undefined || status === null || status === \"\") {\r\n $scope.messageRead = data;\r\n if ($scope.messageRead.Sender.IdUser == $rootScope.User.IdUser)\r\n $scope.iCurrent = 2;\r\n else\r\n $scope.iCurrent = 0;\r\n majNbMsg();\r\n } else if (status == 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n return false;\r\n } else {\r\n $scope.errorMessage = status;\r\n return false;\r\n }\r\n // ReSharper disable once NotAllPathsReturnValue\r\n });\r\n\r\n break;\r\n }\r\n };\r\n\r\n $scope.SortMessageSended = function (sortKey, reverse) {\r\n if ($scope.viewMode === \"sended\") {\r\n $scope.dataMessageSended.sortKey = sortKey;\r\n $scope.dataMessageSended.reverse = reverse;\r\n $scope.GetMessageSended();\r\n\r\n } else if ($scope.viewMode === \"reception\") {\r\n $scope.dataMessageReceived.sortKey = sortKey;\r\n $scope.dataMessageReceived.reverse = reverse;\r\n $scope.GetNewMessage();\r\n }\r\n };\r\n\r\n $scope.GetData = function (pageNo) {\r\n $scope.message.pageNo = pageNo;\r\n\r\n if ($scope.viewMode === \"sended\") {\r\n $scope.GetMessageSended();\r\n }\r\n else if ($scope.viewMode === \"reception\") {\r\n $scope.GetNewMessage();\r\n }\r\n };\r\n\r\n function checkMessage() {\r\n resetTexts();\r\n if (!$scope.newMessage.Receivers || $scope.newMessage.Receivers.length < 1) {\r\n $scope.errorMessage = \"Veuillez sélectionner au moins un destinataire\";\r\n return false;\r\n }\r\n if (!$scope.newMessage.Subject) {\r\n $scope.errorMessage = \"Veuillez renseigner un sujet pour ce message\";\r\n return false;\r\n }\r\n if (!$scope.newMessage.Content) {\r\n $scope.errorMessage = \"Veuillez écrire un contenu pour ce message\";\r\n return false;\r\n }\r\n return true;\r\n }\r\n $scope.AddReceiver = function (obj) {\r\n $scope.resetInput = 1;\r\n if (obj.Type == \"GROUP\") {\r\n obj.UserLights.forEach(function (data) {\r\n if (!$filter('filter')($scope.newMessage.Receivers, { \"IdReceiver\": parseInt(data.IdUser) }, true)[0])\r\n $scope.newMessage.Receivers.push({ \"IdReceiver\": data.IdUser, \"FullName\": data.FullName });\r\n });\r\n } else {\r\n if (!$filter('filter')($scope.newMessage.Receivers, { \"IdReceiver\": parseInt(obj.IdUser) }, true)[0])\r\n $scope.newMessage.Receivers.push({ \"IdReceiver\": obj.IdUser, \"FullName\": obj.FullName });\r\n }\r\n setTimeout(function () {\r\n $scope.resetInput = 0;\r\n }, 200);\r\n\r\n };\r\n $scope.DeleteReceiver = function (index) {\r\n $scope.newMessage.Receivers.splice(index, 1);\r\n };\r\n\r\n $scope.PostMessage = function () {\r\n if (!checkMessage()) return false;\r\n\r\n messengerService.PostMessage($scope.newMessage, function (data, status) {\r\n resetTexts();\r\n if (status === null) {\r\n initMessage();\r\n $scope.successMessage = \"Votre message a bien été transmis\";\r\n $rootScope.lstUsersToMail = [];\r\n return true;\r\n } else if (status == 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n return false;\r\n } else {\r\n $scope.errorMessage = status;\r\n return false;\r\n }\r\n });\r\n };\r\n $scope.saveAttachement = function (idAttachement) {\r\n $scope.newMessage.Attachments.push({ \"IdAttachment\": idAttachement });\r\n };\r\n $scope.DeleteAttachement = function (index) {\r\n $scope.newMessage.Attachments.splice(index, 1);\r\n };\r\n\r\n $scope.DeleteMessage = function (item) {\r\n resetTexts();\r\n if ($scope.iCurrent === 0)//suppression de \"message reçu\"\r\n messengerService.DeleteMessageReceive(item.IdMessage, function (data, status) {\r\n if (status === null) {\r\n $scope.lstMessage = data;\r\n $scope.total = data.length;\r\n $scope.successMessage = \"Votre message a bien été supprimé\";\r\n majNbMsg();\r\n $scope.GetNewMessage();\r\n } else if (status == 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n return false;\r\n } else {\r\n $scope.errorMessage = status;\r\n return false;\r\n }\r\n });\r\n if ($scope.iCurrent == 2)//suppression de \"message envoyé\"\r\n messengerService.DeleteMessageSended(item.IdMessage, function (data, status) {\r\n if (status === null) {\r\n $scope.lstMessage = data;\r\n $scope.total = data.length;\r\n $scope.successMessage = \"Votre message a bien été supprimé\";\r\n $scope.GetMessageSended();\r\n } else if (status == 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n return false;\r\n } else {\r\n $scope.errorMessage = status;\r\n return false;\r\n }\r\n });\r\n };\r\n\r\n $scope.Delete = function () {\r\n if ($scope.iCurrent == 2) {\r\n messengerService.DeleteMessageSended($scope.messageRead.IdMessage, function (data, status) {\r\n if (status === null) {\r\n $location.path('/common/messenger/sended/');\r\n } else if (status == 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n return false;\r\n } else {\r\n $scope.errorMessage = status;\r\n return false;\r\n }\r\n });\r\n } else {\r\n messengerService.DeleteMessageReceive($scope.messageRead.IdMessage, function (data, status) {\r\n if (status === null) {\r\n $location.path('/common/messenger/reception/');\r\n } else if (status == 400) {\r\n $scope.errorMessage = data[0].errors[0].Message;\r\n return false;\r\n } else {\r\n $scope.errorMessage = status;\r\n return false;\r\n }\r\n\r\n });\r\n }\r\n };\r\n \r\n $scope.ReadMessage = function (message) {\r\n $location.path('/common/messenger/read/' + message.IdMessage);\r\n };\r\n\r\n $scope.Reply = function (message) {\r\n $location.path('/common/messenger/newmessage/' + message.IdMessage);\r\n };\r\n\r\n $scope.Cancel = function () {\r\n if ($scope.iCurrent == 2)\r\n $location.path('/common/messenger/sended/');\r\n else\r\n $location.path('/common/messenger/reception/');\r\n };\r\n\r\n $scope.GetAttachment = function (p) {\r\n $window.open(configurationFactory.Url['Api'] + 'Upload/GetAttachment?p=' + p, '_self');\r\n };\r\n\r\n function resetTexts() {\r\n $scope.successMessage = \"\";\r\n $scope.errorMessage = \"\";\r\n }\r\n function initMessage() {\r\n if (!$scope.isUseCereals) {\r\n $scope.newMessage = {};\r\n $scope.newMessage.Receivers = [];\r\n }\r\n\r\n $scope.searchTextClientFromTc = \"\";\r\n $scope.selectedClient = {};\r\n $scope.newMessage.Content = \"\";\r\n $scope.newMessage.Subject = \"\";\r\n $scope.newMessage.Attachments = [];\r\n $scope.lstAttachment = [];\r\n $scope.newMessage.IdSender = currentUserFactory.User.IdUser;\r\n }\r\n\r\n /* ne pas oublier d'apeller la methode a la lecture d'un message */\r\n function majNbMsg() {\r\n messengerService.GetNbMessage(function (data, status) {\r\n $rootScope.nbmessage = data;\r\n });\r\n }\r\n $rootScope.onRefresh = function () {\r\n init();\r\n initMessage();\r\n };\r\n init();\r\n }]);\r\n","AgrimarketControllers.controller('quoteController', ['$scope', '$rootScope', '$routeParams', '$http', '$filter', '$location', '$log', '$interval', 'currentUserFactory', 'configurationFactory',\r\n 'parametersFactory', 'enumFactory', 'quoteService', 'colonnesQuote', 'colonnesQuoteWithoutRealTime',\r\n function ($scope, $rootScope, $routeParams, $http, $filter, $location, $log, $interval, currentUserFactory, configurationFactory, parametersFactory, enumFactory, quoteService, colonnesQuote, colonnesQuoteWithoutRealTime) {\r\n if (!$rootScope.ModuleCotation.Active && !$rootScope.ModuleHashtagri.Active)\r\n $location.path(\"/\");\r\n\r\n \r\n }]);\r\n","AgrimarketControllers.controller('testsocketController', [\r\n\t'$scope', '$rootScope', '$routeParams', '$http', '$filter', '$location', 'testsocketService',\r\n\tfunction ($scope, $rootScope, $routeParams, $http, $filter, $location, testsocketService) {\r\n\r\n\t var actionToOrder = $routeParams.ActionToOrder ? $routeParams.ActionToOrder : 1;\r\n\t $scope.ErrorSocketMessage = \"\";\r\n\t $scope.SuccesSocketMessage = \"\";\r\n\r\n\t var Init = function() {\r\n\t testsocketService.SendAthenaOrder(actionToOrder, function(data, status) {\r\n\t if (status !== null) {\r\n\t if (status == 400) {\r\n\t $scope.ErrorSocketMessage = data[0].errors[0].Message;\r\n\t $rootScope.loading = false;\r\n\t } \r\n\t } else {\r\n\t $scope.SuccesSocketMessage = data;\r\n\t $rootScope.loading = false;\r\n\t }\r\n\t }\r\n\t );\r\n\t };\r\n\r\n\t Init();\r\n\t}\r\n]);","AgrimarketControllers.controller('ceremisDashboardController', [\r\n '$scope', '$sce', 'authenticationService',\r\n function ($scope, $sce, authenticationService) {\r\n authenticationService.GetUrlWithTokenForDashboardsInCeremis(function (url) {\r\n $scope.targetUrl = $sce.trustAsResourceUrl(url.replace('\"', '').replace('\"', ''));\r\n });\r\n }\r\n]);","AgrimarketServices.service('cropsService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n\tfunction ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n\t\tvar SendRequest = function (configfile, callback) {\r\n\t\t\t$http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t\tcallback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t\tcallback(data, status);\r\n\t\t\t\t});\r\n\t\t};\r\n\r\n\t\tthis.GetDefaultCrop = function (callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Crop/GetDefaultCrop'\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.GetCrops = function (callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Crop/GetCrops'\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.GetCropsVisible = function (callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Crop/GetCropsVisible'\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\t\t\r\n\t\tthis.GetCropsInOffers = function (callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Crop/GetCropsInOffers'\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\t\t\r\n\t\tthis.GetCropsWithContracts = function (idTypeContract, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Crop/GetCropsWithContracts',\r\n\t\t\t\tparams: { idTypeContract: idTypeContract }\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n };\r\n\r\n this.GetCropsWithContractsBase = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Crop/GetCropsWithContractsBase'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetCropsWithContractsOption = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Crop/GetCropsWithContractsOption'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetCropsWithContractsBuiltPrice = function (idTypeContract, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Crop/GetCropsWithContractsBuiltPrice',\r\n\t\t\t\tparams: { idTypeContract: idTypeContract }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n\t\tthis.SaveCrops = function (data, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Crop/PostCrop',\r\n\t\t\t\tdata: data\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n\t}]);","AgrimarketServices.service('coverService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\t\r\n \tthis.SaveParameterCover = function (isAuto, callback) {\r\n \t var config = {\r\n \t\t\tmethod: 'POST',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Cover/SaveParameterCover',\r\n \t\t\tparams: {isAuto: isAuto}\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n \tthis.GetAllAccounts = function (callback) {\r\n \t var config = {\r\n \t method: 'GET',\r\n \t url: configurationFactory.Url['Api'] + 'Cover/GetAllAccounts',\r\n \t };\r\n \t SendRequest(config, callback);\r\n \t};\r\n\r\n\r\n \tthis.SaveParamsAccount = function (accountVm, callback) {\r\n \t var config = {\r\n \t method: 'POST',\r\n \t url: configurationFactory.Url['Api'] + 'Cover/SaveParamsAccount',\r\n \t data: accountVm\r\n \t };\r\n \t SendRequest(config, callback);\r\n \t};\r\n \r\n }]);","AgrimarketServices.service('parametersService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory','enumFactory',\r\n\tfunction ($rootScope, $http, $location, currentUserFactory, configurationFactory, enumFactory) {\r\n\r\n\t\tvar SendRequest = function (configfile, callback) {\r\n\t\t\t$http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t\tcallback(data, null, null, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status, headers, config) {\r\n\t\t\t\t\tcallback(data, status, headers, config);\r\n\t\t\t\t});\r\n\t\t};\r\n\r\n\t\tthis.GetParameters = function (callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Parameter/GetParameters'\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n\t this.GetParameterByKey = function(key, callback) {\r\n\t\t var config = {\r\n\t\t\t method: 'GET',\r\n\t\t\t url: configurationFactory.Url['Api'] + 'Parameter/GetParameterByKey',\r\n\t\t\t params: { key: key }\r\n\t\t };\r\n\t SendRequest(config, callback);\r\n\t };\r\n\r\n\t this.GetParametersByIdsGroup = function (idsGroupParameters,callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Parameter/GetParametersByIdsGroup',\r\n\t\t\t\tparams: { idsGroupParameters: idsGroupParameters }\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.SaveParameterByKey = function (key, value, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Parameter/PutParameterByKey',\r\n\t\t\t\tparams: { key: key, value: value }\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.SaveParametersGlobal = function (globalParameters, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Parameter/PutParametersGlobal',\r\n\t\t\t\tdata: globalParameters\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\t\t\r\n\t\tthis.DeleteAttachement = function (idParameter, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'DELETE',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Parameter/DeleteAttachement',\r\n\t\t\t\tparams: { idParameter: idParameter }\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.ShowAskAccessCodeLink = function (callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Parameter/ShowAskAccessCodeLink'\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\t}]);","AgrimarketServices.service('authenticationService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n 'versionService',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory, versionService) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n callback(data, status, headers, config);\r\n });\r\n };\r\n\r\n this.LoginForBackdoor = function (login, password, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url.Api + 'Authenticate/Authenticate',\r\n params: { login: login, password: password }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n var versionSite = versionService.webVersion;\r\n\r\n this.Login = function (login, password, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url.Api + 'Authenticate/AuthenticateUpdate',\r\n data: { Login: login, Password: password, UserAgent: window.navigator.userAgent, Country: navigator.language.slice(0,2), VersionSite: versionSite}\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.LoginByToken = function (token, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url.Api + 'Authenticate/AuthenticateByToken',\r\n data: { Token: token }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.LoginEditionMode = function (idUser, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url.Api + 'Authenticate/AuthenticateEditionMode',\r\n data: { IdUser: idUser }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.ResetPassword = function (keyPassword, newPassword, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Authenticate/ResetPassword',\r\n params: { keyPassword: keyPassword, newPassword: newPassword }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.LoginByConnectorOrUAC = function (loginTiers, jeton, adr, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url.Api + 'Authenticate/AuthenticateByConnectorOrUAC',\r\n params: { login: loginTiers, jeton: jeton, adr: adr }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.LoginByConnectorForCerelio = function (loginTiers, jeton, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url.Api + 'Authenticate/AuthenticateByConnectorForCerelio',\r\n params: { login: loginTiers, jeton: jeton }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.LoginByConnectorSso = function (token, param, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url.Api + 'Authenticate/AuthenticateByConnectorSso',\r\n params: { token: token, param: param }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.LoginByConnectorWithUrlReferrer = function (referrer, param, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url.Api + 'Authenticate/AuthenticateByConnectorWithUrlReferrer',\r\n params: { referrer: referrer, param: param }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.LoginByConnectorWithGuid = function (guid, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url.Api + 'Authenticate/AuthenticateByConnectorWithGuid',\r\n params: { guid: guid }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.ConnectorLoginHash = function (param, hash, idLanguage, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url.Api + 'Authenticate/AuthenticateByConnectorLoginHash',\r\n params: { param: param, hash: hash, idLanguage: idLanguage }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.RedirectOnOuiField = function (idExt, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url.Api + 'Authenticate/RedirectOnOuiField',\r\n params: { idExt: idExt }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetSynoaCultureUrlWithParameters = function (idExt, ip, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url.Api + 'Authenticate/GetSynoaCultureUrlWithParameters',\r\n params: { ip: ip, idExt: idExt }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetEditableObjectForResetPassword = function (keyPassword, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url.Api + 'Authenticate/GetEditableObjectForResetPassword',\r\n params: { keyPassword: keyPassword }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetEditableObjectsForLoginPage = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url.Api + 'Authenticate/GetEditableObjectsForLoginPage',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetUrlWithTokenForDashboardsInCeremis = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url.Api + 'Authenticate/GetUrlWithTokenForDashboardsInCeremis'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.SelectExploitation = function (idExploitation, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Authenticate/SelectExploitation',\r\n params: { idExploitation: idExploitation }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('closeDayService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetCloseDays = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'CloseDay/GetCloseDays'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n \tthis.AddCloseDay = function (closeDay, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'POST',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'CloseDay/PostCloseDay',\r\n \t\t\tdata: closeDay\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\t \r\n \tthis.EditCloseDay = function (closeDay, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'PUT',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'CloseDay/PutCloseDay',\r\n \t\t\tdata: closeDay\r\n \t\t};\r\n \t\t\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n \tthis.DeleteCloseDay = function (id, callback) {\r\n\t\t var config = {\r\n\t\t\t method: 'DELETE',\r\n\t\t\t url: configurationFactory.Url['Api'] + 'CloseDay/DeleteCloseDay',\r\n\t\t\t params : { id: id }\r\n\t\t };\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n\r\n }]);","AgrimarketServices.service('productsService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null, null, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status, headers, config) {\r\n\t\t\t \tcallback(data, status, headers, config);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetAllProducts = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Product/GetAllProducts'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n };\r\n\r\n this.GetAllProductsLight = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Product/GetAllProductsLight'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n \tthis.GetProductsInOffers = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Product/GetProductsInOffers'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n\t\tthis.GetAllImgProducts = function (callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl : configurationFactory.Url['Api'] + 'Product/GetAllImgProducts'\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n \tthis.SaveProduct = function (product, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'PUT',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Product/PutProduct',\r\n \t\t\theaders: { 'Content-Type': 'application/json' },\r\n \t\t\tdata: product\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n\t\tthis.PutImgProduct = function (imageLibraryProduct, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Product/PutImgProduct',\r\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\r\n\t\t\t\tdata: imageLibraryProduct\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n \tthis.SaveVariety = function (variety, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'PUT',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Product/PutVariety',\r\n \t\t\theaders: { 'Content-Type': 'application/json' },\r\n \t\t\tdata: variety\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n\t\tthis.CheckImageLibraryIsValid = function (IdImageLibrary) \r\n\t\t{\r\n\t\t\tif (IdImageLibrary == undefined | IdImageLibrary == null) {\r\n\t\t\t\treturn \" Veuillez choisir une image\";\r\n\t\t\t}\r\n\t\t\treturn \"\";\r\n\t\t};\r\n\r\n }]);","AgrimarketServices.service('typeDashboardActualityAppMobileService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null, null, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status, headers, config) {\r\n\t\t\t \tcallback(data, status, headers, config);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetAllTypeDashboardActualityAppMobile = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'TypeDashboardActualityAppMobile/GetAll'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n };\r\n\r\n\t\tthis.SaveTypeDashboardActualityAppMobileOrder = function (typeDashboardActualityAppMobile, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'PUT',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'TypeDashboardActualityAppMobile/PutTypeDashboardActualityAppMobile',\r\n \t\t\theaders: { 'Content-Type': 'application/json' },\r\n \t\t\tdata: typeDashboardActualityAppMobile\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n }]);","AgrimarketServices.service('typeQuotesService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetTypeQuotes = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'TypeQuotes/GetAll'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n \tthis.GetTypeQuotesInOffers = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'TypeQuotes/GetTypeQuotesInOffers'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }]);","AgrimarketServices.service('typeOffersService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetTypeOffers = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'TypeOffer/GetAll'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }]);","AgrimarketServices.service('offerVisibilityService', ['$http', 'configurationFactory',\r\n function ($http, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.GetOfferVisibilities = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'VisibilityOffer/GetAll'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('typeCoversService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetTypeCovers = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'TypeCover/GetAll'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }]);","AgrimarketServices.service('offerService', ['$rootScope', '$http', 'configurationFactory', 'editableObjectsFactory', 'parametersFactory', 'modulesFactory', 'enumFactory', 'contractingDelayService',\r\n function ($rootScope, $http, configurationFactory, editableObjectsFactory, parametersFactory, modulesFactory, enumFactory, contractingDelayService) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.GetDefaultFilters = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/GetDefaultFilters',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetAllOffers = function (idStatus, idCrop, idProduct, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/GetAll',\r\n params: { idStatus: idStatus, idCrop: idCrop, idProduct: idProduct }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetAllOffersFinalisedActives = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/GetAllFinalisedActives'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetOfferById = function (id, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/GetById',\r\n params: { idOffer: id }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetOfferByIdAndIdExpiry = function (idOffer, idExpiry, idTypeFixation, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/GetOfferByIdAndIdExpiry',\r\n params: { idOffer: idOffer, idExpiry: idExpiry, idTypeFixation: idTypeFixation }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetBodyOffer = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/GetBody'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.SaveOffer = function (offer, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Offer/Save',\r\n data: offer\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.SaveParameterOffer = function (offer, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Offer/SaveParameterOffer',\r\n data: offer\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.SaveParametersOfferByCover = function (cover, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Offer/SaveParametersOfferByCover',\r\n data: cover\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DeleteOffer = function (id, callback) {\r\n var config = {\r\n method: 'DELETE',\r\n url: configurationFactory.Url['Api'] + 'Offer/DeleteOffer',\r\n params: { idOffer: id }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetDataOfferPaginateWithFilter = function (idCrop, idTypeOffer, idProduct, idContractCommitment, max, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/GetDataOfferPaginateWithFilter',\r\n params: {\r\n idCrop: idCrop,\r\n idTypeOffer: idTypeOffer,\r\n idProduct: idProduct,\r\n idContractCommitment: idContractCommitment,\r\n itemPerPage: max,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetAllFinalisedActivesVm = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/GetAllFinalisedActivesVm'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DeleteAttachement = function (idOffer, idAttachment, callback) {\r\n var config = {\r\n method: 'DELETE',\r\n url: configurationFactory.Url['Api'] + 'Offer/DeleteAttachement',\r\n params: { idOffer: idOffer, idAttachment: idAttachment }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.AllowUserToSubscribreToday = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/AllowUserToSubscribreToday'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.CanDeleteStrike = function (idStrike, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/CanDeleteStrike',\r\n params: { idStrike: idStrike }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n this.CheckIsValidTonnageCurrent = function (tonnageCurrent, tonnageMin, tonnageMax, quantityLeft, quotity, commitmentTonnageToFix, idTypeOrder, idTypeCover, tonnageMaxOfCompatibleComponent, tonnageMaxCropProduct, callback) {\r\n if (tonnageCurrent === null || tonnageCurrent === undefined)\r\n tonnageCurrent = '';\r\n\r\n if (tonnageMin === null || tonnageMin === undefined)\r\n tonnageMin = '';\r\n\r\n if (tonnageMax === null || tonnageMax === undefined)\r\n tonnageMax = '';\r\n\r\n if (quantityLeft === null || quantityLeft === undefined)\r\n quantityLeft = '';\r\n\r\n if (quotity === null || quotity === undefined)\r\n quotity = '';\r\n\r\n if (commitmentTonnageToFix === null || commitmentTonnageToFix === undefined)\r\n commitmentTonnageToFix = '';\r\n\r\n if (idTypeOrder === null || idTypeOrder === undefined)\r\n idTypeOrder = '';\r\n\r\n if (idTypeCover === null || idTypeCover === undefined)\r\n idTypeCover = '';\r\n\r\n if (tonnageMaxOfCompatibleComponent === null || tonnageMaxOfCompatibleComponent === undefined)\r\n tonnageMaxOfCompatibleComponent = '';\r\n\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Offer/CheckIsValidTonnageCurrent',\r\n params: { tonnageCurrent: tonnageCurrent, tonnageMin: tonnageMin, tonnageMax: tonnageMax, quantityLeft: quantityLeft, quotity: quotity, commitmentTonnageToFix: commitmentTonnageToFix, idTypeOrder: idTypeOrder, idTypeCover: idTypeCover, tonnageMaxOfCompatibleComponent: tonnageMaxOfCompatibleComponent, tonnageMaxCropProduct: tonnageMaxCropProduct }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.CheckIsValidHectaresCurrent = function (surfaceCurrent, surfaceMin, surfaceMax, quantityLeft, quotity, callback) {\r\n\r\n if (surfaceCurrent === null || surfaceCurrent === undefined) surfaceCurrent = '';\r\n\r\n if (surfaceMin === null || surfaceMin === undefined) surfaceMin = '';\r\n\r\n if (surfaceMax === null || surfaceMax === undefined) surfaceMax = '';\r\n\r\n if (quantityLeft === null || quantityLeft === undefined)\r\n quantityLeft = '';\r\n\r\n if (quotity === null || quotity === undefined)\r\n quotity = '';\r\n\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Offer/CheckIsValidHectaresCurrent',\r\n params: { surfaceCurrent: surfaceCurrent, surfaceMin: surfaceMin, surfaceMax: surfaceMax, quantityLeft: quantityLeft, quotity: quotity}\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n\r\n this.GenerateStrikeAuto = function (strikeAutoVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Offer/GenerateStrikeAuto',\r\n data: strikeAutoVm\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.SaveVariablesForOffers = function (postData, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Offer/SaveVariablesForOffers',\r\n data: postData\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DisableOrEnableOffers = function (offerAction, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Offer/DisableOrEnableOffers',\r\n data: offerAction\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetOfferPrice = function (idExpiry, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/GetOfferPrice',\r\n params: { idExpiry: idExpiry }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetInfoBuiltPriceForAdmin = function (idOffer, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/GetInfoBuiltPriceForAdmin',\r\n params: { idOffer: idOffer }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.PostInfoBuiltPriceForAdmin = function (infoBuiltPriceSaveForAdminVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Offer/PostInfoBuiltPriceForAdmin',\r\n data : infoBuiltPriceSaveForAdminVm\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetInfoBuiltPriceObservationsForAdmin = function (idOffer, startDateFilter, endDateFilter, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Offer/GetInfoBuiltPriceObservationsForAdmin',\r\n params: { idOffer: idOffer, startDateFilter: startDateFilter, endDateFilter: endDateFilter }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DeleteOfferMessage = function (id, callback) {\r\n var config = {\r\n method: 'DELETE',\r\n url: configurationFactory.Url['Api'] + 'Offer/DeleteOfferMessage',\r\n params: { idOfferMessage: id }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetOfferMessageVm = function (idOffer, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/GetOfferMessageVm',\r\n params: { idOffer: idOffer }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.PostOfferMessageVm = function (offerMessageVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Offer/PostOfferMessageVm',\r\n data : offerMessageVm\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetDataOfferUserIncidence = function (idOffer, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/GetDataOfferUserIncidence',\r\n params: { idOffer: idOffer }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.SaveOfferUserIncidence = function (offerUserIncidenceVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Offer/SaveOfferUserIncidence',\r\n data : offerUserIncidenceVm\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DeleteOfferUserIncidence = function (id, callback) {\r\n var config = {\r\n method: 'DELETE',\r\n url: configurationFactory.Url['Api'] + 'Offer/DeleteOfferUserIncidence',\r\n params: { idOfferUserIncidence: id }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.MultiplicatationForGoodDecimal = function (firstValue, secondValue, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Offer/MultiplicatationForGoodDecimal',\r\n params: { firstValue: firstValue, secondValue: secondValue}\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);\r\n","AgrimarketServices.service('wsdApiService', ['$rootScope', '$http', '$location', 'configurationFactory',\r\n function ($rootScope, $http, $location, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n callback(data, status, headers, config);\r\n });\r\n };\r\n\r\n this.GetExpiriesWSDByIdMarket = function (idMarket, callback) {\r\n var config = {\r\n method: 'get',\r\n url: configurationFactory.Url['Api'] + 'WsdApi/GetMarketByIdMarket',\r\n params: {\r\n idMarket: idMarket\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetExpiriesWSDByIdMarketWithQuotes = function (idMarket, idTypeQuote, typeLocat, callback) {\r\n var config = {\r\n method: 'get',\r\n url: configurationFactory.Url['Api'] + 'WsdApi/GetMarketByIdMarketWithExpiriesQuotes',\r\n params: {\r\n idMarket: idMarket,\r\n idTypeQuote: idTypeQuote,\r\n typeLocat: typeLocat\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetMarketsWSDToEuronext = function (callback) {\r\n var config = {\r\n method: 'get',\r\n url: configurationFactory.Url['Api'] + 'WsdApi/GetMarketsByLocat'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetMarketsFutureAndCash = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'WsdApi/GetMarketsFutureAndCash'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetLastValueForexWSDByIdCurrencies = function (idCurrency1, idCurrency2 , callback) {\r\n var config = {\r\n method: 'get',\r\n url: configurationFactory.Url['Api'] + 'WsdApi/GetLastValueForexWSDByIdCurrencies',\r\n params: {\r\n idCurrency1: idCurrency1,\r\n idCurrency2: idCurrency2\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n }]);","AgrimarketServices.service('editableObjectsService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n\tfunction ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n\t\tvar sendRequest = function (configfile, callback) {\r\n\t\t\t$http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t\tcallback(data, null, null, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status, headers, config) {\r\n\t\t\t\t\tcallback(data, status, headers, config);\r\n\t\t\t\t});\r\n\t\t};\r\n\r\n\t\tthis.GetEditableObjectsAndMenu = function (callback) {\r\n\t\t var config = {\r\n\t\t method: 'GET',\r\n\t\t url: configurationFactory.Url['Api'] + 'EditableObject/GetEditableObjectsAndMenu'\r\n\t\t };\r\n\t\t sendRequest(config, callback);\r\n\t\t};\r\n\r\n\r\n\t\tthis.GetEditableMenuByKey = function (keyParent, callback) {\r\n\t\t var config = {\r\n\t\t method: 'GET',\r\n\t\t url: configurationFactory.Url['Api'] + 'EditableObject/GetEditableMenuByKey',\r\n\t\t params: { keyParent: keyParent }\r\n\t\t };\r\n\t\t sendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.SaveEditableObject = function (editableObject, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'EditableObject/SaveEditableObject',\r\n\t\t\t\tdata: editableObject\r\n\t\t\t};\r\n\r\n\t\t\tsendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.UpdateContentEditableObject = function (editableObjects, callback) {\r\n\t\t var config = {\r\n\t\t method: 'POST',\r\n\t\t url: configurationFactory.Url['Api'] + 'EditableObject/UpdateContentEditableObject',\r\n\t\t data: editableObjects\r\n\t\t };\r\n\r\n\t\t sendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.SaveEditableObjects = function (editableObjects, callback) {\r\n\t\t var config = {\r\n\t\t method: 'POST',\r\n\t\t url: configurationFactory.Url['Api'] + 'EditableObject/SaveEditableObjects',\r\n\t\t data: editableObjects\r\n\t\t };\r\n\r\n\t\t sendRequest(config, callback);\r\n\t\t};\r\n\r\n}]);","AgrimarketServices.service('deliveryPeriodService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n\tfunction ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n\t\tvar SendRequest = function (configfile, callback) {\r\n\t\t\t$http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t\tcallback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t\tcallback(data, status);\r\n\t\t\t\t});\r\n\t\t};\r\n\t\r\n\t\tthis.GetAll = function (callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'DeliveryPeriod/GetAll'\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\t}]);","AgrimarketServices.service('validityDurationService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetAll = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'ValidityDuration/GetAll'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }]);","AgrimarketServices.service('modelContractService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\t\r\n \tthis.GetAll = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'ModelContract/GetAll'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }]);","AgrimarketServices.service('groupContactService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.GetAll = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'GroupContact/GetAll'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetAllForManage = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'GroupContact/GetAllForManage'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetUserForGroup = function (idgroupContact, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'GroupContact/GetUserForGroup',\r\n params: { idGroup: idgroupContact }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.SaveGroupContact = function (groupContact, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'GroupContact/SaveGroupContact',\r\n data: groupContact\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DeleteGroupContact = function (idgroupContact, callback) {\r\n var config = {\r\n method: 'DELETE',\r\n url: configurationFactory.Url['Api'] + 'GroupContact/DeleteGroupContact',\r\n params: { id: idgroupContact }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.AddUserInGroupContact = function (idGroupContact, idUser, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'GroupContact/AddUserInGroupContact',\r\n params: { idGroupContact: idGroupContact, idUser: idUser }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.RemoveUserInGroupContact = function (idGroupContact, idUser, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'GroupContact/RemoveUserInGroupContact',\r\n params: { idGroupContact: idGroupContact, idUser: idUser }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetGroupContactsInOffers = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'GroupContact/GetGroupContactsInOffers'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('contractsService', ['$http', '$rootScope', 'configurationFactory', 'enumFactory', '$filter',\r\n function ($http, $rootScope, configurationFactory, enumFactory, $filter) {\r\n\r\n var sendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.GetValidatedContractsPaginate = function (idStateCover, idCrop, idProduct, idTypeOrder, date, idContractStr, numClient, idCompagny, idContractBaseStr, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetValidatedContractsPaginate',\r\n params: {\r\n idStateCover: idStateCover,\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n idTypeOrder: idTypeOrder,\r\n date: date,\r\n idContractStr: idContractStr,\r\n idContractBaseStr: idContractBaseStr,\r\n numClient: numClient,\r\n idCompagny: idCompagny,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetPendingContractsPaginate = function (idStateCover, idCrop, idProduct, idTypeOrder, date, idContractStr, numClient, idCompagny, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetPendingContractsPaginate',\r\n params: {\r\n idStateCover: idStateCover,\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n idTypeOrder: idTypeOrder,\r\n date: date,\r\n idContractStr: idContractStr,\r\n numClient: numClient,\r\n idCompagny: idCompagny,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetToValidatedContractsPaginate = function (idCrop, idProduct, idTypeOrder, date, idContractStr, numClient, idCompagny, nameContractor, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetToValidatedContractsPaginate',\r\n params: {\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n idTypeOrder: idTypeOrder,\r\n date: date,\r\n idContractStr: idContractStr,\r\n numClient: numClient,\r\n idCompagny: idCompagny,\r\n nameContractor: nameContractor,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetCanceledContractsPaginate = function (idCrop, idProduct, idTypeOrder, date, idContractStr, numClient, idCompagny, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetCanceledContractsPaginate',\r\n params: {\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n idTypeOrder: idTypeOrder,\r\n date: date,\r\n idContractStr: idContractStr,\r\n numClient: numClient,\r\n idCompagny: idCompagny,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetDelayedSigningContractsPaginate = function (idCrop, idProduct, date, numClient, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetDelayedSigningContractsPaginate',\r\n params: {\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n date: date,\r\n numClient: numClient,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetPricedContractsPaginate = function (idStateCover, idCrop, idProduct, idTypeOrder, date, idContractStr, numClient, idCompagny, idTypeFixation, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetPricedContractsPaginate',\r\n params: {\r\n idStateCover: idStateCover,\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n idTypeOrder: idTypeOrder,\r\n date: date,\r\n idContractStr: idContractStr,\r\n numClient: numClient,\r\n idCompagny: idCompagny,\r\n idTypeFixation: idTypeFixation,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetIdContractsToSelect = function (idTabContracts, idStateCover, idCrop, idProduct, idTypeOrder, date, idContractStr, numClient, idCompagny, idTypeFixation, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetIdContractsToSelect',\r\n params: {\r\n idTabContracts: idTabContracts,\r\n idStateCover: idStateCover,\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n idTypeOrder: idTypeOrder,\r\n date: date,\r\n idContractStr: idContractStr,\r\n numClient: numClient,\r\n idCompagny: idCompagny,\r\n idTypeFixation: idTypeFixation\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n\r\n this.GetDetailExpiry = function (LstExpiries, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'WsdApi/GetExpiriesByIdExpiries',\r\n params: {\r\n lstExpiry: JSON.stringify(LstExpiries)\r\n }\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.CoverContrats = function (lstToCover, isValidatePriceObjectifView, isCoverContractToFixed, prixTargetPricedContractFIxed, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Contracts/CoverContractsSelected',\r\n cache: false,\r\n data: lstToCover,\r\n params: {\r\n isValidatePriceObjectifView: isValidatePriceObjectifView,\r\n isCoverContractToFixed: isCoverContractToFixed,\r\n prixTargetPricedContractFIxed: prixTargetPricedContractFIxed\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SaveDateDebutSubscriptionContract = function (callback) {\r\n var config = {\r\n method: \"POST\",\r\n url: configurationFactory.Url['Api'] + 'Contracts/SaveDateDebutSubscriptionContract',\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SaveNewContract = function (contractVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Contracts/SaveNewContract',\r\n cache: false,\r\n crossDomain: true,\r\n data: contractVm\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SignContractForDelayedSigning = function (idContract, idConnectionSelected, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Contracts/SignContractForDelayedSigning',\r\n cache: false,\r\n crossDomain: true,\r\n params: {\r\n idContract: idContract,\r\n idConnectionSelected: idConnectionSelected\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SaveNewContractAndSendSmsYouSign = function (contractVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Contracts/SaveNewContractAndSendSmsYouSign',\r\n cache: false,\r\n crossDomain: true,\r\n data: contractVm\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SetIsLogicallyDeleted = function (idContract, callback) {\r\n var config = {\r\n method: 'PUT',\r\n url: configurationFactory.Url['Api'] + 'Contracts/SetIsLogicallyDeleted',\r\n params: {\r\n idContract: idContract\r\n }\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.UpdateContract = function (currentContract, callback) {\r\n var config = {\r\n method: 'PUT',\r\n url: configurationFactory.Url['Api'] + 'Contracts/UpdateContract',\r\n data: currentContract\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetHistoContract = function (idContract, idCrop, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetHistoryContractsTargetPriceByIdInit',\r\n params: { idParentContract: idContract, idCrop: idCrop }\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetFiltersWithContractsByCropAndTabContract = function (idCrop, idTabContracts, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetFiltersWithContractsByCropAndTabContract',\r\n params: { idCrop: idCrop, idTabContracts: idTabContracts }\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetFiltersCommitmentsByCropAndProductAndTypeCommitment = function (idCrop, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetFiltersCommitmentsByCropAndProductAndTypeCommitment',\r\n params: { idCrop: idCrop }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetCompatibleCommitmentsWithFilter = function (idExpiry, max, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetCompatibleCommitmentsWithFilter',\r\n params: {\r\n idExpiry: idExpiry,\r\n itemPerPage: max,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetTypeCommitmentsByCropAndProductAndTypeCommitment = function (idCrop, idProduct, idTypeCommitment, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetTypeCommitmentsByCropAndProductAndTypeCommitment',\r\n params: { idCrop: idCrop, idProduct: idProduct, idTypeCommitment: idTypeCommitment }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetContractCommitmentsWithFilter = function (idCrop, idProduct, idTypeCommitment, max, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetContractCommitmentsWithFilter',\r\n params: {\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n idTypeCommitment: idTypeCommitment,\r\n itemPerPage: max,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetContractsCommitmentValidatedPaginate = function (idCrop, idProduct, idTypeCommitment, date, idContractStr, numClient, idCompagny, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetContractsCommitmentValidatedPaginate',\r\n params: {\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n idTypeCommitment: idTypeCommitment,\r\n date: date,\r\n idContractStr: idContractStr,\r\n numClient: numClient,\r\n idCompagny: idCompagny,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetContractsSurfaceCommitmentValidatedPaginate = function (idCrop, idProduct, date, idContractStr, numClient, idCompagny, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetContractsSurfaceCommitmentValidatedPaginate',\r\n params: {\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n date: date,\r\n idContractStr: idContractStr,\r\n numClient: numClient,\r\n idCompagny: idCompagny,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetFiltersWithContractsCommitmentByCrop = function (idCrop, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetFiltersWithContractsCommitmentByCrop',\r\n params: { idCrop: idCrop }\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetFiltersWithContractsSurfaceCommitmentByCrop = function (idCrop, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetFiltersWithContractsSurfaceCommitmentByCrop',\r\n params: { idCrop: idCrop }\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetFiltersWithContractsCommitment = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetFiltersWithContractsCommitment',\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetFiltersWithContractsSurfaceCommitment = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetFiltersWithContractsSurfaceCommitment',\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetFiltersWithUserContractsByCropAndTabContract = function (idTabContracts, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetFiltersWithUserContractsByCropAndTabContract',\r\n params: {\r\n idTabContracts: idTabContracts\r\n }\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetUserValidatedContractsPaginate = function (idCrop, idProduct, idTypeOrder, date, idContractStr, numClient, itemPerPage, pageNo, sortKey, reverse, nameOffer, idTypeContract, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetUserValidatedContractsPaginate',\r\n params: {\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n idTypeOrder: idTypeOrder,\r\n date: date,\r\n idContractStr: idContractStr,\r\n numClient: numClient,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse,\r\n nameOffer: nameOffer,\r\n idTypeContract: idTypeContract\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetUserPendingContractsPaginate = function (idCrop, idProduct, idTypeOrder, date, idContractStr, numClient, itemPerPage, pageNo, sortKey, reverse, nameOffer, idTypeContract, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetUserPendingContractsPaginate',\r\n params: {\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n idTypeOrder: idTypeOrder,\r\n date: date,\r\n idContractStr: idContractStr,\r\n numClient: numClient,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse,\r\n nameOffer: nameOffer,\r\n idTypeContract: idTypeContract\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetUserDelayedSigningContractsPaginate = function (idCrop, idProduct, date, numClient, itemPerPage, pageNo, sortKey, reverse, nameOffer, idTypeContract, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetUserDelayedSigningContractsPaginate',\r\n params: {\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n date: date,\r\n numClient: numClient,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse,\r\n nameOffer: nameOffer,\r\n idTypeContract: idTypeContract\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetUserPricedContractsPaginate = function (idCrop, idProduct, idTypeOrder, date, idContractStr, numClient, idTypeFixation, itemPerPage, pageNo, sortKey, reverse, nameOffer, idTypeContract, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetUserPricedContractsPaginate',\r\n params: {\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n idTypeOrder: idTypeOrder,\r\n date: date,\r\n idContractStr: idContractStr,\r\n numClient: numClient,\r\n idTypeFixation: idTypeFixation,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse,\r\n nameOffer: nameOffer,\r\n idTypeContract: idTypeContract\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetContractForDelayedSigning = function (idContract, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetContractForDelayedSigning',\r\n params: {\r\n idContract: idContract\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetUserCanceledContractsPaginate = function (idCrop, idProduct, idTypeOrder, date, idContractStr, numClient, itemPerPage, pageNo, sortKey, reverse, nameOffer, idTypeContract, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetUserCanceledContractsPaginate',\r\n params: {\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n idTypeOrder: idTypeOrder,\r\n date: date,\r\n idContractStr: idContractStr,\r\n numClient: numClient,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse,\r\n nameOffer: nameOffer,\r\n idTypeContract: idTypeContract\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetContractCommitmentByIdContract = function (idContract, idOffer, basePrice, targetBasePrice, marketPrice, targetPrice, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetContractCommitmentByIdContract',\r\n params: { idContract: idContract, idOffer: idOffer, basePrice: basePrice, targetBasePrice: targetBasePrice, marketPrice: marketPrice, targetPrice: targetPrice }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetTargetContractsToValidate = function (price, listOfferExpiriesVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetTargetContractsToValidate',\r\n data: {\r\n ListOfferExpiriesVm: listOfferExpiriesVm,\r\n Price: price\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.ValidTargetContracts = function (idOffer, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Contracts/ValidTargetContracts',\r\n params: { idOffer: idOffer }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetContractFutureByIdContractFuture = function (idContractFuture, basePrice, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetContractFutureByIdContractFuture',\r\n params: { idContractFuture: idContractFuture, basePrice: basePrice }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetCompatibleContractFuturesWithFilter = function (idExpiry, max, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetCompatibleContractFuturesWithFilter',\r\n params: {\r\n idExpiry: idExpiry,\r\n itemPerPage: max,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n\r\n this.GetFixationsByIdContractCommitment = function (idContractCommitment, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetFixationsByIdContractCommitment',\r\n params: {\r\n idContractCommitment: idContractCommitment,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.ChkTargetPriceIsValid = function (selectedContract, offerPriceToCompare, paramAuthorizeTargetPriceUnderOfferPrice) {\r\n if (!selectedContract.hasOwnProperty(\"NewTargetPrice\") || selectedContract.NewTargetPrice === null || selectedContract.NewTargetPrice < 0) {\r\n selectedContract.NewTargetPrice = null;\r\n return $rootScope.editableObjectsFactory.EditableObjects.Error_UserContractsFirmMonitoring_MessageTargetPrice.Content;\r\n } else {\r\n //Si fixation price\r\n if (selectedContract.IdTypeFixation == 3 && selectedContract.OfferCurrencyUnit != null && selectedContract.OfferCurrencyUnit !== undefined && selectedContract.OfferCurrencyUnit.DecimalFinal != null) {\r\n offerPriceToCompare = selectedContract.OfferPriceUpdatedWithCoeffConverted;\r\n }\r\n selectedContract.NewTargetPrice = selectedContract.NewTargetPrice.toString().replace(\",\", \".\");\r\n if (!parseFloat(selectedContract.NewTargetPrice)) {\r\n return $rootScope.editableObjectsFactory.EditableObjects.Error_UserContractsFirmMonitoring_PriceMessage.Content;\r\n } else {\r\n selectedContract.NewTargetPrice = Number(selectedContract.NewTargetPrice);\r\n }\r\n if (!paramAuthorizeTargetPriceUnderOfferPrice && selectedContract.NewTargetPrice < offerPriceToCompare) {\r\n selectedContract.NewTargetPrice = null;\r\n return $rootScope.editableObjectsFactory.EditableObjects.Error_UserContractsFirmMonitoring_TargetPriceCompareMessage.Content + \" \" + offerPriceToCompare;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n this.GetInfosForFixContractCommitment = function (idContractCommitment, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetInfosForFixContractCommitment',\r\n params: {\r\n idContractCommitment: idContractCommitment,\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n\r\n this.FixNewContractFromContractCommitment = function (vm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Contracts/FixNewContractFromContractCommitment',\r\n data: vm\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetContractTargetPrice = function (idContract, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetContractTargetPrice',\r\n params: {\r\n idContract: idContract,\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.ValidatedContract = function (idContract, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Contracts/ValidatedContract',\r\n params: {\r\n idContract: idContract,\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.RefusedContract = function (idContract, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Contracts/RefusedContract',\r\n params: {\r\n idContract: idContract,\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.EditedContract = function (contract, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Contracts/EditedContract',\r\n data: contract\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetFiltersWithContractsBuiltPriceByCrop = function (idCrop, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetFiltersWithContractsBuiltPriceByCrop',\r\n params: { idCrop: idCrop }\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetContractsBuiltPricePaginate = function (idCrop, idProduct, dateContract, idContract, numClient, idContractState, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Contracts/GetContractsBuiltPricePaginate',\r\n params: {\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n dateContract: dateContract,\r\n idContract: idContract,\r\n numClient: numClient,\r\n idContractState: idContractState,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n \r\n this.EditedBuiltPriceContract = function (idContract, newQuantity, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Contracts/EditQuantityContractBuiltPrice',\r\n params: {\r\n idContract: idContract,\r\n newQuantity: newQuantity\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.UpdateContractPendingCover = function (idContract, callback) {\r\n var config = {\r\n method: 'PUT',\r\n url: configurationFactory.Url['Api'] + 'Contracts/UpdateContractPendingCover',\r\n params: {\r\n idContract: idContract\r\n }\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n }]);","AgrimarketServices.service('contractsOptionService', ['$http', 'configurationFactory', 'enumFactory',\r\n function ($http, configurationFactory) {\r\n\r\n this.GetDataForSubscribeOption = function (idExpiry, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'ContractsOption/GetDataForSubscribeOption', \r\n params: {\r\n idExpiry: idExpiry,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n } \r\n };\r\n sendRequest(config, callback);\r\n };\r\n \r\n\r\n this.SaveNewContractOption = function (contractOptionVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'ContractsOption/SaveNewContractOption',\r\n cache: false,\r\n crossDomain: true,\r\n data: contractOptionVm\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SaveNewContractOptionAndSendSmsYouSign = function (contractOptionVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'ContractsOption/SaveNewContractOptionAndSendSmsYouSign',\r\n cache: false,\r\n crossDomain: true,\r\n data: contractOptionVm\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n var sendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.GetFiltersWithContractsOptionByCrop = function (idCrop, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'ContractOption/GetFiltersWithContractsOptionByCrop',\r\n params: { idCrop: idCrop }\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetMonitoringContractOptionExpiredPaginate = function (idCrop, idProduct, idTypeOption, date, date2, date3, idContractStr, numClient, idCompagny, itemPerPage, pageNo, sortKey, reverse, callback){\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'ContractOption/GetMonitoringContractOptionExpiredPaginate',\r\n params: {\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n idTypeOption: idTypeOption,\r\n dateCreate: date,\r\n dateExerced: date2,\r\n dateAbandoned: date3,\r\n idContractStr: idContractStr,\r\n numClient: numClient,\r\n idCompagny: idCompagny,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetMonitoringContractOptionPendingPaginate = function (idCrop, idProduct, idTypeOption, date, date2, date3, idContractStr, numClient, idCompagny, itemPerPage, pageNo, sortKey, reverse, callback){\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'ContractOption/GetMonitoringContractOptionPendingPaginate',\r\n params: {\r\n idCrop: idCrop,\r\n idProduct: idProduct,\r\n idTypeOption: idTypeOption,\r\n dateCreate: date,\r\n dateExerced: date2,\r\n dateAbandoned: date3,\r\n idContractStr: idContractStr,\r\n numClient: numClient,\r\n idCompagny: idCompagny,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetGrossGainByContractOptionId = function (idContractOption, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'ContractOption/GetGrossGainByContractOptionId',\r\n params: { idContractOption: idContractOption }\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetContractOptionDetails = function (idContractOption, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'ContractOption/GetContractOptionDetails',\r\n params: { idContractOption: idContractOption }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('userTableService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n\tfunction ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n\t\tvar SendRequest = function (configfile, callback) {\r\n\t\t\t$http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t\tcallback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t\tcallback(data, status);\r\n\t\t\t\t});\r\n\t\t};\r\n\t\r\n\t\tthis.GetById = function (name, callback) {\r\n\t\t var config = {\r\n\t\t method: 'GET',\r\n\t\t url: configurationFactory.Url['Api'] + 'ColumnTable/GetColumnTable',\r\n\t\t params: { idDefaultTable: name }\r\n\t\t };\r\n\t\t return $http(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.GetTableById = function (name, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'ColumnTable/GetColumnTable',\r\n\t\t\t\tparams: { idDefaultTable: name }\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.SaveColumn = function (val,callback) {\r\n\t\t var config = {\r\n\t\t method: 'POST',\r\n\t\t url: configurationFactory.Url['Api'] + 'ColumnTable/PostColumnTable',\r\n\t\t data: val \r\n\t\t };\r\n\t\t SendRequest(config, callback);\r\n\t\t};\r\n\t\t\r\n\t\tthis.PutColumn = function (val, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'PUT',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'ColumnTable/PutColumnTable',\r\n\t\t\t\tdata: val\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\t}]);","AgrimarketServices.service('deliveriesService', ['$http', 'configurationFactory',\r\n function ( $http, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n this.GetDeliveriesPaginateWithFilter = function (dateStart, dateEnd, idOperation, idCompagny, sortKey, reverse, pageNo, max, searchText, deliveryState, orderNumber, callback) {\r\n \t var config = {\r\n \t method: 'GET',\r\n params: {\r\n dateStart: dateStart,\r\n dateEnd: dateEnd,\r\n idOperation: idOperation,\r\n idCompagny: idCompagny,\r\n \t sortKey: sortKey,\r\n \t reverse: reverse,\r\n \t pageNo: pageNo,\r\n \t itemPerPage: max,\r\n searchText: searchText,\r\n deliveryState: deliveryState,\r\n orderNumber: orderNumber\r\n \t },\r\n \t url: configurationFactory.Url['Api'] + 'Delivery/GetDeliveriesPaginateWithFilter',\r\n \t };\r\n \t SendRequest(config, callback);\r\n \t};\r\n\r\n this.GetOperationDeliveries = function (dateStart, dateEnd, idCompagny, callback) {\r\n \t var config = {\r\n \t method: 'GET',\r\n params: {\r\n dateStart: dateStart,\r\n dateEnd: dateEnd,\r\n idCompagny: idCompagny\r\n \t },\r\n \t url: configurationFactory.Url['Api'] + 'Delivery/GetOperationDeliveries'\r\n \t };\r\n \t SendRequest(config, callback);\r\n };\r\n\r\n this.GetDeliveriesXls = function (dateStart, dateEnd, idOperation, idUser, idCompagny, idLanguage) {\r\n return configurationFactory.Url['Api'] + 'Delivery/GetDeliveriesXls/' +\r\n '?dateStart=' + dateStart +\r\n '&dateEnd=' + dateEnd +\r\n '&idOperation=' + idOperation +\r\n '&idUser=' + idUser +\r\n '&idCompagny=' + idCompagny +\r\n '&idLanguage=' + idLanguage;\r\n };\r\n\r\n this.GetFiltersByDates = function (dateStart, dateEnd, callback) {\r\n var config = {\r\n method: 'GET',\r\n params: {\r\n dateStart: dateStart,\r\n dateEnd: dateEnd\r\n },\r\n url: configurationFactory.Url['Api'] + 'Delivery/GetFiltersByDates'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('billsService', ['$http', 'configurationFactory',\r\n\tfunction ($http, configurationFactory) {\r\n\r\n\t\tvar SendRequest = function (configfile, callback) {\r\n\t\t\t$http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t\tcallback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t\tcallback(data, status);\r\n\t\t\t\t});\r\n\t\t};\r\n\t\r\n\t\tthis.GetBillsPaginateWithFilter = function (idStatusBills, startDate, endDate, idTypebill, idCompagny, searchText, max, pageNo, sortKey, reverse, callback) {\r\n\t\t\tvar config = {\r\n\t\t method: 'GET',\r\n\t\t url: configurationFactory.Url['Api'] + 'Bill/GetBillsPaginateWithFilter',\r\n\t\t params: {\r\n\t\t\t\t\tidTypebill: idTypebill,\r\n\t\t\t\t\tidStatusBills: idStatusBills,\r\n\t\t\t\t\tstartDate: startDate,\r\n\t\t\t\t\tendDate: endDate,\r\n\t\t\t\t\tidCompagny: idCompagny,\r\n\t\t searchText: searchText,\r\n\t\t itemPerPage: max,\r\n\t\t pageNo: pageNo,\r\n\t\t sortKey: sortKey,\r\n\t\t reverse: reverse\r\n\t\t }\r\n\t\t\t};\r\n\t\t SendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.GetBillsXls = function (idStatusBills, idTypeBill, idUser, idCompagny, startDate, endDate, searchText, idLanguage) {\r\n return configurationFactory.Url['Api'] + 'Bill/GetBillsXls/' +\r\n\t\t\t\t'?idStatusBills=' + idStatusBills +\r\n '&idTypeBill=' + idTypeBill +\r\n '&idUser=' + idUser +\r\n '&idCompagny=' + idCompagny +\r\n '&startDate=' + startDate +\r\n '&endDate=' + endDate +\r\n '&searchText=' + searchText +\r\n '&idLanguage=' + idLanguage;\r\n };\r\n\r\n\t\tthis.GetFilters = function (callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Bill/GetFilters',\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\t}]);","AgrimarketServices.service('contributionsService', ['$http', 'configurationFactory',\r\n\tfunction ($http, configurationFactory) {\r\n\r\n\t\tvar SendRequest = function (configfile, callback) {\r\n\t\t\t$http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t\tcallback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t\tcallback(data, status);\r\n\t\t\t\t});\r\n\t\t};\r\n\t\r\n\t\tthis.GetContributionsPaginateWithFilter = function (startDate, endDate, idCrop, idProduct, idCompagny, idOperation, searchText, max, pageNo, sortKey, reverse, callback) {\r\n\t\t var config = {\r\n\t\t \tmethod: 'GET',\r\n\t\t \tparams: {\r\n\t\t\t\t\tidCrop: idCrop,\r\n\t\t\t\t\tstartDate: startDate,\r\n\t\t\t\t\tendDate: endDate,\r\n\t\t\t\t\tidProduct: idProduct,\r\n\t\t\t\t\tidCompagny: idCompagny,\r\n\t\t \t idOperation: idOperation,\r\n\t\t \t searchText: searchText,\r\n\t\t \t itemPerPage: max,\r\n\t\t \t pageNo: pageNo,\r\n\t\t \t sortKey: sortKey,\r\n\t\t \t reverse: reverse\r\n\t\t \t},\r\n\t\t \turl: configurationFactory.Url['Api'] + 'Contribution/GetContributionsPaginateWithFilter',\r\n\t\t };\r\n\t\t SendRequest(config, callback);\r\n\t\t};\r\n\r\n this.GetContributionsXls = function (idCrop, idOperation, idUser, productSelected, idCompagny, startDate, endDate, searchText, idLanguage) {\r\n return configurationFactory.Url['Api'] + 'Contribution/GetContributionsXls/' +\r\n '?idCrop=' + idCrop +\r\n '&idOperation=' + idOperation +\r\n '&idUser=' + idUser +\r\n '&productSelected=' + productSelected +\r\n '&idCompagny=' + idCompagny +\r\n '&startDate=' + startDate +\r\n '&endDate=' + endDate +\r\n '&searchText=' + searchText +\r\n '&idLanguage=' + idLanguage;\r\n };\r\n\r\n\t\tthis.GetTypeOperations = function (startDate, endDate, idCrop, idProduct, idCompagny, callback) {\r\n\t\t var config = {\r\n\t\t method: 'GET',\r\n\t\t params: {\r\n\t\t\t\t\tidCrop: idCrop,\r\n\t\t\t\t\tstartDate: startDate,\r\n\t\t\t\t\tendDate: endDate,\r\n\t\t\t\t\tidProduct: idProduct,\r\n\t\t\t\t\tidCompagny: idCompagny\r\n\t\t },\r\n\t\t url: configurationFactory.Url['Api'] + 'Contribution/GetTypeOperations',\r\n\t\t };\r\n\t\t SendRequest(config, callback);\r\n\t\t};\r\n\t \r\n\t\tthis.GetFiltersByIdCrop = function (idCrop, callback) {\r\n\t\t var config = {\r\n\t\t method: 'GET',\r\n\t\t params: {\r\n\t\t idCrop: idCrop\r\n\t\t },\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Contribution/GetFiltersByIdCrop',\r\n\t\t };\r\n\t\t SendRequest(config, callback);\r\n\t\t};\r\n\t}]);","AgrimarketServices.service('operationService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetOperationsByTreatment = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Operation/GetOperationsByTreatment'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n\t\tthis.GetOperationsForAlertMail = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Operation/GetOperationsForAlertMail'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n\t\tthis.GetOperationsInOffers = function (callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Operation/GetOperationsInOffers'\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n }]);","AgrimarketServices.service('categoryArticleService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n\tfunction ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n\t\tvar SendRequest = function (configfile, callback) {\r\n\t\t\t$http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t\tcallback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t\tcallback(data, status);\r\n\t\t\t\t});\r\n\t\t};\r\n\r\n\t\tthis.GetCategoryArticle = function (callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'CategoryArticle/GetCategoryArticle'\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n\t}]);","AgrimarketServices.service('articleService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory', '$timeout',\r\n\tfunction ($rootScope, $http, $location, currentUserFactory, configurationFactory, $timeout) {\r\n\r\n\t var SendRequest = function (configfile, callback) {\r\n\t return $http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t callback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t callback(data, status);\r\n\t\t\t\t});\r\n\t };\r\n\r\n\t this.GetArticles = function (callback) {\r\n\t var config = {\r\n\t method: 'GET',\r\n\t url: configurationFactory.Url['Api'] + 'Article/GetArticles'\r\n\t };\r\n\t SendRequest(config, callback);\r\n\t };\r\n\r\n\t this.PostArticles = function (lstUserArticles, skin, callback) {\r\n\t var config = {\r\n\t method: 'POST',\r\n\t url: configurationFactory.Url['Api'] + 'Article/PostUserArticles',\r\n\t data: lstUserArticles,\r\n\t params: { skin: skin }\r\n\t };\r\n\t SendRequest(config, callback);\r\n\t };\r\n\r\n\t this.FindArticle = function(searchString, timeoutPromise, callback) {\r\n\t var config = {\r\n\t method: 'GET',\r\n\t url: configurationFactory.Url['Api'] + 'Article/FindArticle',\r\n\t params: { searchString: searchString }\r\n\t };\r\n\t return SendRequest(config, callback);\r\n\t };\r\n\r\n\t this.GetUserArticlesWithFilter = function (searchText, max, pageNo, sortKey, reverse, callback) {\r\n\t var config = {\r\n\t method: 'GET',\r\n\t url: configurationFactory.Url['Api'] + 'Article/GetUserArticlesWithFilter',\r\n\t params: {\r\n\t \tsearchText: searchText,\r\n\t \titemPerPage: max,\r\n\t \tpageNo: pageNo,\r\n\t \tsortKey: sortKey,\r\n\t \treverse: reverse\r\n\t }\r\n\t };\r\n\t SendRequest(config, callback);\r\n\t };\r\n\t}]);","AgrimarketServices.service('dateService', [\r\n function() {\r\n this.compareDate = function(date1, date2) {\r\n var newDate1 = date1.split('/');\r\n var newDate2 = date2.split('/');\r\n\r\n if (newDate1[2] == newDate2[2] && newDate1[1] == newDate2[1] && newDate1[0] == newDate2[0]) {\r\n return false;\r\n }\r\n\r\n if (newDate1[2] == newDate2[2] && newDate1[1] == newDate2[1] && newDate1[0] > newDate2[0]) {\r\n return false;\r\n }\r\n\r\n if (newDate1[2] == newDate2[2] && newDate1[1] > newDate2[1]) {\r\n return false;\r\n }\r\n\r\n if (newDate1[2] > newDate2[2]) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n this.compareDate1SuperiorDate2 = function (date1, date2) {\r\n if (date1 && date2 && date1 >= date2)\r\n return true;\r\n else\r\n return false;\r\n };\r\n\r\n this.compareDateOverride = function (date1, date2) {\r\n var newDate1 = date1.split('/');\r\n var newDate2 = date2.split('/');\r\n\r\n if (newDate1[2] == newDate2[2] && newDate1[1] == newDate2[1] && newDate1[0] == newDate2[0]) {\r\n return true;\r\n }\r\n\r\n if (newDate1[2] == newDate2[2] && newDate1[1] == newDate2[1] && newDate1[0] > newDate2[0]) {\r\n return false;\r\n }\r\n\r\n if (newDate1[2] == newDate2[2] && newDate1[1] > newDate2[1]) {\r\n return false;\r\n }\r\n\r\n if (newDate1[2] > newDate2[2]) {\r\n return false;\r\n }\r\n\r\n return true;\r\n };\r\n\r\n this.VerifDateIsCalendar = function(date) {\r\n var dateCheck = date.split(\"/\");\r\n dateCheck[1] -= 1;\r\n var newDate = new Date(dateCheck[2], dateCheck[1], dateCheck[0]);\r\n return newDate.getFullYear() != dateCheck[2] || newDate.getMonth() != dateCheck[1] ? false : true;\r\n };\r\n\r\n this.getFormatDateFromApi = function(date) {\r\n var newDate = date.substr(0, 10).split('-');\r\n return newDate[2] + \"/\" + newDate[1] + \"/\" + newDate[0];\r\n };\r\n\r\n this.ConvertDateToDateAPI = function(date) {\r\n var newDate = date.split('/');\r\n return new Date(Date.UTC(newDate[2], newDate[1] - 1, newDate[0]));\r\n };\r\n\r\n this.toStringddMMyyyy = function(date) {\r\n var day = date.getDate();\r\n var month = date.getMonth() + 1;\r\n var year = date.getFullYear();\r\n var day2 = '' + day;\r\n var month2 = '' + month;\r\n \r\n if (day < 10)\r\n day2 = '0' + day;\r\n if (month < 10)\r\n month2 = '0' + month;\r\n\r\n return day2 + '/' + month2 + '/' + year;\r\n\r\n };\r\n }\r\n]);","AgrimarketServices.service(\"backdoorService\", [\r\n '$rootScope', '$http', '$location', 'configurationFactory',\r\n function($rootScope, $http, $location, configurationFactory) {\r\n\r\n var sendRequest = function(configfile, callback) {\r\n $http(configfile)\r\n .success(function(data) {\r\n callback(data, null, null, null);\r\n })\r\n .error(function(data, status, headers, config) {\r\n callback(data, status, headers, config);\r\n });\r\n };\r\n this.LogBackdoor = function (logBackdoor, passwordBackdoor, callback) {\r\n var config = {\r\n method: \"POST\",\r\n url: configurationFactory.Url['Api'] + \"Backdoor/LogBackdoor\",\r\n params: { logBackdoor: logBackdoor, passwordBackdoor: passwordBackdoor }\r\n\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n }\r\n]);","AgrimarketServices.service('compagnyService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.GetAll = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Compagny/GetAll',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetAllCompagnies = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Compagny/GetAllCompagnies'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.SaveCompagnie = function (compagnie, callback) {\r\n var config = {\r\n method: 'PUT',\r\n url: configurationFactory.Url['Api'] + 'Compagny/PutCompagnie',\r\n headers: { 'Content-Type': 'application/json' },\r\n data: compagnie\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n}]);","AgrimarketServices.service('uploadService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n\tfunction ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n\t var SendRequest = function (configfile, callback) {\r\n\t $http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t callback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t callback(data, status);\r\n\t\t\t\t});\r\n\t };\r\n\r\n\t this.DeleteUpload = function (idAttachment, callback) {\r\n\t var config = {\r\n\t method: 'DELETE',\r\n\t url: configurationFactory.Url['Api'] + 'Upload/DeleteUpload',\r\n\t params: { idAttachment: idAttachment }\r\n\t };\r\n\t SendRequest(config, callback);\r\n\r\n\t };\r\n\r\n\t this.GetFileName = function (p, callback) {\r\n\t var config = {\r\n\t method: 'GET',\r\n\t url: configurationFactory.Url['Api'] + 'Upload/GetFileName',\r\n\t params: { p : p}\r\n\r\n\t };\r\n\t SendRequest(config, callback);\r\n\t };\r\n\t}]);","AgrimarketServices.service('templatesService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n callback(data, status, headers, config);\r\n });\r\n };\r\n\r\n this.GetTemplates = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Template/GetTemplates'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n this.GetTemplateById = function (idTemplate,callback) {\r\n \tvar config = {\r\n \t\tmethod: 'GET',\r\n \t\turl: configurationFactory.Url['Api'] + 'Template/GetTemplateById',\r\n \t\tparams: { idTemplate: idTemplate }\r\n \t};\r\n \tSendRequest(config, callback);\r\n };\r\n\r\n this.GetAllTypeTemplate = function(callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Template/GetTypeTemplates'\r\n };\r\n SendRequest(config, callback);\r\n }; \r\n\r\n this.SaveTemplate = function (template, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Template/SaveTemplate',\r\n data: template\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.UpdateTemplate = function (template, callback) {\r\n var config = {\r\n method: 'PUT',\r\n url: configurationFactory.Url['Api'] + 'Template/UpdateTemplate',\r\n data: template\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DeleteTemplate = function (idTemplate, callback) {\r\n var config = {\r\n method: 'DELETE',\r\n url: configurationFactory.Url['Api'] + 'Template/DeleteTemplate',\r\n params: { idTemplate: idTemplate }\r\n };\r\n\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DisableTemplate = function (idTemplate, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Template/DisableTemplate',\r\n params: { idTemplate: idTemplate }\r\n };\r\n\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.OverviewTemplate = function (template, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Template/OverviewTemplate',\r\n data: template\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('templateMailsService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.GetAllTypeTemplateMails = function (idLanguage, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'TypeTemplateMail/GetAllTypeTemplateMails',\r\n params: { idLanguage: idLanguage }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.SaveTemplateMail = function (template, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'TemplateMail/SaveTemplateMail',\r\n data: template\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetTemplateByIdTypeTemplateMailAndIdRoleAndIdLanguage = function (idTypeTemplateMail, idRole, idLanguage, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'TemplateMail/GetTemplateByIdTypeTemplateMailAndIdRoleAndIdLanguage',\r\n params: { idTypeTemplateMail: idTypeTemplateMail, idRole: idRole, idLanguage : idLanguage }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.SaveConfigMails = function (templateMailsVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'TypeTemplateMail/SaveConfigMails',\r\n data: templateMailsVm\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('communicationMarketInfoService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.GetAllCommunicationMarketInfoPaginate = function (idCommunicationMarketInfoSelected, searchLabelCommunicationMarketInfotring, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'CommunicationMarketInfo/GetAllCommunicationMarketInfoPaginate',\r\n params: {\r\n idCommunicationMarketInfoSelected: idCommunicationMarketInfoSelected,\r\n searchLabelCommunicationMarketInfotring: searchLabelCommunicationMarketInfotring,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetItemsCommunicationMarketInfoByAutoComplete = function (searchString, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'CommunicationMarketInfo/GetItemsCommunicationMarketInfoByAutoComplete',\r\n params: { searchString: searchString }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetById = function (id, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'CommunicationMarketInfo/GetById',\r\n params: { id: id }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.Save = function (comMarketInfo, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'CommunicationMarketInfo/Save',\r\n data: comMarketInfo\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DeleteCommunicationMarketInfo = function (idCommunicationMarketInfo, idCommunicationMarketInfoSelected, searchLabelCommunicationMarketInfotring, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'DELETE',\r\n url: configurationFactory.Url['Api'] + 'CommunicationMarketInfo/DeleteCommunicationMarketInfo',\r\n params: {\r\n idCommunicationMarketInfo: idCommunicationMarketInfo,\r\n idCommunicationMarketInfoSelected: idCommunicationMarketInfoSelected,\r\n searchLabelCommunicationMarketInfotring: searchLabelCommunicationMarketInfotring,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n\r\n SendRequest(config, callback);\r\n };\r\n}]);","AgrimarketServices.service('alertMailService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.GetAlertMailsPaginate = function (isTabAlertMailsEnabled, idGroupContact, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'AlertMail/GetAlertMails',\r\n params: {\r\n isTabAlertMailsEnabled: isTabAlertMailsEnabled,\r\n idGroupContact: idGroupContact,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.EditAlertMailState = function (alertMailAction, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'AlertMail/EditAlertMailState',\r\n data: alertMailAction\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DeleteAlertMail = function (idAlertMail, callback) {\r\n var config = {\r\n method: 'DELETE',\r\n url: configurationFactory.Url['Api'] + 'AlertMail/DeleteAlertMail',\r\n params: { idAlertMail: idAlertMail }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetAlertMailById = function (idAlertMail, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'AlertMail/GetAlertMailById',\r\n params: { idAlertMail: idAlertMail }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetTypeSends = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'AlertMail/GetTypeSends',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetDaysOfWeek = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'AlertMail/GetDaysOfWeek',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetWeekNumbers = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'AlertMail/GetWeekNumbers',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.CheckStep = function (alertMailAction, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'AlertMail/CheckStep',\r\n data: alertMailAction\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.SaveAlertMail = function (alertMailAction, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'AlertMail/Save',\r\n data: alertMailAction\r\n };\r\n SendRequest(config, callback);\r\n };\r\n}]);","AgrimarketServices.service('accuWeatherCallService', ['$http', 'configurationFactory',\r\n function ($http, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.GetAccuWeatherCallsPaginate = function (startDate, endDate, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'AccuWeatherCall/GetAccuWeatherCalls',\r\n params: {\r\n startDate: startDate,\r\n endDate: endDate,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetFilterAccuWeatherCall = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'AccuWeatherCall/GetFilterAccuWeatherCall',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetSumMonthAccuWeatherCalls = function (startDate, endDate, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'AccuWeatherCall/GetSumMonthAccuWeatherCalls',\r\n params: {\r\n startDate: startDate,\r\n endDate: endDate\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n}]);","AgrimarketServices.service('tagsService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n callback(data, status, headers, config);\r\n });\r\n };\r\n \r\n this.GetTagsForTemplatesMails = function (idTypeTemplateMail, callback) {\r\n \tvar config = {\r\n \t\tmethod: 'GET',\r\n \t\turl: configurationFactory.Url['Api'] + 'Tag/GetTagsForTemplatesMails',\r\n \t\tparams: { idTypeTemplateMail: idTypeTemplateMail }\r\n \t};\r\n \tSendRequest(config, callback);\r\n };\r\n\r\n this.GetTagsByIdTypeTemplate = function (idTypeTemplate, callback) {\r\n \tvar config = {\r\n \t\tmethod: 'GET',\r\n \t\turl: configurationFactory.Url['Api'] + 'Tag/GetTagsByIdTypeTemplate',\r\n \t\tparams: { idTypeTemplate: idTypeTemplate }\r\n \t};\r\n \tSendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('pdfService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n\tfunction ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n\t\tvar SendRequest = function (configfile, callback) {\r\n\t\t\t$http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t\tcallback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t\tcallback(data, status);\r\n\t\t\t\t});\r\n\t\t};\r\n\r\n\t\tthis.GetPDFConctract = function (idcontract, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Pdf/GetContract',\r\n\t\t\t\tparams: { idcontract: idcontract }\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t\t\r\n\t\t};\r\n\t\t\r\n\t\t\r\n\t}]);","AgrimarketServices.service('newsService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n callback(data, status, headers, config);\r\n });\r\n };\r\n\r\n this.GetNewsPaginateWithFilter = function (searchText, max, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'News/GetNewsPaginateWithFilter',\r\n params: {\r\n \tsearchText: searchText,\r\n \titemPerPage: max,\r\n \tpageNo: pageNo,\r\n \tsortKey: sortKey,\r\n \treverse: reverse\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetNewsById = function (idnews, callback) {\r\n \tvar config = {\r\n \t\tmethod: 'GET',\r\n \t\turl: configurationFactory.Url['Api'] + 'News/GetNewsById',\r\n \t\tparams: { idnews: idnews }\r\n \t};\r\n \tSendRequest(config, callback);\r\n };\r\n \r\n this.SaveNews = function (news, callback) {\r\n \tvar config = {\r\n \t\tmethod: 'POST',\r\n \t\turl: configurationFactory.Url['Api'] + 'News/SaveNews',\r\n \t\tdata: news\r\n \t};\r\n \tSendRequest(config, callback);\r\n };\r\n\t \r\n this.DeleteNews = function (idnews, callback) {\r\n var config = {\r\n method: 'DELETE',\r\n url: configurationFactory.Url['Api'] + 'News/DeleteNews',\r\n params: { idnews: idnews }\r\n };\r\n\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('quoteService', ['$rootScope', '$http', '$location', 'configurationFactory',\r\n function ($rootScope, $http, $location, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null, null, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status, headers, config) {\r\n\t\t\t \tcallback(data, status, headers, config);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.AddMarket = function (market, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'POST',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Quote/PostMarket',\r\n \t\t\tdata: market\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\t \r\n \tthis.DeleteQuoteMarket = function (market, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'DELETE',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Quote/DeleteQuoteMarket',\r\n \t\t\tparams: { idmarket: market.IdQuoteMarket }\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\t \r\n \tthis.GetMarkets = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Quote/GetMarkets'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\t \r\n\t \r\n \tthis.GetQuoteExpiryBody = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Quote/GetQuoteExpiryBody'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\t \r\n \tthis.PutQuoteExpiry = function (lstmarkets, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'Put',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Quote/PutQuoteExpiry',\r\n \t\t\tdata: lstmarkets\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\t \r\n \tthis.GetSettleDataFromEuronext = function (idExpiry, idMarket, shortData, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Quote/GetSettleDataFromEuronext',\r\n \t\t\tparams: {\r\n \t\t\t\tidExpiry: idExpiry,\r\n \t\t\t\tidMarket: idMarket,\r\n \t\t\t\tshortData: shortData\r\n \t\t\t}\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\t \r\n \tthis.GetLstMarketsCotationsDelayed = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Quote/GetLstMarketsCotationsDelayed'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }]);","AgrimarketServices.service('fluxrssService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n .success(function (data) {\r\n \tcallback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n \tcallback(data, status, headers, config);\r\n });\r\n \t};\r\n\r\n \tthis.GetFluxPaginateWithFilter = function (searchText, max, pageNo, sortKey, reverse, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'FluxRss/GetFluxPaginateWithFilter',\r\n \t\t\tparams: {\r\n \t\t\t\tsearchText: searchText,\r\n \t\t\t\titemPerPage: max,\r\n \t\t\t\tpageNo: pageNo,\r\n \t\t\t\tsortKey: sortKey,\r\n \t\t\t\treverse: reverse\r\n \t\t\t}\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n \tthis.PostFlux = function (data, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'POST',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'FluxRss/PostFlux',\r\n \t\t\tdata: data\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n\t this.DeleteFlux = function(idFluxRss, callback) {\r\n\t\t var config = {\r\n\t\t\t method: 'DELETE',\r\n\t\t\t url: configurationFactory.Url['Api'] + 'FluxRss/DeleteFlux',\r\n\t\t\t params: { idFluxRss: idFluxRss }\r\n\t\t };\r\n\t\t SendRequest(config, callback);\r\n\t };\r\n }]);","AgrimarketServices.service('carouselPictureService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n callback(data, status, headers, config);\r\n });\r\n };\r\n\r\n this.GetCarouselPicturePaginateWithFilter = function (searchText, max, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'carouselPicture/GetCarouselPicturePaginateWithFilter',\r\n params: {\r\n searchText: searchText,\r\n itemPerPage: max,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.PostCarouselPicture = function (data, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'carouselPicture/PostCarouselPicture',\r\n data: data\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DeleteCarouselPicture = function (idCarouselPicture, callback) {\r\n var config = {\r\n method: 'DELETE',\r\n url: configurationFactory.Url['Api'] + 'carouselPicture/DeleteCarouselPicture',\r\n params: { idCarouselPicture: idCarouselPicture }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('videoService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n .success(function (data) {\r\n \tcallback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n \tcallback(data, status, headers, config);\r\n });\r\n \t};\r\n\r\n \tthis.GetVideoPaginateWithFilter = function (searchText, max, pageNo, sortKey, reverse, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Video/GetvideoPaginateWithFilter',\r\n \t\t\tparams: {\r\n \t\t\t\tsearchText: searchText,\r\n \t\t\t\titemPerPage: max,\r\n \t\t\t\tpageNo: pageNo,\r\n \t\t\t\tsortKey: sortKey,\r\n \t\t\t\treverse: reverse\r\n \t\t\t}\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n \tthis.PostVideo = function (data, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'POST',\r\n url: configurationFactory.Url['Api'] + 'video/PostVideo',\r\n \t\t\tdata: data\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n\t this.DeleteVideo = function(idVideo, callback) {\r\n\t\t var config = {\r\n\t\t\t method: 'DELETE',\r\n url: configurationFactory.Url['Api'] + 'video/DeleteVideo',\r\n params: { idVideo: idVideo }\r\n\t\t };\r\n\t\t SendRequest(config, callback);\r\n\t };\r\n }]);","AgrimarketServices.service('dashboardService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n .success(function (data) {\r\n \tcallback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n \tcallback(data, status, headers, config);\r\n });\r\n \t};\r\n\r\n \tthis.GetDashboard = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Dashboard/GetDashboard'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n \tthis.PostPositionBlocs = function (newPosition, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'POST',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Dashboard/PostPositionBlocs',\r\n \t\t\tdata: newPosition\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }\r\n]);","AgrimarketServices.service('contentService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.GetContents = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Content/GetContent',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetProfiles= function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Content/GetProfiles',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.LoadAllGroupContact = function(callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Content/LoadAllGroupContact',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetPageContent = function (idPage,callback) {\r\n \tvar config = {\r\n \t\tmethod: 'GET',\r\n \t\turl: configurationFactory.Url['Api'] + 'Content/GetPageContent',\r\n \t\tparams: { idPage: idPage }\r\n \t};\r\n \tSendRequest(config, callback);\r\n };\r\n\r\n this.SavePosition = function (contents,callback) {\r\n \tvar config = {\r\n \t\tmethod: 'POST',\r\n \t\tdata: contents,\r\n \t\turl: configurationFactory.Url['Api'] + 'Content/SaveContent',\r\n \t};\r\n \tSendRequest(config, callback);\r\n };\r\n\r\n this.GetDatasForPageContent= function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Content/GetDatasForPageContent',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n}]);","AgrimarketServices.service('commandService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n\tfunction ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n\t\tvar SendRequest = function (configfile, callback) {\r\n\t\t\t$http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t\tcallback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t\tcallback(data, status);\r\n\t\t\t\t});\r\n\t\t};\r\n\t\r\n this.GetCommands = function (dateStart, dateEnd, idOperation ,callback) {\r\n\t\t var config = {\r\n\t\t method: 'GET',\r\n\t\t params: {\r\n idOperation: idOperation,\r\n dateStart: dateStart,\r\n dateEnd: dateEnd\r\n\t\t },\r\n\t\t url: configurationFactory.Url['Api'] + 'Command/GetCommands'\r\n\t\t };\r\n\t\t SendRequest(config, callback);\r\n\t\t};\r\n\r\n this.GetCommandsXls = function (dateStart, dateEnd, idOperation, idUser, idCompagny, idLanguage) {\r\n\t\t\treturn configurationFactory.Url['Api'] + 'Command/GetCommandsXls/' +\r\n '?dateStart=' + dateStart +\r\n '&dateEnd=' + dateEnd +\r\n\t\t\t\t'&idOperation=' + idOperation +\r\n\t\t\t\t'&idUser=' + idUser +\r\n\t\t\t\t'&idCompagny=' + idCompagny +\r\n\t\t\t\t'&idLanguage=' + idLanguage;\r\n\t\t};\r\n\r\n this.GetCommandsPaginateWithFilter = function (dateStart, dateEnd, idOperation, idCompagny, searchText, idCommandDeliveryStateSelected, callback) {\r\n\t\t var config = {\r\n\t\t method: 'GET',\r\n\t\t params: {\r\n\t\t\t\t\tidOperation: idOperation,\r\n dateStart: dateStart,\r\n dateEnd: dateEnd,\r\n\t\t\t\t\tidCompagny: idCompagny,\r\n\t\t\t\t\tsearchText: searchText,\r\n idCommandDeliveryState: idCommandDeliveryStateSelected\r\n\t\t },\r\n\t\t url: configurationFactory.Url['Api'] + 'Command/GetCommandsPaginateWithFilter'\r\n\t\t };\r\n\t\t SendRequest(config, callback);\r\n\t\t};\r\n\r\n this.GetOperationCommands = function (dateStart, dateEnd, idCompagny, idExtCommandForOperation, callback) {\r\n\t\t var config = {\r\n\t\t method: 'GET',\r\n\t\t params: {\r\n\t\t dateStart: dateStart,\r\n\t\t dateEnd: dateEnd,\r\n\t\t idCompagny: idCompagny,\r\n idExtCommandForOperation: idExtCommandForOperation\r\n\t\t },\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Command/GetOperationCommands'\r\n\t\t };\r\n\t\t SendRequest(config, callback);\r\n };\r\n\r\n this.GetFiltersByDates = function (dateStart, dateEnd, callback) {\r\n var config = {\r\n method: 'GET',\r\n params: {\r\n dateStart: dateStart,\r\n dateEnd: dateEnd\r\n },\r\n url: configurationFactory.Url['Api'] + 'Command/GetFiltersByDates'\r\n };\r\n SendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.GetArticlesFromCommandPaginate = function (orderNumber, sortKey, reverse, pageNo, max, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\tparams: {\r\n\t\t\t\t\torderNumber: orderNumber,\r\n\t\t\t\t\tsortKey: sortKey,\r\n\t\t\t\t\treverse: reverse,\r\n\t\t\t\t\tpageNo: pageNo,\r\n\t\t\t\t\titemPerPage: max\r\n\t\t\t\t},\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'Command/GetArticlesFromCommandPaginate'\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\t}]);","AgrimarketServices.service('userService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory', 'versionService',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory, versionService) {\r\n var sendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n callback(data, status, headers, config);\r\n });\r\n };\r\n\r\n this.GetUserByIdRole = function (idrole, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'User/GetUserByIdRole',\r\n params: { idrole: idrole }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetUserByIdRolePaginate = function (idrole, itemPerPage, pageNo, sortKey, reverse, filter, isActif, idCompagny, idGroupContact, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'User/GetUserByIdRolePaginate',\r\n params: {\r\n idrole: idrole,\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse,\r\n filter: filter,\r\n isActif: isActif,\r\n idCompagny: idCompagny,\r\n idGroupContact: idGroupContact\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetUserId = function (idrole, sortKey, reverse, filter, isActif, idCompagny, idGroupContact, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'User/GetUserId',\r\n params: {\r\n idrole: idrole,\r\n sortKey: sortKey,\r\n reverse: reverse,\r\n filter: filter,\r\n isActif: isActif,\r\n idCompagny: idCompagny,\r\n idGroupContact: idGroupContact\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SaveClientSelectedFromTC = function (idUser, refreshMenus, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'User/SaveClientSelectedFromTC',\r\n params: { idUser: idUser, refreshMenus: refreshMenus }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.DisconnectClientSelectedFromTC = function (callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'User/DisconnectClientSelectedFromTC'\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.DoUsersAction = function (userAction, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'User/DoUsersAction',\r\n data: userAction\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetAllUser = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'User/GetAllUserGroup'\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SaveUser = function (user, callback) {\r\n var config = {\r\n method: \"POST\",\r\n url: configurationFactory.Url['Api'] + 'User/UserVm',\r\n data: user\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.DeleteLogicallyUser = function (idUser, callback) {\r\n var config = {\r\n method: \"PUT\",\r\n url: configurationFactory.Url['Api'] + 'User/DeleteLogicallyUser',\r\n params: { idUser: idUser }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.CheckExistOrderUserInExecution = function (idUser, callback) {\r\n var config = {\r\n method: \"POST\",\r\n url: configurationFactory.Url['Api'] + 'User/CheckExistOrderUserInExecution',\r\n params: { idUser: idUser }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetAccountStateUser = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'User/GetAccountStateUser',\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.UnsubscribeNewsMarketInfoByIdExt = function (param, hash, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url.Api + 'User/UnsubscribeNewsMarketInfoByIdExt',\r\n params: { idExt: param, hash: hash }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n var versionSite = versionService.webVersion;\r\n\r\n this.SaveValidatedCGU = function (idUser, receiveNewsMarketInfo, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url.Api + 'User/SaveValidatedCGU',\r\n data: { idUser: idUser, receiveNewsMarketInfo: receiveNewsMarketInfo, UserAgent: window.navigator.userAgent, Country: navigator.language.slice(0,2), VersionSite: versionSite }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SaveLinkTc = function (idUser, idTcUser, callback) {\r\n var config = {\r\n method: \"POST\",\r\n url: configurationFactory.Url['Api'] + 'User/SaveLinkTc',\r\n params: { idUser: idUser, idTcUser: idTcUser }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SaveLanguageSelected = function (idLanguageSelected, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'User/SaveLanguageSelected',\r\n params: { idLanguageSelected: idLanguageSelected }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.DeleteLinkTc = function (idUser, idTcUser, callback) {\r\n var config = {\r\n method: \"DELETE\",\r\n url: configurationFactory.Url['Api'] + 'User/DeleteLinkTc',\r\n params: { idUser: idUser, idTcUser: idTcUser }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetDocumentsUser = function (idCrop, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'User/GetDocumentsUser',\r\n params: { idCrop: idCrop }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.UpdateUserInfosByTc = function (user, callback) {\r\n var config = {\r\n method: \"PUT\",\r\n url: configurationFactory.Url['Api'] + 'User/UpdateUserInfosByTc',\r\n data: user\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.VerifUserLight = function (user) {\r\n var errorsPopup = \"\";\r\n\r\n if (!user.LastName)\r\n errorsPopup += \"<li>\" + $rootScope.editableObjectsFactory.EditableObjects.User_Personal_Info_ErrorMessage_LastName.Content +\"</li>\";\r\n\r\n if (!user.Mail)\r\n errorsPopup += \"<li>\" + $rootScope.editableObjectsFactory.EditableObjects.User_Personal_Info_ErrorMessage_Mail.Content + \"</li>\";\r\n else {\r\n var regexMail = /\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*/;\r\n if (!regexMail.test(user.Mail))\r\n errorsPopup += \"<li>\" + $rootScope.editableObjectsFactory.EditableObjects.User_Personal_Info_ErrorMessage_Mail.Content + \"</li>\";\r\n }\r\n\r\n var regexTel = /(\\+33|[0-9])?[-.() ]?[0-9]$/;\r\n if (user.PhoneNumber) {\r\n if (!regexTel.test(user.PhoneNumber))\r\n errorsPopup += \"<li>\" + $rootScope.editableObjectsFactory.EditableObjects.User_Personal_Info_ErrorMessage_PhoneNumber.Content + \"</li>\";\r\n }\r\n if (user.MobileNumber) {\r\n if (!regexTel.test(user.MobileNumber))\r\n errorsPopup += \"<li>\" + $rootScope.editableObjectsFactory.EditableObjects.User_Personal_Info_ErrorMessage_MobileNumber.Content + \"</li>\";\r\n }\r\n\r\n return errorsPopup;\r\n };\r\n\r\n this.GetUsersOfTc = function (callback) {\r\n var config = {\r\n method: \"GET\",\r\n url: configurationFactory.Url['Api'] + 'User/GetUsersOfTc',\r\n data: user\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.CheckEffortTc = function (effortTcValue, initialPrice, typeEffortTc, coeffValue, isGlobalPriceOrSecondComponent, decimalForComponents,callback) {\r\n var config = {\r\n method: \"POST\",\r\n url: configurationFactory.Url['Api'] + 'User/CheckEffortTc',\r\n params: { effortTcValue: effortTcValue, initialPrice: initialPrice, typeEffortTc: typeEffortTc, coeffValue: coeffValue, isGlobalPriceOrSecondComponent: isGlobalPriceOrSecondComponent, decimalForComponents: decimalForComponents}\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.DisconnectExploitation = function (callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'User/DisconnectExploitation'\r\n };\r\n sendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('userInfosService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetUserInfos = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'User/GetUserInfos',\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\t \r\n \tthis.SaveUserInfos = function (userInfos, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'POST',\r\n \t\t\tdata: userInfos,\r\n \t\t\turl: configurationFactory.Url['Api'] + 'User/SaveUserInfos',\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n };\r\n\r\n this.SaveUserAdditionalService = function (userInfos, callback) {\r\n var config = {\r\n method: 'POST',\r\n data: userInfos,\r\n url: configurationFactory.Url['Api'] + 'User/SaveUserAdditionalService',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('messengerService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n .success(function (data) {\r\n \tcallback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n \tcallback(data, status, headers, config);\r\n });\r\n \t};\r\n\r\n \tthis.PostMessage = function (data,callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'Post',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Messenger/PostMessage',\r\n \t\t\tdata: data\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n \t//DeleteMessage\r\n \tthis.DeleteMessageReceive = function (idmessage, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'DELETE',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Messenger/DeleteMessageReceive',\r\n \t\t\tparams: { idmessage: idmessage }\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n \tthis.DeleteMessageSended = function (idmessage, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'DELETE',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Messenger/DeleteMessageSended',\r\n \t\t\tparams: { idmessage: idmessage }\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n \tthis.GetNewMessagePaginate = function (searchMail, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n \t\tvar config = {\r\n \t\t method: 'GET',\r\n \t\t url: configurationFactory.Url['Api'] + 'Messenger/GetNewMessagePaginate',\r\n \t\t params: {\r\n \t\t searchMail: searchMail,\r\n \t\t itemPerPage: itemPerPage,\r\n \t\t pageNo: pageNo,\r\n \t\t sortKey: sortKey,\r\n \t\t reverse: reverse\r\n \t\t }\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n \tthis.GetMessageSendedPaginate = function (searchMail, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n \t\tvar config = {\r\n \t\t method: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Messenger/GetMessageSendedPaginate',\r\n \t\t\tparams: {\r\n \t\t\t searchMail: searchMail,\r\n \t\t\t itemPerPage: itemPerPage,\r\n \t\t\t pageNo: pageNo,\r\n \t\t\t sortKey: sortKey,\r\n \t\t\t reverse: reverse\r\n \t\t\t}\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n \tthis.GetNbMessage = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'Get',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Messenger/GetNbMessageToRead',\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n \tthis.GetMessage = function (idMessage, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'Get',\r\n \t\t\tparams: { idMessage: idMessage },\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Messenger/GetMessage',\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n \tthis.GetReplyMessage = function (idMessage, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'Get',\r\n \t\t\tparams: { idMessage: idMessage },\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Messenger/GetReplyMessage',\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n \t\r\n }]);","\r\nAgrimarketServices.service('testsocketService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n callback(data, status, headers, config);\r\n });\r\n };\r\n\r\n this.SendAthenaOrder = function (actionToOrder, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'TestSocket/SendOrderToAthena',\r\n params: { actionToOrder: actionToOrder }\r\n };\r\n\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('athenaOrdersService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n\tfunction ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n\t\tvar SendRequest = function (configfile, callback) {\r\n\t\t\t$http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t\tcallback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t\tcallback(data, status);\r\n\t\t\t\t});\r\n\t\t};\r\n\r\n\t\tthis.GetAthenaOrdersVmByIdContract = function (idContract, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'AthenaOrders/GetAthenaOrdersVmByIdContract',\r\n\t\t\t\tparams: { idContract: idContract }\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.GetInfosPopUpAthenaOrderBuiltPrice = function (idOfferBuiltPrice, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'AthenaOrders/GetInfosPopUpAthenaOrderBuiltPrice',\r\n params: { idOfferBuiltPrice: idOfferBuiltPrice }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n\t\tthis.GetAthenaOrdersSellByIdOfferBuiltPriceObservation = function (idOfferBuiltPriceObservation, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'AthenaOrders/GetAthenaOrdersSellByIdOfferBuiltPriceObservation',\r\n\t\t\t\tparams: { idOfferBuiltPriceObservation: idOfferBuiltPriceObservation }\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.GetAthenaOrdersExitAnticipatedByIdOfferBuiltPriceObservation = function (idOfferBuiltPriceObservation, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'AthenaOrders/GetAthenaOrdersExitAnticipatedByIdOfferBuiltPriceObservation',\r\n\t\t\t\tparams: { idOfferBuiltPriceObservation: idOfferBuiltPriceObservation }\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.PostAthenaOrderVm = function (order, callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'POST',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'AthenaOrders/PostAthenaOrderVm',\r\n\t\t\t\tdata: order\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n\r\n\t}]);","AgrimarketServices.service('conditionsService', ['$http', 'configurationFactory', 'editableObjectsFactory', '$rootScope', '$filter',\r\n function ($http, configurationFactory, editableObjectsFactory, $rootScope, $filter) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n var _getUserGroupConditionsOfTree = function (idOffer, idExpiry, idVariety, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Tree/GetUserGroupConditionsOfTree',\r\n params: { idOffer: idOffer, idExpiry: idExpiry, idVariety: idVariety }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n var _getUserGroupConditionsChild = function (idTreeCondition, idOffer, idExpiry, idVariety, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Tree/GetUserGroupConditionsChild',\r\n params: { idTreeCondition: idTreeCondition, idOffer: idOffer, idExpiry: idExpiry, idVariety: idVariety }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n var _recursifCheckAndSetGroupConditions = function (lstGroupConditions, objError, tabSelectedValues) {\r\n if (lstGroupConditions && lstGroupConditions.length > 0) {\r\n lstGroupConditions.every(function (element) {\r\n // Gestion des groupes en saisie libre\r\n if (element.IdTypeFreeInput){\r\n if (!element.TextFreeInput) {\r\n objError.text = editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseSelectAllConditions.Content;\r\n return false;\r\n } else if (element.IdTypeFreeInput === $rootScope.enumFactory.TypeFreeInputs.Numeric && isNaN(element.TextFreeInput.replace(',','.'))) {\r\n objError.text = editableObjectsFactory.EditableObjects.Error_OfferSubscribe_GroupFreeInput_ValueMustBeNumeric.Content.replace(\"[group]\",element.Label);\r\n return false;\r\n }\r\n else {\r\n tabSelectedValues.push({ IdTreeGroupCondition: element.IdTreeGroupCondition, Visible: true, Value: 0, GrpLabel: element.Label, Label: element.TextFreeInput, LabelToDisplay: element.TextFreeInput, IdGroupCondition: element.IdGroupCondition, AutoComplete: false });\r\n return true;\r\n }\r\n }\r\n // Gestion des groupes en liste déroulante\r\n if (!element.selectedValue || element.selectedValue.Value <= 0) {\r\n objError.text = editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseSelectAllConditions.Content;\r\n return false;\r\n } else {\r\n var selectedOption = element.LstOptions.filter(function (option) { return option.IdTreeCondition === Number(element.selectedValue); })[0];\r\n var selectedOptionAutoComplete = element.LstOptions.filter(function (option) { return option.Label === element.selectedValue; })[0];\r\n if(selectedOption != null && selectedOption != undefined)\r\n tabSelectedValues.push({ IdTreeGroupCondition: element.IdTreeGroupCondition, IdTreeCondition: Number(element.selectedValue), Visible: selectedOption.Visible, Value: selectedOption.Value, GrpLabel: element.Label, Label: selectedOption.Label, LabelToDisplay: selectedOption.LabelToDisplay, IdGroupCondition: element.IdGroupCondition, AutoComplete: element.AutoComplete });\r\n else if(selectedOptionAutoComplete != null && selectedOptionAutoComplete != undefined)\r\n tabSelectedValues.push({ IdTreeGroupCondition: element.IdTreeGroupCondition, IdTreeCondition: selectedOptionAutoComplete.IdTreeCondition, Visible: selectedOptionAutoComplete.Visible, Value: selectedOptionAutoComplete.Value, GrpLabel: element.Label, Label: selectedOptionAutoComplete.Label, LabelToDisplay: selectedOptionAutoComplete.LabelToDisplay, IdGroupCondition: element.IdGroupCondition, AutoComplete: element.AutoComplete });\r\n _recursifCheckAndSetGroupConditions(element.LstConditionParticularsChilds, objError, tabSelectedValues);\r\n return true;\r\n }\r\n });\r\n }\r\n };\r\n\r\n var _conditionParticularsOnChange = function (idOffer, groupCondPart, bestPath, idExpiry, idVariety) {\r\n groupCondPart.LstConditionParticularsChilds = [];\r\n if (groupCondPart.selectedValue > 0) {\r\n _getUserGroupConditionsChild(groupCondPart.selectedValue, idOffer, idExpiry, idVariety, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n return data[0].errors[0].Message;\r\n } else {\r\n groupCondPart.LstConditionParticularsChilds = data;\r\n groupCondPart.LstConditionParticularsChilds.forEach(function (group) {\r\n group.LstOptions.forEach(function (condition) {\r\n condition.Label = condition.Label;\r\n condition.LabelToDisplay = condition.Visible ? condition.Label + ' (' + condition.Value + ' ' + $rootScope.globalLabels.Currency + ')' : condition.Label;\r\n });\r\n if (bestPath && bestPath.Conditions) {// Si on a le meilleur chemin de condPart, alors on les pré-selectionnes\r\n var infoBestCondPartInGroup = $filter('filter')(bestPath.Conditions, { IdTreeGroupCondition: group.IdTreeGroupCondition }, true)[0];\r\n if (infoBestCondPartInGroup) // On pré-selectionne la condPart, et on va chercher ses fils, si il sagit d'un Autocomplete, on set avec le label car ce n'est pas un select, c'est un input le remplissage est différent\r\n if (!group.IdTypeFreeInput) // si il sagit d'un Autocomplete, on set avec le label car ce n'est pas un select, c'est un input le remplissage est différent\r\n group.selectedValue = !group.AutoComplete ? infoBestCondPartInGroup.IdTreeCondition : infoBestCondPartInGroup.Label;\r\n else\r\n group.TextFreeInput = infoBestCondPartInGroup.Label;\r\n }\r\n else {\r\n if (!group.Hidden)\r\n group.LstOptions.unshift({\r\n \"IdTreeCondition\": 0,\r\n \"Label\": \"Sélectionnez..\",\r\n \"LabelToDisplay\": \"Sélectionnez..\",\r\n \"Value\": 0,\r\n \"Visible\": false\r\n });\r\n group.selectedValue = group.LstOptions[0].IdTreeCondition;\r\n }\r\n if (group.selectedValue)\r\n _conditionParticularsOnChange(idOffer, group, bestPath, idExpiry, idVariety);\r\n });\r\n }\r\n });\r\n }\r\n };\r\n\r\n this.GetTreesForSelect = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Tree/GetTreesForSelect',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetTrees = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Tree/GetTrees',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.SaveTree = function (tree, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Tree/SaveTree',\r\n data: tree\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DeleteTree = function (idTree, callback) {\r\n var config = {\r\n method: 'PUT',\r\n url: configurationFactory.Url['Api'] + 'Tree/DeleteTree',\r\n params: { idTree: idTree }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetGroupConditions = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'GroupCondition/GetGroupConditions'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.SaveGroupConditions = function (groups, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'GroupCondition/SaveGroupConditions',\r\n data: groups\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.CheckAndSetGroupConditions = function (lstGroupConditions, tabSelectedValues) {\r\n var objError = { text: \"\" };\r\n\r\n if (lstGroupConditions && lstGroupConditions.length > 0)\r\n _recursifCheckAndSetGroupConditions(lstGroupConditions, objError, tabSelectedValues);\r\n\r\n return objError.text;\r\n };\r\n\r\n this.GetCondParts = function (idOffer, idTree, idContractCommitment, contractualisationWithCommitment, bestPath, idExpiry, idVariety, callback) {\r\n var res = {\r\n errorMessage: \"\",\r\n conditionParticulars: null\r\n };\r\n if (idTree > 0 && (!idContractCommitment || (contractualisationWithCommitment && !contractualisationWithCommitment.HasContractConditions))) {\r\n _getUserGroupConditionsOfTree(idOffer, idExpiry, idVariety, function (data, status) {\r\n if (status !== null) {\r\n if (status === 400) {\r\n res.errorMessage = data[0].errors[0].Message;\r\n }\r\n } else {\r\n res.conditionParticulars = data;\r\n res.conditionParticulars.forEach(function (group) {\r\n group.LstOptions.forEach(function (condition) {\r\n condition.Label = condition.Label;\r\n condition.LabelToDisplay = condition.Visible ? condition.Label + ' (' + condition.Value + ' ' + $rootScope.globalLabels.Currency + ')' : condition.Label;\r\n });\r\n if (bestPath && bestPath.Conditions) {// Si on a le meilleur chemin de condPart, alors on les pré-selectionnes\r\n var infoBestCondPartInGroup = $filter('filter')(bestPath.Conditions, { IdTreeGroupCondition: group.IdTreeGroupCondition }, true)[0];\r\n if (infoBestCondPartInGroup) {// On pré-selectionne la condPart, et on va chercher ses fils\r\n if (!group.IdTypeFreeInput) // si il sagit d'un Autocomplete, on set avec le label car ce n'est pas un select, c'est un input le remplissage est différent\r\n group.selectedValue = !group.AutoComplete ? infoBestCondPartInGroup.IdTreeCondition : infoBestCondPartInGroup.Label;\r\n else\r\n group.TextFreeInput = infoBestCondPartInGroup.Label;\r\n }\r\n }\r\n else if (!group.IdTypeFreeInput){\r\n if (!group.Hidden)\r\n group.LstOptions.unshift({\r\n \"IdTreeCondition\": 0,\r\n \"Label\": \"Sélectionnez..\",\r\n \"LabelToDisplay\": \"Sélectionnez..\",\r\n \"Value\": 0,\r\n \"Visible\": false\r\n });\r\n group.selectedValue = group.LstOptions[0].IdTreeCondition;\r\n }\r\n if (group.selectedValue)\r\n _conditionParticularsOnChange(idOffer, group, bestPath, idExpiry, idVariety);\r\n });\r\n }\r\n callback(res);\r\n return;\r\n });\r\n }\r\n };\r\n\r\n this.ConditionParticularsOnChange = function (idOffer, condition, bestPath, idExpiry, idVariety) {\r\n _conditionParticularsOnChange(idOffer, condition, bestPath, idExpiry, idVariety);\r\n };\r\n\r\n this.GetTotalLstGroupConditionsSelectedValues = function (lstGroupConditionsSelectedValues) {\r\n var total = 0;\r\n\r\n if (lstGroupConditionsSelectedValues) {\r\n lstGroupConditionsSelectedValues.forEach(function (item) {\r\n if (item && item.Value)\r\n total += item.Value;\r\n });\r\n }\r\n\r\n return total;\r\n };\r\n\r\n this.GetBestPath = function (idOffer, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Tree/GetOfferBestPath',\r\n params: { idOffer: idOffer }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetContractCondParts = function (idContract, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Tree/GetContractCondParts',\r\n params: { idContract: idContract }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetTypeFreeInputs = function(callback){\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'GroupCondition/GetTypeFreeInputs'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('typeOperationsService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetTypeOperations = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'TypeOperation/GetAll'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }]);","AgrimarketServices.service('typeOptionsService', [ '$http', 'configurationFactory',\r\n function ( $http, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetTypeOptions = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'TypeOption/GetAll'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }]);","AgrimarketServices.service('typeCalculOptionsService', [ '$http', 'configurationFactory',\r\n function ( $http, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetTypeCalculOptions = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'TypeCalculOption/GetAll'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }]);","AgrimarketServices.service('elementInfoMarketHomePageService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n\tfunction ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n\t var SendRequest = function (configfile, callback) {\r\n\t $http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t callback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t callback(data, status);\r\n\t\t\t\t});\r\n\t };\r\n\t this.GetElementInfoMarketHomePage = function (callback) {\r\n\t var config = {\r\n\t method: 'GET',\r\n\t url: configurationFactory.Url['Api'] + 'ElementInfoMarketHomePage/GetElementInfoMarketHomePage'\r\n\t };\r\n\t SendRequest(config, callback);\r\n\t };\r\n\r\n\t this.SaveElementInfoMarketHomePage = function (lstElementInfoMarketHomePage, callback) {\r\n\t var config = {\r\n\t method: 'POST',\r\n\t data: lstElementInfoMarketHomePage,\r\n\t url: configurationFactory.Url['Api'] + 'ElementInfoMarketHomePage/SaveElementInfoMarketHomePage'\r\n\t };\r\n\t SendRequest(config, callback);\r\n\t };\r\n\t}]);","AgrimarketServices.service('elementInfoMarketHomePageQuoteService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n\tfunction ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n\t var SendRequest = function (configfile, callback) {\r\n\t $http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t callback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t callback(data, status);\r\n\t\t\t\t});\r\n\t };\r\n\t this.GetAllElementInfoMarketHomePageQuotes = function (callback) {\r\n\t var config = {\r\n\t method: 'GET',\r\n\t url: configurationFactory.Url['Api'] + 'ElementInfoMarketHomePageQuote/GetAllElementInfoMarketHomePageQuotes'\r\n\t };\r\n\t SendRequest(config, callback);\r\n\t };\r\n\r\n\t this.SaveListElementInfoMarketHomePageQuotes = function (lstElementInfoMarketHomePageQuotes, callback) {\r\n\t var config = {\r\n\t method: 'POST',\r\n\t data: lstElementInfoMarketHomePageQuotes,\r\n\t url: configurationFactory.Url['Api'] + 'ElementInfoMarketHomePageQuote/SaveListElementInfoMarketHomePageQuotes'\r\n\t };\r\n\t SendRequest(config, callback);\r\n\t };\r\n\t}]);","AgrimarketServices.service('categoryInfoMarketService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n\tfunction ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n\t\tvar SendRequest = function (configfile, callback) {\r\n\t\t\t$http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t\tcallback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t\tcallback(data, status);\r\n\t\t\t\t});\r\n\t\t};\r\n\r\n\t\tthis.GetCategoryInfosMarket = function (callback) {\r\n\t\t\tvar config = {\r\n\t\t\t\tmethod: 'GET',\r\n\t\t\t\turl: configurationFactory.Url['Api'] + 'CategoryInfoMarket/GetCategoryInfoMarket'\r\n\t\t\t};\r\n\t\t\tSendRequest(config, callback);\r\n\t\t};\r\n\r\n\t\tthis.SaveCategoryInfoMarket = function (lstCategoriesInfoMarket, callback) {\r\n\t\t var config = {\r\n\t\t method: 'POST',\r\n\t\t data :lstCategoriesInfoMarket,\r\n\t\t url: configurationFactory.Url['Api'] + 'CategoryInfoMarket/SaveCategoryInfoMarket'\r\n\t\t };\r\n\t\t SendRequest(config, callback);\r\n };\r\n\r\n this.SaveGroupContactsOfCategoryInfoMarket = function (idCategoryInfoMarket, lstIdGroupContacts, callback) {\r\n var config = {\r\n method: 'POST',\r\n data: lstIdGroupContacts,\r\n params: {\r\n idCategoryInfoMarket: idCategoryInfoMarket\r\n },\r\n url: configurationFactory.Url['Api'] + 'CategoryInfoMarket/SaveGroupContactsOfCategoryInfoMarket'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n\t}]);","AgrimarketServices.service('quoteCashHashtagriService', ['$rootScope', '$http', '$location', 'configurationFactory',\r\n function ($rootScope, $http, $location, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t callback(data, null, null, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status, headers, config) {\r\n\t\t\t callback(data, status, headers, config);\r\n\t\t\t });\r\n };\r\n\r\n this.SaveCashMarkets = function (collection, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'QuoteCashHashtagri/SaveCashMarkets',\r\n data: collection\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetCashMarketsSelected = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'QuoteCashHashtagri/GetCashMarketsSelected'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetCashMarketsFromWsdApi = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'QuoteCashHashtagri/GetCashMarketsFromWsdApi'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n\r\n this.GetHistoCashForGraphByIdExpiryFromWsdApi = function (idExpiry, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'QuoteCashHashtagri/GetHistoCashForGraphByIdExpiryFromWsdApi',\r\n params: {\r\n idExpiry: idExpiry\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('quoteFutureHashtagriService', ['$rootScope', '$http', '$location', 'configurationFactory',\r\n function ($rootScope, $http, $location, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t callback(data, null, null, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status, headers, config) {\r\n\t\t\t callback(data, status, headers, config);\r\n\t\t\t });\r\n };\r\n\r\n this.SaveFutureMarketsExpiries = function (collection, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'QuoteFutureHashtagri/SaveFutureMarketsExpiries',\r\n data: collection\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetFutureMarketExpiriesSelected = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'QuoteFutureHashtagri/GetFutureMarketExpiriesSelected'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetFutureMarketsExpiriesFromWsdApi = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'QuoteFutureHashtagri/GetFutureMarketsExpiriesFromWsdApi'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('quoteForexHashtagriService', ['$rootScope', '$http', '$location', 'configurationFactory',\r\n function ($rootScope, $http, $location, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t callback(data, null, null, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status, headers, config) {\r\n\t\t\t callback(data, status, headers, config);\r\n\t\t\t });\r\n };\r\n\r\n \r\n this.GetHistoForexByIdForexFromWsdApi = function (idForex, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'QuoteForexHashtagri/GetHistoForexByIdForexFromWsdApi',\r\n params: {\r\n idForex: idForex\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('marketinfosUserHashtagriService', ['$rootScope', '$http', '$location', 'configurationFactory',\r\n function ($rootScope, $http, $location, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t callback(data, null, null, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status, headers, config) {\r\n\t\t\t callback(data, status, headers, config);\r\n\t\t\t });\r\n };\r\n\r\n this.GetNewsHashtagriFromWsdApi = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'MarketInfoHashtagriController/GetNewsHashtagriFromWsdApi'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetCategoryInfoMarkets = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'MarketInfoHashtagriController/GetCategoryInfoMarkets'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetMarketInfosCategHashtagriFromWsdApi = function (idNewsCategWSDHashtagri, idNewsCategWSDTechnically, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'MarketInfoHashtagriController/GetMarketInfosCategHashtagriFromWsdApi',\r\n params: {\r\n idNewsCategWSDHashtagri: idNewsCategWSDHashtagri,\r\n idNewsCategWSDTechnically: idNewsCategWSDTechnically\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetFutureMarketQuotes = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'MarketInfoHashtagriController/GetFutureMarketQuotes'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetCashMarketQuotes = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'MarketInfoHashtagriController/GetCashMarketQuotes'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetGlobalMacro = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'MarketInfoHashtagriController/GetGlobalMacro'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetWeatherNews = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'MarketInfoHashtagriController/GetWeatherNews'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetUSDANews = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'MarketInfoHashtagriController/GetUSDANews'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetContentInfoMarketOS = function (idTypeBlockEditable, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'MarketInfoHashtagriController/GetContentInfoMarketOS',\r\n params: { idTypeBlockEditable: idTypeBlockEditable }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n }]);","AgrimarketServices.service('blocDispositionService', ['$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n\tfunction ($http, $location, currentUserFactory, configurationFactory) {\r\n\r\n\t var SendRequest = function (configfile, callback) {\r\n\t $http(configfile)\r\n\t\t\t\t.success(function (data) {\r\n\t\t\t\t callback(data, null);\r\n\t\t\t\t})\r\n\t\t\t\t.error(function (data, status) {\r\n\t\t\t\t callback(data, status);\r\n\t\t\t\t});\r\n\t };\r\n\r\n\t this.GetBlocDispositions = function (callback) {\r\n\t var config = {\r\n\t method: 'GET',\r\n\t url: configurationFactory.Url['Api'] + 'BlocDisposition/GetBlocDispositions'\r\n\t };\r\n\t SendRequest(config, callback);\r\n\t };\r\n\r\n this.GetBlocDispositionsFiltered = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'BlocDisposition/GetBlocDispositionsFiltered'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n \r\n this.GetContentBlocDispositionById = function (id, callback) {\r\n var config = {\r\n method: 'GET',\r\n params: {\r\n id: id\r\n },\r\n url: configurationFactory.Url['Api'] + 'BlocDisposition/GetContentBlocDispositionById'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n\t this.SaveBlocDispositions = function (lstBlocDispositions, callback) {\r\n\t var config = {\r\n\t method: 'POST',\r\n\t data: lstBlocDispositions,\r\n\t url: configurationFactory.Url['Api'] + 'BlocDisposition/SaveBlocDispositions'\r\n\t };\r\n\t SendRequest(config, callback);\r\n\t };\r\n\r\n\r\n this.SaveGroupContactsOfContentBlocDisposition = function (idContentBlocDisposition, lstIdGroupContacts, callback) {\r\n var config = {\r\n method: 'POST',\r\n data: lstIdGroupContacts,\r\n params: {\r\n idContentBlocDisposition: idContentBlocDisposition\r\n },\r\n url: configurationFactory.Url['Api'] + 'BlocDisposition/SaveGroupContactsOfContentBlocDisposition'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n\t}]);","AgrimarketServices.service('typeBlockEditableService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t callback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t callback(data, status);\r\n\t\t\t });\r\n };\r\n\r\n this.GetTypeBlockEditable = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'TypeBlockEditable/GetAll'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('writingContentInfoMarketService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t callback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t callback(data, status);\r\n\t\t\t });\r\n };\r\n\r\n this.SaveContentInfoMarket = function (data, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'WritingContentInfoMarket/SaveContentInfoMarket',\r\n data: data\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetContentsInfoMarketByFilter = function(idWritingContentInfoMarket, searchValue, itemsPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n params: { idWritingContentInfoMarket: idWritingContentInfoMarket, searchValue: searchValue, itemsPerPage: itemsPerPage, pageNo: pageNo, sortKey: sortKey, reverse: reverse },\r\n url: configurationFactory.Url['Api'] + 'WritingContentInfoMarket/GetContentsInfoMarketByFilter'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetItemsContentsByAutoComplete = function(searchString, timeoutPromise, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'WritingContentInfoMarket/GetItemsContentsByAutoComplete',\r\n params: { searchString: searchString }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetContentInfoMarketById = function (idWritingContentInfoMarket, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'WritingContentInfoMarket/GetContentInfoMarketById',\r\n params: { idWritingContentInfoMarket: idWritingContentInfoMarket }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DeleteContentInfoMarket = function (idWritingContentInfoMarket, callback) {\r\n var config = {\r\n method: 'DELETE',\r\n url: configurationFactory.Url['Api'] + 'WritingContentInfoMarket/DeleteContentInfoMarket',\r\n params: { idWritingContentInfoMarket: idWritingContentInfoMarket }\r\n };\r\n\r\n SendRequest(config, callback);\r\n };\r\n\r\n }]);","AgrimarketServices.service('typeOfferCommitmentsService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetTypeOfferCommitments = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'TypeOfferCommitment/GetAll'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }]);","AgrimarketServices.service('typeCommitmentsService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetTypeCommitments = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'TypeCommitment/GetAll'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }]);","AgrimarketServices.service('typeOrdersService', ['$http', 'configurationFactory', 'editableObjectsFactory', 'enumFactory',\r\n function ($http, configurationFactory, editableObjectsFactory, enumFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.PutTypeOrderLabelAction = function (lstTypeOrderFilterVms, callback) {\r\n var config = {\r\n method: 'PUT',\r\n url: configurationFactory.Url['Api'] + 'TypeOrder/PutTypeOrderLabelAction',\r\n data: lstTypeOrderFilterVms\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.PutSubscribeActionLabels = function (lstTypeOrderFilterVms, callback) {\r\n var config = {\r\n method: 'PUT',\r\n url: configurationFactory.Url['Api'] + 'TypeOrder/PutSubscribeActionLabels',\r\n data: lstTypeOrderFilterVms\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.CheckIsValidTypeOrder = function (idTypeOrder, callback) {\r\n var res = {\r\n errorMessage: \"\",\r\n isSell: false,\r\n isObjective: false,\r\n idTypeOrder: null\r\n };\r\n\r\n switch (idTypeOrder) {\r\n case enumFactory.TypeOrders.Vente.IdTypeOrder:\r\n res.isSell = true;\r\n break;\r\n case enumFactory.TypeOrders.Prixobjectif.IdTypeOrder:\r\n res.isObjective = true;\r\n break;\r\n case enumFactory.TypeOrders.Engagement.IdTypeOrder:\r\n break;\r\n default:\r\n res.errorMessage = editableObjectsFactory.EditableObjects.Error_OfferSubscribe_OrderTypeIsEmptyOrIncorrect.Content;\r\n }\r\n\r\n if (!res.errorMessage)\r\n res.idTypeOrder = idTypeOrder;\r\n\r\n callback(res);\r\n };\r\n\r\n }]);","AgrimarketServices.service('routeService', ['$location',\r\n function($location) {\r\n this.locationByParam = function(paramValue) {\r\n\r\n switch (paramValue) {\r\n case 'outstandings':\r\n $location.path(\"/user/accounts/outstandings\");\r\n break;\r\n case 'contributions-marketinfos':\r\n $location.path(\"/user/contributions/\");\r\n break;\r\n case 'contributions':\r\n $location.path(\"/user/contributions/\");\r\n break;\r\n case 'marketinfos':\r\n $location.path(\"/user/marketinfos/\").search({});\r\n break;\r\n case 'asking':\r\n $location.path(\"/user/supply/request/asking\");\r\n break;\r\n case 'offers':\r\n $location.path(\"/user/offers/view/1\");\r\n break;\r\n case 'commitmentoffers':\r\n $location.path(\"/user/offers/view/2\");\r\n break;\r\n case 'commitments':\r\n $location.path(\"/user/commitments/view/tableTypeCommitment\");\r\n break;\r\n case 'validatedcontracts':\r\n $location.path(\"/user/contracts/firm/view/validated\");\r\n break;\r\n case 'pricedcontracts':\r\n $location.path(\"/user/contracts/firm/view/priced\");\r\n break;\r\n case 'canceledcontracts':\r\n $location.path(\"/user/contracts/firm/view/canceled\");\r\n break;\r\n case 'commitmentcontracts':\r\n $location.path(\"/user/contracts/commitment/view/validated\");\r\n break;\r\n case 'surfaceCommitmentcontracts':\r\n $location.path(\"/user/contracts/surfaceCommitment/view/validated\");\r\n break;\r\n case 'siteUnavailable':\r\n $location.path(\"/siteUnavailable\");\r\n break;\r\n case 'UnsubscribeNewsMarketInfo':\r\n $location.path(\"/UnsubscribeNewsMarketInfo\");\r\n break;\r\n case 'disableSubscription':\r\n $location.path(\"/disableSubscription\");\r\n break;\r\n default:\r\n break;\r\n }\r\n };\r\n }\r\n]);","AgrimarketServices.service('elementInfoMarketHomePagesService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.PutElementInfoMarketHomePageLabel = function (lstElementInfoMarketHomePageVms, callback) {\r\n \t var config = {\r\n \t method: 'PUT',\r\n \t url: configurationFactory.Url['Api'] + 'ElementInfoMarketHomePage/PutElementInfoMarketHomePageLabel',\r\n \t data: lstElementInfoMarketHomePageVms\r\n \t };\r\n \t SendRequest(config, callback);\r\n \t};\r\n\r\n }]);","AgrimarketServices.service('userCropCapitalService', ['$http', 'configurationFactory',\r\n function ($http, configurationFactory) {\r\n var sendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n callback(data, status, headers, config);\r\n });\r\n };\r\n\r\n this.GetUserCropCapital = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'UserCropCapital/GetUserCropCapital',\r\n };\r\n sendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('typeFixationsService', ['$http', 'configurationFactory',\r\n function ($http, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n this.PutTypeFixationLabelAction = function (lstTypeFixationVm, callback) {\r\n \t var config = {\r\n \t method: 'PUT',\r\n url: configurationFactory.Url['Api'] + 'TypeFixation/PutTypeFixationLabelAction',\r\n data: lstTypeFixationVm\r\n \t };\r\n \t SendRequest(config, callback);\r\n \t};\r\n\r\n }]);","AgrimarketServices.service('signatureService', ['$http', 'configurationFactory', 'contractingDelayService',\r\n function ($http, configurationFactory, contractingDelayService) {\r\n\r\n var sendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n var _sendSmsForElectronicSignature = function (idContract, idConnection, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Contracts/SendSmsForElectronicSignature',\r\n cache: false,\r\n crossDomain: true,\r\n params: {\r\n idContract: idContract,\r\n idConnectionSelected: idConnection\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.CheckAndSendSmsForElectronicSignature = function (contractVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Contracts/CheckAndSendSmsForElectronicSignature',\r\n cache: false,\r\n crossDomain: true,\r\n data: contractVm\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.CheckContractBaseAndSendSmsForElectronicSignature = function (contractContractBaseVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'ContractBase/CheckContractBaseAndSendSmsForElectronicSignature',\r\n cache: false,\r\n crossDomain: true,\r\n data: contractContractBaseVm\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SendSmsElectronicSignatureForOption = function (idConnection, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'ContractsOption/SendSmsElectronicSignatureForOption',\r\n cache: false,\r\n crossDomain: true,\r\n params: {\r\n idConnectionSelected: idConnection\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SendSmsForDocumentSignature = function (idDocument, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'User/StartDocumentSigning',\r\n cache: false,\r\n crossDomain: true,\r\n params: {\r\n idDocument: idDocument\r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SendSmsForElectronicSignature = function (timeToContracting, idContract, idConnection, callback) {\r\n var res = {\r\n isToLate: false,\r\n errorMessage: \"\",\r\n successMessage: \"\"\r\n };\r\n\r\n res.errorMessage = contractingDelayService.VerifyContractingDelay(timeToContracting);\r\n if (res.errorMessage) {\r\n res.isToLate = true;\r\n callback(res);\r\n return;\r\n }\r\n\r\n _sendSmsForElectronicSignature(idContract, idConnection, function ( data, status) {\r\n if (status !== null) {\r\n if (status === 400)\r\n res.errorMessage = data[0].errors[0].Message;\r\n } else\r\n res.successMessage = data;\r\n\r\n callback(res);\r\n });\r\n };\r\n\r\n this.GetListConnection = function (idUser, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'User/GetListConnection',\r\n cache: false,\r\n crossDomain: true,\r\n params: { idUser: idUser }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this. SignatureWithCodeYouSign = function (fileId, authenticateId, code, idConnection, memberId, procedureId, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Signature/SignatureWithCodeYouSign',\r\n cache: false,\r\n crossDomain: true,\r\n params: { fileId: fileId, authenticateId: authenticateId, code: code, idConnectionSelected: idConnection, memberId: memberId, procedureId: procedureId }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.ResendCodeYouSign = function (memberId, procedureId, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Signature/ResendCodeYouSign',\r\n cache: false,\r\n crossDomain: true,\r\n params: { memberId: memberId, procedureId: procedureId }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.CheckSecurityCodeFirmOrCommitment = function (code, idContract, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Contracts/CheckSecurityCode',\r\n cache: false,\r\n crossDomain: true,\r\n params: { code: code, idContract: idContract }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.CheckSecurityCodeBase = function (code, idContract, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'ContractBase/CheckSecurityCode',\r\n cache: false,\r\n crossDomain: true,\r\n params: { code: code, idContract: idContract }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.CheckSecurityCodeOption = function (code, idContract, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'ContractOption/CheckSecurityCode',\r\n cache: false,\r\n crossDomain: true,\r\n params: { code: code, idContract: idContract }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n }]);","AgrimarketServices.service('contractingDelayService', ['parametersFactory', 'editableObjectsFactory', 'modulesFactory', 'enumFactory', 'contractsService',\r\n function (parametersFactory, editableObjectsFactory, modulesFactory, enumFactory, contractsService) {\r\n\r\n this.InitialisationContractingDelay = function (counter) {\r\n if ((modulesFactory.Modules.ModuleAutomaticCover.Active && parametersFactory.Parameters.AutomaticCover.Value) || parametersFactory.Parameters.IsDisplayContractingDelay.Value === \"1\" ) {\r\n // Sauvegarde de l'heure de début de la prise de position\r\n contractsService.SaveDateDebutSubscriptionContract(function (dataSave, statuSave) {\r\n if (statuSave === null) {\r\n counter.timer = parametersFactory.Parameters.ContractingDelay.Value ? parametersFactory.Parameters.ContractingDelay.Value : \"00:00\";\r\n\r\n if (parametersFactory.Parameters.IsDisplayContractingDelay.Value === \"1\") {\r\n // Counter global style\r\n counter.counterType = \"circular\";\r\n counter.strokeWidth = 3;\r\n counter.strokeWidthBg = 6; // Si circular, doit être >= à strokeWidth, si 'linear' alors doit être == à strokeWidth !!!\r\n counter.showShadow = true;\r\n counter.showRays = false;\r\n counter.colorRays = '#ffffff';\r\n // Counter circular\r\n counter.counterCicularSize = 20;\r\n // Counter linear\r\n counter.counterLinearWidth = 100; // valeur en %\r\n // Typo\r\n counter.fontSize = 11;\r\n counter.fontColor = '#656565';\r\n // Counter colors\r\n counter.colorCounter = '#9acf1e';\r\n counter.colorCounterBg = '#f1f1f1';\r\n counter.colorCounterHalf = '#ed9731';\r\n counter.colorCounterThird = '#881c1c';\r\n\r\n counter.start = true;\r\n }\r\n }\r\n });\r\n }\r\n };\r\n\r\n this.VerifyContractingDelay = function (timeToContracting) {\r\n if (!timeToContracting)\r\n return null;\r\n\r\n if ((modulesFactory.Modules.ModuleAutomaticCover.Active && parametersFactory.Parameters.AutomaticCover.Value === \"1\") || parametersFactory.Parameters.IsDisplayContractingDelay.Value === \"1\") {\r\n var min, second, delay, timeToLimite;\r\n if (parametersFactory.Parameters.ContractingDelay.Value)\r\n delay = parametersFactory.Parameters.ContractingDelay.Value.split(\":\");\r\n else {\r\n var timeDefault = \"00:00\";\r\n delay = timeDefault.split(\":\");\r\n }\r\n\r\n timeToLimite = angular.copy(timeToContracting);\r\n min = parseInt(delay[0]);\r\n second = parseInt(delay[1]);\r\n\r\n timeToLimite.setMinutes(timeToLimite.getMinutes() + min);\r\n timeToLimite.setSeconds(timeToLimite.getSeconds() + second);\r\n\r\n if (new Date() > timeToLimite)\r\n return editableObjectsFactory.EditableObjects.Error_OfferSubscribe_DelayOfContratualizationHaveExceeded.Content + min + editableObjectsFactory.EditableObjects.Error_OfferSubscribe_MinuteAbbreviation.Content + second + editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseTakeBack.Content;\r\n else\r\n return null;\r\n }\r\n else\r\n return null;\r\n };\r\n\r\n }]);","AgrimarketServices.service('targetPriceService', ['editableObjectsFactory', 'enumFactory', '$filter',\r\n function (editableObjectsFactory, enumFactory, $filter) {\r\n\r\n this.CheckPriceAndDateIsValid = function (resumeOffer, idContractCommitment, contractualisationWithCommitment, offerPriceToCompare, paramAuthorizeTargetPriceUnderOfferPrice) {\r\n\r\n if (resumeOffer.idTypeOrder !== enumFactory.TypeOrders.Prixobjectif.IdTypeOrder)\r\n return null;\r\n\r\n /** Vérification du prix saisi ***/\r\n if (!resumeOffer.targetPriceCurrent)\r\n return editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterATargetPrice.Content;\r\n\r\n if (isNaN(resumeOffer.targetPriceCurrent) && resumeOffer.targetPriceCurrent.indexOf(\",\") !== -1)\r\n resumeOffer.targetPriceCurrent = resumeOffer.targetPriceCurrent.replace(\",\", \".\");\r\n\r\n if (!Number(resumeOffer.targetPriceCurrent))\r\n return editableObjectsFactory.EditableObjects.Error_OfferSubscribe_TargetPriceIsNotValid.Content;\r\n\r\n resumeOffer.targetPriceCurrent = Number(resumeOffer.targetPriceCurrent);\r\n\r\n if (!paramAuthorizeTargetPriceUnderOfferPrice && resumeOffer.targetPriceCurrent < offerPriceToCompare)\r\n return editableObjectsFactory.EditableObjects.Error_OfferSubscribe_TargetPriceMustBeSuperirorOrEqualToOfferPrice.Content + offerPriceToCompare;\r\n\r\n /*** Vérification de la date saisie ***/\r\n if (!resumeOffer.AllowDateEndTargetPrice)\r\n return null;\r\n\r\n if (!resumeOffer.DateEndTargetPriceUser)\r\n return editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterEndDateValidityOfTargetPrice.Content;\r\n\r\n var dateEnd, dateMin, dateMax;\r\n var tab1 = $filter('date')(resumeOffer.DateEndTargetPriceUser, 'dd/MM/yyyy').split('/');\r\n var tab2 = $filter('date')(resumeOffer.DateMinTargetPrice, 'dd/MM/yyyy').split('/');\r\n var tab3 = $filter('date')(resumeOffer.DateMaxTargetPrice, 'dd/MM/yyyy').split('/');\r\n\r\n if (tab1.length === 3)\r\n dateEnd = Date.parse(tab1[2] + \"-\" + tab1[1] + \"-\" + tab1[0]);\r\n\r\n if (!dateEnd || dateEnd.isNaN)\r\n return editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterEndDateValidityOfTargetPrice;\r\n\r\n if (tab2.length === 3)\r\n dateMin = new Date(tab2[2] + \"-\" + tab2[1] + \"-\" + tab2[0]);\r\n\r\n if (tab3.length === 3)\r\n dateMax = new Date(tab3[2] + \"-\" + tab3[1] + \"-\" + tab3[0]);\r\n\r\n if (dateEnd < dateMin)\r\n return editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterDateAfter.Content + $filter('date')(dateMin, 'dd/MM/yyyy');\r\n\r\n if (dateEnd > dateMax)\r\n return editableObjectsFactory.EditableObjects.Error_OfferSubscribe_PleaseEnterDateBefore.Content + $filter('date')(dateMax, 'dd/MM/yyyy');\r\n\r\n resumeOffer.DateEndTargetPrice = resumeOffer.DateEndTargetPriceUser;\r\n return null;\r\n };\r\n\r\n this.CheckTargetPriceNotification = function (resumeOffer, targetPriceNotificationByMail, paramCanChooseTargetPriceMessage, user) {\r\n\r\n if (resumeOffer.idTypeOrder === enumFactory.TypeOrders.Prixobjectif.IdTypeOrder &&\r\n paramCanChooseTargetPriceMessage &&\r\n !targetPriceNotificationByMail &&\r\n !user.MobileNumber)\r\n return editableObjectsFactory.EditableObjects.Error_OfferSubscribe_ErrorTargetPriceNotificationBySmsWithoutMobileNumber.Content;\r\n else\r\n return null;\r\n };\r\n\r\n this.GetPreviewFinalPrice = function (basePrice, refPrice, totalCondPart) {\r\n // On fait un Number().toString() afin de ne pas afficher des 0 inutiles après la virgule\r\n return Number(Number(((basePrice ? basePrice : 0) + (refPrice ? refPrice : 0) + (totalCondPart ? totalCondPart : 0))).toFixed(4)).toString();\r\n };\r\n }]);","AgrimarketServices.service('contractBaseService', ['$http', 'configurationFactory',\r\n function ($http, configurationFactory) {\r\n\r\n var sendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.CheckContractBase = function (contractBaseVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'ContractBase/CheckContractBase',\r\n cache: false,\r\n crossDomain: true,\r\n data: contractBaseVm\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SaveNewContractBase = function (contractBaseVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'ContractBase/SaveNewContractBase',\r\n cache: false,\r\n crossDomain: true,\r\n data: contractBaseVm\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.SaveNewContractBaseAndSendSmsYouSign = function (contractBaseVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'ContractBase/SaveNewContractBaseAndSendSmsYouSign',\r\n cache: false,\r\n crossDomain: true,\r\n data: contractBaseVm\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetContractBaseByIdContractBase = function (idContractBase, marketPrice, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'ContractBase/GetContractBaseByIdContractBase',\r\n params: { idContractBase: idContractBase, marketPrice: marketPrice}\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetCompatibleContractBasesWithFilter = function (idExpiry, idContractCommitment, max, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'ContractBase/GetCompatibleContractBasesWithFilter',\r\n params: {\r\n idExpiry: idExpiry,\r\n idContractCommitment: idContractCommitment,\r\n itemPerPage: max,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n sendRequest(config, callback);\r\n }; \r\n\r\n this.GetContractsBasePaginate = function (idContractState, idCrop, idProduct, date, idContractStr, numClient, idCompagny, idTypeOrder, itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'ContractBase/GetContractsBasePaginate',\r\n params: { \r\n idContractState: idContractState,\r\n idCrop: idCrop,\r\n idProduct: idProduct, \r\n date: date,\r\n idContractStr: idContractStr,\r\n numClient: numClient,\r\n idCompagny: idCompagny,\r\n idTypeOrder: idTypeOrder, \r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse \r\n }\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetFiltersWithContractsBaseByCrop = function (idCrop, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'ContractBase/GetFiltersWithContractsBaseByCrop',\r\n params: { idCrop: idCrop }\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetFiltersWithContractsBase = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'ContractBase/GetFiltersWithContractsBase' \r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetTargetContractBasesFixToValidate = function (offerExpiriesVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'ContractBase/GetTargetContractBasesFixToValidate',\r\n data: offerExpiriesVm\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.ValidTargetContractBasesFix = function (offerExpiriesVm, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'ContractBase/ValidTargetContractBasesFix',\r\n data: offerExpiriesVm\r\n };\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.UpdateContractBase = function (currentContractBase, callback) {\r\n var config = {\r\n method: 'PUT',\r\n url: configurationFactory.Url['Api'] + 'ContractBase/UpdateContractBase',\r\n data: currentContractBase\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n this.GetHistoContractBase = function (idContractBase, idCrop, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'ContractBase/GetHistoryContractBasesTargetPriceByIdInit',\r\n params: { idParentContract: idContractBase, idCrop: idCrop }\r\n };\r\n\r\n sendRequest(config, callback);\r\n };\r\n\r\n }]);","AgrimarketServices.service('languageService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetLanguages = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Language/GetLanguages'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n };\r\n\r\n this.GetDefaultLanguage = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Language/GetDefaultLanguage'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n }]);","AgrimarketServices.service('typeFixationBasesService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetTypeFixationBases = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n url: configurationFactory.Url['Api'] + 'TypeFixationBase/GetAll'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }]);","AgrimarketServices.service('smsAlertService', ['$http', 'configurationFactory', '$rootScope',\r\n function ($http, configurationFactory, $rootScope) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n .success(function (data) {\r\n \tcallback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n \tcallback(data, status, headers, config);\r\n });\r\n \t};\r\n\r\n this.SaveUserExpirySmsLimits = function (idExpiry, limitMin, limitMax, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'POST',\r\n url: configurationFactory.Url['Api'] + 'SmsAlert/Save',\r\n params: { idExpiry: idExpiry, limitMin: limitMin, limitMax: limitMax}\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n };\r\n\r\n this.GetSmsAlertsPaginateWithFilter = function ( idCrop, max, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n params: {\r\n idCrop: idCrop,\r\n itemPerPage: max,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n },\r\n url: configurationFactory.Url['Api'] + 'SmsAlert/GetSmsAlertsPaginateWithFilter',\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DeleteAlertSms = function (currentAlertSms, callback) {\r\n var config = {\r\n method: 'PUT',\r\n url: configurationFactory.Url['Api'] + 'SmsAlert/DeleteAlertSms',\r\n data: currentAlertSms\r\n };\r\n\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.CheckSmsAlertIsValid = function (limitMax, limitMin, price) {\r\n if (limitMin && isNaN(limitMin) || limitMax && isNaN(limitMax)) {\r\n return $rootScope.editableObjectsFactory.EditableObjects.User_OfferFirm_PopupSmsAlert_Error_LimitMustBeFloat.Content;\r\n }\r\n\r\n if (limitMin && limitMax && Number(limitMin) > Number(limitMax)) {\r\n return $rootScope.editableObjectsFactory.EditableObjects.User_OfferFirm_PopupSmsAlert_Error_LimitMinSuperiorLimitMax.Content;\r\n }\r\n\r\n if ((limitMin && Number(limitMin) > Number(price)) || (limitMax && Number(limitMax) < Number(price))) {\r\n return $rootScope.editableObjectsFactory.EditableObjects.User_OfferFirm_PopupSmsAlert_Error_OfferPriceNotBetweenLimits.Content;\r\n }\r\n\r\n return \"\";\r\n };\r\n\r\n }]);","AgrimarketServices.service('currencyService', ['$http', 'configurationFactory',\r\n function ( $http, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n\r\n this.GetAllCurrencies = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Currency/GetAllCurrencies'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n }]);","AgrimarketServices.service('unitService', ['$http', 'configurationFactory',\r\n function ($http, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.GetAllUnits = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Unit/GetAllUnits'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n }]);","/**\r\n * Owl Carousel v2.3.4\r\n * Copyright 2013-2018 David Deutsch\r\n * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE\r\n */\r\n/**\r\n * Owl carousel\r\n * @version 2.3.4\r\n * @author Bartosz Wojciechowski\r\n * @author David Deutsch\r\n * @license The MIT License (MIT)\r\n * @todo Lazy Load Icon\r\n * @todo prevent animationend bubling\r\n * @todo itemsScaleUp\r\n * @todo Test Zepto\r\n * @todo stagePadding calculate wrong active classes\r\n */\r\n;(function($, window, document, undefined) {\r\n\r\n\t/**\r\n\t * Creates a carousel.\r\n\t * @class The Owl Carousel.\r\n\t * @public\r\n\t * @param {HTMLElement|jQuery} element - The element to create the carousel for.\r\n\t * @param {Object} [options] - The options\r\n\t */\r\n\tfunction Owl(element, options) {\r\n\r\n\t\t/**\r\n\t\t * Current settings for the carousel.\r\n\t\t * @public\r\n\t\t */\r\n\t\tthis.settings = null;\r\n\r\n\t\t/**\r\n\t\t * Current options set by the caller including defaults.\r\n\t\t * @public\r\n\t\t */\r\n\t\tthis.options = $.extend({}, Owl.Defaults, options);\r\n\r\n\t\t/**\r\n\t\t * Plugin element.\r\n\t\t * @public\r\n\t\t */\r\n\t\tthis.$element = $(element);\r\n\r\n\t\t/**\r\n\t\t * Proxied event handlers.\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._handlers = {};\r\n\r\n\t\t/**\r\n\t\t * References to the running plugins of this carousel.\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._plugins = {};\r\n\r\n\t\t/**\r\n\t\t * Currently suppressed events to prevent them from being retriggered.\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._supress = {};\r\n\r\n\t\t/**\r\n\t\t * Absolute current position.\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._current = null;\r\n\r\n\t\t/**\r\n\t\t * Animation speed in milliseconds.\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._speed = null;\r\n\r\n\t\t/**\r\n\t\t * Coordinates of all items in pixel.\r\n\t\t * @todo The name of this member is missleading.\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._coordinates = [];\r\n\r\n\t\t/**\r\n\t\t * Current breakpoint.\r\n\t\t * @todo Real media queries would be nice.\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._breakpoint = null;\r\n\r\n\t\t/**\r\n\t\t * Current width of the plugin element.\r\n\t\t */\r\n\t\tthis._width = null;\r\n\r\n\t\t/**\r\n\t\t * All real items.\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._items = [];\r\n\r\n\t\t/**\r\n\t\t * All cloned items.\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._clones = [];\r\n\r\n\t\t/**\r\n\t\t * Merge values of all items.\r\n\t\t * @todo Maybe this could be part of a plugin.\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._mergers = [];\r\n\r\n\t\t/**\r\n\t\t * Widths of all items.\r\n\t\t */\r\n\t\tthis._widths = [];\r\n\r\n\t\t/**\r\n\t\t * Invalidated parts within the update process.\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._invalidated = {};\r\n\r\n\t\t/**\r\n\t\t * Ordered list of workers for the update process.\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._pipe = [];\r\n\r\n\t\t/**\r\n\t\t * Current state information for the drag operation.\r\n\t\t * @todo #261\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._drag = {\r\n\t\t\ttime: null,\r\n\t\t\ttarget: null,\r\n\t\t\tpointer: null,\r\n\t\t\tstage: {\r\n\t\t\t\tstart: null,\r\n\t\t\t\tcurrent: null\r\n\t\t\t},\r\n\t\t\tdirection: null\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * Current state information and their tags.\r\n\t\t * @type {Object}\r\n\t\t * @protected\r\n\t\t */\r\n\t\tthis._states = {\r\n\t\t\tcurrent: {},\r\n\t\t\ttags: {\r\n\t\t\t\t'initializing': [ 'busy' ],\r\n\t\t\t\t'animating': [ 'busy' ],\r\n\t\t\t\t'dragging': [ 'interacting' ]\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t$.each([ 'onResize', 'onThrottledResize' ], $.proxy(function(i, handler) {\r\n\t\t\tthis._handlers[handler] = $.proxy(this[handler], this);\r\n\t\t}, this));\r\n\r\n\t\t$.each(Owl.Plugins, $.proxy(function(key, plugin) {\r\n\t\t\tthis._plugins[key.charAt(0).toLowerCase() + key.slice(1)]\r\n\t\t\t\t= new plugin(this);\r\n\t\t}, this));\r\n\r\n\t\t$.each(Owl.Workers, $.proxy(function(priority, worker) {\r\n\t\t\tthis._pipe.push({\r\n\t\t\t\t'filter': worker.filter,\r\n\t\t\t\t'run': $.proxy(worker.run, this)\r\n\t\t\t});\r\n\t\t}, this));\r\n\r\n\t\tthis.setup();\r\n\t\tthis.initialize();\r\n\t}\r\n\r\n\t/**\r\n\t * Default options for the carousel.\r\n\t * @public\r\n\t */\r\n\tOwl.Defaults = {\r\n\t\titems: 3,\r\n\t\tloop: false,\r\n\t\tcenter: false,\r\n\t\trewind: false,\r\n\t\tcheckVisibility: true,\r\n\r\n\t\tmouseDrag: true,\r\n\t\ttouchDrag: true,\r\n\t\tpullDrag: true,\r\n\t\tfreeDrag: false,\r\n\r\n\t\tmargin: 0,\r\n\t\tstagePadding: 0,\r\n\r\n\t\tmerge: false,\r\n\t\tmergeFit: true,\r\n\t\tautoWidth: false,\r\n\r\n\t\tstartPosition: 0,\r\n\t\trtl: false,\r\n\r\n\t\tsmartSpeed: 250,\r\n\t\tfluidSpeed: false,\r\n\t\tdragEndSpeed: false,\r\n\r\n\t\tresponsive: {},\r\n\t\tresponsiveRefreshRate: 200,\r\n\t\tresponsiveBaseElement: window,\r\n\r\n\t\tfallbackEasing: 'swing',\r\n\t\tslideTransition: '',\r\n\r\n\t\tinfo: false,\r\n\r\n\t\tnestedItemSelector: false,\r\n\t\titemElement: 'div',\r\n\t\tstageElement: 'div',\r\n\r\n\t\trefreshClass: 'owl-refresh',\r\n\t\tloadedClass: 'owl-loaded',\r\n\t\tloadingClass: 'owl-loading',\r\n\t\trtlClass: 'owl-rtl',\r\n\t\tresponsiveClass: 'owl-responsive',\r\n\t\tdragClass: 'owl-drag',\r\n\t\titemClass: 'owl-item',\r\n\t\tstageClass: 'owl-stage',\r\n\t\tstageOuterClass: 'owl-stage-outer',\r\n\t\tgrabClass: 'owl-grab'\r\n\t};\r\n\r\n\t/**\r\n\t * Enumeration for width.\r\n\t * @public\r\n\t * @readonly\r\n\t * @enum {String}\r\n\t */\r\n\tOwl.Width = {\r\n\t\tDefault: 'default',\r\n\t\tInner: 'inner',\r\n\t\tOuter: 'outer'\r\n\t};\r\n\r\n\t/**\r\n\t * Enumeration for types.\r\n\t * @public\r\n\t * @readonly\r\n\t * @enum {String}\r\n\t */\r\n\tOwl.Type = {\r\n\t\tEvent: 'event',\r\n\t\tState: 'state'\r\n\t};\r\n\r\n\t/**\r\n\t * Contains all registered plugins.\r\n\t * @public\r\n\t */\r\n\tOwl.Plugins = {};\r\n\r\n\t/**\r\n\t * List of workers involved in the update process.\r\n\t */\r\n\tOwl.Workers = [ {\r\n\t\tfilter: [ 'width', 'settings' ],\r\n\t\trun: function() {\r\n\t\t\tthis._width = this.$element.width();\r\n\t\t}\r\n\t}, {\r\n\t\tfilter: [ 'width', 'items', 'settings' ],\r\n\t\trun: function(cache) {\r\n\t\t\tcache.current = this._items && this._items[this.relative(this._current)];\r\n\t\t}\r\n\t}, {\r\n\t\tfilter: [ 'items', 'settings' ],\r\n\t\trun: function() {\r\n\t\t\tthis.$stage.children('.cloned').remove();\r\n\t\t}\r\n\t}, {\r\n\t\tfilter: [ 'width', 'items', 'settings' ],\r\n\t\trun: function(cache) {\r\n\t\t\tvar margin = this.settings.margin || '',\r\n\t\t\t\tgrid = !this.settings.autoWidth,\r\n\t\t\t\trtl = this.settings.rtl,\r\n\t\t\t\tcss = {\r\n\t\t\t\t\t'width': 'auto',\r\n\t\t\t\t\t'margin-left': rtl ? margin : '',\r\n\t\t\t\t\t'margin-right': rtl ? '' : margin\r\n\t\t\t\t};\r\n\r\n\t\t\t!grid && this.$stage.children().css(css);\r\n\r\n\t\t\tcache.css = css;\r\n\t\t}\r\n\t}, {\r\n\t\tfilter: [ 'width', 'items', 'settings' ],\r\n\t\trun: function(cache) {\r\n\t\t\tvar width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin,\r\n\t\t\t\tmerge = null,\r\n\t\t\t\titerator = this._items.length,\r\n\t\t\t\tgrid = !this.settings.autoWidth,\r\n\t\t\t\twidths = [];\r\n\r\n\t\t\tcache.items = {\r\n\t\t\t\tmerge: false,\r\n\t\t\t\twidth: width\r\n\t\t\t};\r\n\r\n\t\t\twhile (iterator--) {\r\n\t\t\t\tmerge = this._mergers[iterator];\r\n\t\t\t\tmerge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge;\r\n\r\n\t\t\t\tcache.items.merge = merge > 1 || cache.items.merge;\r\n\r\n\t\t\t\twidths[iterator] = !grid ? this._items[iterator].width() : width * merge;\r\n\t\t\t}\r\n\r\n\t\t\tthis._widths = widths;\r\n\t\t}\r\n\t}, {\r\n\t\tfilter: [ 'items', 'settings' ],\r\n\t\trun: function() {\r\n\t\t\tvar clones = [],\r\n\t\t\t\titems = this._items,\r\n\t\t\t\tsettings = this.settings,\r\n\t\t\t\t// TODO: Should be computed from number of min width items in stage\r\n\t\t\t\tview = Math.max(settings.items * 2, 4),\r\n\t\t\t\tsize = Math.ceil(items.length / 2) * 2,\r\n\t\t\t\trepeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0,\r\n\t\t\t\tappend = '',\r\n\t\t\t\tprepend = '';\r\n\r\n\t\t\trepeat /= 2;\r\n\r\n\t\t\twhile (repeat > 0) {\r\n\t\t\t\t// Switch to only using appended clones\r\n\t\t\t\tclones.push(this.normalize(clones.length / 2, true));\r\n\t\t\t\tappend = append + items[clones[clones.length - 1]][0].outerHTML;\r\n\t\t\t\tclones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true));\r\n\t\t\t\tprepend = items[clones[clones.length - 1]][0].outerHTML + prepend;\r\n\t\t\t\trepeat -= 1;\r\n\t\t\t}\r\n\r\n\t\t\tthis._clones = clones;\r\n\r\n\t\t\t$(append).addClass('cloned').appendTo(this.$stage);\r\n\t\t\t$(prepend).addClass('cloned').prependTo(this.$stage);\r\n\t\t}\r\n\t}, {\r\n\t\tfilter: [ 'width', 'items', 'settings' ],\r\n\t\trun: function() {\r\n\t\t\tvar rtl = this.settings.rtl ? 1 : -1,\r\n\t\t\t\tsize = this._clones.length + this._items.length,\r\n\t\t\t\titerator = -1,\r\n\t\t\t\tprevious = 0,\r\n\t\t\t\tcurrent = 0,\r\n\t\t\t\tcoordinates = [];\r\n\r\n\t\t\twhile (++iterator < size) {\r\n\t\t\t\tprevious = coordinates[iterator - 1] || 0;\r\n\t\t\t\tcurrent = this._widths[this.relative(iterator)] + this.settings.margin;\r\n\t\t\t\tcoordinates.push(previous + current * rtl);\r\n\t\t\t}\r\n\r\n\t\t\tthis._coordinates = coordinates;\r\n\t\t}\r\n\t}, {\r\n\t\tfilter: [ 'width', 'items', 'settings' ],\r\n\t\trun: function() {\r\n\t\t\tvar padding = this.settings.stagePadding,\r\n\t\t\t\tcoordinates = this._coordinates,\r\n\t\t\t\tcss = {\r\n\t\t\t\t\t'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2,\r\n\t\t\t\t\t'padding-left': padding || '',\r\n\t\t\t\t\t'padding-right': padding || ''\r\n\t\t\t\t};\r\n\r\n\t\t\tthis.$stage.css(css);\r\n\t\t}\r\n\t}, {\r\n\t\tfilter: [ 'width', 'items', 'settings' ],\r\n\t\trun: function(cache) {\r\n\t\t\tvar iterator = this._coordinates.length,\r\n\t\t\t\tgrid = !this.settings.autoWidth,\r\n\t\t\t\titems = this.$stage.children();\r\n\r\n\t\t\tif (grid && cache.items.merge) {\r\n\t\t\t\twhile (iterator--) {\r\n\t\t\t\t\tcache.css.width = this._widths[this.relative(iterator)];\r\n\t\t\t\t\titems.eq(iterator).css(cache.css);\r\n\t\t\t\t}\r\n\t\t\t} else if (grid) {\r\n\t\t\t\tcache.css.width = cache.items.width;\r\n\t\t\t\titems.css(cache.css);\r\n\t\t\t}\r\n\t\t}\r\n\t}, {\r\n\t\tfilter: [ 'items' ],\r\n\t\trun: function() {\r\n\t\t\tthis._coordinates.length < 1 && this.$stage.removeAttr('style');\r\n\t\t}\r\n\t}, {\r\n\t\tfilter: [ 'width', 'items', 'settings' ],\r\n\t\trun: function(cache) {\r\n\t\t\tcache.current = cache.current ? this.$stage.children().index(cache.current) : 0;\r\n\t\t\tcache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current));\r\n\t\t\tthis.reset(cache.current);\r\n\t\t}\r\n\t}, {\r\n\t\tfilter: [ 'position' ],\r\n\t\trun: function() {\r\n\t\t\tthis.animate(this.coordinates(this._current));\r\n\t\t}\r\n\t}, {\r\n\t\tfilter: [ 'width', 'position', 'items', 'settings' ],\r\n\t\trun: function() {\r\n\t\t\tvar rtl = this.settings.rtl ? 1 : -1,\r\n\t\t\t\tpadding = this.settings.stagePadding * 2,\r\n\t\t\t\tbegin = this.coordinates(this.current()) + padding,\r\n\t\t\t\tend = begin + this.width() * rtl,\r\n\t\t\t\tinner, outer, matches = [], i, n;\r\n\r\n\t\t\tfor (i = 0, n = this._coordinates.length; i < n; i++) {\r\n\t\t\t\tinner = this._coordinates[i - 1] || 0;\r\n\t\t\t\touter = Math.abs(this._coordinates[i]) + padding * rtl;\r\n\r\n\t\t\t\tif ((this.op(inner, '<=', begin) && (this.op(inner, '>', end)))\r\n\t\t\t\t\t|| (this.op(outer, '<', begin) && this.op(outer, '>', end))) {\r\n\t\t\t\t\tmatches.push(i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis.$stage.children('.active').removeClass('active');\r\n\t\t\tthis.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active');\r\n\r\n\t\t\tthis.$stage.children('.center').removeClass('center');\r\n\t\t\tif (this.settings.center) {\r\n\t\t\t\tthis.$stage.children().eq(this.current()).addClass('center');\r\n\t\t\t}\r\n\t\t}\r\n\t} ];\r\n\r\n\t/**\r\n\t * Create the stage DOM element\r\n\t */\r\n\tOwl.prototype.initializeStage = function() {\r\n\t\tthis.$stage = this.$element.find('.' + this.settings.stageClass);\r\n\r\n\t\t// if the stage is already in the DOM, grab it and skip stage initialization\r\n\t\tif (this.$stage.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.$element.addClass(this.options.loadingClass);\r\n\r\n\t\t// create stage\r\n\t\tthis.$stage = $('<' + this.settings.stageElement + '>', {\r\n\t\t\t\"class\": this.settings.stageClass\r\n\t\t}).wrap( $( '<div/>', {\r\n\t\t\t\"class\": this.settings.stageOuterClass\r\n\t\t}));\r\n\r\n\t\t// append stage\r\n\t\tthis.$element.append(this.$stage.parent());\r\n\t};\r\n\r\n\t/**\r\n\t * Create item DOM elements\r\n\t */\r\n\tOwl.prototype.initializeItems = function() {\r\n\t\tvar $items = this.$element.find('.owl-item');\r\n\r\n\t\t// if the items are already in the DOM, grab them and skip item initialization\r\n\t\tif ($items.length) {\r\n\t\t\tthis._items = $items.get().map(function(item) {\r\n\t\t\t\treturn $(item);\r\n\t\t\t});\r\n\r\n\t\t\tthis._mergers = this._items.map(function() {\r\n\t\t\t\treturn 1;\r\n\t\t\t});\r\n\r\n\t\t\tthis.refresh();\r\n\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// append content\r\n\t\tthis.replace(this.$element.children().not(this.$stage.parent()));\r\n\r\n\t\t// check visibility\r\n\t\tif (this.isVisible()) {\r\n\t\t\t// update view\r\n\t\t\tthis.refresh();\r\n\t\t} else {\r\n\t\t\t// invalidate width\r\n\t\t\tthis.invalidate('width');\r\n\t\t}\r\n\r\n\t\tthis.$element\r\n\t\t\t.removeClass(this.options.loadingClass)\r\n\t\t\t.addClass(this.options.loadedClass);\r\n\t};\r\n\r\n\t/**\r\n\t * Initializes the carousel.\r\n\t * @protected\r\n\t */\r\n\tOwl.prototype.initialize = function() {\r\n\t\tthis.enter('initializing');\r\n\t\tthis.trigger('initialize');\r\n\r\n\t\tthis.$element.toggleClass(this.settings.rtlClass, this.settings.rtl);\r\n\r\n\t\tif (this.settings.autoWidth && !this.is('pre-loading')) {\r\n\t\t\tvar imgs, nestedSelector, width;\r\n\t\t\timgs = this.$element.find('img');\r\n\t\t\tnestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined;\r\n\t\t\twidth = this.$element.children(nestedSelector).width();\r\n\r\n\t\t\tif (imgs.length && width <= 0) {\r\n\t\t\t\tthis.preloadAutoWidthImages(imgs);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.initializeStage();\r\n\t\tthis.initializeItems();\r\n\r\n\t\t// register event handlers\r\n\t\tthis.registerEventHandlers();\r\n\r\n\t\tthis.leave('initializing');\r\n\t\tthis.trigger('initialized');\r\n\t};\r\n\r\n\t/**\r\n\t * @returns {Boolean} visibility of $element\r\n\t * if you know the carousel will always be visible you can set `checkVisibility` to `false` to\r\n\t * prevent the expensive browser layout forced reflow the $element.is(':visible') does\r\n\t */\r\n\tOwl.prototype.isVisible = function() {\r\n\t\treturn this.settings.checkVisibility\r\n\t\t\t? this.$element.is(':visible')\r\n\t\t\t: true;\r\n\t};\r\n\r\n\t/**\r\n\t * Setups the current settings.\r\n\t * @todo Remove responsive classes. Why should adaptive designs be brought into IE8?\r\n\t * @todo Support for media queries by using `matchMedia` would be nice.\r\n\t * @public\r\n\t */\r\n\tOwl.prototype.setup = function() {\r\n\t\tvar viewport = this.viewport(),\r\n\t\t\toverwrites = this.options.responsive,\r\n\t\t\tmatch = -1,\r\n\t\t\tsettings = null;\r\n\r\n\t\tif (!overwrites) {\r\n\t\t\tsettings = $.extend({}, this.options);\r\n\t\t} else {\r\n\t\t\t$.each(overwrites, function(breakpoint) {\r\n\t\t\t\tif (breakpoint <= viewport && breakpoint > match) {\r\n\t\t\t\t\tmatch = Number(breakpoint);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tsettings = $.extend({}, this.options, overwrites[match]);\r\n\t\t\tif (typeof settings.stagePadding === 'function') {\r\n\t\t\t\tsettings.stagePadding = settings.stagePadding();\r\n\t\t\t}\r\n\t\t\tdelete settings.responsive;\r\n\r\n\t\t\t// responsive class\r\n\t\t\tif (settings.responsiveClass) {\r\n\t\t\t\tthis.$element.attr('class',\r\n\t\t\t\t\tthis.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\\\S+\\\\s', 'g'), '$1' + match)\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.trigger('change', { property: { name: 'settings', value: settings } });\r\n\t\tthis._breakpoint = match;\r\n\t\tthis.settings = settings;\r\n\t\tthis.invalidate('settings');\r\n\t\tthis.trigger('changed', { property: { name: 'settings', value: this.settings } });\r\n\t};\r\n\r\n\t/**\r\n\t * Updates option logic if necessery.\r\n\t * @protected\r\n\t */\r\n\tOwl.prototype.optionsLogic = function() {\r\n\t\tif (this.settings.autoWidth) {\r\n\t\t\tthis.settings.stagePadding = false;\r\n\t\t\tthis.settings.merge = false;\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Prepares an item before add.\r\n\t * @todo Rename event parameter `content` to `item`.\r\n\t * @protected\r\n\t * @returns {jQuery|HTMLElement} - The item container.\r\n\t */\r\n\tOwl.prototype.prepare = function(item) {\r\n\t\tvar event = this.trigger('prepare', { content: item });\r\n\r\n\t\tif (!event.data) {\r\n\t\t\tevent.data = $('<' + this.settings.itemElement + '/>')\r\n\t\t\t\t.addClass(this.options.itemClass).append(item)\r\n\t\t}\r\n\r\n\t\tthis.trigger('prepared', { content: event.data });\r\n\r\n\t\treturn event.data;\r\n\t};\r\n\r\n\t/**\r\n\t * Updates the view.\r\n\t * @public\r\n\t */\r\n\tOwl.prototype.update = function() {\r\n\t\tvar i = 0,\r\n\t\t\tn = this._pipe.length,\r\n\t\t\tfilter = $.proxy(function(p) { return this[p] }, this._invalidated),\r\n\t\t\tcache = {};\r\n\r\n\t\twhile (i < n) {\r\n\t\t\tif (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) {\r\n\t\t\t\tthis._pipe[i].run(cache);\r\n\t\t\t}\r\n\t\t\ti++;\r\n\t\t}\r\n\r\n\t\tthis._invalidated = {};\r\n\r\n\t\t!this.is('valid') && this.enter('valid');\r\n\t};\r\n\r\n\t/**\r\n\t * Gets the width of the view.\r\n\t * @public\r\n\t * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return.\r\n\t * @returns {Number} - The width of the view in pixel.\r\n\t */\r\n\tOwl.prototype.width = function(dimension) {\r\n\t\tdimension = dimension || Owl.Width.Default;\r\n\t\tswitch (dimension) {\r\n\t\t\tcase Owl.Width.Inner:\r\n\t\t\tcase Owl.Width.Outer:\r\n\t\t\t\treturn this._width;\r\n\t\t\tdefault:\r\n\t\t\t\treturn this._width - this.settings.stagePadding * 2 + this.settings.margin;\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Refreshes the carousel primarily for adaptive purposes.\r\n\t * @public\r\n\t */\r\n\tOwl.prototype.refresh = function() {\r\n\t\tthis.enter('refreshing');\r\n\t\tthis.trigger('refresh');\r\n\r\n\t\tthis.setup();\r\n\r\n\t\tthis.optionsLogic();\r\n\r\n\t\tthis.$element.addClass(this.options.refreshClass);\r\n\r\n\t\tthis.update();\r\n\r\n\t\tthis.$element.removeClass(this.options.refreshClass);\r\n\r\n\t\tthis.leave('refreshing');\r\n\t\tthis.trigger('refreshed');\r\n\t};\r\n\r\n\t/**\r\n\t * Checks window `resize` event.\r\n\t * @protected\r\n\t */\r\n\tOwl.prototype.onThrottledResize = function() {\r\n\t\twindow.clearTimeout(this.resizeTimer);\r\n\t\tthis.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate);\r\n\t};\r\n\r\n\t/**\r\n\t * Checks window `resize` event.\r\n\t * @protected\r\n\t */\r\n\tOwl.prototype.onResize = function() {\r\n\t\tif (!this._items.length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (this._width === this.$element.width()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (!this.isVisible()) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.enter('resizing');\r\n\r\n\t\tif (this.trigger('resize').isDefaultPrevented()) {\r\n\t\t\tthis.leave('resizing');\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tthis.invalidate('width');\r\n\r\n\t\tthis.refresh();\r\n\r\n\t\tthis.leave('resizing');\r\n\t\tthis.trigger('resized');\r\n\t};\r\n\r\n\t/**\r\n\t * Registers event handlers.\r\n\t * @todo Check `msPointerEnabled`\r\n\t * @todo #261\r\n\t * @protected\r\n\t */\r\n\tOwl.prototype.registerEventHandlers = function() {\r\n\t\tif ($.support.transition) {\r\n\t\t\tthis.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this));\r\n\t\t}\r\n\r\n\t\tif (this.settings.responsive !== false) {\r\n\t\t\tthis.on(window, 'resize', this._handlers.onThrottledResize);\r\n\t\t}\r\n\r\n\t\tif (this.settings.mouseDrag) {\r\n\t\t\tthis.$element.addClass(this.options.dragClass);\r\n\t\t\tthis.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this));\r\n\t\t\tthis.$stage.on('dragstart.owl.core selectstart.owl.core', function() { return false });\r\n\t\t}\r\n\r\n\t\tif (this.settings.touchDrag){\r\n\t\t\tthis.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this));\r\n\t\t\tthis.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this));\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Handles `touchstart` and `mousedown` events.\r\n\t * @todo Horizontal swipe threshold as option\r\n\t * @todo #261\r\n\t * @protected\r\n\t * @param {Event} event - The event arguments.\r\n\t */\r\n\tOwl.prototype.onDragStart = function(event) {\r\n\t\tvar stage = null;\r\n\r\n\t\tif (event.which === 3) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif ($.support.transform) {\r\n\t\t\tstage = this.$stage.css('transform').replace(/.*\\(|\\)| /g, '').split(',');\r\n\t\t\tstage = {\r\n\t\t\t\tx: stage[stage.length === 16 ? 12 : 4],\r\n\t\t\t\ty: stage[stage.length === 16 ? 13 : 5]\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\tstage = this.$stage.position();\r\n\t\t\tstage = {\r\n\t\t\t\tx: this.settings.rtl ?\r\n\t\t\t\t\tstage.left + this.$stage.width() - this.width() + this.settings.margin :\r\n\t\t\t\t\tstage.left,\r\n\t\t\t\ty: stage.top\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tif (this.is('animating')) {\r\n\t\t\t$.support.transform ? this.animate(stage.x) : this.$stage.stop()\r\n\t\t\tthis.invalidate('position');\r\n\t\t}\r\n\r\n\t\tthis.$element.toggleClass(this.options.grabClass, event.type === 'mousedown');\r\n\r\n\t\tthis.speed(0);\r\n\r\n\t\tthis._drag.time = new Date().getTime();\r\n\t\tthis._drag.target = $(event.target);\r\n\t\tthis._drag.stage.start = stage;\r\n\t\tthis._drag.stage.current = stage;\r\n\t\tthis._drag.pointer = this.pointer(event);\r\n\r\n\t\t$(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this));\r\n\r\n\t\t$(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function(event) {\r\n\t\t\tvar delta = this.difference(this._drag.pointer, this.pointer(event));\r\n\r\n\t\t\t$(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this));\r\n\r\n\t\t\tif (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tevent.preventDefault();\r\n\r\n\t\t\tthis.enter('dragging');\r\n\t\t\tthis.trigger('drag');\r\n\t\t}, this));\r\n\t};\r\n\r\n\t/**\r\n\t * Handles the `touchmove` and `mousemove` events.\r\n\t * @todo #261\r\n\t * @protected\r\n\t * @param {Event} event - The event arguments.\r\n\t */\r\n\tOwl.prototype.onDragMove = function(event) {\r\n\t\tvar minimum = null,\r\n\t\t\tmaximum = null,\r\n\t\t\tpull = null,\r\n\t\t\tdelta = this.difference(this._drag.pointer, this.pointer(event)),\r\n\t\t\tstage = this.difference(this._drag.stage.start, delta);\r\n\r\n\t\tif (!this.is('dragging')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tevent.preventDefault();\r\n\r\n\t\tif (this.settings.loop) {\r\n\t\t\tminimum = this.coordinates(this.minimum());\r\n\t\t\tmaximum = this.coordinates(this.maximum() + 1) - minimum;\r\n\t\t\tstage.x = (((stage.x - minimum) % maximum + maximum) % maximum) + minimum;\r\n\t\t} else {\r\n\t\t\tminimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum());\r\n\t\t\tmaximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum());\r\n\t\t\tpull = this.settings.pullDrag ? -1 * delta.x / 5 : 0;\r\n\t\t\tstage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull);\r\n\t\t}\r\n\r\n\t\tthis._drag.stage.current = stage;\r\n\r\n\t\tthis.animate(stage.x);\r\n\t};\r\n\r\n\t/**\r\n\t * Handles the `touchend` and `mouseup` events.\r\n\t * @todo #261\r\n\t * @todo Threshold for click event\r\n\t * @protected\r\n\t * @param {Event} event - The event arguments.\r\n\t */\r\n\tOwl.prototype.onDragEnd = function(event) {\r\n\t\tvar delta = this.difference(this._drag.pointer, this.pointer(event)),\r\n\t\t\tstage = this._drag.stage.current,\r\n\t\t\tdirection = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right';\r\n\r\n\t\t$(document).off('.owl.core');\r\n\r\n\t\tthis.$element.removeClass(this.options.grabClass);\r\n\r\n\t\tif (delta.x !== 0 && this.is('dragging') || !this.is('valid')) {\r\n\t\t\tthis.speed(this.settings.dragEndSpeed || this.settings.smartSpeed);\r\n\t\t\tthis.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction));\r\n\t\t\tthis.invalidate('position');\r\n\t\t\tthis.update();\r\n\r\n\t\t\tthis._drag.direction = direction;\r\n\r\n\t\t\tif (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) {\r\n\t\t\t\tthis._drag.target.one('click.owl.core', function() { return false; });\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!this.is('dragging')) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.leave('dragging');\r\n\t\tthis.trigger('dragged');\r\n\t};\r\n\r\n\t/**\r\n\t * Gets absolute position of the closest item for a coordinate.\r\n\t * @todo Setting `freeDrag` makes `closest` not reusable. See #165.\r\n\t * @protected\r\n\t * @param {Number} coordinate - The coordinate in pixel.\r\n\t * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`.\r\n\t * @return {Number} - The absolute position of the closest item.\r\n\t */\r\n\tOwl.prototype.closest = function(coordinate, direction) {\r\n\t\tvar position = -1,\r\n\t\t\tpull = 30,\r\n\t\t\twidth = this.width(),\r\n\t\t\tcoordinates = this.coordinates();\r\n\r\n\t\tif (!this.settings.freeDrag) {\r\n\t\t\t// check closest item\r\n\t\t\t$.each(coordinates, $.proxy(function(index, value) {\r\n\t\t\t\t// on a left pull, check on current index\r\n\t\t\t\tif (direction === 'left' && coordinate > value - pull && coordinate < value + pull) {\r\n\t\t\t\t\tposition = index;\r\n\t\t\t\t// on a right pull, check on previous index\r\n\t\t\t\t// to do so, subtract width from value and set position = index + 1\r\n\t\t\t\t} else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) {\r\n\t\t\t\t\tposition = index + 1;\r\n\t\t\t\t} else if (this.op(coordinate, '<', value)\r\n\t\t\t\t\t&& this.op(coordinate, '>', coordinates[index + 1] !== undefined ? coordinates[index + 1] : value - width)) {\r\n\t\t\t\t\tposition = direction === 'left' ? index + 1 : index;\r\n\t\t\t\t}\r\n\t\t\t\treturn position === -1;\r\n\t\t\t}, this));\r\n\t\t}\r\n\r\n\t\tif (!this.settings.loop) {\r\n\t\t\t// non loop boundries\r\n\t\t\tif (this.op(coordinate, '>', coordinates[this.minimum()])) {\r\n\t\t\t\tposition = coordinate = this.minimum();\r\n\t\t\t} else if (this.op(coordinate, '<', coordinates[this.maximum()])) {\r\n\t\t\t\tposition = coordinate = this.maximum();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn position;\r\n\t};\r\n\r\n\t/**\r\n\t * Animates the stage.\r\n\t * @todo #270\r\n\t * @public\r\n\t * @param {Number} coordinate - The coordinate in pixels.\r\n\t */\r\n\tOwl.prototype.animate = function(coordinate) {\r\n\t\tvar animate = this.speed() > 0;\r\n\r\n\t\tthis.is('animating') && this.onTransitionEnd();\r\n\r\n\t\tif (animate) {\r\n\t\t\tthis.enter('animating');\r\n\t\t\tthis.trigger('translate');\r\n\t\t}\r\n\r\n\t\tif ($.support.transform3d && $.support.transition) {\r\n\t\t\tthis.$stage.css({\r\n\t\t\t\ttransform: 'translate3d(' + coordinate + 'px,0px,0px)',\r\n\t\t\t\ttransition: (this.speed() / 1000) + 's' + (\r\n\t\t\t\t\tthis.settings.slideTransition ? ' ' + this.settings.slideTransition : ''\r\n\t\t\t\t)\r\n\t\t\t});\r\n\t\t} else if (animate) {\r\n\t\t\tthis.$stage.animate({\r\n\t\t\t\tleft: coordinate + 'px'\r\n\t\t\t}, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this));\r\n\t\t} else {\r\n\t\t\tthis.$stage.css({\r\n\t\t\t\tleft: coordinate + 'px'\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Checks whether the carousel is in a specific state or not.\r\n\t * @param {String} state - The state to check.\r\n\t * @returns {Boolean} - The flag which indicates if the carousel is busy.\r\n\t */\r\n\tOwl.prototype.is = function(state) {\r\n\t\treturn this._states.current[state] && this._states.current[state] > 0;\r\n\t};\r\n\r\n\t/**\r\n\t * Sets the absolute position of the current item.\r\n\t * @public\r\n\t * @param {Number} [position] - The new absolute position or nothing to leave it unchanged.\r\n\t * @returns {Number} - The absolute position of the current item.\r\n\t */\r\n\tOwl.prototype.current = function(position) {\r\n\t\tif (position === undefined) {\r\n\t\t\treturn this._current;\r\n\t\t}\r\n\r\n\t\tif (this._items.length === 0) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\tposition = this.normalize(position);\r\n\r\n\t\tif (this._current !== position) {\r\n\t\t\tvar event = this.trigger('change', { property: { name: 'position', value: position } });\r\n\r\n\t\t\tif (event.data !== undefined) {\r\n\t\t\t\tposition = this.normalize(event.data);\r\n\t\t\t}\r\n\r\n\t\t\tthis._current = position;\r\n\r\n\t\t\tthis.invalidate('position');\r\n\r\n\t\t\tthis.trigger('changed', { property: { name: 'position', value: this._current } });\r\n\t\t}\r\n\r\n\t\treturn this._current;\r\n\t};\r\n\r\n\t/**\r\n\t * Invalidates the given part of the update routine.\r\n\t * @param {String} [part] - The part to invalidate.\r\n\t * @returns {Array.<String>} - The invalidated parts.\r\n\t */\r\n\tOwl.prototype.invalidate = function(part) {\r\n\t\tif ($.type(part) === 'string') {\r\n\t\t\tthis._invalidated[part] = true;\r\n\t\t\tthis.is('valid') && this.leave('valid');\r\n\t\t}\r\n\t\treturn $.map(this._invalidated, function(v, i) { return i });\r\n\t};\r\n\r\n\t/**\r\n\t * Resets the absolute position of the current item.\r\n\t * @public\r\n\t * @param {Number} position - The absolute position of the new item.\r\n\t */\r\n\tOwl.prototype.reset = function(position) {\r\n\t\tposition = this.normalize(position);\r\n\r\n\t\tif (position === undefined) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._speed = 0;\r\n\t\tthis._current = position;\r\n\r\n\t\tthis.suppress([ 'translate', 'translated' ]);\r\n\r\n\t\tthis.animate(this.coordinates(position));\r\n\r\n\t\tthis.release([ 'translate', 'translated' ]);\r\n\t};\r\n\r\n\t/**\r\n\t * Normalizes an absolute or a relative position of an item.\r\n\t * @public\r\n\t * @param {Number} position - The absolute or relative position to normalize.\r\n\t * @param {Boolean} [relative=false] - Whether the given position is relative or not.\r\n\t * @returns {Number} - The normalized position.\r\n\t */\r\n\tOwl.prototype.normalize = function(position, relative) {\r\n\t\tvar n = this._items.length,\r\n\t\t\tm = relative ? 0 : this._clones.length;\r\n\r\n\t\tif (!this.isNumeric(position) || n < 1) {\r\n\t\t\tposition = undefined;\r\n\t\t} else if (position < 0 || position >= n + m) {\r\n\t\t\tposition = ((position - m / 2) % n + n) % n + m / 2;\r\n\t\t}\r\n\r\n\t\treturn position;\r\n\t};\r\n\r\n\t/**\r\n\t * Converts an absolute position of an item into a relative one.\r\n\t * @public\r\n\t * @param {Number} position - The absolute position to convert.\r\n\t * @returns {Number} - The converted position.\r\n\t */\r\n\tOwl.prototype.relative = function(position) {\r\n\t\tposition -= this._clones.length / 2;\r\n\t\treturn this.normalize(position, true);\r\n\t};\r\n\r\n\t/**\r\n\t * Gets the maximum position for the current item.\r\n\t * @public\r\n\t * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.\r\n\t * @returns {Number}\r\n\t */\r\n\tOwl.prototype.maximum = function(relative) {\r\n\t\tvar settings = this.settings,\r\n\t\t\tmaximum = this._coordinates.length,\r\n\t\t\titerator,\r\n\t\t\treciprocalItemsWidth,\r\n\t\t\telementWidth;\r\n\r\n\t\tif (settings.loop) {\r\n\t\t\tmaximum = this._clones.length / 2 + this._items.length - 1;\r\n\t\t} else if (settings.autoWidth || settings.merge) {\r\n\t\t\titerator = this._items.length;\r\n\t\t\tif (iterator) {\r\n\t\t\t\treciprocalItemsWidth = this._items[--iterator].width();\r\n\t\t\t\telementWidth = this.$element.width();\r\n\t\t\t\twhile (iterator--) {\r\n\t\t\t\t\treciprocalItemsWidth += this._items[iterator].width() + this.settings.margin;\r\n\t\t\t\t\tif (reciprocalItemsWidth > elementWidth) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tmaximum = iterator + 1;\r\n\t\t} else if (settings.center) {\r\n\t\t\tmaximum = this._items.length - 1;\r\n\t\t} else {\r\n\t\t\tmaximum = this._items.length - settings.items;\r\n\t\t}\r\n\r\n\t\tif (relative) {\r\n\t\t\tmaximum -= this._clones.length / 2;\r\n\t\t}\r\n\r\n\t\treturn Math.max(maximum, 0);\r\n\t};\r\n\r\n\t/**\r\n\t * Gets the minimum position for the current item.\r\n\t * @public\r\n\t * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.\r\n\t * @returns {Number}\r\n\t */\r\n\tOwl.prototype.minimum = function(relative) {\r\n\t\treturn relative ? 0 : this._clones.length / 2;\r\n\t};\r\n\r\n\t/**\r\n\t * Gets an item at the specified relative position.\r\n\t * @public\r\n\t * @param {Number} [position] - The relative position of the item.\r\n\t * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.\r\n\t */\r\n\tOwl.prototype.items = function(position) {\r\n\t\tif (position === undefined) {\r\n\t\t\treturn this._items.slice();\r\n\t\t}\r\n\r\n\t\tposition = this.normalize(position, true);\r\n\t\treturn this._items[position];\r\n\t};\r\n\r\n\t/**\r\n\t * Gets an item at the specified relative position.\r\n\t * @public\r\n\t * @param {Number} [position] - The relative position of the item.\r\n\t * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.\r\n\t */\r\n\tOwl.prototype.mergers = function(position) {\r\n\t\tif (position === undefined) {\r\n\t\t\treturn this._mergers.slice();\r\n\t\t}\r\n\r\n\t\tposition = this.normalize(position, true);\r\n\t\treturn this._mergers[position];\r\n\t};\r\n\r\n\t/**\r\n\t * Gets the absolute positions of clones for an item.\r\n\t * @public\r\n\t * @param {Number} [position] - The relative position of the item.\r\n\t * @returns {Array.<Number>} - The absolute positions of clones for the item or all if no position was given.\r\n\t */\r\n\tOwl.prototype.clones = function(position) {\r\n\t\tvar odd = this._clones.length / 2,\r\n\t\t\teven = odd + this._items.length,\r\n\t\t\tmap = function(index) { return index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2 };\r\n\r\n\t\tif (position === undefined) {\r\n\t\t\treturn $.map(this._clones, function(v, i) { return map(i) });\r\n\t\t}\r\n\r\n\t\treturn $.map(this._clones, function(v, i) { return v === position ? map(i) : null });\r\n\t};\r\n\r\n\t/**\r\n\t * Sets the current animation speed.\r\n\t * @public\r\n\t * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged.\r\n\t * @returns {Number} - The current animation speed in milliseconds.\r\n\t */\r\n\tOwl.prototype.speed = function(speed) {\r\n\t\tif (speed !== undefined) {\r\n\t\t\tthis._speed = speed;\r\n\t\t}\r\n\r\n\t\treturn this._speed;\r\n\t};\r\n\r\n\t/**\r\n\t * Gets the coordinate of an item.\r\n\t * @todo The name of this method is missleanding.\r\n\t * @public\r\n\t * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`.\r\n\t * @returns {Number|Array.<Number>} - The coordinate of the item in pixel or all coordinates.\r\n\t */\r\n\tOwl.prototype.coordinates = function(position) {\r\n\t\tvar multiplier = 1,\r\n\t\t\tnewPosition = position - 1,\r\n\t\t\tcoordinate;\r\n\r\n\t\tif (position === undefined) {\r\n\t\t\treturn $.map(this._coordinates, $.proxy(function(coordinate, index) {\r\n\t\t\t\treturn this.coordinates(index);\r\n\t\t\t}, this));\r\n\t\t}\r\n\r\n\t\tif (this.settings.center) {\r\n\t\t\tif (this.settings.rtl) {\r\n\t\t\t\tmultiplier = -1;\r\n\t\t\t\tnewPosition = position + 1;\r\n\t\t\t}\r\n\r\n\t\t\tcoordinate = this._coordinates[position];\r\n\t\t\tcoordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier;\r\n\t\t} else {\r\n\t\t\tcoordinate = this._coordinates[newPosition] || 0;\r\n\t\t}\r\n\r\n\t\tcoordinate = Math.ceil(coordinate);\r\n\r\n\t\treturn coordinate;\r\n\t};\r\n\r\n\t/**\r\n\t * Calculates the speed for a translation.\r\n\t * @protected\r\n\t * @param {Number} from - The absolute position of the start item.\r\n\t * @param {Number} to - The absolute position of the target item.\r\n\t * @param {Number} [factor=undefined] - The time factor in milliseconds.\r\n\t * @returns {Number} - The time in milliseconds for the translation.\r\n\t */\r\n\tOwl.prototype.duration = function(from, to, factor) {\r\n\t\tif (factor === 0) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\treturn Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs((factor || this.settings.smartSpeed));\r\n\t};\r\n\r\n\t/**\r\n\t * Slides to the specified item.\r\n\t * @public\r\n\t * @param {Number} position - The position of the item.\r\n\t * @param {Number} [speed] - The time in milliseconds for the transition.\r\n\t */\r\n\tOwl.prototype.to = function(position, speed) {\r\n\t\tvar current = this.current(),\r\n\t\t\trevert = null,\r\n\t\t\tdistance = position - this.relative(current),\r\n\t\t\tdirection = (distance > 0) - (distance < 0),\r\n\t\t\titems = this._items.length,\r\n\t\t\tminimum = this.minimum(),\r\n\t\t\tmaximum = this.maximum();\r\n\r\n\t\tif (this.settings.loop) {\r\n\t\t\tif (!this.settings.rewind && Math.abs(distance) > items / 2) {\r\n\t\t\t\tdistance += direction * -1 * items;\r\n\t\t\t}\r\n\r\n\t\t\tposition = current + distance;\r\n\t\t\trevert = ((position - minimum) % items + items) % items + minimum;\r\n\r\n\t\t\tif (revert !== position && revert - distance <= maximum && revert - distance > 0) {\r\n\t\t\t\tcurrent = revert - distance;\r\n\t\t\t\tposition = revert;\r\n\t\t\t\tthis.reset(current);\r\n\t\t\t}\r\n\t\t} else if (this.settings.rewind) {\r\n\t\t\tmaximum += 1;\r\n\t\t\tposition = (position % maximum + maximum) % maximum;\r\n\t\t} else {\r\n\t\t\tposition = Math.max(minimum, Math.min(maximum, position));\r\n\t\t}\r\n\r\n\t\tthis.speed(this.duration(current, position, speed));\r\n\t\tthis.current(position);\r\n\r\n\t\tif (this.isVisible()) {\r\n\t\t\tthis.update();\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Slides to the next item.\r\n\t * @public\r\n\t * @param {Number} [speed] - The time in milliseconds for the transition.\r\n\t */\r\n\tOwl.prototype.next = function(speed) {\r\n\t\tspeed = speed || false;\r\n\t\tthis.to(this.relative(this.current()) + 1, speed);\r\n\t};\r\n\r\n\t/**\r\n\t * Slides to the previous item.\r\n\t * @public\r\n\t * @param {Number} [speed] - The time in milliseconds for the transition.\r\n\t */\r\n\tOwl.prototype.prev = function(speed) {\r\n\t\tspeed = speed || false;\r\n\t\tthis.to(this.relative(this.current()) - 1, speed);\r\n\t};\r\n\r\n\t/**\r\n\t * Handles the end of an animation.\r\n\t * @protected\r\n\t * @param {Event} event - The event arguments.\r\n\t */\r\n\tOwl.prototype.onTransitionEnd = function(event) {\r\n\r\n\t\t// if css2 animation then event object is undefined\r\n\t\tif (event !== undefined) {\r\n\t\t\tevent.stopPropagation();\r\n\r\n\t\t\t// Catch only owl-stage transitionEnd event\r\n\t\t\tif ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.leave('animating');\r\n\t\tthis.trigger('translated');\r\n\t};\r\n\r\n\t/**\r\n\t * Gets viewport width.\r\n\t * @protected\r\n\t * @return {Number} - The width in pixel.\r\n\t */\r\n\tOwl.prototype.viewport = function() {\r\n\t\tvar width;\r\n\t\tif (this.options.responsiveBaseElement !== window) {\r\n\t\t\twidth = $(this.options.responsiveBaseElement).width();\r\n\t\t} else if (window.innerWidth) {\r\n\t\t\twidth = window.innerWidth;\r\n\t\t} else if (document.documentElement && document.documentElement.clientWidth) {\r\n\t\t\twidth = document.documentElement.clientWidth;\r\n\t\t} else {\r\n\t\t\tconsole.warn('Can not detect viewport width.');\r\n\t\t}\r\n\t\treturn width;\r\n\t};\r\n\r\n\t/**\r\n\t * Replaces the current content.\r\n\t * @public\r\n\t * @param {HTMLElement|jQuery|String} content - The new content.\r\n\t */\r\n\tOwl.prototype.replace = function(content) {\r\n\t\tthis.$stage.empty();\r\n\t\tthis._items = [];\r\n\r\n\t\tif (content) {\r\n\t\t\tcontent = (content instanceof jQuery) ? content : $(content);\r\n\t\t}\r\n\r\n\t\tif (this.settings.nestedItemSelector) {\r\n\t\t\tcontent = content.find('.' + this.settings.nestedItemSelector);\r\n\t\t}\r\n\r\n\t\tcontent.filter(function() {\r\n\t\t\treturn this.nodeType === 1;\r\n\t\t}).each($.proxy(function(index, item) {\r\n\t\t\titem = this.prepare(item);\r\n\t\t\tthis.$stage.append(item);\r\n\t\t\tthis._items.push(item);\r\n\t\t\tthis._mergers.push(item.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);\r\n\t\t}, this));\r\n\r\n\t\tthis.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0);\r\n\r\n\t\tthis.invalidate('items');\r\n\t};\r\n\r\n\t/**\r\n\t * Adds an item.\r\n\t * @todo Use `item` instead of `content` for the event arguments.\r\n\t * @public\r\n\t * @param {HTMLElement|jQuery|String} content - The item content to add.\r\n\t * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end.\r\n\t */\r\n\tOwl.prototype.add = function(content, position) {\r\n\t\tvar current = this.relative(this._current);\r\n\r\n\t\tposition = position === undefined ? this._items.length : this.normalize(position, true);\r\n\t\tcontent = content instanceof jQuery ? content : $(content);\r\n\r\n\t\tthis.trigger('add', { content: content, position: position });\r\n\r\n\t\tcontent = this.prepare(content);\r\n\r\n\t\tif (this._items.length === 0 || position === this._items.length) {\r\n\t\t\tthis._items.length === 0 && this.$stage.append(content);\r\n\t\t\tthis._items.length !== 0 && this._items[position - 1].after(content);\r\n\t\t\tthis._items.push(content);\r\n\t\t\tthis._mergers.push(content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);\r\n\t\t} else {\r\n\t\t\tthis._items[position].before(content);\r\n\t\t\tthis._items.splice(position, 0, content);\r\n\t\t\tthis._mergers.splice(position, 0, content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);\r\n\t\t}\r\n\r\n\t\tthis._items[current] && this.reset(this._items[current].index());\r\n\r\n\t\tthis.invalidate('items');\r\n\r\n\t\tthis.trigger('added', { content: content, position: position });\r\n\t};\r\n\r\n\t/**\r\n\t * Removes an item by its position.\r\n\t * @todo Use `item` instead of `content` for the event arguments.\r\n\t * @public\r\n\t * @param {Number} position - The relative position of the item to remove.\r\n\t */\r\n\tOwl.prototype.remove = function(position) {\r\n\t\tposition = this.normalize(position, true);\r\n\r\n\t\tif (position === undefined) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.trigger('remove', { content: this._items[position], position: position });\r\n\r\n\t\tthis._items[position].remove();\r\n\t\tthis._items.splice(position, 1);\r\n\t\tthis._mergers.splice(position, 1);\r\n\r\n\t\tthis.invalidate('items');\r\n\r\n\t\tthis.trigger('removed', { content: null, position: position });\r\n\t};\r\n\r\n\t/**\r\n\t * Preloads images with auto width.\r\n\t * @todo Replace by a more generic approach\r\n\t * @protected\r\n\t */\r\n\tOwl.prototype.preloadAutoWidthImages = function(images) {\r\n\t\timages.each($.proxy(function(i, element) {\r\n\t\t\tthis.enter('pre-loading');\r\n\t\t\telement = $(element);\r\n\t\t\t$(new Image()).one('load', $.proxy(function(e) {\r\n\t\t\t\telement.attr('src', e.target.src);\r\n\t\t\t\telement.css('opacity', 1);\r\n\t\t\t\tthis.leave('pre-loading');\r\n\t\t\t\t!this.is('pre-loading') && !this.is('initializing') && this.refresh();\r\n\t\t\t}, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina'));\r\n\t\t}, this));\r\n\t};\r\n\r\n\t/**\r\n\t * Destroys the carousel.\r\n\t * @public\r\n\t */\r\n\tOwl.prototype.destroy = function() {\r\n\r\n\t\tthis.$element.off('.owl.core');\r\n\t\tthis.$stage.off('.owl.core');\r\n\t\t$(document).off('.owl.core');\r\n\r\n\t\tif (this.settings.responsive !== false) {\r\n\t\t\twindow.clearTimeout(this.resizeTimer);\r\n\t\t\tthis.off(window, 'resize', this._handlers.onThrottledResize);\r\n\t\t}\r\n\r\n\t\tfor (var i in this._plugins) {\r\n\t\t\tthis._plugins[i].destroy();\r\n\t\t}\r\n\r\n\t\tthis.$stage.children('.cloned').remove();\r\n\r\n\t\tthis.$stage.unwrap();\r\n\t\tthis.$stage.children().contents().unwrap();\r\n\t\tthis.$stage.children().unwrap();\r\n\t\tthis.$stage.remove();\r\n\t\tthis.$element\r\n\t\t\t.removeClass(this.options.refreshClass)\r\n\t\t\t.removeClass(this.options.loadingClass)\r\n\t\t\t.removeClass(this.options.loadedClass)\r\n\t\t\t.removeClass(this.options.rtlClass)\r\n\t\t\t.removeClass(this.options.dragClass)\r\n\t\t\t.removeClass(this.options.grabClass)\r\n\t\t\t.attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\\\S+\\\\s', 'g'), ''))\r\n\t\t\t.removeData('owl.carousel');\r\n\t};\r\n\r\n\t/**\r\n\t * Operators to calculate right-to-left and left-to-right.\r\n\t * @protected\r\n\t * @param {Number} [a] - The left side operand.\r\n\t * @param {String} [o] - The operator.\r\n\t * @param {Number} [b] - The right side operand.\r\n\t */\r\n\tOwl.prototype.op = function(a, o, b) {\r\n\t\tvar rtl = this.settings.rtl;\r\n\t\tswitch (o) {\r\n\t\t\tcase '<':\r\n\t\t\t\treturn rtl ? a > b : a < b;\r\n\t\t\tcase '>':\r\n\t\t\t\treturn rtl ? a < b : a > b;\r\n\t\t\tcase '>=':\r\n\t\t\t\treturn rtl ? a <= b : a >= b;\r\n\t\t\tcase '<=':\r\n\t\t\t\treturn rtl ? a >= b : a <= b;\r\n\t\t\tdefault:\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Attaches to an internal event.\r\n\t * @protected\r\n\t * @param {HTMLElement} element - The event source.\r\n\t * @param {String} event - The event name.\r\n\t * @param {Function} listener - The event handler to attach.\r\n\t * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not.\r\n\t */\r\n\tOwl.prototype.on = function(element, event, listener, capture) {\r\n\t\tif (element.addEventListener) {\r\n\t\t\telement.addEventListener(event, listener, capture);\r\n\t\t} else if (element.attachEvent) {\r\n\t\t\telement.attachEvent('on' + event, listener);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Detaches from an internal event.\r\n\t * @protected\r\n\t * @param {HTMLElement} element - The event source.\r\n\t * @param {String} event - The event name.\r\n\t * @param {Function} listener - The attached event handler to detach.\r\n\t * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not.\r\n\t */\r\n\tOwl.prototype.off = function(element, event, listener, capture) {\r\n\t\tif (element.removeEventListener) {\r\n\t\t\telement.removeEventListener(event, listener, capture);\r\n\t\t} else if (element.detachEvent) {\r\n\t\t\telement.detachEvent('on' + event, listener);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Triggers a public event.\r\n\t * @todo Remove `status`, `relatedTarget` should be used instead.\r\n\t * @protected\r\n\t * @param {String} name - The event name.\r\n\t * @param {*} [data=null] - The event data.\r\n\t * @param {String} [namespace=carousel] - The event namespace.\r\n\t * @param {String} [state] - The state which is associated with the event.\r\n\t * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not.\r\n\t * @returns {Event} - The event arguments.\r\n\t */\r\n\tOwl.prototype.trigger = function(name, data, namespace, state, enter) {\r\n\t\tvar status = {\r\n\t\t\titem: { count: this._items.length, index: this.current() }\r\n\t\t}, handler = $.camelCase(\r\n\t\t\t$.grep([ 'on', name, namespace ], function(v) { return v })\r\n\t\t\t\t.join('-').toLowerCase()\r\n\t\t), event = $.Event(\r\n\t\t\t[ name, 'owl', namespace || 'carousel' ].join('.').toLowerCase(),\r\n\t\t\t$.extend({ relatedTarget: this }, status, data)\r\n\t\t);\r\n\r\n\t\tif (!this._supress[name]) {\r\n\t\t\t$.each(this._plugins, function(name, plugin) {\r\n\t\t\t\tif (plugin.onTrigger) {\r\n\t\t\t\t\tplugin.onTrigger(event);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\tthis.register({ type: Owl.Type.Event, name: name });\r\n\t\t\tthis.$element.trigger(event);\r\n\r\n\t\t\tif (this.settings && typeof this.settings[handler] === 'function') {\r\n\t\t\t\tthis.settings[handler].call(this, event);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn event;\r\n\t};\r\n\r\n\t/**\r\n\t * Enters a state.\r\n\t * @param name - The state name.\r\n\t */\r\n\tOwl.prototype.enter = function(name) {\r\n\t\t$.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) {\r\n\t\t\tif (this._states.current[name] === undefined) {\r\n\t\t\t\tthis._states.current[name] = 0;\r\n\t\t\t}\r\n\r\n\t\t\tthis._states.current[name]++;\r\n\t\t}, this));\r\n\t};\r\n\r\n\t/**\r\n\t * Leaves a state.\r\n\t * @param name - The state name.\r\n\t */\r\n\tOwl.prototype.leave = function(name) {\r\n\t\t$.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) {\r\n\t\t\tthis._states.current[name]--;\r\n\t\t}, this));\r\n\t};\r\n\r\n\t/**\r\n\t * Registers an event or state.\r\n\t * @public\r\n\t * @param {Object} object - The event or state to register.\r\n\t */\r\n\tOwl.prototype.register = function(object) {\r\n\t\tif (object.type === Owl.Type.Event) {\r\n\t\t\tif (!$.event.special[object.name]) {\r\n\t\t\t\t$.event.special[object.name] = {};\r\n\t\t\t}\r\n\r\n\t\t\tif (!$.event.special[object.name].owl) {\r\n\t\t\t\tvar _default = $.event.special[object.name]._default;\r\n\t\t\t\t$.event.special[object.name]._default = function(e) {\r\n\t\t\t\t\tif (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) {\r\n\t\t\t\t\t\treturn _default.apply(this, arguments);\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn e.namespace && e.namespace.indexOf('owl') > -1;\r\n\t\t\t\t};\r\n\t\t\t\t$.event.special[object.name].owl = true;\r\n\t\t\t}\r\n\t\t} else if (object.type === Owl.Type.State) {\r\n\t\t\tif (!this._states.tags[object.name]) {\r\n\t\t\t\tthis._states.tags[object.name] = object.tags;\r\n\t\t\t} else {\r\n\t\t\t\tthis._states.tags[object.name] = this._states.tags[object.name].concat(object.tags);\r\n\t\t\t}\r\n\r\n\t\t\tthis._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function(tag, i) {\r\n\t\t\t\treturn $.inArray(tag, this._states.tags[object.name]) === i;\r\n\t\t\t}, this));\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Suppresses events.\r\n\t * @protected\r\n\t * @param {Array.<String>} events - The events to suppress.\r\n\t */\r\n\tOwl.prototype.suppress = function(events) {\r\n\t\t$.each(events, $.proxy(function(index, event) {\r\n\t\t\tthis._supress[event] = true;\r\n\t\t}, this));\r\n\t};\r\n\r\n\t/**\r\n\t * Releases suppressed events.\r\n\t * @protected\r\n\t * @param {Array.<String>} events - The events to release.\r\n\t */\r\n\tOwl.prototype.release = function(events) {\r\n\t\t$.each(events, $.proxy(function(index, event) {\r\n\t\t\tdelete this._supress[event];\r\n\t\t}, this));\r\n\t};\r\n\r\n\t/**\r\n\t * Gets unified pointer coordinates from event.\r\n\t * @todo #261\r\n\t * @protected\r\n\t * @param {Event} - The `mousedown` or `touchstart` event.\r\n\t * @returns {Object} - Contains `x` and `y` coordinates of current pointer position.\r\n\t */\r\n\tOwl.prototype.pointer = function(event) {\r\n\t\tvar result = { x: null, y: null };\r\n\r\n\t\tevent = event.originalEvent || event || window.event;\r\n\r\n\t\tevent = event.touches && event.touches.length ?\r\n\t\t\tevent.touches[0] : event.changedTouches && event.changedTouches.length ?\r\n\t\t\t\tevent.changedTouches[0] : event;\r\n\r\n\t\tif (event.pageX) {\r\n\t\t\tresult.x = event.pageX;\r\n\t\t\tresult.y = event.pageY;\r\n\t\t} else {\r\n\t\t\tresult.x = event.clientX;\r\n\t\t\tresult.y = event.clientY;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t};\r\n\r\n\t/**\r\n\t * Determines if the input is a Number or something that can be coerced to a Number\r\n\t * @protected\r\n\t * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested\r\n\t * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number\r\n\t */\r\n\tOwl.prototype.isNumeric = function(number) {\r\n\t\treturn !isNaN(parseFloat(number));\r\n\t};\r\n\r\n\t/**\r\n\t * Gets the difference of two vectors.\r\n\t * @todo #261\r\n\t * @protected\r\n\t * @param {Object} - The first vector.\r\n\t * @param {Object} - The second vector.\r\n\t * @returns {Object} - The difference.\r\n\t */\r\n\tOwl.prototype.difference = function(first, second) {\r\n\t\treturn {\r\n\t\t\tx: first.x - second.x,\r\n\t\t\ty: first.y - second.y\r\n\t\t};\r\n\t};\r\n\r\n\t/**\r\n\t * The jQuery Plugin for the Owl Carousel\r\n\t * @todo Navigation plugin `next` and `prev`\r\n\t * @public\r\n\t */\r\n\t$.fn.owlCarousel = function(option) {\r\n\t\tvar args = Array.prototype.slice.call(arguments, 1);\r\n\r\n\t\treturn this.each(function() {\r\n\t\t\tvar $this = $(this),\r\n\t\t\t\tdata = $this.data('owl.carousel');\r\n\r\n\t\t\tif (!data) {\r\n\t\t\t\tdata = new Owl(this, typeof option == 'object' && option);\r\n\t\t\t\t$this.data('owl.carousel', data);\r\n\r\n\t\t\t\t$.each([\r\n\t\t\t\t\t'next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove'\r\n\t\t\t\t], function(i, event) {\r\n\t\t\t\t\tdata.register({ type: Owl.Type.Event, name: event });\r\n\t\t\t\t\tdata.$element.on(event + '.owl.carousel.core', $.proxy(function(e) {\r\n\t\t\t\t\t\tif (e.namespace && e.relatedTarget !== this) {\r\n\t\t\t\t\t\t\tthis.suppress([ event ]);\r\n\t\t\t\t\t\t\tdata[event].apply(this, [].slice.call(arguments, 1));\r\n\t\t\t\t\t\t\tthis.release([ event ]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, data));\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\tif (typeof option == 'string' && option.charAt(0) !== '_') {\r\n\t\t\t\tdata[option].apply(data, args);\r\n\t\t\t}\r\n\t\t});\r\n\t};\r\n\r\n\t/**\r\n\t * The constructor for the jQuery Plugin\r\n\t * @public\r\n\t */\r\n\t$.fn.owlCarousel.Constructor = Owl;\r\n\r\n})(window.Zepto || window.jQuery, window, document);\r\n\r\n/**\r\n * AutoRefresh Plugin\r\n * @version 2.3.4\r\n * @author Artus Kolanowski\r\n * @author David Deutsch\r\n * @license The MIT License (MIT)\r\n */\r\n;(function($, window, document, undefined) {\r\n\r\n\t/**\r\n\t * Creates the auto refresh plugin.\r\n\t * @class The Auto Refresh Plugin\r\n\t * @param {Owl} carousel - The Owl Carousel\r\n\t */\r\n\tvar AutoRefresh = function(carousel) {\r\n\t\t/**\r\n\t\t * Reference to the core.\r\n\t\t * @protected\r\n\t\t * @type {Owl}\r\n\t\t */\r\n\t\tthis._core = carousel;\r\n\r\n\t\t/**\r\n\t\t * Refresh interval.\r\n\t\t * @protected\r\n\t\t * @type {number}\r\n\t\t */\r\n\t\tthis._interval = null;\r\n\r\n\t\t/**\r\n\t\t * Whether the element is currently visible or not.\r\n\t\t * @protected\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\t\tthis._visible = null;\r\n\r\n\t\t/**\r\n\t\t * All event handlers.\r\n\t\t * @protected\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tthis._handlers = {\r\n\t\t\t'initialized.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && this._core.settings.autoRefresh) {\r\n\t\t\t\t\tthis.watch();\r\n\t\t\t\t}\r\n\t\t\t}, this)\r\n\t\t};\r\n\r\n\t\t// set default options\r\n\t\tthis._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options);\r\n\r\n\t\t// register event handlers\r\n\t\tthis._core.$element.on(this._handlers);\r\n\t};\r\n\r\n\t/**\r\n\t * Default options.\r\n\t * @public\r\n\t */\r\n\tAutoRefresh.Defaults = {\r\n\t\tautoRefresh: true,\r\n\t\tautoRefreshInterval: 500\r\n\t};\r\n\r\n\t/**\r\n\t * Watches the element.\r\n\t */\r\n\tAutoRefresh.prototype.watch = function() {\r\n\t\tif (this._interval) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._visible = this._core.isVisible();\r\n\t\tthis._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval);\r\n\t};\r\n\r\n\t/**\r\n\t * Refreshes the element.\r\n\t */\r\n\tAutoRefresh.prototype.refresh = function() {\r\n\t\tif (this._core.isVisible() === this._visible) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._visible = !this._visible;\r\n\r\n\t\tthis._core.$element.toggleClass('owl-hidden', !this._visible);\r\n\r\n\t\tthis._visible && (this._core.invalidate('width') && this._core.refresh());\r\n\t};\r\n\r\n\t/**\r\n\t * Destroys the plugin.\r\n\t */\r\n\tAutoRefresh.prototype.destroy = function() {\r\n\t\tvar handler, property;\r\n\r\n\t\twindow.clearInterval(this._interval);\r\n\r\n\t\tfor (handler in this._handlers) {\r\n\t\t\tthis._core.$element.off(handler, this._handlers[handler]);\r\n\t\t}\r\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\r\n\t\t\ttypeof this[property] != 'function' && (this[property] = null);\r\n\t\t}\r\n\t};\r\n\r\n\t$.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh;\r\n\r\n})(window.Zepto || window.jQuery, window, document);\r\n\r\n/**\r\n * Lazy Plugin\r\n * @version 2.3.4\r\n * @author Bartosz Wojciechowski\r\n * @author David Deutsch\r\n * @license The MIT License (MIT)\r\n */\r\n;(function($, window, document, undefined) {\r\n\r\n\t/**\r\n\t * Creates the lazy plugin.\r\n\t * @class The Lazy Plugin\r\n\t * @param {Owl} carousel - The Owl Carousel\r\n\t */\r\n\tvar Lazy = function(carousel) {\r\n\r\n\t\t/**\r\n\t\t * Reference to the core.\r\n\t\t * @protected\r\n\t\t * @type {Owl}\r\n\t\t */\r\n\t\tthis._core = carousel;\r\n\r\n\t\t/**\r\n\t\t * Already loaded items.\r\n\t\t * @protected\r\n\t\t * @type {Array.<jQuery>}\r\n\t\t */\r\n\t\tthis._loaded = [];\r\n\r\n\t\t/**\r\n\t\t * Event handlers.\r\n\t\t * @protected\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tthis._handlers = {\r\n\t\t\t'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (!e.namespace) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!this._core.settings || !this._core.settings.lazyLoad) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif ((e.property && e.property.name == 'position') || e.type == 'initialized') {\r\n\t\t\t\t\tvar settings = this._core.settings,\r\n\t\t\t\t\t\tn = (settings.center && Math.ceil(settings.items / 2) || settings.items),\r\n\t\t\t\t\t\ti = ((settings.center && n * -1) || 0),\r\n\t\t\t\t\t\tposition = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i,\r\n\t\t\t\t\t\tclones = this._core.clones().length,\r\n\t\t\t\t\t\tload = $.proxy(function(i, v) { this.load(v) }, this);\r\n\t\t\t\t\t//TODO: Need documentation for this new option\r\n\t\t\t\t\tif (settings.lazyLoadEager > 0) {\r\n\t\t\t\t\t\tn += settings.lazyLoadEager;\r\n\t\t\t\t\t\t// If the carousel is looping also preload images that are to the \"left\"\r\n\t\t\t\t\t\tif (settings.loop) {\r\n position -= settings.lazyLoadEager;\r\n n++;\r\n }\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\twhile (i++ < n) {\r\n\t\t\t\t\t\tthis.load(clones / 2 + this._core.relative(position));\r\n\t\t\t\t\t\tclones && $.each(this._core.clones(this._core.relative(position)), load);\r\n\t\t\t\t\t\tposition++;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}, this)\r\n\t\t};\r\n\r\n\t\t// set the default options\r\n\t\tthis._core.options = $.extend({}, Lazy.Defaults, this._core.options);\r\n\r\n\t\t// register event handler\r\n\t\tthis._core.$element.on(this._handlers);\r\n\t};\r\n\r\n\t/**\r\n\t * Default options.\r\n\t * @public\r\n\t */\r\n\tLazy.Defaults = {\r\n\t\tlazyLoad: false,\r\n\t\tlazyLoadEager: 0\r\n\t};\r\n\r\n\t/**\r\n\t * Loads all resources of an item at the specified position.\r\n\t * @param {Number} position - The absolute position of the item.\r\n\t * @protected\r\n\t */\r\n\tLazy.prototype.load = function(position) {\r\n\t\tvar $item = this._core.$stage.children().eq(position),\r\n\t\t\t$elements = $item && $item.find('.owl-lazy');\r\n\r\n\t\tif (!$elements || $.inArray($item.get(0), this._loaded) > -1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t$elements.each($.proxy(function(index, element) {\r\n\t\t\tvar $element = $(element), image,\r\n url = (window.devicePixelRatio > 1 && $element.attr('data-src-retina')) || $element.attr('data-src') || $element.attr('data-srcset');\r\n\r\n\t\t\tthis._core.trigger('load', { element: $element, url: url }, 'lazy');\r\n\r\n\t\t\tif ($element.is('img')) {\r\n\t\t\t\t$element.one('load.owl.lazy', $.proxy(function() {\r\n\t\t\t\t\t$element.css('opacity', 1);\r\n\t\t\t\t\tthis._core.trigger('loaded', { element: $element, url: url }, 'lazy');\r\n\t\t\t\t}, this)).attr('src', url);\r\n } else if ($element.is('source')) {\r\n $element.one('load.owl.lazy', $.proxy(function() {\r\n this._core.trigger('loaded', { element: $element, url: url }, 'lazy');\r\n }, this)).attr('srcset', url);\r\n\t\t\t} else {\r\n\t\t\t\timage = new Image();\r\n\t\t\t\timage.onload = $.proxy(function() {\r\n\t\t\t\t\t$element.css({\r\n\t\t\t\t\t\t'background-image': 'url(\"' + url + '\")',\r\n\t\t\t\t\t\t'opacity': '1'\r\n\t\t\t\t\t});\r\n\t\t\t\t\tthis._core.trigger('loaded', { element: $element, url: url }, 'lazy');\r\n\t\t\t\t}, this);\r\n\t\t\t\timage.src = url;\r\n\t\t\t}\r\n\t\t}, this));\r\n\r\n\t\tthis._loaded.push($item.get(0));\r\n\t};\r\n\r\n\t/**\r\n\t * Destroys the plugin.\r\n\t * @public\r\n\t */\r\n\tLazy.prototype.destroy = function() {\r\n\t\tvar handler, property;\r\n\r\n\t\tfor (handler in this.handlers) {\r\n\t\t\tthis._core.$element.off(handler, this.handlers[handler]);\r\n\t\t}\r\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\r\n\t\t\ttypeof this[property] != 'function' && (this[property] = null);\r\n\t\t}\r\n\t};\r\n\r\n\t$.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy;\r\n\r\n})(window.Zepto || window.jQuery, window, document);\r\n\r\n/**\r\n * AutoHeight Plugin\r\n * @version 2.3.4\r\n * @author Bartosz Wojciechowski\r\n * @author David Deutsch\r\n * @license The MIT License (MIT)\r\n */\r\n;(function($, window, document, undefined) {\r\n\r\n\t/**\r\n\t * Creates the auto height plugin.\r\n\t * @class The Auto Height Plugin\r\n\t * @param {Owl} carousel - The Owl Carousel\r\n\t */\r\n\tvar AutoHeight = function(carousel) {\r\n\t\t/**\r\n\t\t * Reference to the core.\r\n\t\t * @protected\r\n\t\t * @type {Owl}\r\n\t\t */\r\n\t\tthis._core = carousel;\r\n\r\n\t\tthis._previousHeight = null;\r\n\r\n\t\t/**\r\n\t\t * All event handlers.\r\n\t\t * @protected\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tthis._handlers = {\r\n\t\t\t'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && this._core.settings.autoHeight) {\r\n\t\t\t\t\tthis.update();\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'changed.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && this._core.settings.autoHeight && e.property.name === 'position'){\r\n\t\t\t\t\tthis.update();\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'loaded.owl.lazy': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && this._core.settings.autoHeight\r\n\t\t\t\t\t&& e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) {\r\n\t\t\t\t\tthis.update();\r\n\t\t\t\t}\r\n\t\t\t}, this)\r\n\t\t};\r\n\r\n\t\t// set default options\r\n\t\tthis._core.options = $.extend({}, AutoHeight.Defaults, this._core.options);\r\n\r\n\t\t// register event handlers\r\n\t\tthis._core.$element.on(this._handlers);\r\n\t\tthis._intervalId = null;\r\n\t\tvar refThis = this;\r\n\r\n\t\t// These changes have been taken from a PR by gavrochelegnou proposed in #1575\r\n\t\t// and have been made compatible with the latest jQuery version\r\n\t\t$(window).on('load', function() {\r\n\t\t\tif (refThis._core.settings.autoHeight) {\r\n\t\t\t\trefThis.update();\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Autoresize the height of the carousel when window is resized\r\n\t\t// When carousel has images, the height is dependent on the width\r\n\t\t// and should also change on resize\r\n\t\t$(window).resize(function() {\r\n\t\t\tif (refThis._core.settings.autoHeight) {\r\n\t\t\t\tif (refThis._intervalId != null) {\r\n\t\t\t\t\tclearTimeout(refThis._intervalId);\r\n\t\t\t\t}\r\n\r\n\t\t\t\trefThis._intervalId = setTimeout(function() {\r\n\t\t\t\t\trefThis.update();\r\n\t\t\t\t}, 250);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t};\r\n\r\n\t/**\r\n\t * Default options.\r\n\t * @public\r\n\t */\r\n\tAutoHeight.Defaults = {\r\n\t\tautoHeight: false,\r\n\t\tautoHeightClass: 'owl-height'\r\n\t};\r\n\r\n\t/**\r\n\t * Updates the view.\r\n\t */\r\n\tAutoHeight.prototype.update = function() {\r\n\t\tvar start = this._core._current,\r\n\t\t\tend = start + this._core.settings.items,\r\n\t\t\tlazyLoadEnabled = this._core.settings.lazyLoad,\r\n\t\t\tvisible = this._core.$stage.children().toArray().slice(start, end),\r\n\t\t\theights = [],\r\n\t\t\tmaxheight = 0;\r\n\r\n\t\t$.each(visible, function(index, item) {\r\n\t\t\theights.push($(item).height());\r\n\t\t});\r\n\r\n\t\tmaxheight = Math.max.apply(null, heights);\r\n\r\n\t\tif (maxheight <= 1 && lazyLoadEnabled && this._previousHeight) {\r\n\t\t\tmaxheight = this._previousHeight;\r\n\t\t}\r\n\r\n\t\tthis._previousHeight = maxheight;\r\n\r\n\t\tthis._core.$stage.parent()\r\n\t\t\t.height(maxheight)\r\n\t\t\t.addClass(this._core.settings.autoHeightClass);\r\n\t};\r\n\r\n\tAutoHeight.prototype.destroy = function() {\r\n\t\tvar handler, property;\r\n\r\n\t\tfor (handler in this._handlers) {\r\n\t\t\tthis._core.$element.off(handler, this._handlers[handler]);\r\n\t\t}\r\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\r\n\t\t\ttypeof this[property] !== 'function' && (this[property] = null);\r\n\t\t}\r\n\t};\r\n\r\n\t$.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight;\r\n\r\n})(window.Zepto || window.jQuery, window, document);\r\n\r\n/**\r\n * Video Plugin\r\n * @version 2.3.4\r\n * @author Bartosz Wojciechowski\r\n * @author David Deutsch\r\n * @license The MIT License (MIT)\r\n */\r\n;(function($, window, document, undefined) {\r\n\r\n\t/**\r\n\t * Creates the video plugin.\r\n\t * @class The Video Plugin\r\n\t * @param {Owl} carousel - The Owl Carousel\r\n\t */\r\n\tvar Video = function(carousel) {\r\n\t\t/**\r\n\t\t * Reference to the core.\r\n\t\t * @protected\r\n\t\t * @type {Owl}\r\n\t\t */\r\n\t\tthis._core = carousel;\r\n\r\n\t\t/**\r\n\t\t * Cache all video URLs.\r\n\t\t * @protected\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tthis._videos = {};\r\n\r\n\t\t/**\r\n\t\t * Current playing item.\r\n\t\t * @protected\r\n\t\t * @type {jQuery}\r\n\t\t */\r\n\t\tthis._playing = null;\r\n\r\n\t\t/**\r\n\t\t * All event handlers.\r\n\t\t * @todo The cloned content removale is too late\r\n\t\t * @protected\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tthis._handlers = {\r\n\t\t\t'initialized.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace) {\r\n\t\t\t\t\tthis._core.register({ type: 'state', name: 'playing', tags: [ 'interacting' ] });\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'resize.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && this._core.settings.video && this.isInFullScreen()) {\r\n\t\t\t\t\te.preventDefault();\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'refreshed.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && this._core.is('resizing')) {\r\n\t\t\t\t\tthis._core.$stage.find('.cloned .owl-video-frame').remove();\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'changed.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && e.property.name === 'position' && this._playing) {\r\n\t\t\t\t\tthis.stop();\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'prepared.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (!e.namespace) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tvar $element = $(e.content).find('.owl-video');\r\n\r\n\t\t\t\tif ($element.length) {\r\n\t\t\t\t\t$element.css('display', 'none');\r\n\t\t\t\t\tthis.fetch($element, $(e.content));\r\n\t\t\t\t}\r\n\t\t\t}, this)\r\n\t\t};\r\n\r\n\t\t// set default options\r\n\t\tthis._core.options = $.extend({}, Video.Defaults, this._core.options);\r\n\r\n\t\t// register event handlers\r\n\t\tthis._core.$element.on(this._handlers);\r\n\r\n\t\tthis._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function(e) {\r\n\t\t\tthis.play(e);\r\n\t\t}, this));\r\n\t};\r\n\r\n\t/**\r\n\t * Default options.\r\n\t * @public\r\n\t */\r\n\tVideo.Defaults = {\r\n\t\tvideo: false,\r\n\t\tvideoHeight: false,\r\n\t\tvideoWidth: false\r\n\t};\r\n\r\n\t/**\r\n\t * Gets the video ID and the type (YouTube/Vimeo/vzaar only).\r\n\t * @protected\r\n\t * @param {jQuery} target - The target containing the video data.\r\n\t * @param {jQuery} item - The item containing the video.\r\n\t */\r\n\tVideo.prototype.fetch = function(target, item) {\r\n\t\t\tvar type = (function() {\r\n\t\t\t\t\tif (target.attr('data-vimeo-id')) {\r\n\t\t\t\t\t\treturn 'vimeo';\r\n\t\t\t\t\t} else if (target.attr('data-vzaar-id')) {\r\n\t\t\t\t\t\treturn 'vzaar'\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn 'youtube';\r\n\t\t\t\t\t}\r\n\t\t\t\t})(),\r\n\t\t\t\tid = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'),\r\n\t\t\t\twidth = target.attr('data-width') || this._core.settings.videoWidth,\r\n\t\t\t\theight = target.attr('data-height') || this._core.settings.videoHeight,\r\n\t\t\t\turl = target.attr('href');\r\n\r\n\t\tif (url) {\r\n\r\n\t\t\t/*\r\n\t\t\t\t\tParses the id's out of the following urls (and probably more):\r\n\t\t\t\t\thttps://www.youtube.com/watch?v=:id\r\n\t\t\t\t\thttps://youtu.be/:id\r\n\t\t\t\t\thttps://vimeo.com/:id\r\n\t\t\t\t\thttps://vimeo.com/channels/:channel/:id\r\n\t\t\t\t\thttps://vimeo.com/groups/:group/videos/:id\r\n\t\t\t\t\thttps://app.vzaar.com/videos/:id\r\n\r\n\t\t\t\t\tVisual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F\r\n\t\t\t*/\r\n\r\n\t\t\tid = url.match(/(http:|https:|)\\/\\/(player.|www.|app.)?(vimeo\\.com|youtu(be\\.com|\\.be|be\\.googleapis\\.com|be\\-nocookie\\.com)|vzaar\\.com)\\/(video\\/|videos\\/|embed\\/|channels\\/.+\\/|groups\\/.+\\/|watch\\?v=|v\\/)?([A-Za-z0-9._%-]*)(\\&\\S+)?/);\r\n\r\n\t\t\tif (id[3].indexOf('youtu') > -1) {\r\n\t\t\t\ttype = 'youtube';\r\n\t\t\t} else if (id[3].indexOf('vimeo') > -1) {\r\n\t\t\t\ttype = 'vimeo';\r\n\t\t\t} else if (id[3].indexOf('vzaar') > -1) {\r\n\t\t\t\ttype = 'vzaar';\r\n\t\t\t} else {\r\n\t\t\t\tthrow new Error('Video URL not supported.');\r\n\t\t\t}\r\n\t\t\tid = id[6];\r\n\t\t} else {\r\n\t\t\tthrow new Error('Missing video URL.');\r\n\t\t}\r\n\r\n\t\tthis._videos[url] = {\r\n\t\t\ttype: type,\r\n\t\t\tid: id,\r\n\t\t\twidth: width,\r\n\t\t\theight: height\r\n\t\t};\r\n\r\n\t\titem.attr('data-video', url);\r\n\r\n\t\tthis.thumbnail(target, this._videos[url]);\r\n\t};\r\n\r\n\t/**\r\n\t * Creates video thumbnail.\r\n\t * @protected\r\n\t * @param {jQuery} target - The target containing the video data.\r\n\t * @param {Object} info - The video info object.\r\n\t * @see `fetch`\r\n\t */\r\n\tVideo.prototype.thumbnail = function(target, video) {\r\n\t\tvar tnLink,\r\n\t\t\ticon,\r\n\t\t\tpath,\r\n\t\t\tdimensions = video.width && video.height ? 'width:' + video.width + 'px;height:' + video.height + 'px;' : '',\r\n\t\t\tcustomTn = target.find('img'),\r\n\t\t\tsrcType = 'src',\r\n\t\t\tlazyClass = '',\r\n\t\t\tsettings = this._core.settings,\r\n\t\t\tcreate = function(path) {\r\n\t\t\t\ticon = '<div class=\"owl-video-play-icon\"></div>';\r\n\r\n\t\t\t\tif (settings.lazyLoad) {\r\n\t\t\t\t\ttnLink = $('<div/>',{\r\n\t\t\t\t\t\t\"class\": 'owl-video-tn ' + lazyClass,\r\n\t\t\t\t\t\t\"srcType\": path\r\n\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\ttnLink = $( '<div/>', {\r\n\t\t\t\t\t\t\"class\": \"owl-video-tn\",\r\n\t\t\t\t\t\t\"style\": 'opacity:1;background-image:url(' + path + ')'\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\ttarget.after(tnLink);\r\n\t\t\t\ttarget.after(icon);\r\n\t\t\t};\r\n\r\n\t\t// wrap video content into owl-video-wrapper div\r\n\t\ttarget.wrap( $( '<div/>', {\r\n\t\t\t\"class\": \"owl-video-wrapper\",\r\n\t\t\t\"style\": dimensions\r\n\t\t}));\r\n\r\n\t\tif (this._core.settings.lazyLoad) {\r\n\t\t\tsrcType = 'data-src';\r\n\t\t\tlazyClass = 'owl-lazy';\r\n\t\t}\r\n\r\n\t\t// custom thumbnail\r\n\t\tif (customTn.length) {\r\n\t\t\tcreate(customTn.attr(srcType));\r\n\t\t\tcustomTn.remove();\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (video.type === 'youtube') {\r\n\t\t\tpath = \"//img.youtube.com/vi/\" + video.id + \"/hqdefault.jpg\";\r\n\t\t\tcreate(path);\r\n\t\t} else if (video.type === 'vimeo') {\r\n\t\t\t$.ajax({\r\n\t\t\t\ttype: 'GET',\r\n\t\t\t\turl: '//vimeo.com/api/v2/video/' + video.id + '.json',\r\n\t\t\t\tjsonp: 'callback',\r\n\t\t\t\tdataType: 'jsonp',\r\n\t\t\t\tsuccess: function(data) {\r\n\t\t\t\t\tpath = data[0].thumbnail_large;\r\n\t\t\t\t\tcreate(path);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else if (video.type === 'vzaar') {\r\n\t\t\t$.ajax({\r\n\t\t\t\ttype: 'GET',\r\n\t\t\t\turl: '//vzaar.com/api/videos/' + video.id + '.json',\r\n\t\t\t\tjsonp: 'callback',\r\n\t\t\t\tdataType: 'jsonp',\r\n\t\t\t\tsuccess: function(data) {\r\n\t\t\t\t\tpath = data.framegrab_url;\r\n\t\t\t\t\tcreate(path);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Stops the current video.\r\n\t * @public\r\n\t */\r\n\tVideo.prototype.stop = function() {\r\n\t\tthis._core.trigger('stop', null, 'video');\r\n\t\tthis._playing.find('.owl-video-frame').remove();\r\n\t\tthis._playing.removeClass('owl-video-playing');\r\n\t\tthis._playing = null;\r\n\t\tthis._core.leave('playing');\r\n\t\tthis._core.trigger('stopped', null, 'video');\r\n\t};\r\n\r\n\t/**\r\n\t * Starts the current video.\r\n\t * @public\r\n\t * @param {Event} event - The event arguments.\r\n\t */\r\n\tVideo.prototype.play = function(event) {\r\n\t\tvar target = $(event.target),\r\n\t\t\titem = target.closest('.' + this._core.settings.itemClass),\r\n\t\t\tvideo = this._videos[item.attr('data-video')],\r\n\t\t\twidth = video.width || '100%',\r\n\t\t\theight = video.height || this._core.$stage.height(),\r\n\t\t\thtml,\r\n\t\t\tiframe;\r\n\r\n\t\tif (this._playing) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis._core.enter('playing');\r\n\t\tthis._core.trigger('play', null, 'video');\r\n\r\n\t\titem = this._core.items(this._core.relative(item.index()));\r\n\r\n\t\tthis._core.reset(item.index());\r\n\r\n\t\thtml = $( '<iframe frameborder=\"0\" allowfullscreen mozallowfullscreen webkitAllowFullScreen ></iframe>' );\r\n\t\thtml.attr( 'height', height );\r\n\t\thtml.attr( 'width', width );\r\n\t\tif (video.type === 'youtube') {\r\n\t\t\thtml.attr( 'src', '//www.youtube.com/embed/' + video.id + '?autoplay=1&rel=0&v=' + video.id );\r\n\t\t} else if (video.type === 'vimeo') {\r\n\t\t\thtml.attr( 'src', '//player.vimeo.com/video/' + video.id + '?autoplay=1' );\r\n\t\t} else if (video.type === 'vzaar') {\r\n\t\t\thtml.attr( 'src', '//view.vzaar.com/' + video.id + '/player?autoplay=true' );\r\n\t\t}\r\n\r\n\t\tiframe = $(html).wrap( '<div class=\"owl-video-frame\" />' ).insertAfter(item.find('.owl-video'));\r\n\r\n\t\tthis._playing = item.addClass('owl-video-playing');\r\n\t};\r\n\r\n\t/**\r\n\t * Checks whether an video is currently in full screen mode or not.\r\n\t * @todo Bad style because looks like a readonly method but changes members.\r\n\t * @protected\r\n\t * @returns {Boolean}\r\n\t */\r\n\tVideo.prototype.isInFullScreen = function() {\r\n\t\tvar element = document.fullscreenElement || document.mozFullScreenElement ||\r\n\t\t\t\tdocument.webkitFullscreenElement;\r\n\r\n\t\treturn element && $(element).parent().hasClass('owl-video-frame');\r\n\t};\r\n\r\n\t/**\r\n\t * Destroys the plugin.\r\n\t */\r\n\tVideo.prototype.destroy = function() {\r\n\t\tvar handler, property;\r\n\r\n\t\tthis._core.$element.off('click.owl.video');\r\n\r\n\t\tfor (handler in this._handlers) {\r\n\t\t\tthis._core.$element.off(handler, this._handlers[handler]);\r\n\t\t}\r\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\r\n\t\t\ttypeof this[property] != 'function' && (this[property] = null);\r\n\t\t}\r\n\t};\r\n\r\n\t$.fn.owlCarousel.Constructor.Plugins.Video = Video;\r\n\r\n})(window.Zepto || window.jQuery, window, document);\r\n\r\n/**\r\n * Animate Plugin\r\n * @version 2.3.4\r\n * @author Bartosz Wojciechowski\r\n * @author David Deutsch\r\n * @license The MIT License (MIT)\r\n */\r\n;(function($, window, document, undefined) {\r\n\r\n\t/**\r\n\t * Creates the animate plugin.\r\n\t * @class The Navigation Plugin\r\n\t * @param {Owl} scope - The Owl Carousel\r\n\t */\r\n\tvar Animate = function(scope) {\r\n\t\tthis.core = scope;\r\n\t\tthis.core.options = $.extend({}, Animate.Defaults, this.core.options);\r\n\t\tthis.swapping = true;\r\n\t\tthis.previous = undefined;\r\n\t\tthis.next = undefined;\r\n\r\n\t\tthis.handlers = {\r\n\t\t\t'change.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && e.property.name == 'position') {\r\n\t\t\t\t\tthis.previous = this.core.current();\r\n\t\t\t\t\tthis.next = e.property.value;\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace) {\r\n\t\t\t\t\tthis.swapping = e.type == 'translated';\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'translate.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) {\r\n\t\t\t\t\tthis.swap();\r\n\t\t\t\t}\r\n\t\t\t}, this)\r\n\t\t};\r\n\r\n\t\tthis.core.$element.on(this.handlers);\r\n\t};\r\n\r\n\t/**\r\n\t * Default options.\r\n\t * @public\r\n\t */\r\n\tAnimate.Defaults = {\r\n\t\tanimateOut: false,\r\n\t\tanimateIn: false\r\n\t};\r\n\r\n\t/**\r\n\t * Toggles the animation classes whenever an translations starts.\r\n\t * @protected\r\n\t * @returns {Boolean|undefined}\r\n\t */\r\n\tAnimate.prototype.swap = function() {\r\n\r\n\t\tif (this.core.settings.items !== 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!$.support.animation || !$.support.transition) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.core.speed(0);\r\n\r\n\t\tvar left,\r\n\t\t\tclear = $.proxy(this.clear, this),\r\n\t\t\tprevious = this.core.$stage.children().eq(this.previous),\r\n\t\t\tnext = this.core.$stage.children().eq(this.next),\r\n\t\t\tincoming = this.core.settings.animateIn,\r\n\t\t\toutgoing = this.core.settings.animateOut;\r\n\r\n\t\tif (this.core.current() === this.previous) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (outgoing) {\r\n\t\t\tleft = this.core.coordinates(this.previous) - this.core.coordinates(this.next);\r\n\t\t\tprevious.one($.support.animation.end, clear)\r\n\t\t\t\t.css( { 'left': left + 'px' } )\r\n\t\t\t\t.addClass('animated owl-animated-out')\r\n\t\t\t\t.addClass(outgoing);\r\n\t\t}\r\n\r\n\t\tif (incoming) {\r\n\t\t\tnext.one($.support.animation.end, clear)\r\n\t\t\t\t.addClass('animated owl-animated-in')\r\n\t\t\t\t.addClass(incoming);\r\n\t\t}\r\n\t};\r\n\r\n\tAnimate.prototype.clear = function(e) {\r\n\t\t$(e.target).css( { 'left': '' } )\r\n\t\t\t.removeClass('animated owl-animated-out owl-animated-in')\r\n\t\t\t.removeClass(this.core.settings.animateIn)\r\n\t\t\t.removeClass(this.core.settings.animateOut);\r\n\t\tthis.core.onTransitionEnd();\r\n\t};\r\n\r\n\t/**\r\n\t * Destroys the plugin.\r\n\t * @public\r\n\t */\r\n\tAnimate.prototype.destroy = function() {\r\n\t\tvar handler, property;\r\n\r\n\t\tfor (handler in this.handlers) {\r\n\t\t\tthis.core.$element.off(handler, this.handlers[handler]);\r\n\t\t}\r\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\r\n\t\t\ttypeof this[property] != 'function' && (this[property] = null);\r\n\t\t}\r\n\t};\r\n\r\n\t$.fn.owlCarousel.Constructor.Plugins.Animate = Animate;\r\n\r\n})(window.Zepto || window.jQuery, window, document);\r\n\r\n/**\r\n * Autoplay Plugin\r\n * @version 2.3.4\r\n * @author Bartosz Wojciechowski\r\n * @author Artus Kolanowski\r\n * @author David Deutsch\r\n * @author Tom De Caluwé\r\n * @license The MIT License (MIT)\r\n */\r\n;(function($, window, document, undefined) {\r\n\r\n\t/**\r\n\t * Creates the autoplay plugin.\r\n\t * @class The Autoplay Plugin\r\n\t * @param {Owl} scope - The Owl Carousel\r\n\t */\r\n\tvar Autoplay = function(carousel) {\r\n\t\t/**\r\n\t\t * Reference to the core.\r\n\t\t * @protected\r\n\t\t * @type {Owl}\r\n\t\t */\r\n\t\tthis._core = carousel;\r\n\r\n\t\t/**\r\n\t\t * The autoplay timeout id.\r\n\t\t * @type {Number}\r\n\t\t */\r\n\t\tthis._call = null;\r\n\r\n\t\t/**\r\n\t\t * Depending on the state of the plugin, this variable contains either\r\n\t\t * the start time of the timer or the current timer value if it's\r\n\t\t * paused. Since we start in a paused state we initialize the timer\r\n\t\t * value.\r\n\t\t * @type {Number}\r\n\t\t */\r\n\t\tthis._time = 0;\r\n\r\n\t\t/**\r\n\t\t * Stores the timeout currently used.\r\n\t\t * @type {Number}\r\n\t\t */\r\n\t\tthis._timeout = 0;\r\n\r\n\t\t/**\r\n\t\t * Indicates whenever the autoplay is paused.\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\t\tthis._paused = true;\r\n\r\n\t\t/**\r\n\t\t * All event handlers.\r\n\t\t * @protected\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tthis._handlers = {\r\n\t\t\t'changed.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && e.property.name === 'settings') {\r\n\t\t\t\t\tif (this._core.settings.autoplay) {\r\n\t\t\t\t\t\tthis.play();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthis.stop();\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (e.namespace && e.property.name === 'position' && this._paused) {\r\n\t\t\t\t\t// Reset the timer. This code is triggered when the position\r\n\t\t\t\t\t// of the carousel was changed through user interaction.\r\n\t\t\t\t\tthis._time = 0;\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'initialized.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && this._core.settings.autoplay) {\r\n\t\t\t\t\tthis.play();\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'play.owl.autoplay': $.proxy(function(e, t, s) {\r\n\t\t\t\tif (e.namespace) {\r\n\t\t\t\t\tthis.play(t, s);\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'stop.owl.autoplay': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace) {\r\n\t\t\t\t\tthis.stop();\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'mouseover.owl.autoplay': $.proxy(function() {\r\n\t\t\t\tif (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {\r\n\t\t\t\t\tthis.pause();\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'mouseleave.owl.autoplay': $.proxy(function() {\r\n\t\t\t\tif (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {\r\n\t\t\t\t\tthis.play();\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'touchstart.owl.core': $.proxy(function() {\r\n\t\t\t\tif (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {\r\n\t\t\t\t\tthis.pause();\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'touchend.owl.core': $.proxy(function() {\r\n\t\t\t\tif (this._core.settings.autoplayHoverPause) {\r\n\t\t\t\t\tthis.play();\r\n\t\t\t\t}\r\n\t\t\t}, this)\r\n\t\t};\r\n\r\n\t\t// register event handlers\r\n\t\tthis._core.$element.on(this._handlers);\r\n\r\n\t\t// set default options\r\n\t\tthis._core.options = $.extend({}, Autoplay.Defaults, this._core.options);\r\n\t};\r\n\r\n\t/**\r\n\t * Default options.\r\n\t * @public\r\n\t */\r\n\tAutoplay.Defaults = {\r\n\t\tautoplay: false,\r\n\t\tautoplayTimeout: 5000,\r\n\t\tautoplayHoverPause: false,\r\n\t\tautoplaySpeed: false\r\n\t};\r\n\r\n\t/**\r\n\t * Transition to the next slide and set a timeout for the next transition.\r\n\t * @private\r\n\t * @param {Number} [speed] - The animation speed for the animations.\r\n\t */\r\n\tAutoplay.prototype._next = function(speed) {\r\n\t\tthis._call = window.setTimeout(\r\n\t\t\t$.proxy(this._next, this, speed),\r\n\t\t\tthis._timeout * (Math.round(this.read() / this._timeout) + 1) - this.read()\r\n\t\t);\r\n\r\n\t\tif (this._core.is('interacting') || document.hidden) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis._core.next(speed || this._core.settings.autoplaySpeed);\r\n\t}\r\n\r\n\t/**\r\n\t * Reads the current timer value when the timer is playing.\r\n\t * @public\r\n\t */\r\n\tAutoplay.prototype.read = function() {\r\n\t\treturn new Date().getTime() - this._time;\r\n\t};\r\n\r\n\t/**\r\n\t * Starts the autoplay.\r\n\t * @public\r\n\t * @param {Number} [timeout] - The interval before the next animation starts.\r\n\t * @param {Number} [speed] - The animation speed for the animations.\r\n\t */\r\n\tAutoplay.prototype.play = function(timeout, speed) {\r\n\t\tvar elapsed;\r\n\r\n\t\tif (!this._core.is('rotating')) {\r\n\t\t\tthis._core.enter('rotating');\r\n\t\t}\r\n\r\n\t\ttimeout = timeout || this._core.settings.autoplayTimeout;\r\n\r\n\t\t// Calculate the elapsed time since the last transition. If the carousel\r\n\t\t// wasn't playing this calculation will yield zero.\r\n\t\telapsed = Math.min(this._time % (this._timeout || timeout), timeout);\r\n\r\n\t\tif (this._paused) {\r\n\t\t\t// Start the clock.\r\n\t\t\tthis._time = this.read();\r\n\t\t\tthis._paused = false;\r\n\t\t} else {\r\n\t\t\t// Clear the active timeout to allow replacement.\r\n\t\t\twindow.clearTimeout(this._call);\r\n\t\t}\r\n\r\n\t\t// Adjust the origin of the timer to match the new timeout value.\r\n\t\tthis._time += this.read() % timeout - elapsed;\r\n\r\n\t\tthis._timeout = timeout;\r\n\t\tthis._call = window.setTimeout($.proxy(this._next, this, speed), timeout - elapsed);\r\n\t};\r\n\r\n\t/**\r\n\t * Stops the autoplay.\r\n\t * @public\r\n\t */\r\n\tAutoplay.prototype.stop = function() {\r\n\t\tif (this._core.is('rotating')) {\r\n\t\t\t// Reset the clock.\r\n\t\t\tthis._time = 0;\r\n\t\t\tthis._paused = true;\r\n\r\n\t\t\twindow.clearTimeout(this._call);\r\n\t\t\tthis._core.leave('rotating');\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Pauses the autoplay.\r\n\t * @public\r\n\t */\r\n\tAutoplay.prototype.pause = function() {\r\n\t\tif (this._core.is('rotating') && !this._paused) {\r\n\t\t\t// Pause the clock.\r\n\t\t\tthis._time = this.read();\r\n\t\t\tthis._paused = true;\r\n\r\n\t\t\twindow.clearTimeout(this._call);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Destroys the plugin.\r\n\t */\r\n\tAutoplay.prototype.destroy = function() {\r\n\t\tvar handler, property;\r\n\r\n\t\tthis.stop();\r\n\r\n\t\tfor (handler in this._handlers) {\r\n\t\t\tthis._core.$element.off(handler, this._handlers[handler]);\r\n\t\t}\r\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\r\n\t\t\ttypeof this[property] != 'function' && (this[property] = null);\r\n\t\t}\r\n\t};\r\n\r\n\t$.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay;\r\n\r\n})(window.Zepto || window.jQuery, window, document);\r\n\r\n/**\r\n * Navigation Plugin\r\n * @version 2.3.4\r\n * @author Artus Kolanowski\r\n * @author David Deutsch\r\n * @license The MIT License (MIT)\r\n */\r\n;(function($, window, document, undefined) {\r\n\t'use strict';\r\n\r\n\t/**\r\n\t * Creates the navigation plugin.\r\n\t * @class The Navigation Plugin\r\n\t * @param {Owl} carousel - The Owl Carousel.\r\n\t */\r\n\tvar Navigation = function(carousel) {\r\n\t\t/**\r\n\t\t * Reference to the core.\r\n\t\t * @protected\r\n\t\t * @type {Owl}\r\n\t\t */\r\n\t\tthis._core = carousel;\r\n\r\n\t\t/**\r\n\t\t * Indicates whether the plugin is initialized or not.\r\n\t\t * @protected\r\n\t\t * @type {Boolean}\r\n\t\t */\r\n\t\tthis._initialized = false;\r\n\r\n\t\t/**\r\n\t\t * The current paging indexes.\r\n\t\t * @protected\r\n\t\t * @type {Array}\r\n\t\t */\r\n\t\tthis._pages = [];\r\n\r\n\t\t/**\r\n\t\t * All DOM elements of the user interface.\r\n\t\t * @protected\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tthis._controls = {};\r\n\r\n\t\t/**\r\n\t\t * Markup for an indicator.\r\n\t\t * @protected\r\n\t\t * @type {Array.<String>}\r\n\t\t */\r\n\t\tthis._templates = [];\r\n\r\n\t\t/**\r\n\t\t * The carousel element.\r\n\t\t * @type {jQuery}\r\n\t\t */\r\n\t\tthis.$element = this._core.$element;\r\n\r\n\t\t/**\r\n\t\t * Overridden methods of the carousel.\r\n\t\t * @protected\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tthis._overrides = {\r\n\t\t\tnext: this._core.next,\r\n\t\t\tprev: this._core.prev,\r\n\t\t\tto: this._core.to\r\n\t\t};\r\n\r\n\t\t/**\r\n\t\t * All event handlers.\r\n\t\t * @protected\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tthis._handlers = {\r\n\t\t\t'prepared.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && this._core.settings.dotsData) {\r\n\t\t\t\t\tthis._templates.push('<div class=\"' + this._core.settings.dotClass + '\">' +\r\n\t\t\t\t\t\t$(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '</div>');\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'added.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && this._core.settings.dotsData) {\r\n\t\t\t\t\tthis._templates.splice(e.position, 0, this._templates.pop());\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'remove.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && this._core.settings.dotsData) {\r\n\t\t\t\t\tthis._templates.splice(e.position, 1);\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'changed.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && e.property.name == 'position') {\r\n\t\t\t\t\tthis.draw();\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'initialized.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && !this._initialized) {\r\n\t\t\t\t\tthis._core.trigger('initialize', null, 'navigation');\r\n\t\t\t\t\tthis.initialize();\r\n\t\t\t\t\tthis.update();\r\n\t\t\t\t\tthis.draw();\r\n\t\t\t\t\tthis._initialized = true;\r\n\t\t\t\t\tthis._core.trigger('initialized', null, 'navigation');\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'refreshed.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && this._initialized) {\r\n\t\t\t\t\tthis._core.trigger('refresh', null, 'navigation');\r\n\t\t\t\t\tthis.update();\r\n\t\t\t\t\tthis.draw();\r\n\t\t\t\t\tthis._core.trigger('refreshed', null, 'navigation');\r\n\t\t\t\t}\r\n\t\t\t}, this)\r\n\t\t};\r\n\r\n\t\t// set default options\r\n\t\tthis._core.options = $.extend({}, Navigation.Defaults, this._core.options);\r\n\r\n\t\t// register event handlers\r\n\t\tthis.$element.on(this._handlers);\r\n\t};\r\n\r\n\t/**\r\n\t * Default options.\r\n\t * @public\r\n\t * @todo Rename `slideBy` to `navBy`\r\n\t */\r\n\tNavigation.Defaults = {\r\n\t\tnav: false,\r\n\t\tnavText: [\r\n\t\t\t'<span aria-label=\"' + 'Previous' + '\">‹</span>',\r\n\t\t\t'<span aria-label=\"' + 'Next' + '\">›</span>'\r\n\t\t],\r\n\t\tnavSpeed: false,\r\n\t\tnavElement: 'button type=\"button\" role=\"presentation\"',\r\n\t\tnavContainer: false,\r\n\t\tnavContainerClass: 'owl-nav',\r\n\t\tnavClass: [\r\n\t\t\t'owl-prev',\r\n\t\t\t'owl-next'\r\n\t\t],\r\n\t\tslideBy: 1,\r\n\t\tdotClass: 'owl-dot',\r\n\t\tdotsClass: 'owl-dots',\r\n\t\tdots: true,\r\n\t\tdotsEach: false,\r\n\t\tdotsData: false,\r\n\t\tdotsSpeed: false,\r\n\t\tdotsContainer: false\r\n\t};\r\n\r\n\t/**\r\n\t * Initializes the layout of the plugin and extends the carousel.\r\n\t * @protected\r\n\t */\r\n\tNavigation.prototype.initialize = function() {\r\n\t\tvar override,\r\n\t\t\tsettings = this._core.settings;\r\n\r\n\t\t// create DOM structure for relative navigation\r\n\t\tthis._controls.$relative = (settings.navContainer ? $(settings.navContainer)\r\n\t\t\t: $('<div>').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled');\r\n\r\n\t\tthis._controls.$previous = $('<' + settings.navElement + '>')\r\n\t\t\t.addClass(settings.navClass[0])\r\n\t\t\t.html(settings.navText[0])\r\n\t\t\t.prependTo(this._controls.$relative)\r\n\t\t\t.on('click', $.proxy(function(e) {\r\n\t\t\t\tthis.prev(settings.navSpeed);\r\n\t\t\t}, this));\r\n\t\tthis._controls.$next = $('<' + settings.navElement + '>')\r\n\t\t\t.addClass(settings.navClass[1])\r\n\t\t\t.html(settings.navText[1])\r\n\t\t\t.appendTo(this._controls.$relative)\r\n\t\t\t.on('click', $.proxy(function(e) {\r\n\t\t\t\tthis.next(settings.navSpeed);\r\n\t\t\t}, this));\r\n\r\n\t\t// create DOM structure for absolute navigation\r\n\t\tif (!settings.dotsData) {\r\n\t\t\tthis._templates = [ $('<button role=\"button\">')\r\n\t\t\t\t.addClass(settings.dotClass)\r\n\t\t\t\t.append($('<span>'))\r\n\t\t\t\t.prop('outerHTML') ];\r\n\t\t}\r\n\r\n\t\tthis._controls.$absolute = (settings.dotsContainer ? $(settings.dotsContainer)\r\n\t\t\t: $('<div>').addClass(settings.dotsClass).appendTo(this.$element)).addClass('disabled');\r\n\r\n\t\tthis._controls.$absolute.on('click', 'button', $.proxy(function(e) {\r\n\t\t\tvar index = $(e.target).parent().is(this._controls.$absolute)\r\n\t\t\t\t? $(e.target).index() : $(e.target).parent().index();\r\n\r\n\t\t\te.preventDefault();\r\n\r\n\t\t\tthis.to(index, settings.dotsSpeed);\r\n\t\t}, this));\r\n\r\n\t\t/*$el.on('focusin', function() {\r\n\t\t\t$(document).off(\".carousel\");\r\n\r\n\t\t\t$(document).on('keydown.carousel', function(e) {\r\n\t\t\t\tif(e.keyCode == 37) {\r\n\t\t\t\t\t$el.trigger('prev.owl')\r\n\t\t\t\t}\r\n\t\t\t\tif(e.keyCode == 39) {\r\n\t\t\t\t\t$el.trigger('next.owl')\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});*/\r\n\r\n\t\t// override public methods of the carousel\r\n\t\tfor (override in this._overrides) {\r\n\t\t\tthis._core[override] = $.proxy(this[override], this);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Destroys the plugin.\r\n\t * @protected\r\n\t */\r\n\tNavigation.prototype.destroy = function() {\r\n\t\tvar handler, control, property, override, settings;\r\n\t\tsettings = this._core.settings;\r\n\r\n\t\tfor (handler in this._handlers) {\r\n\t\t\tthis.$element.off(handler, this._handlers[handler]);\r\n\t\t}\r\n\t\tfor (control in this._controls) {\r\n\t\t\tif (control === '$relative' && settings.navContainer) {\r\n\t\t\t\tthis._controls[control].html('');\r\n\t\t\t} else {\r\n\t\t\t\tthis._controls[control].remove();\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (override in this.overides) {\r\n\t\t\tthis._core[override] = this._overrides[override];\r\n\t\t}\r\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\r\n\t\t\ttypeof this[property] != 'function' && (this[property] = null);\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Updates the internal state.\r\n\t * @protected\r\n\t */\r\n\tNavigation.prototype.update = function() {\r\n\t\tvar i, j, k,\r\n\t\t\tlower = this._core.clones().length / 2,\r\n\t\t\tupper = lower + this._core.items().length,\r\n\t\t\tmaximum = this._core.maximum(true),\r\n\t\t\tsettings = this._core.settings,\r\n\t\t\tsize = settings.center || settings.autoWidth || settings.dotsData\r\n\t\t\t\t? 1 : settings.dotsEach || settings.items;\r\n\r\n\t\tif (settings.slideBy !== 'page') {\r\n\t\t\tsettings.slideBy = Math.min(settings.slideBy, settings.items);\r\n\t\t}\r\n\r\n\t\tif (settings.dots || settings.slideBy == 'page') {\r\n\t\t\tthis._pages = [];\r\n\r\n\t\t\tfor (i = lower, j = 0, k = 0; i < upper; i++) {\r\n\t\t\t\tif (j >= size || j === 0) {\r\n\t\t\t\t\tthis._pages.push({\r\n\t\t\t\t\t\tstart: Math.min(maximum, i - lower),\r\n\t\t\t\t\t\tend: i - lower + size - 1\r\n\t\t\t\t\t});\r\n\t\t\t\t\tif (Math.min(maximum, i - lower) === maximum) {\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tj = 0, ++k;\r\n\t\t\t\t}\r\n\t\t\t\tj += this._core.mergers(this._core.relative(i));\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Draws the user interface.\r\n\t * @todo The option `dotsData` wont work.\r\n\t * @protected\r\n\t */\r\n\tNavigation.prototype.draw = function() {\r\n\t\tvar difference,\r\n\t\t\tsettings = this._core.settings,\r\n\t\t\tdisabled = this._core.items().length <= settings.items,\r\n\t\t\tindex = this._core.relative(this._core.current()),\r\n\t\t\tloop = settings.loop || settings.rewind;\r\n\r\n\t\tthis._controls.$relative.toggleClass('disabled', !settings.nav || disabled);\r\n\r\n\t\tif (settings.nav) {\r\n\t\t\tthis._controls.$previous.toggleClass('disabled', !loop && index <= this._core.minimum(true));\r\n\t\t\tthis._controls.$next.toggleClass('disabled', !loop && index >= this._core.maximum(true));\r\n\t\t}\r\n\r\n\t\tthis._controls.$absolute.toggleClass('disabled', !settings.dots || disabled);\r\n\r\n\t\tif (settings.dots) {\r\n\t\t\tdifference = this._pages.length - this._controls.$absolute.children().length;\r\n\r\n\t\t\tif (settings.dotsData && difference !== 0) {\r\n\t\t\t\tthis._controls.$absolute.html(this._templates.join(''));\r\n\t\t\t} else if (difference > 0) {\r\n\t\t\t\tthis._controls.$absolute.append(new Array(difference + 1).join(this._templates[0]));\r\n\t\t\t} else if (difference < 0) {\r\n\t\t\t\tthis._controls.$absolute.children().slice(difference).remove();\r\n\t\t\t}\r\n\r\n\t\t\tthis._controls.$absolute.find('.active').removeClass('active');\r\n\t\t\tthis._controls.$absolute.children().eq($.inArray(this.current(), this._pages)).addClass('active');\r\n\t\t}\r\n\t};\r\n\r\n\t/**\r\n\t * Extends event data.\r\n\t * @protected\r\n\t * @param {Event} event - The event object which gets thrown.\r\n\t */\r\n\tNavigation.prototype.onTrigger = function(event) {\r\n\t\tvar settings = this._core.settings;\r\n\r\n\t\tevent.page = {\r\n\t\t\tindex: $.inArray(this.current(), this._pages),\r\n\t\t\tcount: this._pages.length,\r\n\t\t\tsize: settings && (settings.center || settings.autoWidth || settings.dotsData\r\n\t\t\t\t? 1 : settings.dotsEach || settings.items)\r\n\t\t};\r\n\t};\r\n\r\n\t/**\r\n\t * Gets the current page position of the carousel.\r\n\t * @protected\r\n\t * @returns {Number}\r\n\t */\r\n\tNavigation.prototype.current = function() {\r\n\t\tvar current = this._core.relative(this._core.current());\r\n\t\treturn $.grep(this._pages, $.proxy(function(page, index) {\r\n\t\t\treturn page.start <= current && page.end >= current;\r\n\t\t}, this)).pop();\r\n\t};\r\n\r\n\t/**\r\n\t * Gets the current succesor/predecessor position.\r\n\t * @protected\r\n\t * @returns {Number}\r\n\t */\r\n\tNavigation.prototype.getPosition = function(successor) {\r\n\t\tvar position, length,\r\n\t\t\tsettings = this._core.settings;\r\n\r\n\t\tif (settings.slideBy == 'page') {\r\n\t\t\tposition = $.inArray(this.current(), this._pages);\r\n\t\t\tlength = this._pages.length;\r\n\t\t\tsuccessor ? ++position : --position;\r\n\t\t\tposition = this._pages[((position % length) + length) % length].start;\r\n\t\t} else {\r\n\t\t\tposition = this._core.relative(this._core.current());\r\n\t\t\tlength = this._core.items().length;\r\n\t\t\tsuccessor ? position += settings.slideBy : position -= settings.slideBy;\r\n\t\t}\r\n\r\n\t\treturn position;\r\n\t};\r\n\r\n\t/**\r\n\t * Slides to the next item or page.\r\n\t * @public\r\n\t * @param {Number} [speed=false] - The time in milliseconds for the transition.\r\n\t */\r\n\tNavigation.prototype.next = function(speed) {\r\n\t\t$.proxy(this._overrides.to, this._core)(this.getPosition(true), speed);\r\n\t};\r\n\r\n\t/**\r\n\t * Slides to the previous item or page.\r\n\t * @public\r\n\t * @param {Number} [speed=false] - The time in milliseconds for the transition.\r\n\t */\r\n\tNavigation.prototype.prev = function(speed) {\r\n\t\t$.proxy(this._overrides.to, this._core)(this.getPosition(false), speed);\r\n\t};\r\n\r\n\t/**\r\n\t * Slides to the specified item or page.\r\n\t * @public\r\n\t * @param {Number} position - The position of the item or page.\r\n\t * @param {Number} [speed] - The time in milliseconds for the transition.\r\n\t * @param {Boolean} [standard=false] - Whether to use the standard behaviour or not.\r\n\t */\r\n\tNavigation.prototype.to = function(position, speed, standard) {\r\n\t\tvar length;\r\n\r\n\t\tif (!standard && this._pages.length) {\r\n\t\t\tlength = this._pages.length;\r\n\t\t\t$.proxy(this._overrides.to, this._core)(this._pages[((position % length) + length) % length].start, speed);\r\n\t\t} else {\r\n\t\t\t$.proxy(this._overrides.to, this._core)(position, speed);\r\n\t\t}\r\n\t};\r\n\r\n\t$.fn.owlCarousel.Constructor.Plugins.Navigation = Navigation;\r\n\r\n})(window.Zepto || window.jQuery, window, document);\r\n\r\n/**\r\n * Hash Plugin\r\n * @version 2.3.4\r\n * @author Artus Kolanowski\r\n * @author David Deutsch\r\n * @license The MIT License (MIT)\r\n */\r\n;(function($, window, document, undefined) {\r\n\t'use strict';\r\n\r\n\t/**\r\n\t * Creates the hash plugin.\r\n\t * @class The Hash Plugin\r\n\t * @param {Owl} carousel - The Owl Carousel\r\n\t */\r\n\tvar Hash = function(carousel) {\r\n\t\t/**\r\n\t\t * Reference to the core.\r\n\t\t * @protected\r\n\t\t * @type {Owl}\r\n\t\t */\r\n\t\tthis._core = carousel;\r\n\r\n\t\t/**\r\n\t\t * Hash index for the items.\r\n\t\t * @protected\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tthis._hashes = {};\r\n\r\n\t\t/**\r\n\t\t * The carousel element.\r\n\t\t * @type {jQuery}\r\n\t\t */\r\n\t\tthis.$element = this._core.$element;\r\n\r\n\t\t/**\r\n\t\t * All event handlers.\r\n\t\t * @protected\r\n\t\t * @type {Object}\r\n\t\t */\r\n\t\tthis._handlers = {\r\n\t\t\t'initialized.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && this._core.settings.startPosition === 'URLHash') {\r\n\t\t\t\t\t$(window).trigger('hashchange.owl.navigation');\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'prepared.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace) {\r\n\t\t\t\t\tvar hash = $(e.content).find('[data-hash]').addBack('[data-hash]').attr('data-hash');\r\n\r\n\t\t\t\t\tif (!hash) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tthis._hashes[hash] = e.content;\r\n\t\t\t\t}\r\n\t\t\t}, this),\r\n\t\t\t'changed.owl.carousel': $.proxy(function(e) {\r\n\t\t\t\tif (e.namespace && e.property.name === 'position') {\r\n\t\t\t\t\tvar current = this._core.items(this._core.relative(this._core.current())),\r\n\t\t\t\t\t\thash = $.map(this._hashes, function(item, hash) {\r\n\t\t\t\t\t\t\treturn item === current ? hash : null;\r\n\t\t\t\t\t\t}).join();\r\n\r\n\t\t\t\t\tif (!hash || window.location.hash.slice(1) === hash) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\twindow.location.hash = hash;\r\n\t\t\t\t}\r\n\t\t\t}, this)\r\n\t\t};\r\n\r\n\t\t// set default options\r\n\t\tthis._core.options = $.extend({}, Hash.Defaults, this._core.options);\r\n\r\n\t\t// register the event handlers\r\n\t\tthis.$element.on(this._handlers);\r\n\r\n\t\t// register event listener for hash navigation\r\n\t\t$(window).on('hashchange.owl.navigation', $.proxy(function(e) {\r\n\t\t\tvar hash = window.location.hash.substring(1),\r\n\t\t\t\titems = this._core.$stage.children(),\r\n\t\t\t\tposition = this._hashes[hash] && items.index(this._hashes[hash]);\r\n\r\n\t\t\tif (position === undefined || position === this._core.current()) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tthis._core.to(this._core.relative(position), false, true);\r\n\t\t}, this));\r\n\t};\r\n\r\n\t/**\r\n\t * Default options.\r\n\t * @public\r\n\t */\r\n\tHash.Defaults = {\r\n\t\tURLhashListener: false\r\n\t};\r\n\r\n\t/**\r\n\t * Destroys the plugin.\r\n\t * @public\r\n\t */\r\n\tHash.prototype.destroy = function() {\r\n\t\tvar handler, property;\r\n\r\n\t\t$(window).off('hashchange.owl.navigation');\r\n\r\n\t\tfor (handler in this._handlers) {\r\n\t\t\tthis._core.$element.off(handler, this._handlers[handler]);\r\n\t\t}\r\n\t\tfor (property in Object.getOwnPropertyNames(this)) {\r\n\t\t\ttypeof this[property] != 'function' && (this[property] = null);\r\n\t\t}\r\n\t};\r\n\r\n\t$.fn.owlCarousel.Constructor.Plugins.Hash = Hash;\r\n\r\n})(window.Zepto || window.jQuery, window, document);\r\n\r\n/**\r\n * Support Plugin\r\n *\r\n * @version 2.3.4\r\n * @author Vivid Planet Software GmbH\r\n * @author Artus Kolanowski\r\n * @author David Deutsch\r\n * @license The MIT License (MIT)\r\n */\r\n;(function($, window, document, undefined) {\r\n\r\n\tvar style = $('<support>').get(0).style,\r\n\t\tprefixes = 'Webkit Moz O ms'.split(' '),\r\n\t\tevents = {\r\n\t\t\ttransition: {\r\n\t\t\t\tend: {\r\n\t\t\t\t\tWebkitTransition: 'webkitTransitionEnd',\r\n\t\t\t\t\tMozTransition: 'transitionend',\r\n\t\t\t\t\tOTransition: 'oTransitionEnd',\r\n\t\t\t\t\ttransition: 'transitionend'\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\tanimation: {\r\n\t\t\t\tend: {\r\n\t\t\t\t\tWebkitAnimation: 'webkitAnimationEnd',\r\n\t\t\t\t\tMozAnimation: 'animationend',\r\n\t\t\t\t\tOAnimation: 'oAnimationEnd',\r\n\t\t\t\t\tanimation: 'animationend'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\ttests = {\r\n\t\t\tcsstransforms: function() {\r\n\t\t\t\treturn !!test('transform');\r\n\t\t\t},\r\n\t\t\tcsstransforms3d: function() {\r\n\t\t\t\treturn !!test('perspective');\r\n\t\t\t},\r\n\t\t\tcsstransitions: function() {\r\n\t\t\t\treturn !!test('transition');\r\n\t\t\t},\r\n\t\t\tcssanimations: function() {\r\n\t\t\t\treturn !!test('animation');\r\n\t\t\t}\r\n\t\t};\r\n\r\n\tfunction test(property, prefixed) {\r\n\t\tvar result = false,\r\n\t\t\tupper = property.charAt(0).toUpperCase() + property.slice(1);\r\n\r\n\t\t$.each((property + ' ' + prefixes.join(upper + ' ') + upper).split(' '), function(i, property) {\r\n\t\t\tif (style[property] !== undefined) {\r\n\t\t\t\tresult = prefixed ? property : true;\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfunction prefixed(property) {\r\n\t\treturn test(property, true);\r\n\t}\r\n\r\n\tif (tests.csstransitions()) {\r\n\t\t/* jshint -W053 */\r\n\t\t$.support.transition = new String(prefixed('transition'))\r\n\t\t$.support.transition.end = events.transition.end[ $.support.transition ];\r\n\t}\r\n\r\n\tif (tests.cssanimations()) {\r\n\t\t/* jshint -W053 */\r\n\t\t$.support.animation = new String(prefixed('animation'))\r\n\t\t$.support.animation.end = events.animation.end[ $.support.animation ];\r\n\t}\r\n\r\n\tif (tests.csstransforms()) {\r\n\t\t/* jshint -W053 */\r\n\t\t$.support.transform = new String(prefixed('transform'));\r\n\t\t$.support.transform3d = tests.csstransforms3d();\r\n\t}\r\n\r\n})(window.Zepto || window.jQuery, window, document);\r\n","AgrimarketServices.service('categoryOfferService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n callback(data, status, headers, config);\r\n });\r\n };\r\n\r\n this.GetAllCategoryOffers = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'categoryOffer/GetAllCategoryOffers'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetCategoryOfferPaginateWithFilter = function (searchText, max, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'categoryOffer/GetCategoryOfferPaginateWithFilter',\r\n params: {\r\n searchText: searchText,\r\n itemPerPage: max,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.PostCategoryOffer = function (data, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'categoryOffer/PostCategoryOffer',\r\n data: data\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DeleteCategoryOffer = function (idCategoryOffer, callback) {\r\n var config = {\r\n method: 'DELETE',\r\n url: configurationFactory.Url['Api'] + 'categoryOffer/DeleteCategoryOffer',\r\n params: { idCategoryOffer: idCategoryOffer }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }]);","AgrimarketServices.service('ceremisApiService', ['$rootScope', '$http', '$location', 'configurationFactory',\r\n function ($rootScope, $http, $location, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n callback(data, status, headers, config);\r\n });\r\n };\r\n\r\n this.GetOffersCeremis = function (idExtCrop, callback) {\r\n var config = {\r\n method: 'get',\r\n url: configurationFactory.Url['Api'] + 'CeremisApi/GetOffersCeremis',\r\n params: {\r\n idExtCrop: idExtCrop\r\n }\r\n };\r\n\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetCeremisStrikes = function (idExpiryWsd, idTypeOption, callback) {\r\n var config = {\r\n method: 'get',\r\n url: configurationFactory.Url['Api'] + 'CeremisApi/GetCeremisStrikes',\r\n params: {\r\n idExpiryWsd: idExpiryWsd,\r\n idTypeOption: idTypeOption\r\n }\r\n };\r\n\r\n SendRequest(config, callback);\r\n };\r\n\r\n }]);","AgrimarketServices.service('portfolioService', ['$http', 'configurationFactory',\r\n function ($http, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.GetContracts = function (params, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Portfolio/GetContracts',\r\n data: params\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetOrders = function (params, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Portfolio/GetOrders',\r\n data: params\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetOrderStatuses = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Portfolio/GetOrderStatuses'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n this.GetContractStatuses = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Portfolio/GetContractStatuses'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n }\r\n ]);","AgrimarketServices.service('typeContractsService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetTypeContracts = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'TypeContract/GetAll'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }]);","AgrimarketServices.service('criteriaOfferService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null, null, null);\r\n })\r\n .error(function (data, status, headers, config) {\r\n callback(data, status, headers, config);\r\n });\r\n };\r\n\r\n this.GetAllCriteriaOffers = function (callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'criteriaOffer/GetAllCriteriaOffers'\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n }]);","AgrimarketServices.service('coverParametersService', ['$rootScope', '$http', '$location', 'currentUserFactory', 'configurationFactory',\r\n function ($rootScope, $http, $location, currentUserFactory, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null, null, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status, headers, config) {\r\n\t\t\t \tcallback(data, status, headers, config);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetCoverParameters = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n url: configurationFactory.Url['Api'] + 'CoverParameter/GetCoverParameters'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n this.SaveCoverParameter = function (coverParameter, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'CoverParameter/SaveCoverParameter',\r\n data: coverParameter\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n }]);","AgrimarketServices.service('notificationsService', ['$http', 'configurationFactory',\r\n function ($http, configurationFactory) {\r\n\r\n var SendRequest = function (configfile, callback) {\r\n $http(configfile)\r\n .success(function (data) {\r\n callback(data, null);\r\n })\r\n .error(function (data, status) {\r\n callback(data, status);\r\n });\r\n };\r\n\r\n this.GetNotificationsPaginate = function (itemPerPage, pageNo, sortKey, reverse, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Notification/GetNotificationsPaginate',\r\n params: {\r\n itemPerPage: itemPerPage,\r\n pageNo: pageNo,\r\n sortKey: sortKey,\r\n reverse: reverse\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.DeleteNotification = function (idNotification, callback) {\r\n var config = {\r\n method: 'DELETE',\r\n url: configurationFactory.Url['Api'] + 'Notification/DeleteNotification',\r\n params: {\r\n idNotification: idNotification\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.GetNotificationById = function (idNotification, callback) {\r\n var config = {\r\n method: 'GET',\r\n url: configurationFactory.Url['Api'] + 'Notification/GetNotificationById',\r\n params: {\r\n idNotification: idNotification ? idNotification : \"\"\r\n }\r\n };\r\n SendRequest(config, callback);\r\n };\r\n\r\n this.Save = function (notification, callback) {\r\n var config = {\r\n method: 'POST',\r\n url: configurationFactory.Url['Api'] + 'Notification/Save',\r\n data: notification\r\n };\r\n SendRequest(config, callback);\r\n };\r\n}]);","AgrimarketServices.service('typePriceService', ['$http', 'configurationFactory',\r\n function ($http, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.GetTypePrices = function (callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'GET',\r\n url: configurationFactory.Url['Api'] + 'TypePrice/GetTypePrices'\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n }]);","AgrimarketServices.service(\"versionService\", [\r\n function() {\r\n var version = \"1.1.18.50\";\r\n\r\n this.webVersion = version;\r\n },\r\n]);\r\n","AgrimarketServices.service('strikeService', ['$http', 'configurationFactory',\r\n function ($http, configurationFactory) {\r\n\r\n \tvar SendRequest = function (configfile, callback) {\r\n \t\t$http(configfile)\r\n\t\t\t .success(function (data) {\r\n\t\t\t \tcallback(data, null);\r\n\t\t\t })\r\n\t\t\t .error(function (data, status) {\r\n\t\t\t \tcallback(data, status);\r\n\t\t\t });\r\n \t};\r\n\r\n \tthis.RecalculateStrikes = function (idOffer, callback) {\r\n \t\tvar config = {\r\n \t\t\tmethod: 'POST',\r\n \t\t\turl: configurationFactory.Url['Api'] + 'Strike/RecalculateStrikesByIdOffer',\r\n\t\t\t\tparams: { idOffer: idOffer}\r\n \t\t};\r\n \t\tSendRequest(config, callback);\r\n \t};\r\n\r\n\t\tthis.GetStrikesByIdExpiry = function (idExpiry, callback) {\r\n \tvar config = {\r\n \t\tmethod: 'GET',\r\n \t\turl: configurationFactory.Url['Api'] + 'Strike/GetStrikesByIdExpiry',\r\n \t\tparams: { idExpiry: idExpiry }\r\n \t};\r\n \tSendRequest(config, callback);\r\n };\r\n }]);"]}