Commit 4f78790e authored by Trino Parra's avatar Trino Parra

first commit

parent 24c16e3a
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AD_UNIT_ID_FOR_BANNER_TEST</key>
<string>ca-app-pub-3940256099942544/2934735716</string>
<key>AD_UNIT_ID_FOR_INTERSTITIAL_TEST</key>
<string>ca-app-pub-3940256099942544/4411468910</string>
<key>CLIENT_ID</key>
<string>186789276076-psijd5t6hmpil4qlhch7rmhah2m6vgp7.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.186789276076-psijd5t6hmpil4qlhch7rmhah2m6vgp7</string>
<key>API_KEY</key>
<string>AIzaSyCa7vSM6MRvpoPf4BxVzAOs6d7NZuf--jM</string>
<key>GCM_SENDER_ID</key>
<string>186789276076</string>
<key>PLIST_VERSION</key>
<string>1</string>
<key>BUNDLE_ID</key>
<string>cl.gearlabs.cochacorporate</string>
<key>PROJECT_ID</key>
<string>app-cocha-2018</string>
<key>STORAGE_BUCKET</key>
<string>app-cocha-2018.appspot.com</string>
<key>IS_ADS_ENABLED</key>
<true></true>
<key>IS_ANALYTICS_ENABLED</key>
<false></false>
<key>IS_APPINVITE_ENABLED</key>
<false></false>
<key>IS_GCM_ENABLED</key>
<true></true>
<key>IS_SIGNIN_ENABLED</key>
<true></true>
<key>GOOGLE_APP_ID</key>
<string>1:186789276076:ios:fe56828c5b49eb73</string>
<key>DATABASE_URL</key>
<string>https://app-cocha-2018.firebaseio.com</string>
</dict>
</plist>
\ No newline at end of file
include node_modules/make-better/core.inc
include node_modules/make-better/frontend.inc
## Set these to the path containing your *.styl/*.jade/*.js files
#STYLUS_DIR := path/to/stylus/files
#JADE_DIR := path/to/jade/files
#JS_DIR := path/to/client/js/files
build: html css js
#html:
#css:
#js:
#public/css/app.css: $(STYLUS_FILES)
# stylus $(STYLUS_DIR)/app.styl -o public/css
[
{
"type":"group",
"title":"Common",
"items":[{
"title":"Title",
"type":"textfield",
"key":"title"
}, {
"title":"Language",
"type":"radio",
"key":"lang",
"default": "en-us",
"items":[{
"value":"en-us",
"title":"English (US)"
}, {
"value":"en-gb",
"title":"English (UK)"
}]
}, {
"title":"Debug",
"type":"toggle",
"default":false,
"key":"debug"
}]
}
]
<?xml version='1.0' encoding='utf-8'?>
<widget id="cl.gearlabs.cochacorporate" version="0.0.2" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>COCHA Corporate</name>
<description>COCHA Corporate App</description>
<author email="hi@ionicframework" href="http://ionicframework.com/">Ionic Framework Team</author>
<content src="index.html" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<allow-navigation href="http://localhost:8080/*" />
<preference name="ScrollEnabled" value="false" />
<preference name="android-minSdkVersion" value="19" />
<preference name="BackupWebStorage" value="none" />
<preference name="SplashMaintainAspectRatio" value="false" />
<preference name="FadeSplashScreenDuration" value="0" />
<preference name="SplashShowOnlyFirstTime" value="true" />
<preference name="KeyboardResize" value="true" />
<preference name="SplashScreen" value="screen" />
<preference name="SplashScreenDelay" value="0" />
<preference name="KeyboardResizeMode" value="native" />
<preference name="DisallowOverscroll" value="true" />
<preference name="orientation" value="portrait" />
<preference name="KeyboardDisplayRequiresUserAction" value="false" />
<preference name="AndroidPersistentFileLocation" value="Compatibility" />
<preference name="AndroidExtraFilesystems" value="files,files-external,documents,sdcard,root" />
<platform name="android">
<allow-intent href="market:*" />
<icon qualifier="ldpi" src="resources/android/icon/drawable-ldpi-icon.png" />
<icon qualifier="mdpi" src="resources/android/icon/drawable-mdpi-icon.png" />
<icon qualifier="hdpi" src="resources/android/icon/drawable-hdpi-icon.png" />
<icon qualifier="xhdpi" src="resources/android/icon/drawable-xhdpi-icon.png" />
<icon qualifier="xxhdpi" src="resources/android/icon/drawable-xxhdpi-icon.png" />
<icon qualifier="xxxhdpi" src="resources/android/icon/drawable-xxxhdpi-icon.png" />
<splash qualifier="land-ldpi" src="resources/android/splash/drawable-land-ldpi-screen.png" />
<splash qualifier="land-mdpi" src="resources/android/splash/drawable-land-mdpi-screen.png" />
<splash qualifier="land-hdpi" src="resources/android/splash/drawable-land-hdpi-screen.png" />
<splash qualifier="land-xhdpi" src="resources/android/splash/drawable-land-xhdpi-screen.png" />
<splash qualifier="land-xxhdpi" src="resources/android/splash/drawable-land-xxhdpi-screen.png" />
<splash qualifier="land-xxxhdpi" src="resources/android/splash/drawable-land-xxxhdpi-screen.png" />
<splash qualifier="port-ldpi" src="resources/android/splash/drawable-port-ldpi-screen.png" />
<splash qualifier="port-mdpi" src="resources/android/splash/drawable-port-mdpi-screen.png" />
<splash qualifier="port-hdpi" src="resources/android/splash/drawable-port-hdpi-screen.png" />
<splash qualifier="port-xhdpi" src="resources/android/splash/drawable-port-xhdpi-screen.png" />
<splash qualifier="port-xxhdpi" src="resources/android/splash/drawable-port-xxhdpi-screen.png" />
<splash qualifier="port-xxxhdpi" src="resources/android/splash/drawable-port-xxxhdpi-screen.png" />
</platform>
<platform name="ios">
<preference name="CordovaWebViewEngine" value="CDVWKWebViewEngine" />
<preference name="StatusBarOverlaysWebView" value="true" />
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
<icon height="57" platform="ios" src="resources/ios/icon/icon.png" width="57" />
<icon height="114" platform="ios" src="resources/ios/icon/icon@2x.png" width="114" />
<icon height="40" platform="ios" src="resources/ios/icon/icon-40.png" width="40" />
<icon height="80" platform="ios" src="resources/ios/icon/icon-40@2x.png" width="80" />
<icon height="50" platform="ios" src="resources/ios/icon/icon-50.png" width="50" />
<icon height="100" platform="ios" src="resources/ios/icon/icon-50@2x.png" width="100" />
<icon height="60" platform="ios" src="resources/ios/icon/icon-60.png" width="60" />
<icon height="120" platform="ios" src="resources/ios/icon/icon-60@2x.png" width="120" />
<icon height="180" platform="ios" src="resources/ios/icon/icon-60@3x.png" width="180" />
<icon height="72" platform="ios" src="resources/ios/icon/icon-72.png" width="72" />
<icon height="144" platform="ios" src="resources/ios/icon/icon-72@2x.png" width="144" />
<icon height="76" platform="ios" src="resources/ios/icon/icon-76.png" width="76" />
<icon height="152" platform="ios" src="resources/ios/icon/icon-76@2x.png" width="152" />
<icon height="29" platform="ios" src="resources/ios/icon/icon-small.png" width="29" />
<icon height="58" platform="ios" src="resources/ios/icon/icon-small@2x.png" width="58" />
<icon height="87" platform="ios" src="resources/ios/icon/icon-small@3x.png" width="87" />
<splash height="1136" platform="ios" src="resources/ios/splash/Default-568h@2x~iphone.png" width="640" />
<splash height="1334" platform="ios" src="resources/ios/splash/Default-667h.png" width="750" />
<splash height="2208" platform="ios" src="resources/ios/splash/Default-736h.png" width="1242" />
<splash height="1242" platform="ios" src="resources/ios/splash/Default-Landscape-736h.png" width="2208" />
<splash height="1536" platform="ios" src="resources/ios/splash/Default-Landscape@2x~ipad.png" width="2048" />
<splash height="768" platform="ios" src="resources/ios/splash/Default-Landscape~ipad.png" width="1024" />
<splash height="2048" platform="ios" src="resources/ios/splash/Default-Portrait@2x~ipad.png" width="1536" />
<splash height="1024" platform="ios" src="resources/ios/splash/Default-Portrait~ipad.png" width="768" />
<splash height="960" platform="ios" src="resources/ios/splash/Default@2x~iphone.png" width="640" />
<splash height="480" platform="ios" src="resources/ios/splash/Default~iphone.png" width="320" />
</platform>
<plugin name="cordova-plugin-whitelist" spec="^1.3.3" />
<plugin name="cordova-plugin-device" spec="^2.0.2" />
<plugin name="mx.ferreyra.callnumber" spec="0.0.2" />
<plugin name="cordova-plugin-statusbar" spec="^2.4.2" />
<plugin name="cordova-plugin-disable-ios11-statusbar" spec="^1.0.0" />
<plugin name="cordova-sqlite-storage" spec="^2.5.2" />
<plugin name="cordova-plugin-fcm" spec="^2.1.2" />
<plugin name="call-number" spec="0.0.2" />
<plugin name="phonegap-plugin-push" spec="^2.2.3">
<variable name="SENDER_ID" value="741593413711" />
<variable name="FCM_VERSION" value="11.6.2" />
</plugin>
<plugin name="cordova-plugin-console" spec="^1.1.0" />
<plugin name="cordova-plugin-actionsheet" spec="^2.3.3" />
<plugin name="cordova-plugin-camera" spec="^4.0.3" />
<plugin name="cordova-plugin-file" spec="^6.0.1" />
<plugin name="cordova-plugin-file-transfer" spec="^1.7.1" />
<plugin name="cordova-plugin-network-information" spec="^2.0.1" />
<plugin name="cordova-plugin-app-preferences" spec="^0.99.3" />
<plugin name="com-badrit-base64" spec="^0.2.0" />
<plugin name="cordova-plugin-filechooser" spec="^1.0.1" />
<plugin name="cordova-plugin-android-permissions" spec="^1.0.0" />
<plugin name="cordova.plugins.diagnostic" spec="^4.0.10" />
<plugin name="cordova-plugin-ionic-keyboard" spec="^2.1.3" />
<plugin name="cordova-plugin-splashscreen" spec="^5.0.2" />
<plugin name="cordova-plugin-headercolor" spec="^1.0.0" />
<plugin name="cordova-plugin-file-opener2" spec="2.0.19" />
<plugin name="cordova-plugin-screen-orientation" spec="3.0.1" />
<engine name="browser" spec="5.0.4" />
<engine name="ios" spec="4.5.5" />
</widget>
{
"project_info": {
"project_number": "186789276076",
"firebase_url": "https://app-cocha-2018.firebaseio.com",
"project_id": "app-cocha-2018",
"storage_bucket": "app-cocha-2018.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:186789276076:android:082ac8db3c013630",
"android_client_info": {
"package_name": "com.sensussoft.cocha"
}
},
"oauth_client": [
{
"client_id": "186789276076-psllcjqfdfvfghdsr804vvtf6v44tobn.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyA6WdpywAgKLX9FMAhxA7FruRNaBn33nqw"
}
],
"services": {
"analytics_service": {
"status": 1
},
"appinvite_service": {
"status": 1,
"other_platform_oauth_client": []
},
"ads_service": {
"status": 2
}
}
}
],
"configuration_version": "1"
}
\ No newline at end of file
{
"name": "chatdemo",
"integrations": {
"cordova": {}
},
"type": "ionic-angular"
}
\ No newline at end of file
{
"name": "Blank Starter",
"baseref": "master",
"tarignore": [
".sourcemaps",
"node_modules",
"package-lock.json",
"www"
],
"scripts": {
"test": "npm run build"
}
}
This diff is collapsed.
{
"name": "chatdemo",
"version": "0.0.1",
"author": "Ionic Framework",
"homepage": "http://ionicframework.com/",
"private": true,
"scripts": {
"clean": "ionic-app-scripts clean",
"build": "ionic-app-scripts build",
"lint": "ionic-app-scripts lint",
"ionic:build": "ionic-app-scripts build",
"ionic:serve": "ionic-app-scripts serve",
"validate": "npm ls"
},
"dependencies": {
"@angular/animations": "^5.2.10",
"@angular/common": "^5.2.11",
"@angular/compiler": "^5.2.11",
"@angular/compiler-cli": "^5.2.11",
"@angular/core": "^5.2.11",
"@angular/forms": "^5.2.11",
"@angular/http": "^5.2.11",
"@angular/platform-browser": "^5.2.11",
"@angular/platform-browser-dynamic": "^5.2.11",
"@ionic-native/android-permissions": "^4.19.0",
"@ionic-native/app-preferences": "^4.10.1",
"@ionic-native/background-mode": "^4.19.0",
"@ionic-native/base64": "^4.10.1",
"@ionic-native/call-number": "^4.19.0",
"@ionic-native/camera": "^4.10.0",
"@ionic-native/core": "^4.7.0",
"@ionic-native/diagnostic": "^4.19.0",
"@ionic-native/fcm": "^4.19.0",
"@ionic-native/file": "^4.10.0",
"@ionic-native/file-chooser": "^4.19.0",
"@ionic-native/file-opener": "^4.19.0",
"@ionic-native/file-transfer": "^4.19.0",
"@ionic-native/firebase": "^4.19.0",
"@ionic-native/header-color": "^4.10.0",
"@ionic-native/keyboard": "^3.12.1",
"@ionic-native/local-notifications": "^4.10.0",
"@ionic-native/network": "^4.10.1",
"@ionic-native/push": "^4.10.0",
"@ionic-native/screen-orientation": "^4.19.0",
"@ionic-native/splash-screen": "4.7.0",
"@ionic-native/sqlite": "^4.19.0",
"@ionic-native/sqlite-porter": "^4.15.0",
"@ionic-native/status-bar": "^4.10.0",
"@ionic-tools/emoji-picker": "^1.3.9",
"@ionic/lab": "^1.0.1",
"@ionic/pro": "1.0.20",
"@ionic/storage": "^2.1.3",
"angular2-elastic": "^0.13.0",
"blob-util": "^2.0.2",
"call-number": "0.0.2",
"com-badrit-base64": "^0.2.0",
"cordova-browser": "5.0.4",
"cordova-ios": "4.5.5",
"cordova-plugin-actionsheet": "^2.3.3",
"cordova-plugin-android-permissions": "^1.0.0",
"cordova-plugin-app-preferences": "^0.99.3",
"cordova-plugin-background-mode": "0.7.2",
"cordova-plugin-camera": "^4.0.3",
"cordova-plugin-console": "^1.1.0",
"cordova-plugin-device": "^2.0.2",
"cordova-plugin-disable-ios11-statusbar": "^1.0.0",
"cordova-plugin-fcm": "^2.1.2",
"cordova-plugin-file": "^6.0.1",
"cordova-plugin-file-downloader": "^0.4.0",
"cordova-plugin-file-md5": "^0.3.3",
"cordova-plugin-file-opener2": "^2.0.19",
"cordova-plugin-file-transfer": "^1.7.1",
"cordova-plugin-filechooser": "^1.2.0",
"cordova-plugin-headercolor": "^1.0.0",
"cordova-plugin-ionic-keyboard": "^2.1.3",
"cordova-plugin-network-information": "^2.0.1",
"cordova-plugin-screen-orientation": "^3.0.1",
"cordova-plugin-splashscreen": "^5.0.2",
"cordova-plugin-statusbar": "^2.4.2",
"cordova-plugin-whitelist": "^1.3.3",
"cordova-plugin-zip": "^3.1.0",
"cordova-sqlite-storage": "^2.6.0",
"cordova.plugins.diagnostic": "^4.0.10",
"date-fns": "^1.29.0",
"es6-promise-plugin": "^4.2.2",
"ionic-angular": "^3.9.2",
"ionic-cache": "^3.1.2",
"ionic-plugin-keyboard": "^2.2.1",
"ionic-select-searchable": "^2.8.2",
"ionicons": "3.0.0",
"localforage": "^1.7.3",
"moment": "^2.22.2",
"mx.ferreyra.callnumber": "0.0.2",
"ng-socket-io": "^0.2.4",
"node-strophe": "^2.0.0",
"phonegap-plugin-push": "^2.2.3",
"rxjs": "^5.5.10",
"stanza.io": "^9.2.0",
"strophe": "^1.2.4",
"strophe.js": "^1.2.15",
"strophejs-plugin-muc": "^1.1.0",
"strophejs-plugin-roster": "^1.1.0",
"sw-toolbox": "3.6.0",
"zone.js": "0.8.26"
},
"devDependencies": {
"@ionic/app-scripts": "3.2.1",
"typescript": "~2.6.2"
},
"description": "An Ionic project",
"cordova": {
"plugins": {
"cordova-plugin-whitelist": {},
"cordova-plugin-device": {},
"cordova-plugin-splashscreen": {},
"cordova-plugin-headercolor": {},
"mx.ferreyra.callnumber": {},
"cordova-plugin-statusbar": {},
"cordova-plugin-disable-ios11-statusbar": {},
"cordova-sqlite-storage": {},
"cordova-plugin-fcm": {},
"call-number": {},
"phonegap-plugin-push": {
"SENDER_ID": "741593413711",
"FCM_VERSION": "11.6.2"
},
"cordova-plugin-console": {},
"cordova-plugin-actionsheet": {},
"cordova-plugin-camera": {},
"cordova-plugin-file": {},
"cordova-plugin-file-transfer": {},
"cordova-plugin-network-information": {},
"cordova-plugin-app-preferences": {},
"com-badrit-base64": {},
"cordova-plugin-filechooser": {},
"cordova-plugin-android-permissions": {},
"cordova.plugins.diagnostic": {},
"cordova-plugin-ionic-keyboard": {},
"cordova-plugin-file-opener2": {},
"cordova-plugin-screen-orientation": {}
},
"platforms": [
"browser",
"ios"
]
},
"pre-commit": [
"lint",
"validate",
"test"
]
}
import { Component, ViewChild } from '@angular/core';
import { Nav, Platform, MenuController, NavController, App, AlertController, Events } from 'ionic-angular';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
import { Keyboard } from '@ionic-native/keyboard';
import { Storage } from '@ionic/storage';
import { Content } from 'ionic-angular';
import { FCM } from '@ionic-native/fcm';
import { Push} from '@ionic-native/push';
import { RestProvider } from '../providers/rest/rest';
import { MenuPage } from '../pages/menu/menu';
import { PassportloginPage } from '../pages/passportlogin/passportlogin';
import { CacheService } from "ionic-cache";
import {XMPPService} from "../providers/xmpp-service/xmpp-service";
import { Firebase } from '@ionic-native/firebase';
import {BackgroundMode} from "@ionic-native/background-mode";
import {DatabaseProvider} from "../providers/database/database";
import {ChatPage} from "../pages/chat/chat";
import {Loader} from "../providers/loader/loader";
declare let cordova: any;
@Component({
templateUrl: 'app.html',
providers: [XMPPService]
})
export class MyApp {
@ViewChild(Nav) nav: Nav;
@ViewChild('myNav') navCtrl: NavController;
@ViewChild(Content) content: Content;
rootPage:any = PassportloginPage;
appId: any = '12345678';
Rut : any;
error : any = '';
appID : any;
empresaID : any;
companyLogo : any;
jid: any;
name : any;
senderJID : any;
password : any;
pages: Array<{title: any, component: any, icon: any}> =[];
constructor(public loader: Loader, public platform: Platform,
public statusBar: StatusBar, public splashScreen: SplashScreen,
public menu: MenuController,public keyboard: Keyboard,
public storage: Storage, public fcm: FCM, public app: App,
public push: Push, public alertCtrl: AlertController,
public xmppService: XMPPService,public firebase: Firebase,
public restProvider: RestProvider, public events: Events,
cache: CacheService, public backgroundmode: BackgroundMode,
public db: DatabaseProvider) {
this.backgroundmode.enable();
this.pages = [
{ icon: 'ios-arrow-forward', title: 'Solicita tu viaje', component: 'ChatPage'},
{ icon: 'ios-arrow-forward', title: 'Consejos para tu viaje', component: 'TraveladvicePage'},
{ icon: 'ios-arrow-forward', title: 'Datos Utiles', component: 'UsefulinfoPage'},
{ icon: 'ios-arrow-forward', title: 'Notificaciones', component: 'NotiListPage'},
];
this.platform.ready().then(() => {
this.keyboard.disableScroll(true);
this.initializeApp();
this.restProvider.initializeNetworkEvents()
this.events.subscribe('network:offline', () => {});
this.events.subscribe('network:online', () => {});
this.storage.set('appid', this.appId);
this.statusBar.styleDefault();
this.splashScreen.hide();
this.statusBar.show();
this.fcm.onNotification().subscribe(data => {
let message = JSON.parse(JSON.stringify(data));
this.db.addNotification(message.title, message.subtitle, message.body, message.url,message.image_url)
.then((data) => {
this.app.getRootNav().push('NotiListPage');
});
});
});
this.xmppService.dismiss.subscribe((value) => {
if (value == "login") {
this.app.getRootNav().push(ChatPage);
} else if (value == "logout") {
app.getRootNav().push(PassportloginPage);
}
});
}
initializeApp() {
let usuario = window.localStorage.getItem('usuario') ? window.localStorage.getItem('usuario') : '';
let password = window.localStorage.getItem('password') ? window.localStorage.getItem('password') : '';
if(usuario && password) {
this.nav.setRoot(MenuPage);
}else{
this.nav.setRoot(PassportloginPage);
}
}
openPage(page) {
this.menu.close();
if (page.component == "ChatPage"){
this.storage.get("senderJID").then((getsenderJID) => {
this.senderJID = getsenderJID;
});
this.storage.get("empresaId").then((getempresaID) => {
this.empresaID = getempresaID;
});
this.storage.get("appId").then((getappID) => {
this.appID = getappID;
});
this.storage.get("password").then((pass) =>{
this.password = pass;
});
this.storage.get("isPassportLogin").then((resulst) => {
if(resulst){
this.storage.get("RUT").then((getRut) => {
this.Rut = getRut;
this.restProvider.getJIDtoChat(this.Rut, this.appID, this.empresaID)
.then(data => {
if(data['error']){
let alert = this.alertCtrl.create({
subTitle: data['error'],
buttons: ['Dismiss']
});
alert.present();
} else {
this.jid = data['jid'];
this.storage.set('name', data['nombre']);
this.storage.set('reciverJID', this.jid);
this.loader.show('Please Wait');
this.xmppService.login(this.senderJID, this.password);
}
}).catch(error => {
let alert = this.alertCtrl.create({
subTitle: error.error.error,
buttons: ['Dismiss']
});
alert.present();
});
});
} else {}
});
}else {
if(page.component){
this.app.getRootNav().push(page.component);
}
}
}
scrollToBottom() {
setTimeout(() => {
if (this.content.scrollToBottom) {
this.content.scrollToBottom();
}
}, 40)
}
}
<!-- <ion-nav [root]="rootPage"></ion-nav> -->
<ion-menu [content]="content" side="left" persistent="true">
<ion-content style="background-color: #2e2b2c;">
<ion-list>
<button menuClose ion-item *ngFor="let p of pages" (click)="openPage(p)" class="menubtn no-scroll" style="background-color: #2e2b2c!important;color: white!important;">
Test {{p.title}} <ion-icon [name]="p.icon" item-start style="font-size: 28px;color: #CB0D12"></ion-icon>
</button>
</ion-list>
</ion-content>
</ion-menu>
<!-- Disable swipe-to-go-back because it's poor UX to combine STGB with side menus -->
<ion-nav #myNav [root]="rootPage" #content swipeBackEnabled="false"></ion-nav>
import { BrowserModule } from '@angular/platform-browser';
import { ErrorHandler, NgModule } from '@angular/core';
import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular';
import { SplashScreen } from '@ionic-native/splash-screen';
import { StatusBar } from '@ionic-native/status-bar';
import { Keyboard } from '@ionic-native/keyboard';
import { IonicStorageModule } from '@ionic/storage';
import { FileTransfer} from '@ionic-native/file-transfer';
import { File } from '@ionic-native/file';
import { Camera } from '@ionic-native/camera';
import { MyApp } from './app.component';
import { HomePage } from '../pages/home/home';
import { MenuPage } from '../pages/menu/menu';
import { InquiryPage } from '../pages/inquiry/inquiry';
import { PassportloginPage } from '../pages/passportlogin/passportlogin';
import { PassportloginPageModule } from '../pages/passportlogin/passportlogin.module';
import { HeaderComponent } from '../components/header/header';
import { HeaderComponentModule } from '../components/header/header.module';
import { FooterComponentModule } from '../components/footer/footer.module';
import { EmojiPickerComponentModule } from '../components/emoji-picker/emoji-picker.module';
import { CallNumber } from '@ionic-native/call-number';
import { Loader } from '../providers/loader/loader';
import { EmojiProvider } from '../providers/emoji';
import { HttpClientModule } from "@angular/common/http";
import { RestProvider } from '../providers/rest/rest';
import { FCM } from '@ionic-native/fcm';
import { Network } from '@ionic-native/network';
import { Push } from '@ionic-native/push';
import { CacheModule } from 'ionic-cache';
import { Base64 } from '@ionic-native/base64';
import { SelectSearchableModule } from 'ionic-select-searchable';
import {ChatPage} from "../pages/chat/chat";
import { Firebase } from '@ionic-native/firebase';
import {NotiDetailPage} from "../pages/noti-detail/noti-detail";
import {FileChooser} from "@ionic-native/file-chooser";
import {AndroidPermissions} from "@ionic-native/android-permissions";
import {Diagnostic} from "@ionic-native/diagnostic";
import {BackgroundMode} from "@ionic-native/background-mode";
import { DatabaseProvider } from '../providers/database/database';
import {SQLite} from "@ionic-native/sqlite";
import {FileOpener} from "@ionic-native/file-opener";
import { InquiryProvider } from '../providers/inquiry/inquiry';
@NgModule({
declarations: [
MyApp,
HomePage, ChatPage, NotiDetailPage,
MenuPage, InquiryPage
],
imports: [
HttpClientModule,
BrowserModule,
IonicModule.forRoot(MyApp, { ios: {
scrollAssist: false,
autoFocusAssist: false,
inputBlurring: false
} }),
IonicStorageModule.forRoot({
name: '__mydb',
driverOrder: ['indexeddb', 'sqlite', 'websql']
}),
CacheModule.forRoot(),
HeaderComponentModule,
FooterComponentModule,
PassportloginPageModule,
EmojiPickerComponentModule,
SelectSearchableModule
],
bootstrap: [IonicApp],
entryComponents: [
MyApp,
HomePage, ChatPage,
PassportloginPage,
MenuPage, NotiDetailPage,
InquiryPage,
HeaderComponent,
],
providers: [
Keyboard,
StatusBar, Diagnostic, BackgroundMode,
SplashScreen,
{provide: ErrorHandler, useClass: IonicErrorHandler},
EmojiProvider,
CallNumber,
Loader,
RestProvider,
FCM, Firebase,
Push,
FileTransfer,
File,
Camera, FileChooser,
Network, AndroidPermissions,
Base64,
DatabaseProvider,
FileOpener, SQLite,
InquiryProvider
]
})
export class AppModule {}
// http://ionicframework.com/docs/theming/
// App Global Sass
// --------------------------------------------------
// Put style rules here that you want to apply globally. These
// styles are for the entire app and not just one component.
// Additionally, this file can be also used as an entry point
// to import other Sass files to be included in the output CSS.
//
// Shared Sass letiables, which can be used to adjust Ionic's
// default Sass letiables, belong in "theme/letiables.scss".
//
// To declare rules for a specific mode, create a child rule
// for the .md, .ios, or .wp mode classes. The mode class is
// automatically applied to the <body> element in the app.
// @font-face {
// font-family: '';
// src: url('../assets/fonts/DIN-RegularAlternate.ttf');
// }
// ion-content, form, ion-item, ion-label, ion-input, p{
// font-family: '' !important;
// }
// @font-face {
// font-family: 'Raleway';
// src: url('../assets/fonts/Raleway.woff2') format('woff2');
// }
// * {
// font-family: Raleway;
// }
@font-face {
font-family: 'Din';
src: url('../assets/fonts/DINPro-Regular.e96653d.woff2') format('woff2');
}
* {
font-family: Din;
}
// DINPro-Regular.e96653d.woff2
// @font-face {
// font-family: 'Raleway';
// src: url('../assets/fonts/raleway.woff2');
// }
// body, span, button, h1, h3, h5, h6, p, div, ion-item, ion-title, li, a, img, textarea, input, ion-content {
// font-family: 'Raleway', sans-serif !important;
// }
.padding-top {
margin-top: 48px !important;
}
.ios ion-nav > .ion-page > .toolbar.statusbar-padding:first-child, .ios ion-nav > .ion-page > ion-header > .toolbar.statusbar-padding:first-child, .ios ion-tab > .ion-page > .toolbar.statusbar-padding:first-child, .ios ion-tab > .ion-page > ion-header > .toolbar.statusbar-padding:first-child, .ios ion-tabs > .ion-page.tab-subpage > ion-header > .toolbar.statusbar-padding:first-child, .ios ion-menu > .menu-inner > .toolbar.statusbar-padding:first-child, .ios ion-menu > .menu-inner > ion-header > .toolbar.statusbar-padding:first-child {
padding-top: calc(20px + 4px);
padding-top: calc(constant(safe-area-inset-top) + 4px);
padding-top: calc(env(safe-area-inset-top) + 4px);
min-height: calc(0px + 20px);
min-height: calc(44px + constant(safe-area-inset-top));
min-height: calc(44px + env(safe-area-inset-top));
}
.toolbar-background-md {
border-color: #b2b2b2;
background: #F3F4F6;
}
.toolbar-background-ios {
background: #F3F4F6;
}
.toolbar-background-wp {
border-color: #b2b2b2;
background: #F3F4F6;
}
.platform-ios .padding-top{
margin-top: 50px !important;
}
.platform-android .padding-top{
margin-top: 45px !important;
}
.platform-windows .padding-top{
margin-top: 35px !important;
}
.list-md .item-block .item-inner {
border-bottom: 1px solid #2E2B2C;
}
.list-wp .item-block .item-inner {
border-bottom: 1px solid #2E2B2C;
}
.platform-ios .list-md .item-block{
border-bottom: 1px solid #2E2B2C;
}
.platform-wp .list-md .item-block{
border-bottom: 1px solid #2E2B2C;
}
.list-ios > .item-block:first-child {
border-top: 0.55px solid #2E2B2C;
}
.list-ios .item-block .item-inner {
border-bottom: 0.55px solid #2E2B2C;
}
.list-ios > .item-block:last-child, .list-ios > .item-wrapper:last-child .item-block {
border-bottom: 0.55px solid #2E2B2C;
}
.item-md ion-icon[item-left] + .item-inner, .item-md ion-icon[item-left] + .item-input, .item-md ion-icon[item-start] + .item-inner, .item-md ion-icon[item-start] + .item-input {
margin-left: 10px;
}
.no-scroll .scroll-content{
overflow: hidden;
}
.menubtn{
background-color: white;
color: black;
font-size: 18px;
padding-left: 5px;
border-bottom: 1px solid #706e6f;
}
// .platform-ios
// {
// page-menu { // replaced by your page HERE
// top: 20px !important;
// }
// page-home { // replaced by your page HERE
// top: 20px !important;
// }
// page-chat { // replaced by your page HERE
// top: 20px !important;
// }
// page-passportlogin { // replaced by your page HERE
// top: 20px !important;
// }
// page-password { // replaced by your page HERE
// top: 20px !important;
// }
// page-traveladvice { // replaced by your page HERE
// top: 20px !important;
// }
// page-usefulinfo { // replaced by your page HERE
// top: 20px !important;
// }
// }
.toolbar-ios {
// // padding-top: 15px;
// padding-left: 4px;
// padding-right: 4px;
// min-height: 61px;
padding-top: 18px;
padding-bottom: 0px !important;
padding-left: 0px;
padding-right: 0px;
}
.error-message{
color: red;
text-align: center;
}
.platform-ios .ios-header {
height:calc(58px + 22px);
min-height:calc(58px + 22px);
padding-top:25px;
}
// body.keyboard-is-open ion-footer {
// display: none;
// }
body.keyboard-is-open .scroll-content {
margin-bottom: 0 !important;
}
body.keyboard-is-open .fixed-content {
margin-bottom: 0 !important;
}
body.keyboard-is-open .applyFooter{
display: none;
bottom: 0;
}
.toast-success {
> div{
background-color:#00c851!important;
}
}
.toast-error {
> div{
background-color:#ff3547!important;
}
}
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
platformBrowserDynamic().bootstrapModule(AppModule);
/**
* @fileoverview Magic dependency loading. Taken from script.aculo.us
* and modified to break it.
* @author Stefan Strigler steve@zeank.in-berlin.de
*/
/*exported JSJaC */
var JSJaC = {
Version: '1.4',
require: function(libraryName) {
/*jshint evil: true */
// inserting via DOM fails in Safari 2.0, so brute force approach
document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
},
load: function() {
var includes =
['xmlextras',
'jsextras',
'crypt',
'JSJaCConfig',
'JSJaCConstants',
'JSJaCCookie',
'JSJaCJSON',
'JSJaCJID',
'JSJaCUtils',
'JSJaCBuilder',
'JSJaCPacket',
'JSJaCError',
'JSJaCKeys',
'JSJaCConnection',
'JSJaCHttpPollingConnection',
'JSJaCHttpBindingConnection',
'JSJaCConsoleLogger',
'JSJaCWebSocketConnection'
];
var scripts = document.getElementsByTagName("script");
var path = './', i;
for (i=0; i<scripts.length; i++) {
if (scripts.item(i).src && scripts.item(i).src.match(/JSJaC\.js$/)) {
path = scripts.item(i).src.replace(/JSJaC.js$/,'');
break;
}
}
for (i=0; i<includes.length; i++)
this.require(path+includes[i]+'.js');
},
bind: function(fn, obj, optArg) {
return function(arg) {
return fn.apply(obj, [arg, optArg]);
};
}
};
if (typeof JSJaCConnection == 'undefined')
JSJaC.load();
/**
* Js con logica de File Upload
*
* Contine funcion que permite hacer la instancia del los objetos File Upload
*
* @author Desarrollado por Frank Quero para Gearlabs Chile; querof@gmail.com
*/
/**
* @let newjsonClass letiable que almacena las instancias de los objetos file input.
*/
let newjsonClass = {};
/**
* Función utilizada para llamar instancias de objetos fileInput, e imprimir información de archivos, progreso de subida y estatus de esta.
*
* @param debug integer, valores: 1 imprime en la consola el estatus de cada llamada, o y vacio no realiza impresión alguna.
* @param cancelar integer, valores: 1 cancela el proceso de upload del archivo ientificado en el parametro idUpload, 0 y
* vacio no realiza acción alguna.
* @param idUpload String, valores: string que representa en el arreglo newjsonClass una posisión que contiene un objeto fileInput, 0 y
* vacio no realiza acción alguna.
* @return json con información del archivo y el proceso de upload.
*/
function enviaArchivo(debug,cancelar,idUpload)
{
if(idUpload==0){
idUpload = Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);// Math.floor(Math.random() * 6) + 1;
newjsonClass[idUpload] = new jsonClass({ idUpload: idUpload, error: 1, porcentaje: 0 });
}
if(cancelar==1) newjsonClass[idUpload].cancel();
if(newjsonClass[idUpload] && debug ==1)
{
console.log(newjsonClass[idUpload].returnletsArray());
return newjsonClass[idUpload].returnletsArray();
}
if(debug ==1) console.log('No existe e objecto identificado con el idUpload: ' + idUpload);
return null;
}
/**
* Prototipo que representa la clase de objeto json de respuesta
*
* Crea las instancia de los bjetos fileInput y file Upload de Jquery, adicionalmente realiza
* todo el control de comunicación con el servidor durante todo el proceso de upload.
*
* @author Desarrollado por Frank Quero para Gearlabs Chile; querof@gmail.com
*/
let jsonClass = function(options){
/**
* @let lets letiables accesadas en la clase; ellas repesentan la estructura de la respuesta json.
*/
let lets = {
nombreArchivo: null, //tipo texto (máximo 128)
URLarchivo: null,// tipo URL (máximo 256)
ext: null, //tipo texto (máximo 10)
error: null, //tipo numero (entero)
idUpload: null, // = Math.floor(Math.random()*6)+1; //tipo texto
porcentaje: 0, //tipo numero (entero)
};
/**
* @let root representa el prototipo u objeto en si.
* @let fileInput representa el objeto inputFile instanciado en cada llamada,
* este es utlizado por Jquery para tomar el archivo.
* @let xhr objeto que contiene el hilo de colunicación entre el servidor y jquery,
* a traves de el se puede cancelar el proceso.
* @let rarId representa el PK de la tabla referencias_archivos.
*/
let root = this;
let fileInput;
let xhr;
let rarId = null;
/**
* Constructor de la clase, inicializa el proceso
*/
this.construct = function(options){
$.extend(lets , options);
crearInput();
$(fileInput).trigger("click");
};
/**
* Retorna el avance del proceso.
*
* @return lets.porcentaje integer.
*/
this.getAvance = function(){
return lets.porcentaje;
};
/**
* Permite cancelar el proceso de subida de archivos, mientras este no halla culminado.
*
*/
this.cancel = function(){
xhr.abort();
$.extend( lets, { error: -1});
xhr = null;
};
/**
* Retorna objeto Json a partir de la letiable lets.
*
*/
this.returnJson = function(){
return JSON.stringify(lets);
};
/**
* Retorna la letiable lets.
*
*/
this.returnletsArray = function(){
return lets;
};
/**
* Instancia los objetos input file, y controla todo el proceso de upload de archivos,
* utilizando para ello el componente Upload file de Jquery.
*
* @return retorna el resultado del proceso durante su ejecución y actualiza la letiable lets.
*/
let crearInput = function(){
fileInput = $('<input id="fileupload" type="file" name="files[]" data-url="'+uploadPath+'" style="display: none">');
return $(function () {
$(fileInput).fileupload({
dataType: 'json',
maxChunkSize: maxChunkSize,
done: function (e, data) {
$.extend( lets, { URLarchivo: data.result.URLarchivo, error: 0});
},
progressall: function (e, data) {
$.extend( lets, { porcentaje: parseInt(data.loaded / data.total * 100, 10) } );
},
fail: function(e,data){
$.extend( lets, { error: -3 });
$.getJSON(rollbackPath+'/'+rarId, function (result){console.log(result.mensaje);});
}
}).bind('fileuploadadd', function (e, data) {
let error = 1;
$.getJSON(donePath, function (result)
{
console.log(result.mensaje);
});
xhr = data.submit();
if(data.files.size > maxFileSize)
{
error = -2;
xhr.abort();
}
$.extend( lets, {error: error});
return lets;
})
.bind('fileuploadchange', function (e, data) {
let fileName = data.files[0].name;
$.extend( lets, { nombreArchivo: fileName, ext: fileName.substr(fileName.lastIndexOf('.'))});
console.log("lets=>", lets);
})
.on('fileuploadchunkdone', function (e, data) {
console.log("lets=>", lets);
rarId = data.result.rarId;
});
});
}
/*
* Llamada al constructor
*/
this.construct(options);
};
Please follow these pull request guidelines:
1. Update your fork to the latest upstream version.
2. Follow the coding conventions of the original source files (indentation, spaces, brackets layout).
3. Code changes must pass JSHint validation with the `.jshintrc` settings of this project.
4. Code changes must pass the QUnit tests defined in the `test` folder.
5. New features should be covered by accompanying QUnit tests.
6. Keep your commits as atomic as possible, i.e. create a new commit for every single bug fix or feature added.
7. Always add meaningful commit messages.
MIT License
Copyright © 2010 Sebastian Tschan, https://blueimp.net
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
# jQuery File Upload Plugin
## Demo
[Demo File Upload](https://blueimp.github.io/jQuery-File-Upload/)
## Description
File Upload widget with multiple file selection, drag&amp;drop support, progress bars, validation and preview images, audio and video for jQuery.
Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.
## Setup
* [How to setup the plugin on your website](https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)
* [How to use only the basic plugin (minimal setup guide).](https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin)
## Features
* **Multiple file upload:**
Allows to select multiple files at once and upload them simultaneously.
* **Drag & Drop support:**
Allows to upload files by dragging them from your desktop or filemanager and dropping them on your browser window.
* **Upload progress bar:**
Shows a progress bar indicating the upload progress for individual files and for all uploads combined.
* **Cancelable uploads:**
Individual file uploads can be canceled to stop the upload progress.
* **Resumable uploads:**
Aborted uploads can be resumed with browsers supporting the Blob API.
* **Chunked uploads:**
Large files can be uploaded in smaller chunks with browsers supporting the Blob API.
* **Client-side image resizing:**
Images can be automatically resized on client-side with browsers supporting the required JS APIs.
* **Preview images, audio and video:**
A preview of image, audio and video files can be displayed before uploading with browsers supporting the required APIs.
* **No browser plugins (e.g. Adobe Flash) required:**
The implementation is based on open standards like HTML5 and JavaScript and requires no additional browser plugins.
* **Graceful fallback for legacy browsers:**
Uploads files via XMLHttpRequests if supported and uses iframes as fallback for legacy browsers.
* **HTML file upload form fallback:**
Allows progressive enhancement by using a standard HTML file upload form as widget element.
* **Cross-site file uploads:**
Supports uploading files to a different domain with cross-site XMLHttpRequests or iframe redirects.
* **Multiple plugin instances:**
Allows to use multiple plugin instances on the same webpage.
* **Customizable and extensible:**
Provides an API to set individual options and define callback methods for various upload events.
* **Multipart and file contents stream uploads:**
Files can be uploaded as standard "multipart/form-data" or file contents stream (HTTP PUT file upload).
* **Compatible with any server-side application platform:**
Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.
## Requirements
### Mandatory requirements
* [jQuery](https://jquery.com/) v. 1.6+
* [jQuery UI widget factory](https://api.jqueryui.com/jQuery.widget/) v. 1.9+ (included): Required for the basic File Upload plugin, but very lightweight without any other dependencies from the jQuery UI suite.
* [jQuery Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) (included): Required for [browsers without XHR file upload support](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).
### Optional requirements
* [JavaScript Templates engine](https://github.com/blueimp/JavaScript-Templates) v. 2.5.4+: Used to render the selected and uploaded files for the Basic Plus UI and jQuery UI versions.
* [JavaScript Load Image library](https://github.com/blueimp/JavaScript-Load-Image) v. 1.13.0+: Required for the image previews and resizing functionality.
* [JavaScript Canvas to Blob polyfill](https://github.com/blueimp/JavaScript-Canvas-to-Blob) v. 2.1.1+:Required for the image previews and resizing functionality.
* [blueimp Gallery](https://github.com/blueimp/Gallery) v. 2.15.1+: Used to display the uploaded images in a lightbox.
* [Bootstrap](http://getbootstrap.com/) v. 3.2.0+
* [Glyphicons](http://glyphicons.com/)
The user interface of all versions, except the jQuery UI version, is built with [Bootstrap](http://getbootstrap.com/) and icons from [Glyphicons](http://glyphicons.com/).
### Cross-domain requirements
[Cross-domain File Uploads](https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads) using the [Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) require a redirect back to the origin server to retrieve the upload results. The [example implementation](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/main.js) makes use of [result.html](https://github.com/blueimp/jQuery-File-Upload/blob/master/cors/result.html) as a static redirect page for the origin server.
The repository also includes the [jQuery XDomainRequest Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/cors/jquery.xdr-transport.js), which enables limited cross-domain AJAX requests in Microsoft Internet Explorer 8 and 9 (IE 10 supports cross-domain XHR requests).
The XDomainRequest object allows GET and POST requests only and doesn't support file uploads. It is used on the [Demo](https://blueimp.github.io/jQuery-File-Upload/) to delete uploaded files from the cross-domain demo file upload service.
### Custom Backends
You can add support for various backends by adhering to the specification [outlined here](https://github.com/blueimp/jQuery-File-Upload/wiki/JSON-Response).
## Browsers
### Desktop browsers
The File Upload plugin is regularly tested with the latest browser versions and supports the following minimal versions:
* Google Chrome
* Apple Safari 4.0+
* Mozilla Firefox 3.0+
* Opera 11.0+
* Microsoft Internet Explorer 6.0+
### Mobile browsers
The File Upload plugin has been tested with and supports the following mobile browsers:
* Apple Safari on iOS 6.0+
* Google Chrome on iOS 6.0+
* Google Chrome on Android 4.0+
* Default Browser on Android 2.3+
* Opera Mobile 12.0+
### Supported features
For a detailed overview of the features supported by each browser version, please have a look at the [Extended browser support information](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).
## Contributing
**Bug fixes** and **new features** can be proposed using [pull requests](https://github.com/blueimp/jQuery-File-Upload/pulls).
Please read the [contribution guidelines](https://github.com/blueimp/jQuery-File-Upload/blob/master/CONTRIBUTING.md) before submitting a pull request.
## Support
This project is actively maintained, but there is no official support channel.
If you have a question that another developer might help you with, please post to [Stack Overflow](http://stackoverflow.com/questions/tagged/blueimp+jquery+file-upload) and tag your question with `blueimp jquery file upload`.
## License
Released under the [MIT license](https://opensource.org/licenses/MIT).
{
"bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.)
"camelcase" : true, // true: Identifiers must be in camelCase
"curly" : true, // true: Require {} for every new block or scope
"eqeqeq" : true, // true: Require triple equals (===) for comparison
"forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty()
"immed" : true, // true: Require immediate invocations to be wrapped in parens
// e.g. `(function () { } ());`
"indent" : 4, // {int} Number of spaces to use for indentation
"latedef" : true, // true: Require variables/functions to be defined before being used
"newcap" : true, // true: Require capitalization of all constructor functions e.g. `new F()`
"noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee`
"noempty" : true, // true: Prohibit use of empty blocks
"nonew" : true, // true: Prohibit use of constructors for side-effects (without assignment)
"plusplus" : false, // true: Prohibit use of `++` & `--`
"quotmark" : "single", // Quotation mark consistency:
// false : do nothing (default)
// true : ensure whatever is used is consistent
// "single" : require single quotes
// "double" : require double quotes
"undef" : true, // true: Require all non-global variables to be declared (prevents global leaks)
"unused" : true, // true: Require all defined variables be used
"strict" : true, // true: Requires all functions run in ES5 Strict Mode
"trailing" : true, // true: Prohibit trailing whitespaces
"maxparams" : false, // {int} Max number of formal params allowed per function
"maxdepth" : false, // {int} Max depth of nested blocks (within functions)
"maxstatements" : false, // {int} Max number statements per function
"maxcomplexity" : false, // {int} Max cyclomatic complexity per function
"maxlen" : false, // {int} Max number of characters per line
// Relaxing
"asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons)
"boss" : false, // true: Tolerate assignments where comparisons would be expected
"debug" : false, // true: Allow debugger statements e.g. browser breakpoints.
"eqnull" : false, // true: Tolerate use of `== null`
"es5" : false, // true: Allow ES5 syntax (ex: getters and setters)
"esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`)
"moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features)
// (ex: `for each`, multiple try/catch, function expression…)
"evil" : false, // true: Tolerate use of `eval` and `new Function()`
"expr" : false, // true: Tolerate `ExpressionStatement` as Programs
"funcscope" : false, // true: Tolerate defining variables inside control statements"
"globalstrict" : false, // true: Allow global "use strict" (also enables 'strict')
"iterator" : false, // true: Tolerate using the `__iterator__` property
"lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block
"laxbreak" : false, // true: Tolerate possibly unsafe line breakings
"laxcomma" : false, // true: Tolerate comma-first style coding
"loopfunc" : false, // true: Tolerate functions being defined in loops
"multistr" : false, // true: Tolerate multi-line strings
"proto" : false, // true: Tolerate using the `__proto__` property
"scripturl" : false, // true: Tolerate script-targeted URLs
"smarttabs" : false, // true: Tolerate mixed tabs/spaces when used for alignment
"shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;`
"sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation
"supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;`
"validthis" : false, // true: Tolerate using this in a non-constructor function
// Environments
"browser" : false, // Web Browser (window, document, etc)
"couch" : false, // CouchDB
"devel" : false, // Development/debugging (alert, confirm, etc)
"dojo" : false, // Dojo Toolkit
"jquery" : false, // jQuery
"mootools" : false, // MooTools
"node" : false, // Node.js
"nonstandard" : false, // Widely adopted globals (escape, unescape, etc)
"prototypejs" : false, // Prototype and Scriptaculous
"rhino" : false, // Rhino
"worker" : false, // Web Workers
"wsh" : false, // Windows Scripting Host
"yui" : false, // Yahoo User Interface
// Legacy
"nomen" : true, // true: Prohibit dangling `_` in variables
"onevar" : true, // true: Allow only one `var` statement per function
"passfail" : false, // true: Stop on first error
"white" : true, // true: Check against strict whitespace and indentation rules
// Custom Globals
"globals" : {} // additional predefined global variables
}
*
!css/jquery.fileupload-noscript.css
!css/jquery.fileupload-ui-noscript.css
!css/jquery.fileupload-ui.css
!css/jquery.fileupload.css
!img/loading.gif
!img/progressbar.gif
!js/cors/jquery.postmessage-transport.js
!js/cors/jquery.xdr-transport.js
!js/vendor/jquery.ui.widget.js
!js/jquery.fileupload-angular.js
!js/jquery.fileupload-audio.js
!js/jquery.fileupload-image.js
!js/jquery.fileupload-jquery-ui.js
!js/jquery.fileupload-process.js
!js/jquery.fileupload-ui.js
!js/jquery.fileupload-validate.js
!js/jquery.fileupload-video.js
!js/jquery.fileupload.js
!js/jquery.iframe-transport.js
This diff is collapsed.
This diff is collapsed.
<!DOCTYPE HTML>
<!--
/*
* jQuery File Upload Plugin Basic Demo
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*/
-->
<html lang="en">
<head>
<!-- Force latest IE rendering engine or ChromeFrame if installed -->
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><![endif]-->
<meta charset="utf-8">
<title>jQuery File Upload Demo - Basic version</title>
<meta name="description" content="File Upload widget with multiple file selection, drag&amp;drop support and progress bar for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Bootstrap styles -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<!-- Generic page styles -->
<link rel="stylesheet" href="css/style.css">
<!-- CSS to style the file input field as button and adjust the Bootstrap progress bars -->
<link rel="stylesheet" href="css/jquery.fileupload.css">
</head>
<body>
<div class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-fixed-top .navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="https://github.com/blueimp/jQuery-File-Upload">jQuery File Upload</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li><a href="https://github.com/blueimp/jQuery-File-Upload/tags">Download</a></li>
<li><a href="https://github.com/blueimp/jQuery-File-Upload">Source Code</a></li>
<li><a href="https://github.com/blueimp/jQuery-File-Upload/wiki">Documentation</a></li>
<li><a href="https://blueimp.net">&copy; Sebastian Tschan</a></li>
</ul>
</div>
</div>
</div>
<div class="container">
<h1>jQuery File Upload Demo</h1>
<h2 class="lead">Basic version</h2>
<ul class="nav nav-tabs">
<li class="active"><a href="basic.html">Basic</a></li>
<li><a href="basic-plus.html">Basic Plus</a></li>
<li><a href="index.html">Basic Plus UI</a></li>
<li><a href="angularjs.html">AngularJS</a></li>
<li><a href="jquery-ui.html">jQuery UI</a></li>
</ul>
<br>
<blockquote>
<p>File Upload widget with multiple file selection, drag&amp;drop support and progress bar for jQuery.<br>
Supports cross-domain, chunked and resumable file uploads.<br>
Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.</p>
</blockquote>
<br>
<!-- The fileinput-button span is used to style the file input field as button -->
<span class="btn btn-success fileinput-button">
<i class="glyphicon glyphicon-plus"></i>
<span>Select files...</span>
<!-- The file input field used as target for the file upload widget -->
<input id="fileupload" type="file" name="files[]" multiple>
</span>
<br>
<br>
<!-- The global progress bar -->
<div id="progress" class="progress">
<div class="progress-bar progress-bar-success"></div>
</div>
<!-- The container for the uploaded files -->
<div id="files" class="files"></div>
<br>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Demo Notes</h3>
</div>
<div class="panel-body">
<ul>
<li>The maximum file size for uploads in this demo is <strong>999 KB</strong> (default file size is unlimited).</li>
<li>Only image files (<strong>JPG, GIF, PNG</strong>) are allowed in this demo (by default there is no file type restriction).</li>
<li>Uploaded files will be deleted automatically after <strong>5 minutes or less</strong> (demo files are stored in memory).</li>
<li>You can <strong>drag &amp; drop</strong> files from your desktop on this webpage (see <a href="https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support">Browser support</a>).</li>
<li>Please refer to the <a href="https://github.com/blueimp/jQuery-File-Upload">project website</a> and <a href="https://github.com/blueimp/jQuery-File-Upload/wiki">documentation</a> for more information.</li>
<li>Built with the <a href="http://getbootstrap.com/">Bootstrap</a> CSS framework and Icons from <a href="http://glyphicons.com/">Glyphicons</a>.</li>
</ul>
</div>
</div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
<script src="js/vendor/jquery.ui.widget.js"></script>
<!-- The Iframe Transport is required for browsers without support for XHR file uploads -->
<script src="js/jquery.iframe-transport.js"></script>
<!-- The basic File Upload plugin -->
<script src="js/jquery.fileupload.js"></script>
<!-- Bootstrap JS is not required, but included for the responsive demo navigation -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script>
/*jslint unparam: true */
/*global window, $ */
$(function () {
'use strict';
// Change this to the location of your server-side upload handler:
var url = window.location.hostname === 'blueimp.github.io' ?
'//jquery-file-upload.appspot.com/' : 'server/php/';
$('#fileupload').fileupload({
url: url,
dataType: 'json',
done: function (e, data) {
$.each(data.result.files, function (index, file) {
$('<p/>').text(file.name).appendTo('#files');
});
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
});
</script>
</body>
</html>
#!/usr/bin/env node
'use strict';
var path = require('path');
var packageJSON = require(path.join(__dirname, 'package.json'));
var bowerFile = path.join(__dirname, 'bower.json');
var bowerJSON = require('bower-json').parse(
require(bowerFile),
{normalize: true}
);
bowerJSON.version = packageJSON.version;
require('fs').writeFileSync(
bowerFile,
JSON.stringify(bowerJSON, null, 2) + '\n'
);
{
"name": "blueimp-file-upload",
"version": "9.21.0",
"title": "jQuery File Upload",
"description": "File Upload widget with multiple file selection, drag&amp;drop support, progress bar, validation and preview images.",
"keywords": [
"jquery",
"file",
"upload",
"widget",
"multiple",
"selection",
"drag",
"drop",
"progress",
"preview",
"cross-domain",
"cross-site",
"chunk",
"resume",
"gae",
"go",
"python",
"php",
"bootstrap"
],
"homepage": "https://github.com/blueimp/jQuery-File-Upload",
"author": {
"name": "Sebastian Tschan",
"url": "https://blueimp.net"
},
"maintainers": [
{
"name": "Sebastian Tschan",
"url": "https://blueimp.net"
}
],
"repository": {
"type": "git",
"url": "git://github.com/blueimp/jQuery-File-Upload.git"
},
"bugs": "https://github.com/blueimp/jQuery-File-Upload/issues",
"license": "MIT",
"dependencies": {
"jquery": ">=1.6",
"blueimp-tmpl": ">=2.5.4",
"blueimp-load-image": ">=1.13.0",
"blueimp-canvas-to-blob": ">=2.1.1"
},
"main": [
"js/jquery.fileupload.js"
],
"ignore": [
"/*.*",
"/cors",
"css/jquery-ui-demo-ie8.css",
"css/jquery-ui-demo.css",
"css/style.css",
"js/app.js",
"js/main.js",
"server",
"test"
]
}
<!DOCTYPE HTML>
<!--
/*
* jQuery File Upload Plugin postMessage API
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2011, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*/
-->
<html lang="en">
<head>
<meta charset="utf-8">
<title>jQuery File Upload Plugin postMessage API</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
<script>
/*jslint unparam: true, regexp: true */
/*global $, Blob, FormData, location */
'use strict';
var origin = /^http:\/\/example.org/,
target = new RegExp('^(http(s)?:)?\\/\\/' + location.host + '\\/');
$(window).on('message', function (e) {
e = e.originalEvent;
var s = e.data,
xhr = $.ajaxSettings.xhr(),
f;
if (!origin.test(e.origin)) {
throw new Error('Origin "' + e.origin + '" does not match ' + origin);
}
if (!target.test(e.data.url)) {
throw new Error('Target "' + e.data.url + '" does not match ' + target);
}
$(xhr.upload).on('progress', function (ev) {
ev = ev.originalEvent;
e.source.postMessage({
id: s.id,
type: ev.type,
timeStamp: ev.timeStamp,
lengthComputable: ev.lengthComputable,
loaded: ev.loaded,
total: ev.total
}, e.origin);
});
s.xhr = function () {
return xhr;
};
if (!(s.data instanceof Blob)) {
f = new FormData();
$.each(s.data, function (i, v) {
f.append(v.name, v.value);
});
s.data = f;
}
$.ajax(s).always(function (result, statusText, jqXHR) {
if (!jqXHR.done) {
jqXHR = result;
result = null;
}
e.source.postMessage({
id: s.id,
status: jqXHR.status,
statusText: statusText,
result: result,
headers: jqXHR.getAllResponseHeaders()
}, e.origin);
});
});
</script>
</body>
</html>
<!DOCTYPE HTML>
<!--
/*
* jQuery Iframe Transport Plugin Redirect Page
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*/
-->
<html lang="en">
<head>
<meta charset="utf-8">
<title>jQuery Iframe Transport Plugin Redirect Page</title>
</head>
<body>
<script>
document.body.innerText=document.body.textContent=decodeURIComponent(window.location.search.slice(1));
</script>
</body>
</html>
@charset "UTF-8";
/*
* jQuery File Upload Demo CSS Fixes for IE<9
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*/
.navigation {
list-style: none;
padding: 0;
margin: 1em 0;
}
.navigation li {
display: inline;
margin-right: 10px;
}
@charset "UTF-8";
/*
* jQuery File Upload Demo CSS
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*/
body {
max-width: 750px;
margin: 0 auto;
padding: 1em;
font-family: "Lucida Grande", "Lucida Sans Unicode", Arial, sans-serif;
font-size: 1em;
line-height: 1.4em;
background: #222;
color: #fff;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
a {
color: orange;
text-decoration: none;
}
img {
border: 0;
vertical-align: middle;
}
h1 {
line-height: 1em;
}
blockquote {
padding: 0 0 0 15px;
margin: 0 0 20px;
border-left: 5px solid #eee;
}
table {
width: 100%;
margin: 10px 0;
}
.fileupload-progress {
margin: 10px 0;
}
.fileupload-progress .progress-extended {
margin-top: 5px;
}
.error {
color: red;
}
@media (min-width: 481px) {
.navigation {
list-style: none;
padding: 0;
}
.navigation li {
display: inline-block;
}
.navigation li:not(:first-child):before {
content: "| ";
}
}
@charset "UTF-8";
/*
* jQuery File Upload Plugin NoScript CSS
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*/
.fileinput-button input {
position: static;
opacity: 1;
filter: none;
font-size: inherit !important;
direction: inherit;
}
.fileinput-button span {
display: none;
}
@charset "UTF-8";
/*
* jQuery File Upload UI Plugin NoScript CSS
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2012, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*/
.fileinput-button i,
.fileupload-buttonbar .delete,
.fileupload-buttonbar .toggle {
display: none;
}
@charset "UTF-8";
/*
* jQuery File Upload UI Plugin CSS
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2010, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*/
.fileupload-buttonbar .btn,
.fileupload-buttonbar .toggle {
margin-bottom: 5px;
}
.progress-animated .progress-bar,
.progress-animated .bar {
background: url("../img/progressbar.gif") !important;
filter: none;
}
.fileupload-process {
float: right;
display: none;
}
.fileupload-processing .fileupload-process,
.files .processing .preview {
display: block;
width: 32px;
height: 32px;
background: url("../img/loading.gif") center no-repeat;
background-size: contain;
}
.files audio,
.files video {
max-width: 300px;
}
@media (max-width: 767px) {
.fileupload-buttonbar .toggle,
.files .toggle,
.files .btn span {
display: none;
}
.files .name {
width: 80px;
word-wrap: break-word;
}
.files audio,
.files video {
max-width: 80px;
}
.files img,
.files canvas {
max-width: 100%;
}
}
@charset "UTF-8";
/*
* jQuery File Upload Plugin CSS
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*/
.fileinput-button {
position: relative;
overflow: hidden;
display: inline-block;
}
.fileinput-button input {
position: absolute;
top: 0;
right: 0;
margin: 0;
opacity: 0;
-ms-filter: 'alpha(opacity=0)';
font-size: 200px !important;
direction: ltr;
cursor: pointer;
}
/* Fixes for IE < 8 */
@media screen\9 {
.fileinput-button input {
filter: alpha(opacity=0);
font-size: 100%;
height: 100%;
}
}
@charset "UTF-8";
/*
* jQuery File Upload Plugin CSS Example
* https://github.com/blueimp/jQuery-File-Upload
*
* Copyright 2013, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* https://opensource.org/licenses/MIT
*/
body {
padding-top: 60px;
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment