/* webfan (C) Till Wehowski, Webfan.de - All rights reserved. */
function browserOnLoad(frame){
frame.addEventListener('beforeunload', function(){
frdl.UI.progress().start();
});
frame.addEventListener('load', function(){
webfan.$Async(function(){
frdl.UI.progress().complete();
},100);
});
frdl.ready(function(){
$(frdl.$q('input[frdl-id="'+frame.getAttribute('frdl-id')+'"]', false)).hide();
$(frdl.$q('input[frdl-id="'+frame.getAttribute('frdl-id')+'"]', false)).fadeIn('fast');
try{
frdl.$q('input[frdl-id="'+frame.getAttribute('frdl-id')+'"]', false).setAttribute('placeholder', frame.contentWindow.location.href || frame.src);
}catch(err){
frdl.$q('input[frdl-id="'+frame.getAttribute('frdl-id')+'"]', false).setAttribute('placeholder', frame.src);
}
});
}
function openWidget(url){
frdl.ready(function(){
if('undefined'===typeof frdl.UI || 'function' !== typeof frdl.UI.progress){
return webfan.$Async(function(){
openWidget(url);
},1000);
}
$('div[data-webkit-mod="PANEL.WIDGET"]')
.attr('data-flow-tab-state-component-url', url)
;
$('div[data-webkit-mod="PANEL.WIDGET"]').fadeIn('slow');
/* if(null === frdl.$q('webfan[name="'+url+'"]', false)){ */
frdl.UI.progress().start();
$('div[data-webkit-mod="PANEL.WIDGET"]')
.html('<webfan name="'+url+'" type="widget"></webfan>')
;
$(document).trigger('readystatechange');
webfan.$Async(function(){
$(document).trigger('readystatechange');
webfan.$Async(function(){
frdl.ready(function(){
frdl.UI.progress().complete();
webfan.$Async(function(){
frdl.ready(frdl.UI.progress().complete);
},2000);
});
},2000);
},1000);
/*} */
});
}
function eraseWidgets(){
frdl.each(frdl.$q('li[data-flow-tab-state="component"]'), function(i, el){
if('component' !== el.getAttribute('data-flow-tab-state'))return true;
var id = el.getAttribute('frdl-id');
window.Tabs().removeTab(id);
$('div[data-webkit-mod="PANEL.WIDGET"]')
.children()
.hide()
.remove()
;
});
}
function _decodeUrl(newUrl){
newUrl=urldecode(newUrl);
newUrl=str_replace('~2F~2F', '//', newUrl);
newUrl=str_replace('~2F', '/', newUrl);
return newUrl;
}
(function(){
'use strict';
function GUI(gui){
gui.ready = new frdl.EventEmitter;
gui.onReady = gui.ready.required([
'theme loaded',
'module $frdl.wd().Menu loaded',
'module $frdl.wd loaded',
'module $5:http://'+frdl.route('HOST_CDN_PUBLIC_FRDL')+'/cdn/frdl/flow/components/webfan/workspace/js/desktop.js loaded',
'module $5:http://'+frdl.route('HOST_CDN_PUBLIC_FRDL')+'/cdn/frdl/flow/components/webfan/workspace/js/webfan.gui.MenuCtrl.js loaded',
'tabs loaded'
], function (dataArray) {
console.log('gui.onReady event');
frdl.ready(function() {
webfan.$Async(function(){
require('webfan/my-webfan-menu', function(MenuDummyNoExports){
frdl.ready(frdl.UI.progress().complete);
});
},3500);
webfan.$Async(function(){
if(window.location.hash.substr(0,'#/com.webfan.my/browse/'.length)==='#/com.webfan.my/browse/'){
webfan.$Async(function(){
var newUrl = window.location.hash.substr('#/com.webfan.my/browse/'.length, window.location.hash.length);
newUrl=_decodeUrl(newUrl);
window.Tabs().addTab(new frdl.Url(newUrl).getHost(), newUrl, null, 'browser', true, {name:'browser', params:{url:newUrl}}, true);
},500);
}
},1);
webfan.$Async(function(){
$('*[flow-mod="img.loading"]').fadeOut('slow');
$('*[flow-mod="img.loading"]').remove();
frdl.ready(function(){
$("html, body").animate({ scrollTop: 0 }, "slow");
if(true===frdl.UI.isMobileTheme){
$('*[frdl-webkit-id="side-menu-left"] > *[flow-toggler]').trigger('click');
}
webfan.$Async(function(){
// frdl.wd(false).hide();
$('.browser-wrap-all').fadeIn('slow');
frdl.ready(frdl.UI.progress().complete);
},100);
});
},1);
gui.isReady = true;
});
}, frdl);
gui.ready.once('theme loaded', function(){
frdl.UI.progress().start();
frdl.wd(false).hide();
frdl.wd(false).hide();
});
require.state.on('resolved', function(){
gui.ready.emit('module $'+arguments[0].identifier+' loaded', arguments[0]);
});
var _configfile ='config.dat';
gui.configfile = function(file){
if(file){
_configfile = ('string' === typeof file && '.' !== file.substr(0,1)) ? file
: (('function'===typeof file) ? file() : process.cwd(file))
}else{
return _configfile;
}
};
gui.getGUIManifest = function(){
return window.webfanWebkitSettings().manifest;
};
return gui;
}
var gui = (true === navigator['-webkit-webfan'])
? GUI(navigator.webfan.GUI() )
: require('webfan/navigator/shim-nw-gui');
gui = GUI(gui);
window.gui = gui;
var fs = require('fs');
window.__Helper_profileHtml64 = frdl.base64_encode('<div data-frdl-component="http://example.com/webfan/webkit-profile"></div>');
window.openComponent = function(title, url, cssClass){
frdl.UI.progress().start();
eraseWidgets();
webfan.$Async(function(){
eraseWidgets();
webfan.$Async(function(){
window.Tabs().addTab(title, '/com.webfan.my/component', '', 'html', true,
{name:'component', params:{url:url}, options : {reload:true}},
true, true, cssClass, true);
/* frdl.UI.progress().stop(true); */
},1000);
},250);
};
window.browserOnLoad=browserOnLoad;
window.openDesktopWidgetApp = function(component){
var mid = 'widget-'+Sha1.hash(component)+'-'+component.length;
var iconID = 'icon_module_' + mid;
location.hash='#';location.hash='#/app=&click=' + iconID;
};
frdl.ready(function(){
var bootDelay = 100;
var serviceInjectorUrl = '5:http://app.frdl.webfan.de/auth/-webkit-webfan/app-check';
var PATHPFX = '/com.webfan.my/';
var ROOTDEFAULT = webfan['$root-app']();
frdl.a
.module('webfan.webkit',[ 'webfan.gui'])
.config([ '$sceProvider','$stateProvider', '$urlRouterProvider', '$locationProvider', '$ocLazyLoadProvider',
function( $sceProvider, $stateProvider, $urlRouterProvider, $locationProvider, $ocLazyLoadProvider) {
$ocLazyLoadProvider.config({
debug : true,
events: true
});
$locationProvider.html5Mode(false);
/*
if(true===frdl.UI.isMobileTheme){
$locationProvider.html5Mode({
enabled: false,
requireBase: true
});
$locationProvider.hashPrefix('#');
$.mobile.pushStateEnabled = false;
}else{
$locationProvider.html5Mode(false);
}
*/
$sceProvider.enabled(false);
$stateProvider
/*
.state( {
name : 'root',
url: "^/",
abstract:true,
resolve :{
loadSDK: ['$ocLazyLoad', '$injector', function($ocLazyLoad, $injector) {
return $ocLazyLoad.load(['webfan.gui.sdk'],
{
serie: false,
cache: true,
rerun: false,
reconfig: false
}
).then(function() {
console.log('dependency injection webfan.gui.sdk');
});
}],
testInit : function(){
return function(){
return true;
};
}
routerPrepared: ['$rootScope', function($rootScope) {
$rootScope.$on('$routeChangeStart', function(event){
event.preventDefault();
});
return true;
}],
// fs : FS
}
})
*/
.state( {
name : 'browser',
url: PATHPFX+'browse/:url',
params: { cmd: { dynamic: true } },
views: {
"internalView": {
controller:function($scope, $stateParams, $state){
/* console.dir($stateParams); */
}
}/*,
"viewTestB": { templateUrl: AppData.__DIR__+'templates/home.html' }*/
},
resolve :{
}
})
.state( {
name : 'start',
url: PATHPFX+'start/:section',
params: { cmd: { dynamic: true } },
views: {
"startView": { templateUrl: './templates/start.html' ,
controller:function($scope, $stateParams, $state){
$scope.lang = {
Welcome : __('Welcome', [''])
};
}
}
},
resolve :{
}
})
.state( {
name : 'component',
url: PATHPFX+'component/:url',
params: { cmd: { dynamic: true },
config: { dynamic: true }
},
views: {
"widgetView": {
/* templateUrl: './templates/widget.html' , */
controller:function($scope, $stateParams, $state){
$scope.params = $stateParams;
var u = new frdl.Url( _decodeUrl($scope.params.url) );
var url = _decodeUrl($scope.params.url);
if('http'===u.getScheme() || 'https'===u.getScheme()){
frdl.alert.confirm('Do you trust and want top open: ' +url+'?', function (e) {
if (e) {
openWidget(url);
} else {
frdl.alert.log('Canceled');
}
});
}else{
openWidget(url);
}
$('div[data-webkit-mod="PANEL.WIDGET"]').fadeIn('slow');
$('div[data-webkit-mod="PANEL.WIDGET"]').css('width', 'auto');
$('div[data-webkit-mod="PANEL.WIDGET"]').css('min-width', '320px');
}
}
},
resolve :{
}
})
.state( {
name : 'settings',
url: PATHPFX+'settings/:section',
params: { cmd: { dynamic: true },
config: { dynamic: true }
},
views: {
"internalView": { templateUrl: './templates/settings.html' ,
controller:function($sce, $scope, $stateParams, $state){
$scope.userAgent = navigator.userAgent;
if(true===navigator.onLine){
frdl.$q('button[flow-mod="BTN:Clear Local Storage Data"]', false).removeAttribute('disabled');
frdl.$q('button[flow-mod="BTN:Clear JS Direct Cache"]', false).removeAttribute('disabled');
if(true === navigator['-webkit-webfan']){
frdl.$q('button[flow-mod="BTN:Clear App Cache"]', false).removeAttribute('disabled');
}
}
frdl.ready(function(){
webfan.$Async(function(){
$scope.selectDebugModeHTML = $sce.trustAsHtml('<select onchange="frdl.debug.mode(parseInt(this.options[this.selectedIndex].value));frdl.$DB.save(\'settings/debugmode\', frdl.debug.mode().toString());"><option value="'+frdl.debug.mode()+'" selected>Debugmode: '+frdl.debug.mode()+'</option><option value="0">Debugmode: 0</option><option value="1">Debugmode: 1</option><option value="2">Debugmode: 2</option></select>');
$scope.$digest();
},1000);
});
}
}/*,
"viewTestB": { templateUrl: AppData.__DIR__+'templates/home.html' }*/
},
resolve :{
// fs : FS
}
})
.state({
name : 'install',
url: webfan['$browser-scheme']() +'install/:version',
params: { config: { dynamic: true } },
views :{ "installView" :{
templateUrl: "./templates/install.app",
controller:function($scope, $stateParams, $state){
/*
frdl.ready(function(){
webfan.$Async(function(){
var vocabulary = require('5:http://cdn.frdl.webfan.de/cdn/application/webfan/locale/module/install.helper.js', function(mod){
frdl.lang(vocabulary);
});
},1);
});
*/
}
}/*,
"installSubView" : {
templateUrl: "./templates/register.html"
}*/
}
})
;
}])
.controller('settingsCtrl', ['$sce', '$scope' , '$http' , '$stateParams', '$state', '$rootScope', function($sce, $scope, $http, $stateParams, $state, $stateProvider, $rootScope){
var applyManifest = function(){
frdl.$q('title', false).innerHTML = window.webfanWebkitSettings().manifest.name;
if('undefined' !== typeof window.webfanWebkitSettings().manifest.icons){
frdl.each(window.webfanWebkitSettings().manifest.icons, function(i, icon){
if('16x16' === icon.sizes){
var el = frdl.$q('link[rel*="icon"], link[type="image\/x-icon"]', false);
el.setAttribute('href', icon.src);
el.setAttribute('sizes', icon.sizes);
}
});
}
};
$scope.localizeAsync = function(){
/*
frdl.ready(function(){
webfan.$Async(function(){
var vocabulary = require('5:http://cdn.frdl.webfan.de/cdn/application/webfan/locale/module/start.helper.js', function(mod){
frdl.lang(vocabulary);
webfan.$Async(function(){
frdl.translate();
},600);
});
},500);
});
*/
};
// $scope.ApplicationState = new frdl.EventEmitter();
var BootConfigLoadEvent = new frdl.EventEmitter();
var __l = false;
BootConfigLoadEvent.once('bootconfig', function(){
function emitThemes(){
webfan.$Async(function(){
frdl.ready(function(){
gui.ready.emit('theme loaded', $scope);
});
},1);
}
__l = true;
applyManifest();
var c = arguments[0].config, fs = require('fs');
webfan.$Async(function(){
var _sql = "SELECT * FROM webkit.widgets WHERE enabled=true AND default=true";
var promise = frdl.sql.query(_sql, function(err, resultset) {
if (err) {
console.error(err);
} else {
if(0<frdl.debug.mode()) console.log('sql--sql :');
if(0<frdl.debug.mode())console.log('' + _sql);
if(0<frdl.debug.mode()) console.log('\nsql--data:');
if(0<frdl.debug.mode()) console.dir(resultset);
}
});
promise.then( function(result) {
if(0<frdl.debug.mode())console.log('promise--sql :');
if(0<frdl.debug.mode())console.log('' + _sql);
if(0<frdl.debug.mode())console.log('\npromise--data:');
if(0<frdl.debug.mode())console.dir(result);
var row, i;
if(1>result.data.length){
result.data = [
['component', 'frdl-component', true, false, true, 'widget://example.com/webfan/webkit', 'div[data-webkit-mod="components"]'],
['theme', 'frdl-component', true, false, true, 'widget://example.com/themes/default', 'div[data-webkit-mod="themes"]']
// ,['component', 'frdl-component', true, false, true, 'widget://example.com/frdl/webfan', '*[data-webkit-mod="page.top"]']
];
frdl.alert.error('Error loading -webkit widgets!');
}
while((row = frdl.sql.fetch_object(result)) && false !== row){
$(row.destination).append('<div data-'+row.type+'="'+row.url+'"></div>');
}
$(document).trigger('readystatechange');
webfan.$Async(function(){
$(document).trigger('readystatechange');
webfan.$Async(function(){
webfan.$Async(function(){
webfan.$Async(function(){
frdl.ready(emitThemes);
$(document).trigger('readystatechange');
},1);
},10);
},10);
},10);
}, function(errResult){
console.error(errResult);
} );
var _sql = "SELECT * FROM webkit.tabs_active";
var promise2 = frdl.sql.query(_sql, function(err, resultset) {
if (err) {
console.error(err);
} else {
if(0<frdl.debug.mode()) console.log('sql--sql :');
if(0<frdl.debug.mode())console.log('' + _sql);
if(0<frdl.debug.mode()) console.log('\nsql--data:');
if(0<frdl.debug.mode()) console.dir(resultset);
}
});
promise2.then( function(result) {
if(0<frdl.debug.mode())console.log('promise--sql :');
if(0<frdl.debug.mode())console.log('' + _sql);
if(0<frdl.debug.mode())console.log('\npromise--data:');
if(0<frdl.debug.mode())console.dir(result);
var row;
while((row = frdl.sql.fetch_object(result)) && false !== row){
if(PATHPFX+'start' === frdl.base64_decode(row.url))return ;
if(PATHPFX+'data' === frdl.base64_decode(row.url))return ;
if(webfan['$browser-scheme']() + 'install' === frdl.base64_decode(row.url))return ;
if('/apc/' === frdl.base64_decode(row.url))return ;
window.Tabs().addTab(frdl.base64_decode(row.title), frdl.base64_decode(row.url), frdl.base64_decode(row.html), row.type, row.cancable, row.state, false, false, row.cssClass, true);
}
console.dir(result);
}, function(errResult){
console.error(errResult);
} );
webfan.$Async(function(){
if('undefined'=== typeof window.Tabs().getTab(PATHPFX+'start')){
window.Tabs().addTab('Start', PATHPFX+'start', '', 'html', false, {name:'start', params:{}}, false, false, 'icon-attach-home');
}
webfan.$Async(function(){
webfan.$Async(function(){
window.Tabs().addTab('Data', PATHPFX+'data', '<div data-frdl-component="widget://example.com/webfan/webfat"></div>', 'html', false, false, false, false, 'icon-attach-webfat');
webfan.$Async(function(){
window.Tabs().addTab('APC', '/apc/', '<div data-frdl-component="widget://example.com/frdl/webfan"></div>', 'html', false, false, false, false, 'icon-attach-apc');
window.Tabs().startTabs();
process.cwd(frdl.fs5.polyfill.getFiler().fs.root);
fs.readFile('1.3.6.1.4.1.37553.8.1.8.8.10.1.1/~tab.CACHE', function(err, data){
if(err){
return;
}
window.Tabs().currentTab=JSON.parse(data);
});
webfan.$Async(function(){
if(null===window.Tabs().currentTab){
window.Tabs().openTab(PATHPFX+'start');
}
},50);
frdl.ready(function(){
webfan.$Async(function(){
gui.ready.emit('tabs loaded', $scope);
},300);
});
},1);
},1);
},1);
},1);
},1);
});
$scope.userAgent = navigator.userAgent;
$scope.isWebKitStr = $sce.trustAsHtml((true ===navigator['-webkit-webfan'])
? '<span class="webfan-yellowgreen">YES</span>'
: '<span class="webfan-red">NO</span>');
$scope.ApplicationRoot = webfan['path.exec']();
$scope.WebAppRoot = webfan['app://']();
$scope.clearLocalStorageAll=function(){
frdl.alert.confirm('Are you sure you want to Clear All Local Storage Data?<p class="error">Attention! You may loose data!</p>', function (e) {
if (e) {
if(true===navigator.onLine)localStorage.clear();
} else {
}
});
};
$scope.clearRequireCache=function(){
frdl.alert.confirm('Are you sure you want to Clear JS Direct Cache?<p class="error">Attention! You may loose data!</p>', function (e) {
if (e) {
if(true===navigator.onLine)require.clear();
} else {
}
});
};
$scope.clearAppCache=function(){
frdl.alert.confirm('Are you sure you want to Clear App Cache?<p class="error">Attention! You may loose data!</p>', function (e) {
if (e) {
if(true===navigator.onLine){
gui.App.clearCache();
}
} else {
}
});
};
var b = function(){
if(false===__l){
BootConfigLoadEvent.emit('bootconfig', {
config : $scope.manifest,
time : new Date().getTime()
});
}
__l = true;
b = function(){};
};
$scope.loadConfig = function(){
if('Chrome' !== frdl.Device().browser){
try{
process.cwd(frdl.fs5.polyfill.getFiler().fs.root);
fs.readFile(gui.configfile(), function(err, data){
if(err){
b();
// console.warn(err);
return;
}
$scope.manifest=JSON.parse(data);
$scope.config=$scope.manifest;
b();
applyManifest();
});
}catch(err){
b();
// console.warn(err);
}
}else{
process.cwd(frdl.fs5.polyfill.getFiler().fs.root);
var c = fs.readFileSync(gui.configfile());
if(false !== c){
try{
$scope.manifest=JSON.parse(c);
$scope.config=$scope.manifest;
applyManifest();
}catch(err){
b();
console.warn('Cannot read config.dat!');
}
}
b();
}
/*
var c = fs.readFileSync(gui.configfile(), true);
c.then(function(data){
$scope.manifest=JSON.parse(data);
$scope.manifest = defaults($scope.manifest);
$scope.config=$scope.manifest;
b();
}, function(err){
if(0<frdl.debug.mode())console.warn(err);
b();
});
*/
};
$scope.checkStatus = function(){
if(true===$scope.manifest.installed)return;
/*
if(!!Proxy.isPolyfile){
var str = 'Proxy.isPolyfile => App:checkStatus skipped!';
if(!!console)console.warn(str);
frdl.alert.error('Cannot install App! (checkStatus)');
return;
}
*/
if(true===$scope.manifest.installed
|| 'function'!==typeof window.Tabs
|| 'undefined' === typeof window.Tabs().currentTab
|| location.hash === '#' + PATHPFX + 'start'
|| (!!$state.current && 'start'===$state.current.name)
|| ('function'===typeof window.Tabs &&
(
'undefined' === typeof window.Tabs().currentTab
|| null === window.Tabs().currentTab
|| 'undefined' === typeof window.Tabs().currentTab.url
|| window.Tabs().currentTab.url === './about.html'
)
)
|| 'undefined' === typeof $scope.manifestServer
)return webfan.$Async(function(){
$scope.checkStatus();
},15000);
webfan.$Async(function(){
if(false===$scope.manifest.installed /* && window.Tabs().currentTab.url !== webfan['$browser-scheme']() +'install'*/
&& 'install' !== $state.current.name
&& 'browser' !== $state.current.name
){
webfan.$Async(function(){
window.Tabs().addTab('Install Setup', webfan['$browser-scheme']() + 'install', '', 'html', true, {name:'install', params:{}}, true);
},100);
} else if($scope.manifestServer.version !== $scope.manifest.version &&
( null === window.Tabs().currentTab
|| (
window.Tabs().currentTab.url !== './templates/install.app'
&& window.Tabs().currentTab.url !== './node_modules/updater/updater.html'
)
)
){
if(true===$scope.manifest.autoupdate){
window.webfanWebkitSettings().runUpdate(false);
}else{
/* window.Tabs().addTab('Update', './node_modules/updater/updater.html', null, 'frame.trusted', true, undefined, true); webfan.$Async(function(){window.Tabs().openTab('./node_modules/updater/updater.html');},250); */
}
}
webfan.$Async(function(){
$scope.checkStatus();
},2500);
},500);
};
if('undefined'===typeof $scope.manifestServer)$scope.manifestServer=$scope.manifest;
if(true===navigator.onLine){
$http.get(((true === navigator['-webkit-webfan']) ? ROOTDEFAULT : '') + frdl.$q('link[type="application/manifest+json"]', false).getAttribute('href'))
.success(function(data, status, headers, config) {
$scope.manifestServer=data;
/* $scope.manifestServer.name += ' ('+$scope.manifestServer.id+')'; */
})
.error(function(data, status, headers, config) {
console.info('cannot get '+'Application '+' manifest!');
$scope.manifestServer={
name : '-ERROR-',
version : '0.0.0'
};
});
}else{
$scope.manifestServer=$scope.manifest;
}
$scope.saveManifest = function(){
process.cwd(frdl.DIRS.AppPath);
require('fs').writeFile(gui.configfile(), JSON.stringify($scope.manifest), function(err, data){
if(err){
console.error(err);
return;
}
}/* file, data[, options], callback */);
};
$scope.runUpdate = function(refresh, skipCheck){
function updateAppDataSync(updateDir, appDir){
if(null !== sessionStorage.getItem('-webkit-webfan/~update.last.running')
&& new Date().getTime() - (1 * 15000) < parseInt(sessionStorage.getItem('-webkit-webfan/~update.last.running'))
){
frdl.alert.log('Updated already, please wait a moment...');
return;
}
sessionStorage.setItem('-webkit-webfan/~update.last.running', new Date().getTime());
var JWT_1 = sessionStorage.getItem('1.3.6.1.4.1.37553.8.1.8.3.1/JWT/handshake');
if(null===JWT_1){
frdl.alert.error('Cannot get JWT for install!');
return;
}
console.log('Get upgrade script...');
frdl.UI.progress().start();
var o = {
updateDir : updateDir,
appDir : appDir,
argv : (!!frdl.nw) ? frdl.NativeApp.App.argv : ['update', '--flavour=webfapp'],
hash : frdl.Sha1.hash(
+ '0x00' + navigator.appVersion
+ '0x00' + navigator.userAgent
+ '0x00' + updateDir
+ '0x00' + appDir
+ '0x00' + JSON.stringify(('undefined'!==typeof nw) ? frdl.NativeApp.App.argv : ['update', '--flavour=webfapp'])
+ '/' + new Date().getFullYear()
+ '/' + new Date().getMonth()
+ '/' + new Date().getDay()
+ '43667'
)
};
o.importScript = webfan['$root-app']() + '/autoupdate.js?import=upgrade' + '&hash=' + o.hash;
o.cacheID = '5:' + o.importScript;
console.log('Update data and config ...');
try{
$.ajax( {
url: o.importScript,
crossDomain: true,
cache:false,
headers: {'X-Requested-With': 'XMLHttpRequest',
'X-Frdl-Nw': (!!frdl.nw) ? 'true' : 'false'
},
type: 'POST',
dataType: 'TEXT',
data: {
JWT_1 : JWT_1,
install_manifest : frdl.base64_encode(JSON.stringify(window.webfanWebkitSettings().manifest)),
test : 'test-update'
}
} )
.done(function(response) {
//alert(response);
frdl.UI.progress().start() ;
var module = new TModule(o.importScript);
module.descriptor = module.resolve(o.importScript);
module.parent = module || require('frdl');
module.sourceURL = o.importScript;
module.source = response;
try{
var update = eval(frdl.require.getCompiler('application/javascript')(module.source, module));
var r = (true === update(o) ) ? true : false;
window.Tabs().addTab('Settings', PATHPFX + 'settings', '', 'html', true, {name:'settings', params:{}}, true, true, 'icon-attach-schraube');
window.Tabs().removeTab('Install Setup');
// frdl.alert.success('Upgrade finished.');
}catch(err) {
console.error(err);
frdl.alert.error(err);
var r = false;
}
frdl.UI.progress().complete() ;
})
.fail(function(jqXHR, textStatus) {
frdl.alert.error('Error: ' + url + 'config.xml ' + jqXHR.status);
})
.always(function() {
frdl.UI.progress().complete() ;
frdl.UI.progress().complete() ;
});
}catch(err){
console.error(err);
}
}
/* if( true!==$scope.manifest.installed)return;*/
/*
if(!!$scope.lastupdatecheck && new Date().getTime() - 60 * 60 * 1000 < $scope.lastupdatecheck){
webfan.$Async(function(){
$scope.runUpdate(false);
},(2 * 60 * 60 * 1000));
return;
}
*/
$scope.lastupdatecheck = new Date().getTime();
if('undefined'===typeof refresh)refresh=false;
var url = webfan['$root-app']() + '/autoupdate.js'+((true===refresh)?('?refresh='+new Date().getTime()):'')/*+frdl.Device().OS*/;
if (true===$scope.manifest.autoupdate || true === refresh){
/*
frdl.getScript(url, function(){
webfan['$-webkit-webfan update']();
});
*/
if(true===navigator.onLine){
updateAppDataSync(frdl.DIRS.AppPath,frdl.DIRS.AppPath);
}else{
frdl.alert.error('Cannot run update because you are offline,<br />please open an internet connection and retry!');
}
}
webfan.$Async(function(){
$scope.runUpdate(false);
},(6 * 60 * 60 * 1000))
};
webfan.$Async(function(){
$scope.checkStatus();
},3000);
//localStorage.setItem('webapp://manifest', window.webfanWebkitSettings().manifest);
if('undefined' === typeof $scope.manifest){
$scope.manifest ={
name : '-UNINSTALLED-',
version : '0.0.0',
installed : false
};
// $scope.saveManifest();
}
window.webfanWebkitSettings = function(){
return $scope;
} ;
window.webfanWebkitSettings().loadConfig();
}])
/**
<div ng-controller="TabCtrl">
<p>
<ul class="tabset">
<li ng-repeat="tab in tabs"
class="tabsetTab"
frdl-id="{{tab.id}}"
>
<span ng-bind="tab.title" ng-click="onClickTab(tab)"></span>
<span ng-click="removeTab(tab)">X</span>
</li>
</ul>
</p>
<p style="height:100%;display:block;">
<div style="height:100%;">
<div ng-repeat="tab in tabs">
<div frdl-id="{{tab.id}}" style="display:none;height:100%;width:100%;" data-flow-mod="tab">
<div ng-bind-html="tab.html"></div>
</div>
</div>
</div>
</p>
</div>
*/
.controller('TabCtrl', function($scope, $sce, $state) {
$scope.tabs = [];
var w = window || window;
$scope.currentTab=null;
$scope.openTab = function (tab, reload) {
var Reload = reload;
if(!isNaN(tab)){
tab = $scope.tabs[tab];
}else if('string' ===typeof tab){
tab = $scope.getTab(tab);
if(null === tab || 'undefined' === typeof tab)return false;
}
$scope.currentTab = tab;
webfan.$Async(function(){
frdl.wd(false).hide();
},10);
/*
var isOpen = false;
if($('li[frdl-id="'+$scope.currentTab.id+'"]').hasClass('tabsetActive')){
isOpen = true;
}
*/
$('*[data-flow-mod="tab"]')
.hide()
.css('height', '0px')
.css('width', '0px')
;
/* $('*[ui-view]').hide(); */
try{
if('undefined'!==typeof tab.state /* && $state.current.name !== tab.state.name */){
$state.go(tab.state.name, tab.state.params, tab.state.options || {});
$('li[frdl-id="'+$scope.currentTab.id+'"]')
.addClass('tabsetActive')
;
if('component' === tab.state.name){
$('li[frdl-id="'+$scope.currentTab.id+'"]')
.attr('data-flow-tab-state', tab.state.name || '')
;
}
webfan.$Async(function(){
$('*[ui-view]').hide();
var v;
for(v in $state.current.views){
/* tab.html += $('*[ui-view="'+v+'"]').html(); */
$('*[ui-view="'+v+'"]')
.attr('frdl-webkit-src',$scope.currentTab.url )
.attr('frdl-id',$scope.currentTab.id )
.css('height', '100%')
.css('width', '100%')
.show();
}
$("html, body").animate({ scrollTop: 0 }, "slow");
},10);
}else if('undefined'===typeof tab.state){
$state.go('browser', {url:$scope.currentTab.url}, { reload: true });
}
}catch(err){
console.warn('NoStateWarning(ToDo):'+err);
}
webfan.$Async(function(){
$('div[frdl-id="'+$scope.currentTab.id+'"], *[frdl-webkit-src="'+$scope.currentTab.url+'"]')
.fadeIn('slow')
.css('height', '100%')
.css('width', '100%')
.css('display', 'block')
.css('top', '0px')
.css('bottom', '0px')
.css('margin', '0 auto')
.find((true===Reload) ? '*[data-frdl-mod-browser]' : '*[data-frdl-mod-browser]:not([src])')
.attr('src',$scope.currentTab.url )
;
$('li.tabsetActive')
.removeClass('tabsetActive')
;
$('li[frdl-id="'+$scope.currentTab.id+'"]')
.addClass('tabsetActive')
;
},30);
webfan.$Async(function(){
$(document).trigger('readystatechange');
frdl.UI.Compile(100);
},100);
// frdl.$q('div[flow-section-id="FileExplorer"]', false).style.display='none';
};
$scope.removeTab = function (tab, save) {
var _tab = frdl.clone(tab);
$scope.tabs.splice($scope.tabs.indexOf(tab), 1);
webfan.$Async(function(){
$('*[frdl-id="'+tab.id+'"]')
.hide()
.remove()
;
},100);
if(0===$scope.tabs.length){
$scope.addTab('about:blank', 'about:blank', null, 'browser');
}
$scope.openTab(0);
try{
if('undefined' === typeof save || true === save){
// frdl.sql.query('begin');
var sqlquery = "DELETE FROM webkit.tabs_active WHERE id='"+_tab.id+"' LIMIT 1"; //LIMIT 1
frdl.sql.query(sqlquery, function(err, result){
if(err){
console.error(err+ ' ' +sqlquery);
return;
}
console.dir(result);
frdl.sql.query('commit');
});
}
}catch(err){
console.warn(err);
}
};
$scope.isActiveTab = function(tab) {
return tab.id === $scope.currentTab.id;
};
$scope.getTab = function(str) {
var r = undefined;
frdl.each($scope.tabs, function(i, tab){
if(('undefined' !== typeof tab.id && str === tab.id)
|| ('undefined' !== typeof tab.url && str === tab.url)
|| ('undefined' !== typeof tab.title && str === tab.title)
){
r=tab;
return false;
}
});
return r;
};
/*
$scope.browserOnUnLoad=function(ev){
};
var browserOnUnLoad = $scope.browserOnUnLoad;
$scope.browserOnLoad=function(ev){
var el = ev.target;
el.onbeforeunload=browserOnUnLoad;
var tab = $scope.getTab(el.getAttribute('frdl-id')) ;
tab.title = ((el.contentWindow || el.contentDocument).document).title || tab.title;
};
*/
/**
todo https://github.com/nwjs/nw.js/wiki/Window#windowevalframe-script
Window.eval(frame, script)
**/
$scope.addTab = function(title, url, html, type, cancable, state, open, save, cssClass, reload){
var hint_cmd ='Enter something to the command line at the bottom'
hint_cmd += '\n-URL beginning with http:// https:// or filesystem:';
hint_cmd += '\n-webfan cli command starting with \'webfan\' (CLI syntax)';
hint_cmd += '\n-Execute javascript by starting the line with the token \'!\' (JS syntax)';
hint_cmd += '\n-search command starting the line with the token \'search\' or others (experimental)';
hint_cmd += '\n-ql command starting with \'ql\' (SQL syntax)';
var hint_cmd_alert = frdl.str_replace('\n', '<br />', hint_cmd);
var ExistingTab = $scope.getTab(url);
if('undefined'!==typeof ExistingTab){
if(true === open)return $scope.openTab(ExistingTab, reload);
return ExistingTab;
}
var h = '', HTML = '', ID = 'flow-tab-' + Guid.newGuid(), isBrowser = false;
if('undefined'===typeof cancable)cancable=true;
if(true !== navigator['-webkit-webfan'] && ('browser'===type || 'app'===type)){
type = 'frame';
}
if('browser'===type){
// h += '<webview resizable onload="browserOnLoad(this);" data-frdl-mod-browser="'+ID+'" src="'+url+'" frdl-id="'+ID+'" style="border:none; width:100%; height:100%; display:block;top:0;bottom:0;margin: 0 auto;"></webview>';
h += '<iframe resizable onload="browserOnLoad(this);" data-frdl-mod-browser="'+ID+'" src="'+url+'" frdl-id="'+ID+'" style="border:none; width:100%;height:100%; display:block;top:0;bottom:0;margin: 0 auto;" nwdisable nwfaketop></iframe>';
isBrowser=true;
}else if('frame'===type){
h += '<iframe resizable onload="browserOnLoad(this);" data-frdl-mod-browser="'+ID+'" src="'+url+'" frdl-id="'+ID+'" style="border:none; width:100%;height:100%; display:block;top:0;bottom:0;margin: 0 auto;" nwdisable nwfaketop></iframe>';
isBrowser=true;
}else if('frame.trusted'===type){
h += '<iframe resizable onload="browserOnLoad(this);" data-frdl-mod-browser="'+ID+'" src="'+url+'" frdl-id="'+ID+'" style="border:none; width:100%;height:100%; display:block;top:0;bottom:0;margin: 0 auto;" frdl-nwtrusted></iframe>';
isBrowser=true;
}else if('app'===type){
h += '<appview resizable onload="browserOnLoad(this);" data-frdl-mod-browser="'+ID+'" src="'+url+'" frdl-id="'+ID+'" style="border:none; width:100%;height:100%; display:block;top:0;bottom:0;margin: 0 auto;"></appview>';
isBrowser=true;
}
/* <p ng-bind="tab.url"></p>*/
if(true===isBrowser){
state = {name:'browser', params:{url:url}};
var bhtml = '<frdl data-browserset></frdl>';
bhtml+= '<p class="url-bar-outer-p" flow-to-front>';
bhtml+='<input type="text" flow-mod="command-line" title="'+hint_cmd+'" onkeydown="var ev=event || window.event;if(parseInt(ev.keyCode)!==13)return;browse_webkit(this, ev);" placeholder="'+url+'" frdl-id="'+ID+'" />';
bhtml+='<button class="icon-button-browse" onclick="var ev=event || window.event;browse_webkit(frdl.$q(\'input[frdl-id=\\\''+ID+'\\\']\', false), ev);" ></button>';
bhtml+='<button class="icon-button-browse-back" onclick="window.history.back();" ></button>';
bhtml+='<button class="icon-button-browse-forward" onclick="window.history.forward();" ></button>';
/*
bhtml+='<img onclick="browse(frdl.$q(\'input[frdl-id=\\\''+ID+'\\\']\', false));" src="icons/browse.gif" style="border:none;cursor:pointer;"/>';
bhtml+='<img onclick="window.history.back();" src="icons/browse_back.gif" style="border:none;cursor:pointer;"/>';
bhtml+='<img onclick="window.history.forward();" src="icons/browse_forward.gif" style="border:none;cursor:pointer;"/>';
*/
bhtml+='</p>';
}else{
var bhtml = '<frdl data-browserset></frdl>';
bhtml+= '<p class="url-bar-outer-p" flow-to-front><input flow-mod="command-line" title="'+hint_cmd+'" class="url-bar icon-attach-icon-link" type="text" onkeydown="var ev=event || window.event;if(parseInt(ev.keyCode)!==13)return;browse_webkit(this, ev);" placeholder="'+url+'" frdl-id="'+ID+'" /></p>';
}
if('string'===typeof html)HTML+=html;
if(false === frdl.strpos(html, '<frdl data-browserset></frdl>')){
HTML += h + bhtml;
}
$scope.$evalAsync(
function() {
$scope.tabs.push({
id : ID,
title : title,
url : url,
type : type,
html : $sce.trustAsHtml(HTML),
cancable : cancable ,
state : state || undefined,
cssClass : cssClass || undefined
});
var tab = $scope.getTab(ID);
tab.open = function(Reload){
$scope.openTab(tab, Reload);
$('li[frdl-id="'+tab.id+'"]').trigger('click');
frdl.ready(function(){
frdl.translate();
});
webfan.$Async(function(){
$("html, body").animate({ scrollTop: 0 }, "slow");
},1);
return tab;
};
if(open===true)tab.open(reload);
webfan.$Async(function(){
if('string' === typeof tab.cssClass){
$('li[frdl-id="'+tab.id+'"]')
.addClass(tab.cssClass)
.css('width', 'auto')
.css('min-width', '64px')
.css('max-width', '355px')
;
}
if('undefined'!==typeof state && 'component' === state.name){
$('li[frdl-id="'+tab.id+'"]')
.attr('data-flow-tab-state', state.name)
;
}
},500);
try{
if('undefined' === typeof save || true === save){
// frdl.sql.query('begin');
if(PATHPFX+'start' === frdl.base64_decode(url))return ;
if(PATHPFX+'data' === frdl.base64_decode(url))return ;
if(webfan['$browser-scheme']() + 'install' === frdl.base64_decode(url))return ;
if('/apc/' === frdl.base64_decode(url))return ;
var sqlquery = "INSERT INTO webkit.tabs_active SET id='"+ID+"', title='"+frdl.base64_encode(title)+"', url='"+frdl.base64_encode(url)+"', type='"+type+"', html='"+frdl.base64_encode(HTML)+"', cancable='"+cancable+"', cssClass='"+cssClass+"' ";
frdl.sql.query(sqlquery, function(err, result){
if(err){
console.error(err+ ' ' +sqlquery);
return;
}
frdl.sql.query('commit');
});
}
}catch(err){
console.warn(err);
}
});
};
/* end addTab */
/* init tabs */
webfan.$Async(function(){
$scope.$watchCollection('tabs',
function(newValue, oldValue) {
if(newValue.length !== oldValue.length) {
if('undefined'!==typeof frdl.wd().Menu && 'function'===typeof frdl.wd().Menu.getOpenTags){
frdl.wd().Menu.getOpenTags(true);
}
}
});
$scope.$watch('currentTab',
function(newValue, oldValue) {
if(newValue !== oldValue) {
var fs = require('fs');
frdl.fs5.polyfill.getFiler().cd(frdl.fs5.polyfill.getFiler().fs.root);
fs.writeFile('1.3.6.1.4.1.37553.8.1.8.8.10.1.1/~tab.CACHE', JSON.stringify(newValue), function(err, data){
if(err){
console.error(err);
return;
}
}, console.warn);
}
});
},1000);
$scope.startTabs = function(Reload){
$('*[data-flow-mod="tab"]')
.hide()
.css('height', '0px')
.css('width', '0px')
;
if(null === $scope.currentTab){
return;
}
$('*[ui-view]').hide();
var v;
for(v in $state.current.views){
$('*[ui-view="'+v+'"]')
.attr('frdl-webkit-src',$scope.currentTab.url )
.attr('frdl-id',$scope.currentTab.id )
.css('height', '100%')
.css('width', '100%')
.show();
}
$("html, body").animate({ scrollTop: 0 }, "slow");
$('div[frdl-id="'+$scope.currentTab.id+'"], *[frdl-webkit-src="'+$scope.currentTab.url+'"]')
.fadeIn('slow')
.css('height', '100%')
.css('width', '100%')
.css('display', 'block')
.css('top', '0px')
.css('bottom', '0px')
.css('margin', '0 auto')
.find((true===Reload) ? '*[data-frdl-mod-browser]' : '*[data-frdl-mod-browser]:not([src])')
.attr('src',$scope.currentTab.url )
;
$('li.tabsetActive')
.removeClass('tabsetActive')
;
$('li[frdl-id="'+$scope.currentTab.id+'"]')
.addClass('tabsetActive')
;
};
$scope.startTabs();
window.Tabs = function(){
return $scope;
};
})
.controller('browserCtrl', function($scope, $stateParams, $state){
window.addEventListener("beforeunload", function() {
frdl.sql.query('COMMIT');
}, true);
$scope.onMessage = function(message){
if('string'===typeof message) return frdl.alert.log('Message from service: '+message);
if('function'===typeof message )return message();
};
$scope.whenOnline=function(){
webfan.$Async(function(){
// if(true===navigator.doNotTrack && !navigator['-webkit-webfan']) return;
if(true===navigator.onLine){
//todo
}
},1);
window.addEventListener("offline", $scope.whenOffline, true);
};
$scope.whenOffline=function(){
if('undefined'!==typeof require.cache()['$'+serviceInjectorUrl] || 'undefined'!==typeof require.cache()[serviceInjectorUrl]){
try{
//todo
}catch(err){
console.warn(err);
}
}
window.addEventListener("online", $scope.whenOnline, true);
};
webfan.$Async(function(){
if(true===navigator.onLine){
$scope.whenOnline();
}else{
$scope.whenOffline();
}
},bootDelay);
$scope.$on('$stateChangeSuccess',
function(event, toState, toParams, fromState, fromParams){
console.log(toState.name);
var isNewParams=(toParams!==fromParams) ? true : false;
var isNewState=(toState.name!==fromState.name)?true:false;
var isChanged=(!!isNewParams || !!isNewState)?true:false;
if(!!isChanged){
//webfan.$Async(function(){
// window.webfanWebkitSettings().loadConfig();
//},1500);
//webfan.$Async(function(){
// window.webfanWebkitSettings().localizeAsync();
//},1500);
$("html, body").animate({ scrollTop: 0 }, "slow");
if('component' !== toState.name && 'component' === fromState.name ){
$('div[data-webkit-mod="PANEL.WIDGET"]').fadeOut('slow');
}
}
// if(!!isChanged)
var el = frdl.$q('frdl-section[frdl-webkit-id="side-menu-left"] > a[flow-toggler]', false);
if('start' === toState.name ){
if(el.parentNode.style.width==='160px'){
}else{
el.parentNode.style.width='160px';
$('ul[flow-section-id=\'sidebar\']').fadeIn('slow');
}
}else{
if(el.parentNode.style.width==='3px'){
}else{
el.parentNode.style.width='3px';
$('ul[flow-section-id=\'sidebar\']').fadeOut('slow');
}
}
frdl.ready(window.webfanWebkitSettings().checkStatus);
webfan.$Async(function(){
window.webfanWebkitSettings().localizeAsync();
},1500);
webfan.$Async(function(){
$("html, body").animate({ scrollTop: 0 }, "slow");
},500);
});
//$scope.$on('$stateChangeSuccess',
webfan.$Async(function(){
frdl.ready(window.webfanWebkitSettings().checkStatus);
},2000);
})
.controller('installCtrl', ['$scope', '$http', '$sce', function($scope, $http, $sce){
if(true===window.webfanWebkitSettings().manifest.installed){
window.Tabs().removeTab('./templates/install.app',false);
}
$scope.autoupdate=true;
// var msgpack =require("msgpack/lib/msgpack");
$scope.config = window.webfanWebkitSettings().manifestServer;
// $scope.config = window.webfanWebkitSettings().manifest;
// $scope.config = gui.getGUIManifest();
$scope.userAgent =navigator.userAgent;
$scope.isWebKitStr = (true ===navigator['-webkit-webfan'])
? 'YES'
: 'NO';
$scope.ApplicationRoot = frdl.DIRS.AppPath;
$scope.WebAppRoot = webfan['app://']();
$scope.lang = {
};
$scope.lang.installWebAppFor = __('My.Webfan WebApp for %s.', [$scope.userAgent]);
$scope.install=function(){
if(true !== $scope.accept || true === $scope.config.installed)return false;
// console.dir($scope.autoupdate) ;
// console.dir(window.webfanWebkitSettings().manifest);
// console.dir(window.webfanWebkitSettings().manifestServer);
webfan.$Async(function(){
frdl.UI.progress().start() ;
webfan.$Async(function(){
// $scope.config.installed = true;
$scope.config.autoupdate = (true===$scope.autoupdate) ? true : false;
$scope.config.id = window.webfanWebkitSettings().manifestServer.id;
var _Fn = function(){
_Fn = function(){};
window.webfanWebkitSettings().manifest = $scope.config;
window.webfanWebkitSettings().runUpdate(true, true);
};
var fs = frdl.require('fs');
process.cwd(frdl.DIRS.AppPath);
fs.writeFile(gui.configfile(), JSON.stringify($scope.config), function(err, data){
if(err){
console.error(err);
return;
}
_Fn();
});
},10);
},30);
};
}])
.run(function(){
})
});
})();
(function () {
'use strict';
function browse_webkit(browserInput, event){
function cmd_webfan(cmd){
frdl.c(cmd, function(messageLog, argparse){
if(messageLog){
frdl.each(messageLog, function(i,m){
frdl.alert.log('<pre>'+m+'</pre>');
});
}else{
frdl.alert.log('<pre></pre>');
}
}, true, self || window);
}
var b = browserInput;
var tabID = b.getAttribute('frdl-id');
var bf = frdl.$q('*[data-frdl-mod-browser="'+tabID+'"]', false); /* browser frame */
/*console.dir(bf);
var tab = window.Tabs().getTab(tabID);*/
var newUrl = b.value;
if(''===newUrl.trim())return false;
b.setAttribute('placeholder', b.value);
b.value = '';
var words = newUrl.split(/\s/);
var cmd = words[0].toLowerCase();
var sqlStarts = ['alter', 'select', 'update', 'delete', 'create', 'insert', 'show', 'replace', 'drop', 'explain'];
try{
var oldUrl = bf.getAttribute('src');
}catch(err){
var oldUrl = '';
}
var scheme = new frdl.Url(newUrl).getScheme();
var ev = event || window.event;
if('undefined'!==typeof ev && 16 === parseInt(ev.keyCode) && ('http'===scheme || 'https'===scheme || 'filesystem:'===newUrl.substr(0,'filesystem:'.length))){
window.Tabs().addTab(new frdl.Url(newUrl).getHost(), newUrl, null, 'browser', true, undefined, true);
//b.value = oldUrl;
return;
}else if('http'===scheme || 'https'===scheme || 'filesystem'===scheme){
/*bf.setAttribute('nwdisable', true);
bf.setAttribute('nwfaketop', true);
if(bf.hasAttribute('frdl-nwtrusted'))bf.removeAttribute('frdl-nwtrusted');
bf.setAttribute('src', newUrl);
*/
window.Tabs().addTab(new frdl.Url(newUrl).getHost(), newUrl, null, 'browser', true, {name:'browser', params:{url:newUrl}}, true);
// b.value = oldUrl;
return;
}else if('webfan'===scheme || 'web+fan'===scheme){
//location.hash='#'+newUrl;
console.log('ToDo webfan://'+ newUrl);
}else if('webfan'=== cmd){
cmd_webfan(newUrl);
}else if(
'search'===cmd
|| 'suche'===cmd
|| 'recherché'===cmd
|| '#'===cmd
){
var searchterm = newUrl.substr(cmd.length, newUrl.length).trim();
var url = 'http://suche.webfan.de/?q=' + frdl.urlencode(searchterm);
window.Tabs().addTab('Search '+ frdl.htmlentities(searchterm), url, null, 'browser', true, {name:'browser', params:{url:url}}, true);
} else if('!'===newUrl.substr(0,1) || 'js' === cmd){
try{
eval(newUrl.substr(1,newUrl.length));
}catch(err){
console.error(err);
frdl.alert.error(err);
}
}else if('ql' === cmd || 'sql' === cmd || -1 !== sqlStarts.indexOf(cmd)){
if(-1 === sqlStarts.indexOf(cmd)){
newUrl = newUrl.substr(cmd.length, newUrl.length).trim();
}
cmd_webfan(newUrl);
}
else /*if('#js'===newUrl.substr(0,3))*/{
cmd_webfan('webfan ' + newUrl.trim());
}/* else{
return false;
}*/
}
window.browse_webkit=browse_webkit;
}());
|