PATH:
home
/
letacommog
/
letaweb
/
scripts
/
editor
$(document).ready(function() { //config requireJS requirejs.config({ urlArgs: "version=" + window.version, baseUrl: window.baseScriptPath, paths: { libraries: window.baseScriptPath + '/libraries/', popup: window.baseScriptPath + '/editor/popup/', module: window.baseScriptPath + '/editor/modules/' } }); //debug requireJS requirejs.onError = function (err) { console.log(err); console.log('modules: ' + err.requireModules); if(err.prototype!=undefined) throw err; }; }); //return builder url var getRelativeUrl = function() { var url = document.location.protocol +"//"+ document.location.hostname + document.location.pathname; var filename = 'admin.php'; var i = url.indexOf(filename); url = url.substring(0, i + filename.length); if(url[url.length - 1] != '/') url = url + '/'; return url; }; // abstract module for ajax communication angular.module('pagemanager.ajax',[]) .value('overlayTemplate','<div><div class="ui-block"></div></div>') .factory('ajax',['$http','$dialog','$q',function($http,$dialog,$q) { return function() { //execute ajax request using post method this.post = function(url, data) { data = data || {}; data.YII_CSRF_TOKEN=window.YII_CSRF_TOKEN; var that = this; return $http( { url: getRelativeUrl() + url, method: 'POST', data: $.param(data), headers: {'Content-Type': 'application/x-www-form-urlencoded'} }) .then( function(response) { var data = response.data; return data; }, function(response) { var data = response.data, status = response.status, header = response.header, config = response.config; $dialog.message({message:data, title:'Error'}); } ); }; //execute ajax request using get method this.get = function(url, data,cache) { var that = this; return $http( { url: getRelativeUrl() + url, method: 'GET', params: data, headers: {'Content-Type': 'application/x-www-form-urlencoded'} }) .then( function(response) { var data = response.data; return data; }, function(response) { var data = response.data; return data; } ); }; //execute ajax request without display message on error this.executeNoMessage = function(url, data) { return this._execute(url, data,false); }; //execute ajax request with display message on error this.execute = function(url, data) { return this._execute(url, data,true); }; //base function to execute ajax request this._execute = function(url, data,messageOnError) { var that = this; data = data || {}; data.YII_CSRF_TOKEN=window.YII_CSRF_TOKEN; return $http( { url: getRelativeUrl() + url, method: 'POST', data: $.param(data), headers: {'Content-Type': 'application/x-www-form-urlencoded'} }) .then( function(response) { var data = response.data, status = response.status, header = response.header, config = response.config; if(!data.success) { var mess = data.message; if(messageOnError) if(mess != undefined) { $dialog.message({message:mess, title:'Error'}); } else $dialog.message({message:data, title:'Error'}); return $q.reject(data); } else return data.data; }, function(response) { var data = response.data, status = response.status, header = response.header, config = response.config; if(messageOnError) { if(response.status == 403) { $dialog.message({message:data, title:'Error'}); } else if(response.status !== 401) $dialog.message({message:data, title:'Error'}); } return $q.reject(response); } ); }; } }]); //angular module extend from ajax module //contain functions for builder to communication with server and client angular.module('pagemanager.communication',['pagemanager.ajax']) .factory('defaultEditor',[function() { if(window.editors!=undefined && window.editors.length) { this.default_editor = window.editors[0]; return this.default_editor; } return 'base'; }]) .factory('communication',['$templateCache','$q','ajax','$cacheFactory','defaultEditor',function($templateCache,$q,ajax,$cacheFactory,defaultEditor) { return { //function bridge to ajax module ajaxCall : function(url, data, displayError) { if(displayError == undefined) displayError = true; var ajaxInstance = new ajax(); if(displayError) return ajaxInstance.execute(url, data); return ajaxInstance.executeNoMessage(url, data); }, //function bridge to ajax module ajaxCallNoMessage : function(url, data) { var ajaxInstance = new ajax(); return ajaxInstance.executeNoMessage(url, data); }, removeTemplate : function(type, name) { var n = name.replace('/', '3'); var t = $('script#' + type+ n + 'Template'); t.remove(); }, //load widget html //this function used when a widget is created getModuleHtml: function(name, data) { data.type = name; var ajaxInstance = new ajax(); return ajaxInstance.post('module', data).then( function(response) { var html = response; return html; }); }, getZoneTemplate : function( name) { var ajaxInstance = new ajax(); return ajaxInstance.get('viewzone?name=' + name, {}).then( function(response) { var html = response; return html; }); }, getHtml : function( name, cache) { cache = cache || false; return this.getTemplate(name, cache); }, //get html template base on path getTemplate : function( path,cache) { var n = path; cache = cache || false; if($templateCache.get(path)==undefined) { return this.api('getTemplate', {name: path}).then( function(response) { var html = response.html; if(cache == 1 || cache == true) $templateCache.put(path,html); return html; }); } else { html = $templateCache.get(path); var defered = $q.defer(); if(typeof html == 'string') { defered.resolve(html); } else defered.reject(html); return defered.promise; } return html; }, // This function is used to request server api api : function( action, data, path,displayError) { if(!path) { path = window.location.hash; path = $.trim(path); if(path[0] == '#') path = path.substring(1); if(path[0] == '/') path = path.substring(1); } if(path.length == 0) path = defaultEditor; var url = 'api?path=' + path + '&action=' + action; return this.ajaxCall(url, data,displayError); }, // get full url of an server api getApiUrl : function( action, data, path) { if(!path) { path = window.location.hash; path = $.trim(path); if(path[0] == '#') path = path.substring(1); if(path[0] == '/') path = path.substring(1); } if(path.length == 0) path = defaultEditor; var url = 'api?path=' + path + '&action=' + action; url = getRelativeUrl() +url; return url; }, //get all color schemes getColorList : function() { var name = 'colorList'; return this.api('getColorScheme', {}); }, getSocialShareButtonList : function(success) { var cache = $cacheFactory.get('List'); if(!cache) cache = $cacheFactory('List'); if(cache.get('socialShareButton') != undefined) { var defer = $q.defer(); defer.resolve( cache.get('socialShareButton') ); return defer.promise; } else { return this.ajaxCall('getSocialButton', { }).then( function(json) { cache.put('socialShareButton', json); return json; }); } }, //get all skin preset of an widget getSkinList : function(type, format) { var cache = $cacheFactory.get('List'); if(!cache) cache = $cacheFactory('List'); if(!format) format = 0; if(cache.get('skin/' + type + '/' + format) != undefined) { var defer = $q.defer(); defer.resolve( cache.get('skin/' + type + '/' + format) ); return defer.promise; } else { return this.api('getSkinList', { name: type, format: format },'content').then( function(json) { var list = []; for(var i = 0;i < json.length;i++) { list.push(json[i]); } cache.put('skin/' + type + '/' + format, list); return list; }); } }, //get all skin preset of an widget width index getIndexedSkinList : function(type, index) { var cache = $cacheFactory.get('List'); if(!cache) cache = $cacheFactory('List'); var format = 0; if(cache.get('skin/' + type) != undefined) { var defer = $q.defer(); var result = {list:cache.get('skin/' + type) , index:index} defer.resolve( result ); return defer.promise; } else { return this.api('getSkinList', { name: type, format: format },'content').then( function(json) { var list = []; for(var i = 0;i < json.length;i++) { list.push(json[i]); } cache.put('skin/' + type, list); return {list:list, index:index}; }); } }, //put the list data to cache setList:function(name,list) { var cache = $cacheFactory.get('List'); cache.put(name+ '_', list) }, //remove the list data from cache removeList:function(name) { var cache = $cacheFactory.get('List'); if(angular.isDefined(cache)) { cache.remove(name+ '_{}'); } }, //get the list data from server getList : function(name, data, api_path) { var async = true; data = data || {}; var cache = $cacheFactory.get('List'); if(!cache) cache = $cacheFactory('List'); var string = $.toJSON(data) if(cache.get(name+ '_'+string) != undefined) { var defer = $q.defer(); defer.resolve( cache.get(name+ '_'+string) ); return defer.promise; } data.name = name; return this.api('getList', data,api_path).then( function(json) { cache.put(name+ '_'+string, json) return json; }); }, getDefaultCurrency : function(success, a) { var cache = $cacheFactory.get('DefaultCurrency'); if(!cache) cache = $cacheFactory('DefaultCurrency'); if(cache.get('value') != undefined) { var defer = $q.defer(); defer.resolve( cache.get('value') ); return defer.promise; } else { return this.api('getDefaultCurrency', { }).then( function(json) { cache.put('value', json) return json; }); } }, getPagedListUrl:function(name, data,api_path) { var url = this.getApiUrl('getPagedList',data,api_path); url +='&name=' + name; return url; }, getPagedList : function(name, data,api_path) { data.name = name; data.page = data.page || 1; data.rp = data.rp || 20; data.sortname = data.sortname || 'id'; data.sortorder = data.sortorder || 'desc'; data.query = data.query || ''; // data.search = data.search; data.qtype = data.qtype || ''; return this.api('getPagedList', data,api_path).then( function(json) { return json; }); }, getConfiguration : function(key) { var rs = ''; var cache = $cacheFactory.get('Configurations'); if(!cache) cache = $cacheFactory('Configurations'); if(typeof cache.get(key) != 'undefined') { var defer = $q.defer(); defer.resolve( cache.get(key) ); return defer.promise; } return this.api('getConfiguration', {key: key}).then( function(json) { if(json == 'null') return null; var cache = $cacheFactory.get('Configurations'); cache.put(key, json) return json }); }, getConfigurations : function(keys) { return this.api('getConfigurations', {keys: keys}) }, updateConfiguration : function(key, value, success) { this.api('updateConfiguration', {key: key, value: value}, success); }, getStylesheetContents : function (hrefs, callback) { return this.api('getCSS',{hrefs: hrefs}); }, saveCSS : function() { this.ajaxCall('saveCSS', { styleSheets : StyleSheet.getContent()}); }, }; }]) .config(function($httpProvider) { $httpProvider.interceptors.push(['$q', '$localStorage','$location','$rootScope', function($q, $localStorage,$location,$rootScope) { return { request: function (config) { $rootScope.activeCalls=$rootScope.activeCalls||0; $rootScope.activeCalls += 1; config.headers = config.headers || {}; $('#loadingSpinner').show(); config.headers.Authorization="Test"; if ($localStorage.token) { config.headers.Authorization = 'Bearer ' + $localStorage.token; } return config; }, requestError: function (rejection) { $rootScope.activeCalls=$rootScope.activeCalls||0; $rootScope.activeCalls -= 1; if ( $rootScope.activeCalls == 0) { $('#loadingSpinner').hide(); } return rejection; }, response: function (response) { $rootScope.activeCalls=$rootScope.activeCalls||0; $rootScope.activeCalls -= 1; if ( $rootScope.activeCalls == 0) { $('#loadingSpinner').hide(); } return response; }, responseError: function (response) { $rootScope.activeCalls=$rootScope.activeCalls||0; $rootScope.activeCalls -= 1; if(response.status === 401) { $location.path('/signin'); $rootScope.$apply(function() { $location.path('/signin'); }); } if ( $rootScope.activeCalls == 0) { $('#loadingSpinner').hide(); } return $q.reject(response); }, }; }]); }); angular.module('pagemanager.file_manager', ['pagemanager.communication', 'ui.dialog','ng-context-menu']); angular.module('pagemanager', ['ui.router','ui.popup','ui.bootstrap','pagemanager.communication','pagemanager.file_manager','pagemanger.authentication']) .directive('loadingSpinner', function ($http) { return { restrict: 'A', replace: true, template: '<div class=""><div class="ui-block"></div></div>', link: function (scope, element, attrs) { scope.$watch('activeCalls', function (newVal, oldVal) { if (newVal == 0) { $(element).hide(); } else { $(element).show(); } }); } }; }) .controller('headerController',['$location','AuthenticationSvc','$rootScope','$scope','$file_manager','popup_profile', function($location,AuthenticationSvc,$rootScope,$scope, $file_manager,popup_profile) { $rootScope.$watch('actived_tab', function(n,o) { $scope.actived_tab = n; }) $rootScope.$watch('username', function(n,o) { $scope.username = n; }); $rootScope.username = window.username; $scope.viewProfile = function() { popup_profile.open(); } $scope.viewPlanStatus = function() { popup_profile.open(); } $scope.logout = function() { AuthenticationSvc.logout().then(function() { $location.path('/signin'); }); }; }]) .run(function($state,$rootScope) { $rootScope.activeCalls=0; $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { //event.preventDefault(); var fromName = fromState.name; if(!fromState.abstract) { var fromEditor = fromName.split('.')[0]; var toName = toState.name; var toEditor = toName.split('.')[0]; if(fromEditor!=toEditor &&( toName!='signin'&& fromName!='signin')) { if(confirm("Are you sure to leave - All data may be lost?")==false) event.preventDefault(); else { $(window).trigger('unloadEditor'); } } } }); }) .config(function($stateProvider,$urlRouterProvider,$httpProvider,$logProvider,$controllerProvider) { var avaiable_editors = window.editors; $logProvider.debugEnabled(true); $controllerProvider.allowGlobals(); $urlRouterProvider .otherwise('/'+avaiable_editors[0]); var maxChild = 10; for(var i = 0;i < avaiable_editors.length;i++) { if(avaiable_editors[i]=='signin' || avaiable_editors[i]=='signup') continue; var stateName = avaiable_editors[i]; var childStateName = stateName; $stateProvider .state(stateName, { url: "/"+stateName, onEnter: function($state,pageService) { pageService.activeTab(this.name); } }); for(var j = 0;j < maxChild;j++) { childStateName = childStateName + '.child'+ j; $stateProvider .state(childStateName, { url: "/:child" + j, }); } } $stateProvider .state('signin', { url: "/signin", onEnter: function($state,popup_login) { popup_login.open(); } }) .state('signup', { url: "/signup", controller: 'AuthenticationCtrl' }); }) .factory('pageService',['$rootScope','communication','$state',function($rootScope,communication, $state) { return { activeTab : function(name) { var avaiable_editors = window.editors; if(avaiable_editors.indexOf(name) == -1) name = avaiable_editors[0]; if(name == $rootScope.actived_tab) return; $('#editor_container').empty(); var app_container = $('#' + name + '_container'); app_container.remove(); if(app_container.length == 0) { app_container = $('<div id="' + name + '_container"></div>'); $('#editor_container').append(app_container); } communication.getTemplate(name).then(function(html) { app_container.html(html); try { angular.bootstrap(app_container[0], [name]); $rootScope.actived_tab = name; } catch(e) { console.log(e); } }); }, triggerTab : function(tab) { var href = $(tab).attr('href'); href = href.substring(1); var name = this.getEditorName(href); this.activeTab(name); }, trim : function(n) { var r = $.trim(n); if(r.length == 0) return r; while( r[0] == '/' && r.length > 0 ) { r = r.substring(1); } while( r[r.length - 1] == '/' && r.length > 1 ) { r = r.substring(0, r.length - 2); } return r; }, reloadEditor : function() { delete this.actived_tab; this.loadEditor(); }, getDefaultEditor : function() { if(!this.default_editor) { if(window.editors!=undefined && window.editors.length) { this.default_editor = window.editors[0]; return this.default_editor; } } return this.default_editor; }, loadEditor : function() { var e = this.getDefaultEditor(); this.activeTab(e); }, addConfiguration : function(key, value) { this.configurations.push({name:key, value: value}); }, getEditorName : function(path) { var pt = this.trim(path).split('/'); if(pt.length >= 1) { var en = $.trim(pt[0] ); return en; } return path; }, } }]); $(function() { var inFormOrLink; //$('a').delegate('click', function() { inFormOrLink = true; }); $(window).on("beforeunload", function() { if(window.is_reload) return; return confirm("Do you need to reload?"); }) }); angular.module('pagemanger.authentication',['pagemanager.communication','ngStorage','ui.router','ui.popup']) .factory('AuthenticationSvc', ['$rootScope','communication', '$localStorage','$q', function($rootScope,communication, $localStorage, $q){ var baseUrl = "user"; function changeUser(user) { angular.extend(currentUser, user); } function urlBase64Decode(str) { var output = str.replace('-', '+').replace('_', '/'); switch (output.length % 4) { case 0: break; case 2: output += '=='; break; case 3: output += '='; break; default: throw 'Illegal base64url string!'; } return window.atob(output); } function getUserFromToken() { var token = $localStorage.token; var user = {}; if (typeof token !== 'undefined' && token!= null) { var encoded = token.split('.')[1]; user = JSON.parse(urlBase64Decode(encoded)); } return user; } var currentUser = getUserFromToken(); return { save: function(data, success, error) { return communication.api('signin', data) }, signin: function(data, success, error) { return communication.ajaxCallNoMessage('user/authenticate', data).then(function(res) { $rootScope.username= res.name; $localStorage.token = res.token; return res; }); }, me: function(success, error) { return communication.api('me') }, logout: function() { return communication.ajaxCallNoMessage('user/logout',{}).then(function(res) { changeUser({}); delete $localStorage.token; return 1; }); } }; } ]) .constant('AUTH_EVENTS', { loginSuccess: 'auth-login-success', loginFailed: 'auth-login-failed', logoutSuccess: 'auth-logout-success', sessionTimeout: 'auth-session-timeout', notAuthenticated: 'auth-not-authenticated', notAuthorized: 'auth-not-authorized' }) .factory('AuthInterceptor', function ($rootScope, $q, AUTH_EVENTS) { return { responseError: function (response) { $rootScope.$broadcast({ 401: AUTH_EVENTS.notAuthenticated, 403: AUTH_EVENTS.notAuthorized, 419: AUTH_EVENTS.sessionTimeout, 440: AUTH_EVENTS.sessionTimeout }[response.status], response); return $q.reject(response); } }; }) .controller('AuthenticationCtrl', ['$rootScope', '$scope', '$location', '$localStorage', 'AuthenticationSvc', function($rootScope, $scope, $location, $localStorage, AuthenticationSvc) { $scope.signup = function() { var formData = { email: $scope.email, password: $scope.password } AuthenticationSvc.save(formData).then( function(res) { if (res.type == false) { alert(res.data) } else { $localStorage.token = res.data.token; $location.path('/'); } }, function() { $rootScope.error = 'Failed to signup'; }) }; $scope.me = function() { AuthenticationSvc.me(function(res) { $scope.myDetails = res; }, function() { $rootScope.error = 'Failed to fetch details'; }) }; $scope.token = $localStorage.token; }]) angular.module('pagemanger.controls',['ui.bootstrap.datetimepicker']) .directive('shareButtonEditButtonDraggable', ['$compile','$parse',function($compile,$parse) { }]) .filter('makeRange', function() { return function(input) { var lowBound, highBound; switch (input.length) { case 1: lowBound = 0; highBound = parseInt(input[0]) - 1; break; case 2: lowBound = parseInt(input[0]); highBound = parseInt(input[1]); break; default: return input; } var result = []; for (var i = lowBound; i <= highBound; i++) result.push(i); return result; }; }) .provider( '$tooltipEx', function () { // The default options tooltip and popover. var defaultOptions = { placement: 'top', animation: true, popupDelay: 0 }; // Default hide triggers for each show trigger var triggerMap = { 'mouseenter': 'mouseleave', 'click': 'click', 'clickTooltip': 'click.Tooltip', 'focus': 'blur' }; // The options specified to the provider globally. var globalOptions = {}; /** * `options({})` allows global configuration of all tooltips in the * application. * * var app = angular.module( 'App', ['ui.bootstrap.tooltip'], function( $tooltipProvider ) { * // place tooltips left instead of top by default * $tooltipProvider.options( { placement: 'left' } ); * }); */ this.options = function( value ) { angular.extend( globalOptions, value ); }; /** * This allows you to extend the set of trigger mappings available. E.g.: * * $tooltipProvider.setTriggers( 'openTrigger': 'closeTrigger' ); */ this.setTriggers = function setTriggers ( triggers ) { angular.extend( triggerMap, triggers ); }; /** * This is a helper function for translating camel-case to snake-case. */ function snake_case(name){ var regexp = /[A-Z]/g; var separator = '-'; return name.replace(regexp, function(letter, pos) { return (pos ? separator : '') + letter.toLowerCase(); }); } /** * Returns the actual instance of the $tooltip service. * TODO support multiple triggers */ this.$get = [ '$window', '$compile', '$timeout', '$document', '$uibPosition', '$interpolate', function ( $window, $compile, $timeout, $document, $uibPosition, $interpolate ) { return function $tooltipEx ( type, prefix, defaultTriggerShow ) { var options = angular.extend( {}, defaultOptions, globalOptions ); function getTriggers ( trigger ) { var show = trigger || options.trigger || defaultTriggerShow; var hide = triggerMap[show] || show; return { show: show, hide: hide }; } var directiveName = snake_case( type ); var startSym = $interpolate.startSymbol(); var endSym = $interpolate.endSymbol(); var template = '<div '+ directiveName +'-popup '+ 'data="data"'+ 'title="'+startSym+'title'+endSym+'" '+ 'content="'+startSym+'content'+endSym+'" '+ 'placement="'+startSym+'placement'+endSym+'" '+ 'animation="animation" '+ 'is-open="isOpen"'+ '>'+ '</div>'; return { restrict: 'EA', compile: function (tElem, tAttrs) { var tooltipLinker = $compile( template ); return function link ( scope, element, attrs ) { var tooltip; var tooltipLinkedScope; var transitionTimeout; var popupTimeout; var appendToBody = angular.isDefined( options.appendToBody ) ? options.appendToBody : true; var triggers = getTriggers( undefined ); var hasEnableExp = angular.isDefined(attrs[prefix+'Enable']); var ttScope = scope.$new(); var tooltip_click_alive = false; var positionTooltip = function () { var ttPosition = $uibPosition.positionElements(element, tooltip, ttScope.placement, appendToBody); ttPosition.top = Math.max(0,ttPosition.top); ttPosition.left = Math.max(0,ttPosition.left); ttPosition.top += 'px'; ttPosition.left += 'px'; // Now set the calculated positioning. tooltip.css( ttPosition ); }; // By default, the tooltip is not open. // TODO add ability to start tooltip opened ttScope.isOpen = false; function toggleTooltipBind () { if ( ! ttScope.isOpen ) { showTooltipBind(); } else { hideTooltipBind(); } } // Show the tooltip with delay if specified, otherwise show it immediately function showTooltipBind(event) { // if(!tooltip) // event.stopPropagation(); if(hasEnableExp && !scope.$eval(attrs[prefix+'Enable'])) { return; } prepareTooltip(); if ( ttScope.popupDelay ) { // Do nothing if the tooltip was already scheduled to pop-up. // This happens if show is triggered multiple times before any hide is triggered. if (!popupTimeout) { popupTimeout = $timeout( show, ttScope.popupDelay, false ); popupTimeout.then(function(reposition){reposition();}); } } else { show()(); } } function hideTooltipBind () { scope.$apply(function () { hide(); }); } function document_hideTooltipBind (event) { var target = event.target; if(element.is(target)) { return; } else if(tooltip) { if(tooltip.find(event.target).length == 0) scope.$apply(function () { hide(); }); } } // Show the tooltip popup element. function show() { popupTimeout = null; // If there is a pending remove transition, we must cancel it, lest the // tooltip be mysteriously removed. if ( transitionTimeout ) { $timeout.cancel( transitionTimeout ); transitionTimeout = null; } // Don't show empty tooltips. if ( ! ttScope.content ) { return angular.noop; } $document.unbind('click', document_hideTooltipBind); createTooltip(); // Set the initial positioning. tooltip.css({ top: 0, left: 0, display: 'block' }); // Now we add it to the DOM because need some info about it. But it's not // visible yet anyway. if ( appendToBody ) { $document.find( 'body' ).append( tooltip ); } else { element.after( tooltip ); } if(tooltip_click_alive) { $document.bind('click', document_hideTooltipBind); } positionTooltip(); // And show the tooltip. ttScope.isOpen = true; ttScope.$digest(); // digest required as $apply is not called // Return positioning function as promise callback for correct // positioning after draw. return positionTooltip; } // Hide the tooltip popup element. function hide() { // First things first: we don't show it anymore. ttScope.isOpen = false; //if tooltip is going to be shown after delay, we must cancel this $timeout.cancel( popupTimeout ); popupTimeout = null; // And now we remove it from the DOM. However, if we have animation, we // need to wait for it to expire beforehand. // FIXME: this is a placeholder for a port of the transitions library. if ( ttScope.animation ) { if (!transitionTimeout) { transitionTimeout = $timeout(removeTooltip, 500); } } else { removeTooltip(); } } function createTooltip() { // There can only be one tooltip element per directive shown at once. if (tooltip) { removeTooltip(); } tooltipLinkedScope = ttScope.$new(); tooltip = tooltipLinker(tooltipLinkedScope, angular.noop); } function removeTooltip() { transitionTimeout = null; if (tooltip) { tooltip.remove(); tooltip = null; } if (tooltipLinkedScope) { tooltipLinkedScope.$destroy(); tooltipLinkedScope = null; } } function prepareTooltip() { prepPlacement(); prepPopupDelay(); } /** * Observe the relevant attributes. */ attrs.$observe( type, function ( val ) { ttScope.content = val; if (!val && ttScope.isOpen ) { hide(); } }); attrs.$observe( prefix+'Title', function ( val ) { ttScope.title = val; }); function prepPlacement() { var val = attrs[ prefix + 'Placement' ]; ttScope.placement = angular.isDefined( val ) ? val : options.placement; } function prepPopupDelay() { var val = attrs[ prefix + 'PopupDelay' ]; var delay = parseInt( val, 10 ); ttScope.popupDelay = ! isNaN(delay) ? delay : options.popupDelay; } var unregisterTriggers = function () { element.unbind(triggers.show, showTooltipBind); element.unbind(triggers.hide, hideTooltipBind); $document.unbind('click',document_hideTooltipBind); }; function prepTriggers() { var val = attrs[ prefix + 'Trigger' ]; unregisterTriggers(); triggers = getTriggers( val ); if ( triggers.show === triggers.hide ) { element.bind( triggers.show, toggleTooltipBind ); } else if(triggers.hide=='click.Tooltip') { element.bind( triggers.hide, toggleTooltipBind ); tooltip_click_alive = true; } else { element.bind( triggers.show, showTooltipBind ); element.bind( triggers.hide, hideTooltipBind ); } } prepTriggers(); var animation = scope.$eval(attrs[prefix + 'Animation']); ttScope.animation = angular.isDefined(animation) ? !!animation : options.animation; var appendToBodyVal = scope.$eval(attrs[prefix + 'AppendToBody']); appendToBody = angular.isDefined(appendToBodyVal) ? appendToBodyVal : appendToBody; // if a tooltip is attached to <body> we need to remove it on // location change as its parent scope will probably not be destroyed // by the change. if ( appendToBody ) { scope.$on('$locationChangeSuccess', function closeTooltipOnLocationChangeSuccess () { if ( ttScope.isOpen ) { hide(); } }); } // Make sure tooltip is destroyed and removed. scope.$on('$destroy', function onDestroyTooltip() { $timeout.cancel( transitionTimeout ); $timeout.cancel( popupTimeout ); unregisterTriggers(); removeTooltip(); ttScope = null; }); }; } }; }; }]; }) .directive('uiFormPopOverBindHtmlUnsafe', function () { return function (scope, element, attr) { element.addClass('ng-binding').data('$binding', attr.uiFormPopOverBindHtmlUnsafe); scope.$watch(attr.uiFormPopOverBindHtmlUnsafe, function uiFormPopOverBindHtmlUnsafeWatchAction(value) { element.html(value || ''); }); }; }) .directive('uiFormPopOverPopup', function ($compile) { return { link: function(scope,element,attrs) { scope.compiled_content = $compile(scope.content)(scope); }, restrict: 'EA', replace: true, scope: { data:'=',content: '@',title: '@', placement: '@', animation: '&', isOpen: '&' }, template: "<div class=\"popover {{placement}}\" ng-class=\"{ in: isOpen(), fade: animation() }\">\n" + " <div class=\"arrow\"></div>\n" + " <div class=\"popover-inner\">\n" + " <h3 class=\"popover-title\" ng-bind=\"title\" ng-show=\"title\"></h3>\n" + " <div class=\"popover-content\" ui-form-pop-over-bind-html-unsafe=\"compiled_content\"></div>\n" + " </div>\n" + "</div>\n" , }; }) .directive('uiFormPopOver', ['$uibPosition','$tooltipEx','$compile',function ($uibPosition,$tooltipEx,$compile) { return $tooltipEx( 'uiFormPopOver', 'popover', 'click' ); }]) .directive('uiCssPaddingEdit', function ($compile) { return { link: function(scope,element,attrs,ngModel) { var border_style_options = '<option value="solid">solid</option>'+ '<option value="dashed">dashed</option>' + '<option value="dotted">dotted</option>' + '<option value="double">double</option>'+ '<option value="groove">groove</option>'+ '<option value="hidden">hidden</option>'+ '<option value="inset">inset</option>'+ '<option value="outset">outset</option>'+ '<option value="ridge">ridge</option>'+ '<option value="none">none</option>'; var unit_options = '<option value="px">px</option>'+ '<option value="em">em</option>' + '<option value="%">%</option>'; scope.$parent.$watch(attrs.ngModel,function(newValue){ // Watch given path for changes scope.data = newValue; }); scope.margin = 1; if(attrs.noMargin != undefined) scope.margin = 0; scope.padding = 1; if(attrs.noPadding != undefined) scope.padding = 0; scope.border = 1; if(attrs.noBorder != undefined) scope.border = 0; scope.styles = {}; scope.changeStyle = function(type, value) { scope.styles[type] = value; StyleSheet.global._setCSS(scope.selector,type,value); } scope.changeNumberStyle = function(type, value) { scope.changeStyle(type,value.value + value.unit); } var sides = ['top','right','bottom','left']; scope.changeMargin = function(type, value,side,all) { if(all) { var svalue = scope.data[type][side]; for(var i = 0;i < sides.length;i++) { scope.data[type][sides[i]].value=svalue.value; scope.data[type][sides[i]].unit=svalue.unit; } scope.changeStyle(type,svalue.value + svalue.unit); } else scope.changeStyle(type,value.top.value + value.top.unit + ' '+ value.right.value + value.right.unit + ' ' + value.bottom.value + value.bottom.unit + ' ' +value.left.value + value.left.unit + ' '); } scope.changeBorder = function(type,value,border_all) { if(border_all) { var svalue = scope.data.border[type]; for(var i = 0;i < sides.length;i++) { scope.data.border[sides[i]].value=svalue.value; scope.data.border[sides[i]].unit=svalue.unit; scope.data.border[sides[i]].style=svalue.style; scope.data.border[sides[i]].color=svalue.color; } scope.changeStyle('border',svalue.value + svalue.unit + ' '+svalue.style + ' ' +svalue.color); } else scope.changeStyle('border-' +type,value[type].value + value[type].unit + ' '+ value[type].style + ' ' + (angular.isDefined(value[type].color) ? value[type].color : '##0') ); } scope.marginPopover = function(m,p) { return '</div><div class="col-md-12"><label><input type="checkbox" ng-model="data.'+m+'_all" ng-change=\"$parent.changeMargin(\''+m + '\',data.'+m +',\'' +p+ '\',data.'+m+'_all)\"/>Apppy to all</label></div>' + '<input ng-change=\"$parent.changeMargin(\'' +m + '\',data.' + m + ',\'' +p+ '\',data.'+m+'_all)" type=\"number\" ng-model="data.' + m + '.' + p + '.value"/><select ng-model="data.' + m+'.'+p + '.unit" ng-change=\"$parent.changeMargin(\'' + m + '\',data.' + m + ',\'' +p+ '\',data.'+m+'_all)">' + unit_options + '<select>'; } scope.borderPopover = function(p) { return '</div><div class="col-md-12"><label><input type="checkbox" ng-model="data.border_all" ng-change=\"$parent.changeBorder(\''+p + '\',data.border,data.border_all)\"/>Apppy to all</label></div>' + '<div class="col-md-6"><input class="form-control" ng-change=\"$parent.changeBorder(\''+p + '\',data.border,data.border_all)" type=\"number\" ng-model="data.border.' + p + '.value"/></div><div class="col-md-6"><select class="form-control" ng-model="border.'+p + '.unit" ng-change=\"$parent.changeBorder(\''+ p + '\',data.border,data.border_all)\">' + unit_options +'</select></div><div class="col-md-6">' + '<select ng-model="data.border.'+ p + '.style" ng-change=\"$parent.changeBorder(\''+p + '\',data.border,data.border_all)\">' +border_style_options +'</select></div>'+ '<div class="col-md-6"><div colorpalettepicker ng-model="data.border.'+p + '.color" ng-change=\"$parent.changeBorder(\''+p + '\',data.border,data.border_all)\"></div>' ; } }, require: '?ngModel', restrict: 'EA', replace: true, scope: { data:'=ngModel',selector:'=' }, templateUrl: getRelativeUrl() + "api?action=getHtml&name=content/design/csseditor/table_layout" } }); angular.module('pagemanager.link',['pagemanager.ajax']) .service('linkUtil', ['$cacheFactory',function($cacheFactory) { this.createUrl = function(a) { var params = ''; if(a.parameters) { for(var j = 0;j < a.parameters.length;j++) { params += '&' + encodeURIComponent(a.parameters[j].name) + '=' + encodeURIComponent(a.parameters[j].value); } if(params.length > 0) params = params.substring(1); } var address = (a.link); var lnk = ''; if(address != false) { lnk = 'index.php/' + encodeURIComponent(address); if(params.length > 0) lnk += '&' + params; } return lnk; }; this._getPageAddress = function() { }; this.getPageAddress = function(page_id, page_list) { if(typeof page_list == 'undefined') { data = {}; var cache = $cacheFactory.get('List'); if(!cache) cache = $cacheFactory('List'); var string = $.toJSON(data) if(cache.get(page+ '_' + string) != undefined) { page_list = ( cache.get(name+ '_' + string) ); } } if(typeof page_list != 'undefined') { for(var i in page_list) { if(!page_list.hasOwnProperty(i)) continue; if(page_list[i]['id'] == page_id) { return page_list[i]['name']; } if(typeof page_list[i].items != 'undefined') { var tst = this.getPageAddress(page_id, page_list[i].items); if(tst != false) return tst; } } } return false; }; this.decode = function(href) { var p = href.split('?'); if(p.length == 1) { p = p[0]; p = p.split('.'); p = $.trim(p[0]); return {page: p}; } var page = p[0]; page = page.split('.'); page = $.trim(page[0]); var parameters = p[1]; parameters = parameters.split('&'); var pr = []; //var c = this.check_special_pages(page); for(var i = 0;i < parameters.length;i++) { var t = parameters[i].split('='); var name = $.trim(t[0]); var value = $.trim(t[1]); if(name == 'file_name' && page == 'index') { page = value; continue; } if(name == 'name' && page == 'module') { page = value; continue; } pr.push( {name : decodeURIComponent(name), value : decodeURIComponent(value) } ); } return {page:page, parameters:pr}; }; }]); function isEmpty(obj) { for(var prop in obj) { if(obj.hasOwnProperty(prop)) return false; } return true; } function getMinValue(arr) { if(arr.length > 0) { var m = arr[0]; for(var i = 1; i < arr.length; i++) { if( m < arr[i] ) m = arr[i]; } return m; } return 0; } Number.prototype.format = function(n, x, s, c) { var re = '\\d(?=(\\d{' + (x || 3) + '})+' + (n > 0 ? '\\D' : '$') + ')', num = this.toFixed(Math.max(0, ~~n)); return (c ? num.replace('.', c) : num).replace(new RegExp(re, 'g'), '$&' + (s || ',')); }; String.prototype.format = function (args) { var str = this; return str.replace(String.prototype.format.regex, function(item) { var intVal = parseInt(item.substring(1, item.length - 1)); var replace; if (intVal >= 0) { replace = args[intVal]; } else if (intVal === -1) { replace = "{"; } else if (intVal === -2) { replace = "}"; } else { replace = ""; } return replace; }); }; function object_toArray(object) { var result = []; for(var i in object) { if(!object.hasOwnProperty(i)) continue; result.push(object[i]); } return result; } String.prototype.format.regex = new RegExp("{-?[0-9]+}", "g");
[+]
..
[-] pagemanager.js
[edit]
[-] customize.js
[edit]
[+]
viewer
[-] ecommerce.js
[edit]
[-] pagemanager.iframe.js
[edit]
[+]
popup
[-] pagemanager.modules.js
[edit]
[+]
customize
[+]
blog
[-] settings.js
[edit]
[+]
modules
[-] content.js
[edit]
[-] blog.js
[edit]
[-] base.js
[edit]
[+]
settings
[+]
ecommerce