diff --git a/.svn/entries b/.svn/entries deleted file mode 100644 index 48082f72f087ce7e6fa75b9c41d7387daecd447b..0000000000000000000000000000000000000000 --- a/.svn/entries +++ /dev/null @@ -1 +0,0 @@ -12 diff --git a/.svn/format b/.svn/format deleted file mode 100644 index 48082f72f087ce7e6fa75b9c41d7387daecd447b..0000000000000000000000000000000000000000 --- a/.svn/format +++ /dev/null @@ -1 +0,0 @@ -12 diff --git a/.svn/pristine/00/009e30cb888529424ff3085d11785d71b244b472.svn-base b/.svn/pristine/00/009e30cb888529424ff3085d11785d71b244b472.svn-base deleted file mode 100644 index 19978087c0f7c45f6349493ee9b3e4b3b9866163..0000000000000000000000000000000000000000 --- a/.svn/pristine/00/009e30cb888529424ff3085d11785d71b244b472.svn-base +++ /dev/null @@ -1,236 +0,0 @@ - false, - 'filecount' => 1, - 'delete-enabled' => true, - 'delete-force-confirm' => true, - 'retry-enable-auto' => true, - 'retry-max-auto-attempts' => 1, - 'retry-auto-attempt-delay' => 2, - 'auto-upload' => false, - ); - - $options = ( ! empty( $this->field['options'] ) ) ? $this->field['options'] : array(); - - $this->field['options'] = wp_parse_args( $options, $defaults ); - - } - - public function output() { - - echo $this->element_before(); - - ?> - - - field['options']['maxsize'] ) && Exopite_Simple_Options_Framework_Upload::file_upload_max_size() >= $this->field['options']['maxsize'] ) { - $maxsize = $this->field['options']['maxsize']; - } - - $allowed_mime_types = ( gettype( Exopite_Simple_Options_Framework_Upload::allowed_mime_types() ) == 'array' ) ? implode( ',', Exopite_Simple_Options_Framework_Upload::allowed_mime_types() ) : Exopite_Simple_Options_Framework_Upload::allowed_mime_types(); - - if ( isset( $this->field['options']['allowed'] ) && is_array( $this->field['options']['allowed'] ) ) { - $allowed_mime_types_array = explode( ',', $allowed_mime_types ); - $allowed_mime_types_array = array_intersect( $allowed_mime_types_array, $this->field['options']['allowed'] ); - $allowed_mime_types = implode( ',', $allowed_mime_types_array ); - } - - - ?> -
field['options']['attach'] && $this->config['type'] == 'metabox' ) ? 'data-postid="' . get_the_ID() . '" ' : ''; - echo 'data-ajaxurl="' . site_url( 'wp-admin/admin-ajax.php' ) . '" '; - echo 'data-delete-enabled="' . $this->field['options']['delete-enabled'] . '" '; - echo 'data-delete-force-confirm="' . $this->field['options']['delete-force-confirm'] . '" '; - echo 'data-retry-enable-auto="' . $this->field['options']['retry-enable-auto'] . '" '; - echo 'data-retry-max-auto-attempts="' . $this->field['options']['retry-max-auto-attempts'] . '" '; - echo 'data-retry-auto-attempt-delay="' . $this->field['options']['retry-auto-attempt-delay'] . '" '; - echo 'data-auto-upload="' . $this->field['options']['auto-upload'] . '" '; - ?>> -
-
- field['options']['filecount'] . '
'; - echo esc_attr__( 'Max file upload size: ', 'exopite-sof' ) . number_format( (float) ( Exopite_Simple_Options_Framework_Upload::file_upload_max_size() / 1048576 ), 2, '.', '' ) . 'Mb

'; - // echo '' . esc_attr__( 'To increase file upload limit in the standard built-in WordPress media uploader up as large as available disk space allows, you could use', 'exopite-sof' ) . ' Tuxedo Big File Uploads ' . esc_attr__( 'Plugin', 'exopite-sof' ) . ''; - - ?> -
- element_after(); - - } - - public static function enqueue( $args ) { - - if ( ! wp_script_is( 'fine-uploader' ) ) { - - /** - * https://fineuploader.com/ - */ - - $resources = array( - array( - 'name' => 'fine-uploader', - 'fn' => 'fine-uploader-new.min.css', - 'type' => 'style', - 'dependency' => array(), - 'version' => '5.15.5', - 'attr' => 'all', - ), - array( - 'name' => 'fine-uploader', - 'fn' => 'jquery.fine-uploader.min.js', - 'type' => 'script', - 'dependency' => array(), - 'version' => '5.15.5', - 'attr' => true, - ), - array( - 'name' => 'exopite-sof-fine-uploader-loader', - 'fn' => 'loader-fine-uploader.min.js', - 'type' => 'script', - 'dependency' => array( 'fine-uploader' ), - 'version' => '', - 'attr' => true, - ), - ); - - parent::do_enqueue( $resources, $args ); - - } - - } - - } - -} diff --git a/.svn/pristine/01/01f4d0c19a948713a108300a7e998d14c5294aab.svn-base b/.svn/pristine/01/01f4d0c19a948713a108300a7e998d14c5294aab.svn-base deleted file mode 100644 index 2de1d07a7a968acca16a4919e2f1af71df424846..0000000000000000000000000000000000000000 --- a/.svn/pristine/01/01f4d0c19a948713a108300a7e998d14c5294aab.svn-base +++ /dev/null @@ -1,96 +0,0 @@ -element_before(); - - $unallows = array(); - $unique_id = ( ! empty( $this->unique ) ) ? $this->unique : $this->field['id']; - - $self = new Exopite_Simple_Options_Framework( array( - 'id' => $this->element_name(), - 'multilang' => $this->config['multilang'], - 'is_options_simple' => $this->config['is_options_simple'], - ), null ); - - $i = 0; - - $fields = $this->field['fields']; - - echo '
'; - echo '
'; - - /** - * 1 -> col-12 col-lg-12 (12/index) - * 2 -> col-12 col-lg-6 - * 3 -> col-12 col-lg-4 - * 4 -> col-12 col-lg-3 - * 6 -> col-12 col-lg-2 - */ - - $col_classes = array( 'col', 'col-xs-12' ); - $allowed_cols = array( 1, 2, 3, 4, 6 ); - $col_number = ( isset( $this->field['options']['cols'] ) ) ? intval( $this->field['options']['cols'] ) : 1; - if ( ! in_array( $col_number, $allowed_cols ) ) { - $col_number = 1; - } else { - $col_classes[] = 'col-lg-' . ( 12 / $col_number ); - $col_classes[] = 'exopite-sof-col-lg'; - } - - foreach ( $fields as $field ) { - - echo '
'; - - if ( in_array( $field['type'], $unallows ) ) { - $field['_notice'] = true; - continue; - } - - if ( is_serialized( $this->value ) ) { - $this->value = unserialize( $this->value ); - } - - $field_value = ''; - if ( isset( $field['id'] ) && isset( $this->value[ $field['id'] ] ) ) { - $field_value = $this->value[ $field['id'] ]; - } elseif ( isset( $field['default'] ) ) { - $field_value = $field['default']; - } - - $class = 'Exopite_Simple_Options_Framework_Field_' . $field['type']; - - echo $self->add_field( $field, $field_value ); - - echo '
'; // col - - } - - echo '
'; // row - echo '
'; // container - - echo $this->element_after(); - - } - - } - -} diff --git a/.svn/pristine/02/0261fe61eca6b579c90ab1460fdad09cb8f84c07.svn-base b/.svn/pristine/02/0261fe61eca6b579c90ab1460fdad09cb8f84c07.svn-base deleted file mode 100644 index b0a8f59e4389da8c6b124762e1c184f026f91247..0000000000000000000000000000000000000000 --- a/.svn/pristine/02/0261fe61eca6b579c90ab1460fdad09cb8f84c07.svn-base +++ /dev/null @@ -1,116 +0,0 @@ -wxapi = new RAW_Weixin_API(); - - - } - - - - } - - - // 实例化并加入全局变量 - $GLOBALS['RestAPIMiniProgram'] = new RestAPIMiniProgram(); - - function RAW() { - - if( ! isset( $GLOBALS['RestAPIMiniProgram'] ) ) { - $GLOBALS['RestAPIMiniProgram'] = new RestAPIMiniProgram(); - } - - return $GLOBALS['RestAPIMiniProgram']; - } - - function ram_plugin_action_links( $links, $file ) { - if ( plugin_basename( __FILE__ ) !== $file ) { - return $links; - } - - $settings_link = ' ' . esc_html__( '升级增强版', 'REST API TO MiniProgram' ) . ''; - - array_unshift( $links, $settings_link ); - - $settings_link = ' ' . esc_html__( '升级专业版', 'REST API TO MiniProgram' ) . ''; - - array_unshift( $links, $settings_link ); - - - $settings_link = ' ' . esc_html__( '技术支持', 'REST API TO MiniProgram' ) . ''; - - array_unshift( $links, $settings_link ); - - $settings_link = '' . esc_html__( '设置', 'REST API TO MiniProgram' ) . ''; - - array_unshift( $links, $settings_link ); - - return $links; - } - -} diff --git a/.svn/pristine/04/0401311040eaae4a9f759ddf960b581b93e2410f.svn-base b/.svn/pristine/04/0401311040eaae4a9f759ddf960b581b93e2410f.svn-base deleted file mode 100644 index 17ca4e45b4299e8dc87efc6dcc833c7ef98b7cb1..0000000000000000000000000000000000000000 --- a/.svn/pristine/04/0401311040eaae4a9f759ddf960b581b93e2410f.svn-base +++ /dev/null @@ -1,252 +0,0 @@ -namespace = 'watch-life-net/v1'; - $this->resource_name = 'category'; - } - - public function register_routes() { - register_rest_route( $this->namespace, '/' . $this->resource_name.'/getsubscription', array( - // Here we register the readable endpoint for collections. - array( - 'methods' => 'GET', - 'callback' => array( $this, 'getSubscription' ), - 'permission_callback' => array( $this, 'get_item_permissions_check' ), - 'args' => array( - 'openid' => array( - 'required' => true - ) - ) - - ), - // Register our schema callback. - 'schema' => array( $this, 'get_public_item_schema' ), - ) ); - - register_rest_route( $this->namespace, '/' . $this->resource_name.'/postsubscription', array( - // Here we register the readable endpoint for collections. - array( - 'methods' => 'POST', - 'callback' => array( $this, 'postSubscription' ), - 'permission_callback' => array( $this, 'post_item_permissions_check' ), - 'args' => array( - 'openid' => array( - 'required' => true - ), - 'categoryid' => array( - 'required' => true - ) - ) - - ), - // Register our schema callback. - 'schema' => array( $this, 'get_public_item_schema' ), - ) ); - - register_rest_route( $this->namespace, '/' . $this->resource_name.'/ids', array( - // Here we register the readable endpoint for collections. - array( - 'methods' => 'GET', - 'callback' => array( $this, 'get_categories_ids' ), - //'permission_callback' => array( $this, 'get_item_permissions_check' ) - - ), - // Register our schema callback. - 'schema' => array( $this, 'get_public_item_schema' ), - ) ); - - } - - - - public function postSubscription($request) - { - global $wpdb; - $openid= $request['openid']; - $categoryid=$request['categoryid']; - $user_id =0; - $user = get_user_by( 'login', $openid); - if($user) - { - $user_id = $user->ID; - if(!empty($user_id)) - { - $sql =$wpdb->prepare("SELECT * FROM ".$wpdb->usermeta ." WHERE user_id=%d and meta_key='wl_sub' and meta_value=%s",$user_id,$categoryid); - $usermetas = $wpdb->get_results($sql); - $count =count($usermetas); - if ($count==0) - { - - if(add_user_meta($user_id, "wl_sub",$categoryid,false)) - { - $result["code"]="success"; - $result["message"]= "订阅成功"; - $result["status"]="200"; - - - } - else - { - $result["code"]="success"; - $result["message"]= "订阅失败"; - $result["status"]="500"; - - } - - } - else - { - if (delete_user_meta($user_id,'wl_sub',$categoryid)) - { - - $result["code"]="success"; - $result["message"]= "取消订阅成功"; - $result["status"]="201"; - - - } - else - { - $result["code"]="success"; - $result["message"]= "取消订阅失败"; - $result["status"]="501"; - - - } - - } - } - else - { - $result["code"]="success"; - $result["message"]= "用户参数错误"; - $result["status"]="500"; - - } - - } - else - { - - $result["code"]="success"; - $result["message"]= "用户参数错误"; - $result["status"]="500"; - - } - - $response = rest_ensure_response($result); - return $response; - - } - - public function getSubscription($request) - { - global $wpdb; - $openid= $request['openid']; - $user_id =0; - $user = get_user_by( 'login', $openid); - if($user) - { - $user_id = $user->ID; - $usermeta = get_user_meta($user_id); - if (!empty($usermeta)) - { - //$usermetaList =$wpdb->get_results($sql); - $result["code"]="success"; - $result["message"]= "获取订阅成功"; - $result["status"]="200"; - if(!empty($usermeta['wl_sub'])) - { - $result["subscription"]=$usermeta['wl_sub']; - $substr=implode(",",$usermeta['wl_sub']); - $result["substr"]=$substr; - $sql="SELECT SQL_CALC_FOUND_ROWS ".$wpdb->posts.".ID ,".$wpdb->posts.".post_title FROM ".$wpdb->posts." LEFT JOIN ".$wpdb->term_relationships." ON (".$wpdb->posts.".ID = ".$wpdb->term_relationships.".object_id) WHERE 1=1 AND ( ".$wpdb->term_relationships.".term_taxonomy_id IN (".$substr.")) AND ".$wpdb->posts.".post_type = 'post' AND (".$wpdb->posts.".post_status = 'publish') GROUP BY ".$wpdb->posts.".ID ORDER BY ".$wpdb->posts.".post_date DESC LIMIT 0, 20"; - $usermetaList =$wpdb->get_results($sql); - $result["usermetaList"]=$usermetaList; - - } - } - else - { - $result["code"]="success"; - $result["message"]= "没有订阅的专栏"; - $result["status"]="501"; - - - } - - } - else - { - $result["code"]="success"; - $result["message"]= "用户参数错误"; - $result["status"]="501"; - - - } - - $response = rest_ensure_response($result); - return $response; - - - - } - - public function get_categories_ids() - { - $categoriesId =get_option('wf_display_categories'); - - - $result['Ids'] =$categoriesId; - - $response = rest_ensure_response($result); - return $response; - } - - public function post_item_permissions_check($request) - { - $openid= $request['openid']; - $categoryid=$request['categoryid']; - if(empty($openid) || empty($categoryid) ) - { - return new WP_Error( 'error', '参数错误', array( 'status' => 500 ) ); - } - else{ - if(!username_exists($openid)) - { - return new WP_Error( 'error', '不允许提交', array( 'status' => 500 ) ); - } - - } - - return true; - } - - public function get_item_permissions_check($request ) { - $openid= $request['openid']; - if(empty($openid) ) - { - return new WP_Error( 'error', '参数错误', array( 'status' => 500 ) ); - } - - else - { - if(!username_exists($openid)) - { - return new WP_Error( 'error', '不允许提交', array( 'status' => 500 ) ); - } - - } - return true; - } - -} - diff --git a/.svn/pristine/04/048707bc52ac4b6563aaa383bfe8660a0ddc908c.svn-base b/.svn/pristine/04/048707bc52ac4b6563aaa383bfe8660a0ddc908c.svn-base deleted file mode 100644 index 401ec0f36e4f73b8efa40bd6f604fe80d286db70..0000000000000000000000000000000000000000 Binary files a/.svn/pristine/04/048707bc52ac4b6563aaa383bfe8660a0ddc908c.svn-base and /dev/null differ diff --git a/.svn/pristine/04/04fd7555ec867a50a5e80166f41e457a86d04fed.svn-base b/.svn/pristine/04/04fd7555ec867a50a5e80166f41e457a86d04fed.svn-base deleted file mode 100644 index 29438e854e2f3752f708b4b0712f4881640946c1..0000000000000000000000000000000000000000 --- a/.svn/pristine/04/04fd7555ec867a50a5e80166f41e457a86d04fed.svn-base +++ /dev/null @@ -1,588 +0,0 @@ -IsOut_trade_noSet()) { - throw new RAM_WxPayException("缺少统一支付接口必填参数out_trade_no!"); - }else if(!$inputObj->IsBodySet()){ - throw new RAM_WxPayException("缺少统一支付接口必填参数body!"); - }else if(!$inputObj->IsTotal_feeSet()) { - throw new RAM_WxPayException("缺少统一支付接口必填参数total_fee!"); - }else if(!$inputObj->IsTrade_typeSet()) { - throw new RAM_WxPayException("缺少统一支付接口必填参数trade_type!"); - } - - //关联参数 - if($inputObj->GetTrade_type() == "JSAPI" && !$inputObj->IsOpenidSet()){ - throw new RAM_WxPayException("统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!"); - } - if($inputObj->GetTrade_type() == "NATIVE" && !$inputObj->IsProduct_idSet()){ - throw new RAM_WxPayException("统一支付接口中,缺少必填参数product_id!trade_type为JSAPI时,product_id为必填参数!"); - } - - //异步通知url未设置,则使用配置文件中的url - if(!$inputObj->IsNotify_urlSet()){ - $inputObj->SetNotify_url(RAM_WxPayConfig::NOTIFY_URL);//异步通知url - } - - $inputObj->SetAppid(RAM_WxPayConfig::get_appid());//公众账号ID - $inputObj->SetMch_id(RAM_WxPayConfig::get_mchid());//商户号 - $inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//终端ip - //$inputObj->SetSpbill_create_ip("1.1.1.1"); - $inputObj->SetNonce_str(self::getNonceStr());//随机字符串 - - //签名 - $inputObj->SetSign(); - $xml = $inputObj->ToXml(); - - $startTimeStamp = self::getMillisecond();//请求开始时间 - $response = self::postXmlCurl($xml, $url, false, $timeOut); - $result = RAM_WxPayResults::Init($response); - self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间 - - return $result; - } - - /** - * - * 查询订单,WxPayOrderQuery中out_trade_no、transaction_id至少填一个 - * appid、mchid、spbill_create_ip、nonce_str不需要填入 - * @param RAM_WxPayOrderQuery $inputObj - * @param int $timeOut - * @throws RAM_WxPayException - * @return 成功时返回,其他抛异常 - */ - public static function orderQuery($inputObj, $timeOut = 6) - { - $url = "https://api.mch.weixin.qq.com/pay/orderquery"; - //检测必填参数 - if(!$inputObj->IsOut_trade_noSet() && !$inputObj->IsTransaction_idSet()) { - throw new RAM_WxPayException("订单查询接口中,out_trade_no、transaction_id至少填一个!"); - } - $inputObj->SetAppid(RAM_WxPayConfig::get_appid());//公众账号ID - $inputObj->SetMch_id(RAM_WxPayConfig::get_mchid());//商户号 - $inputObj->SetNonce_str(self::getNonceStr());//随机字符串 - - $inputObj->SetSign();//签名 - $xml = $inputObj->ToXml(); - - $startTimeStamp = self::getMillisecond();//请求开始时间 - $response = self::postXmlCurl($xml, $url, false, $timeOut); - $result = RAM_WxPayResults::Init($response); - self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间 - - return $result; - } - - /** - * - * 关闭订单,RAM_WxPayCloseOrder中out_trade_no必填 - * appid、mchid、spbill_create_ip、nonce_str不需要填入 - * @param RAM_WxPayCloseOrder $inputObj - * @param int $timeOut - * @throws RAM_WxPayException - * @return 成功时返回,其他抛异常 - */ - public static function closeOrder($inputObj, $timeOut = 6) - { - $url = "https://api.mch.weixin.qq.com/pay/closeorder"; - //检测必填参数 - if(!$inputObj->IsOut_trade_noSet()) { - throw new RAM_WxPayException("订单查询接口中,out_trade_no必填!"); - } - $inputObj->SetAppid(RAM_WxPayConfig::get_appid());//公众账号ID - $inputObj->SetMch_id(RAM_WxPayConfig::get_mchid());//商户号 - $inputObj->SetNonce_str(self::getNonceStr());//随机字符串 - - $inputObj->SetSign();//签名 - $xml = $inputObj->ToXml(); - - $startTimeStamp = self::getMillisecond();//请求开始时间 - $response = self::postXmlCurl($xml, $url, false, $timeOut); - $result = RAM_WxPayResults::Init($response); - self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间 - - return $result; - } - - /** - * - * 申请退款,WxPayRefund中out_trade_no、transaction_id至少填一个且 - * out_refund_no、total_fee、refund_fee、op_user_id为必填参数 - * appid、mchid、spbill_create_ip、nonce_str不需要填入 - * @param WxPayRefund $inputObj - * @param int $timeOut - * @throws RAM_WxPayException - * @return 成功时返回,其他抛异常 - */ - public static function refund($inputObj, $timeOut = 6) - { - $url = "https://api.mch.weixin.qq.com/secapi/pay/refund"; - //检测必填参数 - if(!$inputObj->IsOut_trade_noSet() && !$inputObj->IsTransaction_idSet()) { - throw new RAM_WxPayException("退款申请接口中,out_trade_no、transaction_id至少填一个!"); - }else if(!$inputObj->IsOut_refund_noSet()){ - throw new RAM_WxPayException("退款申请接口中,缺少必填参数out_refund_no!"); - }else if(!$inputObj->IsTotal_feeSet()){ - throw new RAM_WxPayException("退款申请接口中,缺少必填参数total_fee!"); - }else if(!$inputObj->IsRefund_feeSet()){ - throw new RAM_WxPayException("退款申请接口中,缺少必填参数refund_fee!"); - }else if(!$inputObj->IsOp_user_idSet()){ - throw new RAM_WxPayException("退款申请接口中,缺少必填参数op_user_id!"); - } - $inputObj->SetAppid(RAM_WxPayConfig::get_appid());//公众账号ID - $inputObj->SetMch_id(RAM_WxPayConfig::get_mchid());//商户号 - $inputObj->SetNonce_str(self::getNonceStr());//随机字符串 - - $inputObj->SetSign();//签名 - $xml = $inputObj->ToXml(); - $startTimeStamp = self::getMillisecond();//请求开始时间 - $response = self::postXmlCurl($xml, $url, true, $timeOut); - $result = RAM_WxPayResults::Init($response); - self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间 - - return $result; - } - - /** - * - * 查询退款 - * 提交退款申请后,通过调用该接口查询退款状态。退款有一定延时, - * 用零钱支付的退款20分钟内到账,银行卡支付的退款3个工作日后重新查询退款状态。 - * WxPayRefundQuery中out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个 - * appid、mchid、spbill_create_ip、nonce_str不需要填入 - * @param WxPayRefundQuery $inputObj - * @param int $timeOut - * @throws RAM_WxPayException - * @return 成功时返回,其他抛异常 - */ - public static function refundQuery($inputObj, $timeOut = 6) - { - $url = "https://api.mch.weixin.qq.com/pay/refundquery"; - //检测必填参数 - if(!$inputObj->IsOut_refund_noSet() && - !$inputObj->IsOut_trade_noSet() && - !$inputObj->IsTransaction_idSet() && - !$inputObj->IsRefund_idSet()) { - throw new RAM_WxPayException("退款查询接口中,out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个!"); - } - $inputObj->SetAppid(RAM_WxPayConfig::get_appid());//公众账号ID - $inputObj->SetMch_id(RAM_WxPayConfig::get_mchid());//商户号 - $inputObj->SetNonce_str(self::getNonceStr());//随机字符串 - - $inputObj->SetSign();//签名 - $xml = $inputObj->ToXml(); - - $startTimeStamp = self::getMillisecond();//请求开始时间 - $response = self::postXmlCurl($xml, $url, false, $timeOut); - $result = RAM_WxPayResults::Init($response); - self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间 - - return $result; - } - - /** - * 下载对账单,WxPayDownloadBill中bill_date为必填参数 - * appid、mchid、spbill_create_ip、nonce_str不需要填入 - * @param WxPayDownloadBill $inputObj - * @param int $timeOut - * @throws RAM_WxPayException - * @return 成功时返回,其他抛异常 - */ - public static function downloadBill($inputObj, $timeOut = 6) - { - $url = "https://api.mch.weixin.qq.com/pay/downloadbill"; - //检测必填参数 - if(!$inputObj->IsBill_dateSet()) { - throw new RAM_WxPayException("对账单接口中,缺少必填参数bill_date!"); - } - $inputObj->SetAppid(RAM_WxPayConfig::get_appid());//公众账号ID - $inputObj->SetMch_id(RAM_WxPayConfig::get_mchid());//商户号 - $inputObj->SetNonce_str(self::getNonceStr());//随机字符串 - - $inputObj->SetSign();//签名 - $xml = $inputObj->ToXml(); - - $response = self::postXmlCurl($xml, $url, false, $timeOut); - if(substr($response, 0 , 5) == ""){ - return ""; - } - return $response; - } - - /** - * 提交被扫支付API - * 收银员使用扫码设备读取微信用户刷卡授权码以后,二维码或条码信息传送至商户收银台, - * 由商户收银台或者商户后台调用该接口发起支付。 - * WxPayWxPayMicroPay中body、out_trade_no、total_fee、auth_code参数必填 - * appid、mchid、spbill_create_ip、nonce_str不需要填入 - * @param WxPayWxPayMicroPay $inputObj - * @param int $timeOut - */ - public static function micropay($inputObj, $timeOut = 10) - { - $url = "https://api.mch.weixin.qq.com/pay/micropay"; - //检测必填参数 - if(!$inputObj->IsBodySet()) { - throw new RAM_WxPayException("提交被扫支付API接口中,缺少必填参数body!"); - } else if(!$inputObj->IsOut_trade_noSet()) { - throw new RAM_WxPayException("提交被扫支付API接口中,缺少必填参数out_trade_no!"); - } else if(!$inputObj->IsTotal_feeSet()) { - throw new RAM_WxPayException("提交被扫支付API接口中,缺少必填参数total_fee!"); - } else if(!$inputObj->IsAuth_codeSet()) { - throw new RAM_WxPayException("提交被扫支付API接口中,缺少必填参数auth_code!"); - } - - $inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//终端ip - $inputObj->SetAppid(RAM_WxPayConfig::get_appid());//公众账号ID - $inputObj->SetMch_id(RAM_WxPayConfig::get_mchid());//商户号 - $inputObj->SetNonce_str(self::getNonceStr());//随机字符串 - - $inputObj->SetSign();//签名 - $xml = $inputObj->ToXml(); - - $startTimeStamp = self::getMillisecond();//请求开始时间 - $response = self::postXmlCurl($xml, $url, false, $timeOut); - $result = RAM_WxPayResults::Init($response); - self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间 - - return $result; - } - - /** - * - * 撤销订单API接口,WxPayReverse中参数out_trade_no和transaction_id必须填写一个 - * appid、mchid、spbill_create_ip、nonce_str不需要填入 - * @param WxPayReverse $inputObj - * @param int $timeOut - * @throws RAM_WxPayException - */ - public static function reverse($inputObj, $timeOut = 6) - { - $url = "https://api.mch.weixin.qq.com/secapi/pay/reverse"; - //检测必填参数 - if(!$inputObj->IsOut_trade_noSet() && !$inputObj->IsTransaction_idSet()) { - throw new RAM_WxPayException("撤销订单API接口中,参数out_trade_no和transaction_id必须填写一个!"); - } - - $inputObj->SetAppid(RAM_WxPayConfig::get_appid());//公众账号ID - $inputObj->SetMch_id(RAM_WxPayConfig::get_mchid());//商户号 - $inputObj->SetNonce_str(self::getNonceStr());//随机字符串 - - $inputObj->SetSign();//签名 - $xml = $inputObj->ToXml(); - - $startTimeStamp = self::getMillisecond();//请求开始时间 - $response = self::postXmlCurl($xml, $url, true, $timeOut); - $result = RAM_::Init($response); - self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间 - - return $result; - } - - /** - * - * 测速上报,该方法内部封装在report中,使用时请注意异常流程 - * WxPayReport中interface_url、return_code、result_code、user_ip、execute_time_必填 - * appid、mchid、spbill_create_ip、nonce_str不需要填入 - * @param WxPayReport $inputObj - * @param int $timeOut - * @throws RAM_WxPayException - * @return 成功时返回,其他抛异常 - */ - public static function report($inputObj, $timeOut = 1) - { - $url = "https://api.mch.weixin.qq.com/payitil/report"; - //检测必填参数 - if(!$inputObj->IsInterface_urlSet()) { - throw new RAM_WxPayException("接口URL,缺少必填参数interface_url!"); - } if(!$inputObj->IsReturn_codeSet()) { - throw new RAM_WxPayException("返回状态码,缺少必填参数return_code!"); - } if(!$inputObj->IsResult_codeSet()) { - throw new RAM_WxPayException("业务结果,缺少必填参数result_code!"); - } if(!$inputObj->IsUser_ipSet()) { - throw new RAM_WxPayException("访问接口IP,缺少必填参数user_ip!"); - } if(!$inputObj->IsExecute_time_Set()) { - throw new RAM_WxPayException("接口耗时,缺少必填参数execute_time_!"); - } - $inputObj->SetAppid(RAM_WxPayConfig::get_appid());//公众账号ID - $inputObj->SetMch_id(RAM_WxPayConfig::get_mchid());//商户号 - $inputObj->SetUser_ip($_SERVER['REMOTE_ADDR']);//终端ip - $inputObj->SetTime(date("YmdHis"));//商户上报时间 - $inputObj->SetNonce_str(self::getNonceStr());//随机字符串 - - $inputObj->SetSign();//签名 - $xml = $inputObj->ToXml(); - - $startTimeStamp = self::getMillisecond();//请求开始时间 - $response = self::postXmlCurl($xml, $url, false, $timeOut); - return $response; - } - - /** - * - * 生成二维码规则,模式一生成支付二维码 - * appid、mchid、spbill_create_ip、nonce_str不需要填入 - * @param WxPayBizPayUrl $inputObj - * @param int $timeOut - * @throws RAM_WxPayException - * @return 成功时返回,其他抛异常 - */ - public static function bizpayurl($inputObj, $timeOut = 6) - { - if(!$inputObj->IsProduct_idSet()){ - throw new RAM_WxPayException("生成二维码,缺少必填参数product_id!"); - } - - $inputObj->SetAppid(RAM_WxPayConfig::get_appid());//公众账号ID - $inputObj->SetMch_id(RAM_WxPayConfig::get_mchid());//商户号 - $inputObj->SetTime_stamp(time());//时间戳 - $inputObj->SetNonce_str(self::getNonceStr());//随机字符串 - - $inputObj->SetSign();//签名 - - return $inputObj->GetValues(); - } - - /** - * - * 转换短链接 - * 该接口主要用于扫码原生支付模式一中的二维码链接转成短链接(weixin://wxpay/s/XXXXXX), - * 减小二维码数据量,提升扫描速度和精确度。 - * appid、mchid、spbill_create_ip、nonce_str不需要填入 - * @param WxPayShortUrl $inputObj - * @param int $timeOut - * @throws RAM_WxPayException - * @return 成功时返回,其他抛异常 - */ - public static function shorturl($inputObj, $timeOut = 6) - { - $url = "https://api.mch.weixin.qq.com/tools/shorturl"; - //检测必填参数 - if(!$inputObj->IsLong_urlSet()) { - throw new RAM_WxPayException("需要转换的URL,签名用原串,传输需URL encode!"); - } - $inputObj->SetAppid(RAM_WxPayConfig::get_appid());//公众账号ID - $inputObj->SetMch_id(RAM_WxPayConfig::get_mchid());//商户号 - $inputObj->SetNonce_str(self::getNonceStr());//随机字符串 - - $inputObj->SetSign();//签名 - $xml = $inputObj->ToXml(); - - $startTimeStamp = self::getMillisecond();//请求开始时间 - $response = self::postXmlCurl($xml, $url, false, $timeOut); - $result = RAM_WxPayResults::Init($response); - self::reportCostTime($url, $startTimeStamp, $result);//上报请求花费时间 - - return $result; - } - - /** - * - * 支付结果通用通知 - * @param function $callback - * 直接回调函数使用方法: notify(you_function); - * 回调类成员函数方法:notify(array($this, you_function)); - * $callback 原型为:function function_name($data){} - */ - public static function notify($callback, &$msg) - { - //获取通知的数据 - $xml = $GLOBALS['HTTP_RAW_POST_DATA']; - //如果返回成功则验证签名 - try { - $result = RAM_WxPayResults::Init($xml); - } catch (RAM_WxPayException $e){ - $msg = $e->errorMessage(); - return false; - } - - return call_user_func($callback, $result); - } - - /** - * - * 产生随机字符串,不长于32位 - * @param int $length - * @return 产生的随机字符串 - */ - public static function getNonceStr($length = 32) - { - $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; - $str =""; - for ( $i = 0; $i < $length; $i++ ) { - $str .= substr($chars, mt_rand(0, strlen($chars)-1), 1); - } - return $str; - } - - /** - * 直接输出xml - * @param string $xml - */ - public static function replyNotify($xml) - { - echo $xml; - } - - /** - * - * 上报数据, 上报的时候将屏蔽所有异常流程 - * @param string $usrl - * @param int $startTimeStamp - * @param array $data - */ - private static function reportCostTime($url, $startTimeStamp, $data) - { - //如果不需要上报数据 - if(RAM_WxPayConfig::REPORT_LEVENL == 0){ - return; - } - //如果仅失败上报 - if(RAM_WxPayConfig::REPORT_LEVENL == 1 && - array_key_exists("return_code", $data) && - $data["return_code"] == "SUCCESS" && - array_key_exists("result_code", $data) && - $data["result_code"] == "SUCCESS") - { - return; - } - - //上报逻辑 - $endTimeStamp = self::getMillisecond(); - $objInput = new RAM_WxPayReport(); - $objInput->SetInterface_url($url); - $objInput->SetExecute_time_($endTimeStamp - $startTimeStamp); - //返回状态码 - if(array_key_exists("return_code", $data)){ - $objInput->SetReturn_code($data["return_code"]); - } - //返回信息 - if(array_key_exists("return_msg", $data)){ - $objInput->SetReturn_msg($data["return_msg"]); - } - //业务结果 - if(array_key_exists("result_code", $data)){ - $objInput->SetResult_code($data["result_code"]); - } - //错误代码 - if(array_key_exists("err_code", $data)){ - $objInput->SetErr_code($data["err_code"]); - } - //错误代码描述 - if(array_key_exists("err_code_des", $data)){ - $objInput->SetErr_code_des($data["err_code_des"]); - } - //商户订单号 - if(array_key_exists("out_trade_no", $data)){ - $objInput->SetOut_trade_no($data["out_trade_no"]); - } - //设备号 - if(array_key_exists("device_info", $data)){ - $objInput->SetDevice_info($data["device_info"]); - } - - try{ - self::report($objInput); - } catch (RAM_WxPayException $e){ - //不做任何处理 - } - } - - /** - * 以post方式提交xml到对应的接口url - * - * @param string $xml 需要post的xml数据 - * @param string $url url - * @param bool $useCert 是否需要证书,默认不需要 - * @param int $second url执行超时时间,默认30s - * @throws RAM_WxPayException - */ - private static function postXmlCurl($xml, $url, $useCert = false, $second = 30) - { - $ch = curl_init(); - $curlVersion = curl_version(); - $ua = "WXPaySDK/0.9 (".PHP_OS.") PHP/".PHP_VERSION." CURL/".$curlVersion['version']." ".RAM_WxPayConfig::get_mchid(); - - //设置超时 - curl_setopt($ch, CURLOPT_TIMEOUT, $second); - - //如果有配置代理这里就设置代理 - if(RAM_WxPayConfig::CURL_PROXY_HOST != "0.0.0.0" - && RAM_WxPayConfig::CURL_PROXY_PORT != 0){ - curl_setopt($ch,CURLOPT_PROXY, RAM_WxPayConfig::CURL_PROXY_HOST); - curl_setopt($ch,CURLOPT_PROXYPORT, RAM_WxPayConfig::CURL_PROXY_PORT); - } - curl_setopt($ch,CURLOPT_URL, $url); - curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); - curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);//严格校验 - curl_setopt($ch,CURLOPT_USERAGENT, $ua); - //设置header - curl_setopt($ch, CURLOPT_HEADER, FALSE); - //要求结果为字符串且输出到屏幕上 - curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); - - if($useCert == true){ - //设置证书 - //使用证书:cert 与 key 分别属于两个.pem文件 - //证书文件请放入服务器的非web目录下 - curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); - curl_setopt($ch,CURLOPT_SSLCERT, RAM_WxPayConfig::SSLCERT_PATH); - curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); - curl_setopt($ch,CURLOPT_SSLKEY, RAM_WxPayConfig::SSLKEY_PATH); - } - //post提交方式 - curl_setopt($ch, CURLOPT_POST, TRUE); - curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); - //运行curl - $data = curl_exec($ch); - //返回结果 - if($data){ - curl_close($ch); - return $data; - } else { - $error = curl_errno($ch); - curl_close($ch); - throw new RAM_WxPayException("curl出错,错误码:$error"); - } - } - - /** - * 获取毫秒级别的时间戳 - */ - private static function getMillisecond() - { - //获取毫秒的时间戳 - $time = explode ( " ", microtime () ); - $time = $time[1] . ($time[0] * 1000); - $time2 = explode( ".", $time ); - $time = $time2[0]; - return $time; - } -} - diff --git a/.svn/pristine/05/059f007f281605d181745a5489fd6f977fe1c9cc.svn-base b/.svn/pristine/05/059f007f281605d181745a5489fd6f977fe1c9cc.svn-base deleted file mode 100644 index d11188adb3b7d5e93370ad9e23bf3b5cab0312f1..0000000000000000000000000000000000000000 --- a/.svn/pristine/05/059f007f281605d181745a5489fd6f977fe1c9cc.svn-base +++ /dev/null @@ -1,121 +0,0 @@ -term_id; - if(empty($subscription)) - { - $data->data['subimg'] ="subscription.png"; - $data->data['subflag'] ="0"; - } - else - { - if(array_search($id,$subscription )) - { - $data->data['subimg'] ="subscription-on.png"; - $data->data['subflag'] ="1"; - } - else - { - $data->data['subimg'] ="subscription.png"; - $data->data['subflag'] ="0"; - - } - } - - - if($temp=get_term_meta($item->term_id,'catcover',true)) - { - $category_thumbnail_image=$temp; - - } - elseif($temp=get_term_meta($item->term_id,'thumbnail',true)); - { - $category_thumbnail_image=$temp; - } - - $data->data['category_thumbnail_image'] =$category_thumbnail_image; - return $data; -} - -function getSubscription($openid) - { - global $wpdb; - $user_id =0; - $user = get_user_by('login', $openid); - $subscription= array(); - if($user) - { - $user_id = $user->ID; - $usermeta = get_user_meta($user_id); - if (!empty($usermeta)) - { - if(!empty($usermeta['wl_sub'])) - { - $subscription=$usermeta['wl_sub']; - } - } - - } - return $subscription; - - } - - - - - -/********* 给分类添加微信小程序封面 *********/ - -add_action( 'category_add_form_fields', 'weixin_new_term_catcover_field' ); -function weixin_new_term_catcover_field() { - wp_nonce_field( basename( __FILE__ ), 'weixin_app_term_catcover_nonce' ); - - ?> - - -term_id, 'catcover', true ); - wp_enqueue_script('rawscript', plugins_url().'/'.REST_API_TO_MINIPROGRAM_PLUGIN_NAME.'/includes/js/script.js', false, '1.0'); - if ( ! $catcover ) - $catcover = $default; ?> - - - - - - - - - -__CreateOauthUrlForCode($baseUrl); - Header("Location: $url"); - exit(); - } else { - //获取code码,以获取openid - $code = $_GET['code']; - $openid = $this->getOpenidFromMp($code); - return $openid; - } - } - - /** - * - * 获取jsapi支付的参数 - * @param array $UnifiedOrderResult 统一支付接口返回的数据 - * @throws RAM_WxPayException - * - * @return json数据,可直接填入js函数作为参数 - */ - public function GetJsApiParameters($UnifiedOrderResult) - { - if(!array_key_exists("appid", $UnifiedOrderResult) - || !array_key_exists("prepay_id", $UnifiedOrderResult) - || $UnifiedOrderResult['prepay_id'] == "") - { - throw new RAM_WxPayException("参数错误"); - } - $jsapi = new RAM_WxPayJsApiPay(); - $jsapi->SetAppid($UnifiedOrderResult["appid"]); - $timeStamp = time(); - $jsapi->SetTimeStamp("$timeStamp"); - $jsapi->SetNonceStr(RAM_WxPayApi::getNonceStr()); - $jsapi->SetPackage("prepay_id=" . $UnifiedOrderResult['prepay_id']); - $jsapi->SetSignType("MD5"); - $jsapi->SetPaySign($jsapi->MakeSign()); - //$parameters = json_encode($jsapi->GetValues()); - $parameters = $jsapi->GetValues(); //xjb 修改为返回数组 - return $parameters; - } - - /** - * - * 通过code从工作平台获取openid机器access_token - * @param string $code 微信跳转回来带上的code - * - * @return openid - */ - public function GetOpenidFromMp($code) - { - $url = $this->__CreateOauthUrlForOpenid($code); - //初始化curl - $ch = curl_init(); - $curlVersion = curl_version(); - $ua = "WXPaySDK/0.0.5 (".PHP_OS.") PHP/".PHP_VERSION." CURL/".$curlVersion['version']." ".RAM_WxPayConfig::MCHID; - - //设置超时 - curl_setopt($ch, CURLOPT_TIMEOUT, $this->curl_timeout); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE); - curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,FALSE); - curl_setopt($ch,CURLOPT_USERAGENT, $ua); - curl_setopt($ch, CURLOPT_HEADER, FALSE); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); - if(RAM_WxPayConfig::CURL_PROXY_HOST != "0.0.0.0" - && RAM_WxPayConfig::CURL_PROXY_PORT != 0){ - curl_setopt($ch,CURLOPT_PROXY, RAM_WxPayConfig::CURL_PROXY_HOST); - curl_setopt($ch,CURLOPT_PROXYPORT, RAM_WxPayConfig::CURL_PROXY_PORT); - } - //运行curl,结果以jason形式返回 - $res = curl_exec($ch); - curl_close($ch); - //取出openid - $data = json_decode($res,true); - $this->data = $data; - $openid = $data['openid']; - return $openid; - } - - /** - * - * 拼接签名字符串 - * @param array $urlObj - * - * @return 返回已经拼接好的字符串 - */ - private function ToUrlParams($urlObj) - { - $buff = ""; - foreach ($urlObj as $k => $v) - { - if($k != "sign"){ - $buff .= $k . "=" . $v . "&"; - } - } - - $buff = trim($buff, "&"); - return $buff; - } - - /** - * - * 获取地址js参数 - * - * @return 获取共享收货地址js函数需要的参数,json格式可以直接做参数使用 - */ - public function GetEditAddressParameters() - { - $getData = $this->data; - $data = array(); - $data["appid"] = RAM_WxPayConfig::APPID; - $data["url"] = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; - $time = time(); - $data["timestamp"] = "$time"; - $data["noncestr"] = "1234568"; - $data["accesstoken"] = $getData["access_token"]; - ksort($data); - $params = $this->ToUrlParams($data); - $addrSign = sha1($params); - - $afterData = array( - "addrSign" => $addrSign, - "signType" => "sha1", - "scope" => "jsapi_address", - "appId" => RAM_WxPayConfig::APPID, - "timeStamp" => $data["timestamp"], - "nonceStr" => $data["noncestr"] - ); - $parameters = json_encode($afterData); - return $parameters; - } - - /** - * - * 构造获取code的url连接 - * @param string $redirectUrl 微信服务器回跳的url,需要url编码 - * - * @return 返回构造好的url - */ - private function __CreateOauthUrlForCode($redirectUrl) - { - $urlObj["appid"] = RAM_WxPayConfig::APPID; - $urlObj["redirect_uri"] = "$redirectUrl"; - $urlObj["response_type"] = "code"; - $urlObj["scope"] = "snsapi_base"; - $urlObj["state"] = "STATE"."#wechat_redirect"; - $bizString = $this->ToUrlParams($urlObj); - return "https://open.weixin.qq.com/connect/oauth2/authorize?".$bizString; - } - - /** - * - * 构造获取open和access_toke的url地址 - * @param string $code,微信跳转带回的code - * - * @return 请求的url - */ - private function __CreateOauthUrlForOpenid($code) - { - $urlObj["appid"] = RAM_WxPayConfig::APPID; - $urlObj["secret"] = RAM_WxPayConfig::APPSECRET; - $urlObj["code"] = $code; - $urlObj["grant_type"] = "authorization_code"; - $bizString = $this->ToUrlParams($urlObj); - return "https://api.weixin.qq.com/sns/oauth2/access_token?".$bizString; - } -} diff --git a/.svn/pristine/07/076b47c2398a5e17a954227c954ec6ceaf7f3723.svn-base b/.svn/pristine/07/076b47c2398a5e17a954227c954ec6ceaf7f3723.svn-base deleted file mode 100644 index 98792e6a05d5fe56c3db569d0deaa643dbcbe13d..0000000000000000000000000000000000000000 --- a/.svn/pristine/07/076b47c2398a5e17a954227c954ec6ceaf7f3723.svn-base +++ /dev/null @@ -1,49 +0,0 @@ -field['min'] ) ) { - $attr[] = 'min="' . $this->field['min'] . '"'; - } - if ( ! empty( $this->field['max'] ) ) { - $attr[] = 'max="' . $this->field['max'] . '"'; - } - if ( ! empty( $this->field['step'] ) ) { - $attr[] = 'step="' . $this->field['step'] . '"'; - } - $attrs = ( ! empty( $attr ) ) ? ' ' . trim( implode( ' ', $attr ) ) : ''; - $unit = ( isset( $this->field['unit'] ) ) ? '' . $this->field['unit'] . '' : ''; - $classes = ( isset( $this->field['class'] ) ) ? implode( ' ', explode( ' ', $this->field['class'] ) ) : ''; - - echo $this->element_before(); - - echo 'element_attributes() . '>' . $unit; - echo ''; - - echo $this->element_after(); - - } - - } - -} diff --git a/.svn/pristine/08/08a6dbcd29fe5a9b8efdee76c355ec497f8643d7.svn-base b/.svn/pristine/08/08a6dbcd29fe5a9b8efdee76c355ec497f8643d7.svn-base deleted file mode 100644 index 2770488c2f43ddd0b154a09bd8ab8334ce1ce5aa..0000000000000000000000000000000000000000 --- a/.svn/pristine/08/08a6dbcd29fe5a9b8efdee76c355ec497f8643d7.svn-base +++ /dev/null @@ -1,2 +0,0 @@ -/* Chosen v1.8.7 | (c) 2011-2018 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */ -(function(){var t,e,s,i,r=function(t,e){return function(){return t.apply(e,arguments)}},n={}.hasOwnProperty;(i=function(){function t(){this.options_index=0,this.parsed=[]}return t.prototype.add_node=function(t){return"OPTGROUP"===t.nodeName.toUpperCase()?this.add_group(t):this.add_option(t)},t.prototype.add_group=function(t){var e,s,i,r,n,o;for(e=this.parsed.length,this.parsed.push({array_index:e,group:!0,label:t.label,title:t.title?t.title:void 0,children:0,disabled:t.disabled,classes:t.className}),o=[],s=0,i=(n=t.childNodes).length;s"+this.escape_html(t.group_label)+""+t.html:t.html},t.prototype.mouse_enter=function(){return this.mouse_on_container=!0},t.prototype.mouse_leave=function(){return this.mouse_on_container=!1},t.prototype.input_focus=function(t){if(this.is_multiple){if(!this.active_field)return setTimeout((e=this,function(){return e.container_mousedown()}),50)}else if(!this.active_field)return this.activate_field();var e},t.prototype.input_blur=function(t){if(!this.mouse_on_container)return this.active_field=!1,setTimeout((e=this,function(){return e.blur_test()}),100);var e},t.prototype.label_click_handler=function(t){return this.is_multiple?this.container_mousedown(t):this.activate_field()},t.prototype.results_option_build=function(t){var e,s,i,r,n,o,h;for(e="",h=0,r=0,n=(o=this.results_data).length;r=this.max_shown_results));r++);return e},t.prototype.result_add_option=function(t){var e,s;return t.search_match&&this.include_option_in_results(t)?(e=[],t.disabled||t.selected&&this.is_multiple||e.push("active-result"),!t.disabled||t.selected&&this.is_multiple||e.push("disabled-result"),t.selected&&e.push("result-selected"),null!=t.group_array_index&&e.push("group-option"),""!==t.classes&&e.push(t.classes),(s=document.createElement("li")).className=e.join(" "),t.style&&(s.style.cssText=t.style),s.setAttribute("data-option-array-index",t.array_index),s.innerHTML=t.highlighted_html||t.html,t.title&&(s.title=t.title),this.outerHTML(s)):""},t.prototype.result_add_group=function(t){var e,s;return(t.search_match||t.group_match)&&t.active_options>0?((e=[]).push("group-result"),t.classes&&e.push(t.classes),(s=document.createElement("li")).className=e.join(" "),s.innerHTML=t.highlighted_html||this.escape_html(t.label),t.title&&(s.title=t.title),this.outerHTML(s)):""},t.prototype.results_update_field=function(){if(this.set_default_text(),this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.results_build(),this.results_showing)return this.winnow_results()},t.prototype.reset_single_select_options=function(){var t,e,s,i,r;for(r=[],t=0,e=(s=this.results_data).length;t"+this.escape_html(s)+""+this.escape_html(p)),null!=a&&(a.group_match=!0)):null!=n.group_array_index&&this.results_data[n.group_array_index].search_match&&(n.search_match=!0)));return this.result_clear_highlight(),_<1&&h.length?(this.update_results_content(""),this.no_results(h)):(this.update_results_content(this.results_option_build()),(null!=t?t.skip_highlight:void 0)?void 0:this.winnow_results_set_highlight())},t.prototype.get_search_regex=function(t){var e,s;return s=this.search_contains?t:"(^|\\s|\\b)"+t+"[^\\s]*",this.enable_split_word_search||this.search_contains||(s="^"+s),e=this.case_sensitive_search?"":"i",new RegExp(s,e)},t.prototype.search_string_match=function(t,e){var s;return s=e.exec(t),!this.search_contains&&(null!=s?s[1]:void 0)&&(s.index+=1),s},t.prototype.choices_count=function(){var t,e,s;if(null!=this.selected_option_count)return this.selected_option_count;for(this.selected_option_count=0,t=0,e=(s=this.form_field.options).length;t0?this.keydown_backstroke():this.pending_backstroke||(this.result_clear_highlight(),this.results_search());break;case 13:t.preventDefault(),this.results_showing&&this.result_select(t);break;case 27:this.results_showing&&this.results_hide();break;case 9:case 16:case 17:case 18:case 38:case 40:case 91:break;default:this.results_search()}},t.prototype.clipboard_event_checker=function(t){var e;if(!this.is_disabled)return setTimeout((e=this,function(){return e.results_search()}),50)},t.prototype.container_width=function(){return null!=this.options.width?this.options.width:this.form_field.offsetWidth+"px"},t.prototype.include_option_in_results=function(t){return!(this.is_multiple&&!this.display_selected_options&&t.selected)&&(!(!this.display_disabled_options&&t.disabled)&&!t.empty)},t.prototype.search_results_touchstart=function(t){return this.touch_started=!0,this.search_results_mouseover(t)},t.prototype.search_results_touchmove=function(t){return this.touch_started=!1,this.search_results_mouseout(t)},t.prototype.search_results_touchend=function(t){if(this.touch_started)return this.search_results_mouseup(t)},t.prototype.outerHTML=function(t){var e;return t.outerHTML?t.outerHTML:((e=document.createElement("div")).appendChild(t),e.innerHTML)},t.prototype.get_single_html=function(){return'\n '+this.default_text+'\n
\n
\n
\n \n
    \n
    '},t.prototype.get_multi_html=function(){return'
      \n
    • \n \n
    • \n
    \n
    \n
      \n
      '},t.prototype.get_no_results_html=function(t){return'
    • \n '+this.results_none_found+" "+this.escape_html(t)+"\n
    • "},t.browser_is_supported=function(){return"Microsoft Internet Explorer"!==window.navigator.appName||document.documentMode>=8},t.default_multiple_text="Select Some Options",t.default_single_text="Select an Option",t.default_no_result_text="No results match",t}(),(t=jQuery).fn.extend({chosen:function(i){return e.browser_is_supported()?this.each(function(e){var r,n;n=(r=t(this)).data("chosen"),"destroy"!==i?n instanceof s||r.data("chosen",new s(this,i)):n instanceof s&&n.destroy()}):this}}),s=function(s){function r(){return r.__super__.constructor.apply(this,arguments)}return function(t,e){for(var s in e)n.call(e,s)&&(t[s]=e[s]);function i(){this.constructor=t}i.prototype=e.prototype,t.prototype=new i,t.__super__=e.prototype}(r,e),r.prototype.setup=function(){return this.form_field_jq=t(this.form_field),this.current_selectedIndex=this.form_field.selectedIndex},r.prototype.set_up_html=function(){var e,s;return(e=["chosen-container"]).push("chosen-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&e.push(this.form_field.className),this.is_rtl&&e.push("chosen-rtl"),s={class:e.join(" "),title:this.form_field.title},this.form_field.id.length&&(s.id=this.form_field.id.replace(/[^\w]/g,"_")+"_chosen"),this.container=t("
      ",s),this.container.width(this.container_width()),this.is_multiple?this.container.html(this.get_multi_html()):this.container.html(this.get_single_html()),this.form_field_jq.hide().after(this.container),this.dropdown=this.container.find("div.chosen-drop").first(),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chosen-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chosen-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chosen-search").first(),this.selected_item=this.container.find(".chosen-single").first()),this.results_build(),this.set_tab_index(),this.set_label_behavior()},r.prototype.on_ready=function(){return this.form_field_jq.trigger("chosen:ready",{chosen:this})},r.prototype.register_observers=function(){var t;return this.container.on("touchstart.chosen",(t=this,function(e){t.container_mousedown(e)})),this.container.on("touchend.chosen",function(t){return function(e){t.container_mouseup(e)}}(this)),this.container.on("mousedown.chosen",function(t){return function(e){t.container_mousedown(e)}}(this)),this.container.on("mouseup.chosen",function(t){return function(e){t.container_mouseup(e)}}(this)),this.container.on("mouseenter.chosen",function(t){return function(e){t.mouse_enter(e)}}(this)),this.container.on("mouseleave.chosen",function(t){return function(e){t.mouse_leave(e)}}(this)),this.search_results.on("mouseup.chosen",function(t){return function(e){t.search_results_mouseup(e)}}(this)),this.search_results.on("mouseover.chosen",function(t){return function(e){t.search_results_mouseover(e)}}(this)),this.search_results.on("mouseout.chosen",function(t){return function(e){t.search_results_mouseout(e)}}(this)),this.search_results.on("mousewheel.chosen DOMMouseScroll.chosen",function(t){return function(e){t.search_results_mousewheel(e)}}(this)),this.search_results.on("touchstart.chosen",function(t){return function(e){t.search_results_touchstart(e)}}(this)),this.search_results.on("touchmove.chosen",function(t){return function(e){t.search_results_touchmove(e)}}(this)),this.search_results.on("touchend.chosen",function(t){return function(e){t.search_results_touchend(e)}}(this)),this.form_field_jq.on("chosen:updated.chosen",function(t){return function(e){t.results_update_field(e)}}(this)),this.form_field_jq.on("chosen:activate.chosen",function(t){return function(e){t.activate_field(e)}}(this)),this.form_field_jq.on("chosen:open.chosen",function(t){return function(e){t.container_mousedown(e)}}(this)),this.form_field_jq.on("chosen:close.chosen",function(t){return function(e){t.close_field(e)}}(this)),this.search_field.on("blur.chosen",function(t){return function(e){t.input_blur(e)}}(this)),this.search_field.on("keyup.chosen",function(t){return function(e){t.keyup_checker(e)}}(this)),this.search_field.on("keydown.chosen",function(t){return function(e){t.keydown_checker(e)}}(this)),this.search_field.on("focus.chosen",function(t){return function(e){t.input_focus(e)}}(this)),this.search_field.on("cut.chosen",function(t){return function(e){t.clipboard_event_checker(e)}}(this)),this.search_field.on("paste.chosen",function(t){return function(e){t.clipboard_event_checker(e)}}(this)),this.is_multiple?this.search_choices.on("click.chosen",function(t){return function(e){t.choices_click(e)}}(this)):this.container.on("click.chosen",function(t){t.preventDefault()})},r.prototype.destroy=function(){return t(this.container[0].ownerDocument).off("click.chosen",this.click_test_action),this.form_field_label.length>0&&this.form_field_label.off("click.chosen"),this.search_field[0].tabIndex&&(this.form_field_jq[0].tabIndex=this.search_field[0].tabIndex),this.container.remove(),this.form_field_jq.removeData("chosen"),this.form_field_jq.show()},r.prototype.search_field_disabled=function(){return this.is_disabled=this.form_field.disabled||this.form_field_jq.parents("fieldset").is(":disabled"),this.container.toggleClass("chosen-disabled",this.is_disabled),this.search_field[0].disabled=this.is_disabled,this.is_multiple||this.selected_item.off("focus.chosen",this.activate_field),this.is_disabled?this.close_field():this.is_multiple?void 0:this.selected_item.on("focus.chosen",this.activate_field)},r.prototype.container_mousedown=function(e){var s;if(!this.is_disabled)return!e||"mousedown"!==(s=e.type)&&"touchstart"!==s||this.results_showing||e.preventDefault(),null!=e&&t(e.target).hasClass("search-choice-close")?void 0:(this.active_field?this.is_multiple||!e||t(e.target)[0]!==this.selected_item[0]&&!t(e.target).parents("a.chosen-single").length||(e.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),t(this.container[0].ownerDocument).on("click.chosen",this.click_test_action),this.results_show()),this.activate_field())},r.prototype.container_mouseup=function(t){if("ABBR"===t.target.nodeName&&!this.is_disabled)return this.results_reset(t)},r.prototype.search_results_mousewheel=function(t){var e;if(t.originalEvent&&(e=t.originalEvent.deltaY||-t.originalEvent.wheelDelta||t.originalEvent.detail),null!=e)return t.preventDefault(),"DOMMouseScroll"===t.type&&(e*=40),this.search_results.scrollTop(e+this.search_results.scrollTop())},r.prototype.blur_test=function(t){if(!this.active_field&&this.container.hasClass("chosen-container-active"))return this.close_field()},r.prototype.close_field=function(){return t(this.container[0].ownerDocument).off("click.chosen",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chosen-container-active"),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale(),this.search_field.blur()},r.prototype.activate_field=function(){if(!this.is_disabled)return this.container.addClass("chosen-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},r.prototype.test_active_click=function(e){var s;return(s=t(e.target).closest(".chosen-container")).length&&this.container[0]===s[0]?this.active_field=!0:this.close_field()},r.prototype.results_build=function(){return this.parsing=!0,this.selected_option_count=null,this.results_data=i.select_to_array(this.form_field),this.is_multiple?this.search_choices.find("li.search-choice").remove():(this.single_set_selected_text(),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?(this.search_field[0].readOnly=!0,this.container.addClass("chosen-container-single-nosearch")):(this.search_field[0].readOnly=!1,this.container.removeClass("chosen-container-single-nosearch"))),this.update_results_content(this.results_option_build({first:!0})),this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.parsing=!1},r.prototype.result_do_highlight=function(t){var e,s,i,r,n;if(t.length){if(this.result_clear_highlight(),this.result_highlight=t,this.result_highlight.addClass("highlighted"),r=(i=parseInt(this.search_results.css("maxHeight"),10))+(n=this.search_results.scrollTop()),(e=(s=this.result_highlight.position().top+this.search_results.scrollTop())+this.result_highlight.outerHeight())>=r)return this.search_results.scrollTop(e-i>0?e-i:0);if(s0)return this.form_field_label.on("click.chosen",this.label_click_handler)},r.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices_count()<1&&!this.active_field?(this.search_field.val(this.default_text),this.search_field.addClass("default")):(this.search_field.val(""),this.search_field.removeClass("default"))},r.prototype.search_results_mouseup=function(e){var s;if((s=t(e.target).hasClass("active-result")?t(e.target):t(e.target).parents(".active-result").first()).length)return this.result_highlight=s,this.result_select(e),this.search_field.focus()},r.prototype.search_results_mouseover=function(e){var s;if(s=t(e.target).hasClass("active-result")?t(e.target):t(e.target).parents(".active-result").first())return this.result_do_highlight(s)},r.prototype.search_results_mouseout=function(e){if(t(e.target).hasClass("active-result")||t(e.target).parents(".active-result").first())return this.result_clear_highlight()},r.prototype.choice_build=function(e){var s,i,r;return s=t("
    • ",{class:"search-choice"}).html(""+this.choice_label(e)+""),e.disabled?s.addClass("search-choice-disabled"):((i=t("",{class:"search-choice-close","data-option-array-index":e.array_index})).on("click.chosen",(r=this,function(t){return r.choice_destroy_link_click(t)})),s.append(i)),this.search_container.before(s)},r.prototype.choice_destroy_link_click=function(e){if(e.preventDefault(),e.stopPropagation(),!this.is_disabled)return this.choice_destroy(t(e.target))},r.prototype.choice_destroy=function(t){if(this.result_deselect(t[0].getAttribute("data-option-array-index")))return this.active_field?this.search_field.focus():this.show_search_field_default(),this.is_multiple&&this.choices_count()>0&&this.get_search_field_value().length<1&&this.results_hide(),t.parents("li").first().remove(),this.search_field_scale()},r.prototype.results_reset=function(){if(this.reset_single_select_options(),this.form_field.options[0].selected=!0,this.single_set_selected_text(),this.show_search_field_default(),this.results_reset_cleanup(),this.trigger_form_field_change(),this.active_field)return this.results_hide()},r.prototype.results_reset_cleanup=function(){return this.current_selectedIndex=this.form_field.selectedIndex,this.selected_item.find("abbr").remove()},r.prototype.result_select=function(t){var e,s;if(this.result_highlight)return e=this.result_highlight,this.result_clear_highlight(),this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.is_multiple?e.removeClass("active-result"):this.reset_single_select_options(),e.addClass("result-selected"),(s=this.results_data[e[0].getAttribute("data-option-array-index")]).selected=!0,this.form_field.options[s.options_index].selected=!0,this.selected_option_count=null,this.is_multiple?this.choice_build(s):this.single_set_selected_text(this.choice_label(s)),this.is_multiple&&(!this.hide_results_on_select||t.metaKey||t.ctrlKey)?t.metaKey||t.ctrlKey?this.winnow_results({skip_highlight:!0}):(this.search_field.val(""),this.winnow_results()):(this.results_hide(),this.show_search_field_default()),(this.is_multiple||this.form_field.selectedIndex!==this.current_selectedIndex)&&this.trigger_form_field_change({selected:this.form_field.options[s.options_index].value}),this.current_selectedIndex=this.form_field.selectedIndex,t.preventDefault(),this.search_field_scale())},r.prototype.single_set_selected_text=function(t){return null==t&&(t=this.default_text),t===this.default_text?this.selected_item.addClass("chosen-default"):(this.single_deselect_control_build(),this.selected_item.removeClass("chosen-default")),this.selected_item.find("span").html(t)},r.prototype.result_deselect=function(t){var e;return e=this.results_data[t],!this.form_field.options[e.options_index].disabled&&(e.selected=!1,this.form_field.options[e.options_index].selected=!1,this.selected_option_count=null,this.result_clear_highlight(),this.results_showing&&this.winnow_results(),this.trigger_form_field_change({deselected:this.form_field.options[e.options_index].value}),this.search_field_scale(),!0)},r.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect)return this.selected_item.find("abbr").length||this.selected_item.find("span").first().after(''),this.selected_item.addClass("chosen-single-with-deselect")},r.prototype.get_search_field_value=function(){return this.search_field.val()},r.prototype.get_search_text=function(){return t.trim(this.get_search_field_value())},r.prototype.escape_html=function(e){return t("
      ").text(e).html()},r.prototype.winnow_results_set_highlight=function(){var t,e;if(null!=(t=(e=this.is_multiple?[]:this.search_results.find(".result-selected.active-result")).length?e.first():this.search_results.find(".active-result").first()))return this.result_do_highlight(t)},r.prototype.no_results=function(t){var e;return e=this.get_no_results_html(t),this.search_results.append(e),this.form_field_jq.trigger("chosen:no_results",{chosen:this})},r.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},r.prototype.keydown_arrow=function(){var t;return this.results_showing&&this.result_highlight?(t=this.result_highlight.nextAll("li.active-result").first())?this.result_do_highlight(t):void 0:this.results_show()},r.prototype.keyup_arrow=function(){var t;return this.results_showing||this.is_multiple?this.result_highlight?(t=this.result_highlight.prevAll("li.active-result")).length?this.result_do_highlight(t.first()):(this.choices_count()>0&&this.results_hide(),this.result_clear_highlight()):void 0:this.results_show()},r.prototype.keydown_backstroke=function(){var t;return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(t=this.search_container.siblings("li.search-choice").last()).length&&!t.hasClass("search-choice-disabled")?(this.pending_backstroke=t,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")):void 0},r.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},r.prototype.search_field_scale=function(){var e,s,i,r,n,o,h;if(this.is_multiple){for(n={position:"absolute",left:"-1000px",top:"-1000px",display:"none",whiteSpace:"pre"},s=0,i=(o=["fontSize","fontStyle","fontWeight","fontFamily","lineHeight","textTransform","letterSpacing"]).length;s").css(n)).text(this.get_search_field_value()),t("body").append(e),h=e.width()+25,e.remove(),this.container.is(":visible")&&(h=Math.min(this.container.outerWidth()-10,h)),this.search_field.width(h)}},r.prototype.trigger_form_field_change=function(t){return this.form_field_jq.trigger("input",t),this.form_field_jq.trigger("change",t)},r}()}).call(this); \ No newline at end of file diff --git a/.svn/pristine/09/09187f967bd7d5dee3da7dd322c4c8dd7331a583.svn-base b/.svn/pristine/09/09187f967bd7d5dee3da7dd322c4c8dd7331a583.svn-base deleted file mode 100644 index eddd8bf1ae971e921d903137556e8a3e28c935b6..0000000000000000000000000000000000000000 --- a/.svn/pristine/09/09187f967bd7d5dee3da7dd322c4c8dd7331a583.svn-base +++ /dev/null @@ -1,107 +0,0 @@ -/* REQUIRED for core functionality */ -.responsive-tabs__heading { display: none;} -.responsive-tabs__list__item { display: inline; cursor:pointer;} -@media (max-width: 767px) { - .responsive-tabs__list { display: none;} - .responsive-tabs__heading { display: block; cursor: pointer; } - .responsive-tabs__panel--closed-accordion-only { display: none;} -} -@media (min-width: 768px) { - .responsive-tabs__panel--closed-accordion-only { display: block !important;} -} -/* END - Required for core functionality */ -/* OPTIONAL - Basic Skin */ -.responsive-tabs-wrapper { - clear: both; - zoom: 1; -} -.responsive-tabs-wrapper:before, -.responsive-tabs-wrapper:after { - content: ""; - display: table; -} -.responsive-tabs-wrapper:after { - clear: both; -} -.responsive-tabs__heading:focus, -.responsive-tabs__list__item:focus { outline: 1px solid #ccc; } -.responsive-tabs__heading--active:focus, -.responsive-tabs__list__item--active:focus { outline: none !important;} -.responsive-tabs__list { font-size: 1.2em; margin: 2em 0 0 0; border-bottom: 1px solid #ddd; padding-top: 0; padding-left:0; padding-right:0; padding-bottom:13px; line-height: 1em;} -.responsive-tabs__list__item { background: #eee; padding: 10px 20px; margin-right: 1em; border-top-left-radius: 5px; border-top-right-radius: 5px;border: 1px solid #ddd; } -.responsive-tabs__list__item:hover {background: #efefef } -.responsive-tabs__list__item--active, -.responsive-tabs__list__item--active:hover { background: #fff; border-bottom-color: #fff;} -.responsive-tabs__panel { background:#fff; margin-top:-1px; padding:20px; border-left: 1px solid #ddd; border-right: 1px solid #ddd; border-top: 1px solid #ddd; border-bottom: 1px solid #ddd;} -@media (min-width: 768px) { - .responsive-tabs__list, .responsive-tabs__panel { - width:95%; - } -} -@media (max-width: 767px) { - .responsive-tabs__heading { - padding: 0.5em; border-radius: 5px; border: 1px solid #ccc; box-shadow: 0px 2px 3px rgba(0,0,0,0.4); - background: #ddd; - position: relative; - } - .responsive-tabs__heading:after { - content:""; - display: block; - position: absolute; - right: 20px; - top: 40%; - width: 0; - height: 0; - border-left: 10px solid transparent; - border-right: 10px solid transparent; - border-top: 10px solid #000; - } - .responsive-tabs__heading:hover, - .responsive-tabs__heading--active:hover { background-color: #efefef} - .responsive-tabs__heading--active { background: #fff;} - .responsive-tabs__heading--active:after { - border-bottom: 10px solid #000; - border-top:0; - } -} -/* END - Optional - Basic Skin */ -.option .imglink { - width:80%; - max-width:600px; -} -.option .intext { - width:60%; - max-width:400px; -} -.option select { - width:160px; -} -.option textarea { - width:80%; - max-width:600px; - min-height:180px; -} -.wrap .dashicons-admin-settings { - color: #0073aa; - font-size: 30px; - margin: 3px 15px 0 0; -} -.wrap .version { - background: #555; - color: #fff; - font-size: 12px; - margin: 0 0 0 10px; - padding: 1px 8px; - border-radius: 2px; - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); -} -.wrap .clearfix { - margin-top: 20px; - margin-left:-20px; - margin-right:-20px; - padding: 0; - /* border-top: 1px solid #e5e5e5; */ -} -.wrap .hide { - display:none!important; -} \ No newline at end of file diff --git a/.svn/pristine/09/09cad715ae5bbea495b03744567e62a84919e61e.svn-base b/.svn/pristine/09/09cad715ae5bbea495b03744567e62a84919e61e.svn-base deleted file mode 100644 index e6303501ece93c24d2a426749f96860dbe100222..0000000000000000000000000000000000000000 --- a/.svn/pristine/09/09cad715ae5bbea495b03744567e62a84919e61e.svn-base +++ /dev/null @@ -1,7713 +0,0 @@ -// Fine Uploader 5.15.5 - MIT licensed. http://fineuploader.com -(function(global) { - (function($) { - "use strict"; - var $el, pluginOptions = [ "uploaderType", "endpointType" ]; - function init(options) { - var xformedOpts = transformVariables(options || {}), newUploaderInstance = getNewUploaderInstance(xformedOpts); - uploader(newUploaderInstance); - addCallbacks(xformedOpts, newUploaderInstance); - return $el; - } - function getNewUploaderInstance(params) { - var uploaderType = pluginOption("uploaderType"), namespace = pluginOption("endpointType"); - if (uploaderType) { - uploaderType = uploaderType.charAt(0).toUpperCase() + uploaderType.slice(1).toLowerCase(); - if (namespace) { - return new qq[namespace]["FineUploader" + uploaderType](params); - } - return new qq["FineUploader" + uploaderType](params); - } else { - if (namespace) { - return new qq[namespace].FineUploader(params); - } - return new qq.FineUploader(params); - } - } - function dataStore(key, val) { - var data = $el.data("fineuploader"); - if (val) { - if (data === undefined) { - data = {}; - } - data[key] = val; - $el.data("fineuploader", data); - } else { - if (data === undefined) { - return null; - } - return data[key]; - } - } - function uploader(instanceToStore) { - return dataStore("uploader", instanceToStore); - } - function pluginOption(option, optionVal) { - return dataStore(option, optionVal); - } - function addCallbacks(transformedOpts, newUploaderInstance) { - var callbacks = transformedOpts.callbacks = {}; - $.each(newUploaderInstance._options.callbacks, function(prop, nonJqueryCallback) { - var name, callbackEventTarget; - name = /^on(\w+)/.exec(prop)[1]; - name = name.substring(0, 1).toLowerCase() + name.substring(1); - callbackEventTarget = $el; - callbacks[prop] = function() { - var originalArgs = Array.prototype.slice.call(arguments), transformedArgs = [], nonJqueryCallbackRetVal, jqueryEventCallbackRetVal; - $.each(originalArgs, function(idx, arg) { - transformedArgs.push(maybeWrapInJquery(arg)); - }); - nonJqueryCallbackRetVal = nonJqueryCallback.apply(this, originalArgs); - try { - jqueryEventCallbackRetVal = callbackEventTarget.triggerHandler(name, transformedArgs); - } catch (error) { - qq.log("Caught error in Fine Uploader jQuery event handler: " + error.message, "error"); - } - if (nonJqueryCallbackRetVal != null) { - return nonJqueryCallbackRetVal; - } - return jqueryEventCallbackRetVal; - }; - }); - newUploaderInstance._options.callbacks = callbacks; - } - function transformVariables(source, dest) { - var xformed, arrayVals; - if (dest === undefined) { - if (source.uploaderType !== "basic") { - xformed = { - element: $el[0] - }; - } else { - xformed = {}; - } - } else { - xformed = dest; - } - $.each(source, function(prop, val) { - if ($.inArray(prop, pluginOptions) >= 0) { - pluginOption(prop, val); - } else if (val instanceof $) { - xformed[prop] = val[0]; - } else if ($.isPlainObject(val)) { - xformed[prop] = {}; - transformVariables(val, xformed[prop]); - } else if ($.isArray(val)) { - arrayVals = []; - $.each(val, function(idx, arrayVal) { - var arrayObjDest = {}; - if (arrayVal instanceof $) { - $.merge(arrayVals, arrayVal); - } else if ($.isPlainObject(arrayVal)) { - transformVariables(arrayVal, arrayObjDest); - arrayVals.push(arrayObjDest); - } else { - arrayVals.push(arrayVal); - } - }); - xformed[prop] = arrayVals; - } else { - xformed[prop] = val; - } - }); - if (dest === undefined) { - return xformed; - } - } - function isValidCommand(command) { - return $.type(command) === "string" && !command.match(/^_/) && uploader()[command] !== undefined; - } - function delegateCommand(command) { - var xformedArgs = [], origArgs = Array.prototype.slice.call(arguments, 1), retVal; - transformVariables(origArgs, xformedArgs); - retVal = uploader()[command].apply(uploader(), xformedArgs); - return maybeWrapInJquery(retVal); - } - function maybeWrapInJquery(val) { - var transformedVal = val; - if (val != null && typeof val === "object" && (val.nodeType === 1 || val.nodeType === 9) && val.cloneNode) { - transformedVal = $(val); - } - return transformedVal; - } - $.fn.fineUploader = function(optionsOrCommand) { - var self = this, selfArgs = arguments, retVals = []; - this.each(function(index, el) { - $el = $(el); - if (uploader() && isValidCommand(optionsOrCommand)) { - retVals.push(delegateCommand.apply(self, selfArgs)); - if (self.length === 1) { - return false; - } - } else if (typeof optionsOrCommand === "object" || !optionsOrCommand) { - init.apply(self, selfArgs); - } else { - $.error("Method " + optionsOrCommand + " does not exist on jQuery.fineUploader"); - } - }); - if (retVals.length === 1) { - return retVals[0]; - } else if (retVals.length > 1) { - return retVals; - } - return this; - }; - })(jQuery); - (function($) { - "use strict"; - var rootDataKey = "fineUploaderDnd", $el; - function init(options) { - if (!options) { - options = {}; - } - options.dropZoneElements = [ $el ]; - var xformedOpts = transformVariables(options); - addCallbacks(xformedOpts); - dnd(new qq.DragAndDrop(xformedOpts)); - return $el; - } - function dataStore(key, val) { - var data = $el.data(rootDataKey); - if (val) { - if (data === undefined) { - data = {}; - } - data[key] = val; - $el.data(rootDataKey, data); - } else { - if (data === undefined) { - return null; - } - return data[key]; - } - } - function dnd(instanceToStore) { - return dataStore("dndInstance", instanceToStore); - } - function addCallbacks(transformedOpts) { - var callbacks = transformedOpts.callbacks = {}; - $.each(new qq.DragAndDrop.callbacks(), function(prop, func) { - var name = prop, $callbackEl; - $callbackEl = $el; - callbacks[prop] = function() { - var args = Array.prototype.slice.call(arguments), jqueryHandlerResult = $callbackEl.triggerHandler(name, args); - return jqueryHandlerResult; - }; - }); - } - function transformVariables(source, dest) { - var xformed, arrayVals; - if (dest === undefined) { - xformed = {}; - } else { - xformed = dest; - } - $.each(source, function(prop, val) { - if (val instanceof $) { - xformed[prop] = val[0]; - } else if ($.isPlainObject(val)) { - xformed[prop] = {}; - transformVariables(val, xformed[prop]); - } else if ($.isArray(val)) { - arrayVals = []; - $.each(val, function(idx, arrayVal) { - if (arrayVal instanceof $) { - $.merge(arrayVals, arrayVal); - } else { - arrayVals.push(arrayVal); - } - }); - xformed[prop] = arrayVals; - } else { - xformed[prop] = val; - } - }); - if (dest === undefined) { - return xformed; - } - } - function isValidCommand(command) { - return $.type(command) === "string" && command === "dispose" && dnd()[command] !== undefined; - } - function delegateCommand(command) { - var xformedArgs = [], origArgs = Array.prototype.slice.call(arguments, 1); - transformVariables(origArgs, xformedArgs); - return dnd()[command].apply(dnd(), xformedArgs); - } - $.fn.fineUploaderDnd = function(optionsOrCommand) { - var self = this, selfArgs = arguments, retVals = []; - this.each(function(index, el) { - $el = $(el); - if (dnd() && isValidCommand(optionsOrCommand)) { - retVals.push(delegateCommand.apply(self, selfArgs)); - if (self.length === 1) { - return false; - } - } else if (typeof optionsOrCommand === "object" || !optionsOrCommand) { - init.apply(self, selfArgs); - } else { - $.error("Method " + optionsOrCommand + " does not exist in Fine Uploader's DnD module."); - } - }); - if (retVals.length === 1) { - return retVals[0]; - } else if (retVals.length > 1) { - return retVals; - } - return this; - }; - })(jQuery); - var qq = function(element) { - "use strict"; - return { - hide: function() { - element.style.display = "none"; - return this; - }, - attach: function(type, fn) { - if (element.addEventListener) { - element.addEventListener(type, fn, false); - } else if (element.attachEvent) { - element.attachEvent("on" + type, fn); - } - return function() { - qq(element).detach(type, fn); - }; - }, - detach: function(type, fn) { - if (element.removeEventListener) { - element.removeEventListener(type, fn, false); - } else if (element.attachEvent) { - element.detachEvent("on" + type, fn); - } - return this; - }, - contains: function(descendant) { - if (!descendant) { - return false; - } - if (element === descendant) { - return true; - } - if (element.contains) { - return element.contains(descendant); - } else { - return !!(descendant.compareDocumentPosition(element) & 8); - } - }, - insertBefore: function(elementB) { - elementB.parentNode.insertBefore(element, elementB); - return this; - }, - remove: function() { - element.parentNode.removeChild(element); - return this; - }, - css: function(styles) { - if (element.style == null) { - throw new qq.Error("Can't apply style to node as it is not on the HTMLElement prototype chain!"); - } - if (styles.opacity != null) { - if (typeof element.style.opacity !== "string" && typeof element.filters !== "undefined") { - styles.filter = "alpha(opacity=" + Math.round(100 * styles.opacity) + ")"; - } - } - qq.extend(element.style, styles); - return this; - }, - hasClass: function(name, considerParent) { - var re = new RegExp("(^| )" + name + "( |$)"); - return re.test(element.className) || !!(considerParent && re.test(element.parentNode.className)); - }, - addClass: function(name) { - if (!qq(element).hasClass(name)) { - element.className += " " + name; - } - return this; - }, - removeClass: function(name) { - var re = new RegExp("(^| )" + name + "( |$)"); - element.className = element.className.replace(re, " ").replace(/^\s+|\s+$/g, ""); - return this; - }, - getByClass: function(className, first) { - var candidates, result = []; - if (first && element.querySelector) { - return element.querySelector("." + className); - } else if (element.querySelectorAll) { - return element.querySelectorAll("." + className); - } - candidates = element.getElementsByTagName("*"); - qq.each(candidates, function(idx, val) { - if (qq(val).hasClass(className)) { - result.push(val); - } - }); - return first ? result[0] : result; - }, - getFirstByClass: function(className) { - return qq(element).getByClass(className, true); - }, - children: function() { - var children = [], child = element.firstChild; - while (child) { - if (child.nodeType === 1) { - children.push(child); - } - child = child.nextSibling; - } - return children; - }, - setText: function(text) { - element.innerText = text; - element.textContent = text; - return this; - }, - clearText: function() { - return qq(element).setText(""); - }, - hasAttribute: function(attrName) { - var attrVal; - if (element.hasAttribute) { - if (!element.hasAttribute(attrName)) { - return false; - } - return /^false$/i.exec(element.getAttribute(attrName)) == null; - } else { - attrVal = element[attrName]; - if (attrVal === undefined) { - return false; - } - return /^false$/i.exec(attrVal) == null; - } - } - }; - }; - (function() { - "use strict"; - qq.canvasToBlob = function(canvas, mime, quality) { - return qq.dataUriToBlob(canvas.toDataURL(mime, quality)); - }; - qq.dataUriToBlob = function(dataUri) { - var arrayBuffer, byteString, createBlob = function(data, mime) { - var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder, blobBuilder = BlobBuilder && new BlobBuilder(); - if (blobBuilder) { - blobBuilder.append(data); - return blobBuilder.getBlob(mime); - } else { - return new Blob([ data ], { - type: mime - }); - } - }, intArray, mimeString; - if (dataUri.split(",")[0].indexOf("base64") >= 0) { - byteString = atob(dataUri.split(",")[1]); - } else { - byteString = decodeURI(dataUri.split(",")[1]); - } - mimeString = dataUri.split(",")[0].split(":")[1].split(";")[0]; - arrayBuffer = new ArrayBuffer(byteString.length); - intArray = new Uint8Array(arrayBuffer); - qq.each(byteString, function(idx, character) { - intArray[idx] = character.charCodeAt(0); - }); - return createBlob(arrayBuffer, mimeString); - }; - qq.log = function(message, level) { - if (window.console) { - if (!level || level === "info") { - window.console.log(message); - } else { - if (window.console[level]) { - window.console[level](message); - } else { - window.console.log("<" + level + "> " + message); - } - } - } - }; - qq.isObject = function(variable) { - return variable && !variable.nodeType && Object.prototype.toString.call(variable) === "[object Object]"; - }; - qq.isFunction = function(variable) { - return typeof variable === "function"; - }; - qq.isArray = function(value) { - return Object.prototype.toString.call(value) === "[object Array]" || value && window.ArrayBuffer && value.buffer && value.buffer.constructor === ArrayBuffer; - }; - qq.isItemList = function(maybeItemList) { - return Object.prototype.toString.call(maybeItemList) === "[object DataTransferItemList]"; - }; - qq.isNodeList = function(maybeNodeList) { - return Object.prototype.toString.call(maybeNodeList) === "[object NodeList]" || maybeNodeList.item && maybeNodeList.namedItem; - }; - qq.isString = function(maybeString) { - return Object.prototype.toString.call(maybeString) === "[object String]"; - }; - qq.trimStr = function(string) { - if (String.prototype.trim) { - return string.trim(); - } - return string.replace(/^\s+|\s+$/g, ""); - }; - qq.format = function(str) { - var args = Array.prototype.slice.call(arguments, 1), newStr = str, nextIdxToReplace = newStr.indexOf("{}"); - qq.each(args, function(idx, val) { - var strBefore = newStr.substring(0, nextIdxToReplace), strAfter = newStr.substring(nextIdxToReplace + 2); - newStr = strBefore + val + strAfter; - nextIdxToReplace = newStr.indexOf("{}", nextIdxToReplace + val.length); - if (nextIdxToReplace < 0) { - return false; - } - }); - return newStr; - }; - qq.isFile = function(maybeFile) { - return window.File && Object.prototype.toString.call(maybeFile) === "[object File]"; - }; - qq.isFileList = function(maybeFileList) { - return window.FileList && Object.prototype.toString.call(maybeFileList) === "[object FileList]"; - }; - qq.isFileOrInput = function(maybeFileOrInput) { - return qq.isFile(maybeFileOrInput) || qq.isInput(maybeFileOrInput); - }; - qq.isInput = function(maybeInput, notFile) { - var evaluateType = function(type) { - var normalizedType = type.toLowerCase(); - if (notFile) { - return normalizedType !== "file"; - } - return normalizedType === "file"; - }; - if (window.HTMLInputElement) { - if (Object.prototype.toString.call(maybeInput) === "[object HTMLInputElement]") { - if (maybeInput.type && evaluateType(maybeInput.type)) { - return true; - } - } - } - if (maybeInput.tagName) { - if (maybeInput.tagName.toLowerCase() === "input") { - if (maybeInput.type && evaluateType(maybeInput.type)) { - return true; - } - } - } - return false; - }; - qq.isBlob = function(maybeBlob) { - if (window.Blob && Object.prototype.toString.call(maybeBlob) === "[object Blob]") { - return true; - } - }; - qq.isXhrUploadSupported = function() { - var input = document.createElement("input"); - input.type = "file"; - return input.multiple !== undefined && typeof File !== "undefined" && typeof FormData !== "undefined" && typeof qq.createXhrInstance().upload !== "undefined"; - }; - qq.createXhrInstance = function() { - if (window.XMLHttpRequest) { - return new XMLHttpRequest(); - } - try { - return new ActiveXObject("MSXML2.XMLHTTP.3.0"); - } catch (error) { - qq.log("Neither XHR or ActiveX are supported!", "error"); - return null; - } - }; - qq.isFolderDropSupported = function(dataTransfer) { - return dataTransfer.items && dataTransfer.items.length > 0 && dataTransfer.items[0].webkitGetAsEntry; - }; - qq.isFileChunkingSupported = function() { - return !qq.androidStock() && qq.isXhrUploadSupported() && (File.prototype.slice !== undefined || File.prototype.webkitSlice !== undefined || File.prototype.mozSlice !== undefined); - }; - qq.sliceBlob = function(fileOrBlob, start, end) { - var slicer = fileOrBlob.slice || fileOrBlob.mozSlice || fileOrBlob.webkitSlice; - return slicer.call(fileOrBlob, start, end); - }; - qq.arrayBufferToHex = function(buffer) { - var bytesAsHex = "", bytes = new Uint8Array(buffer); - qq.each(bytes, function(idx, byt) { - var byteAsHexStr = byt.toString(16); - if (byteAsHexStr.length < 2) { - byteAsHexStr = "0" + byteAsHexStr; - } - bytesAsHex += byteAsHexStr; - }); - return bytesAsHex; - }; - qq.readBlobToHex = function(blob, startOffset, length) { - var initialBlob = qq.sliceBlob(blob, startOffset, startOffset + length), fileReader = new FileReader(), promise = new qq.Promise(); - fileReader.onload = function() { - promise.success(qq.arrayBufferToHex(fileReader.result)); - }; - fileReader.onerror = promise.failure; - fileReader.readAsArrayBuffer(initialBlob); - return promise; - }; - qq.extend = function(first, second, extendNested) { - qq.each(second, function(prop, val) { - if (extendNested && qq.isObject(val)) { - if (first[prop] === undefined) { - first[prop] = {}; - } - qq.extend(first[prop], val, true); - } else { - first[prop] = val; - } - }); - return first; - }; - qq.override = function(target, sourceFn) { - var super_ = {}, source = sourceFn(super_); - qq.each(source, function(srcPropName, srcPropVal) { - if (target[srcPropName] !== undefined) { - super_[srcPropName] = target[srcPropName]; - } - target[srcPropName] = srcPropVal; - }); - return target; - }; - qq.indexOf = function(arr, elt, from) { - if (arr.indexOf) { - return arr.indexOf(elt, from); - } - from = from || 0; - var len = arr.length; - if (from < 0) { - from += len; - } - for (;from < len; from += 1) { - if (arr.hasOwnProperty(from) && arr[from] === elt) { - return from; - } - } - return -1; - }; - qq.getUniqueId = function() { - return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(c) { - var r = Math.random() * 16 | 0, v = c == "x" ? r : r & 3 | 8; - return v.toString(16); - }); - }; - qq.ie = function() { - return navigator.userAgent.indexOf("MSIE") !== -1 || navigator.userAgent.indexOf("Trident") !== -1; - }; - qq.ie7 = function() { - return navigator.userAgent.indexOf("MSIE 7") !== -1; - }; - qq.ie8 = function() { - return navigator.userAgent.indexOf("MSIE 8") !== -1; - }; - qq.ie10 = function() { - return navigator.userAgent.indexOf("MSIE 10") !== -1; - }; - qq.ie11 = function() { - return qq.ie() && navigator.userAgent.indexOf("rv:11") !== -1; - }; - qq.edge = function() { - return navigator.userAgent.indexOf("Edge") >= 0; - }; - qq.safari = function() { - return navigator.vendor !== undefined && navigator.vendor.indexOf("Apple") !== -1; - }; - qq.chrome = function() { - return navigator.vendor !== undefined && navigator.vendor.indexOf("Google") !== -1; - }; - qq.opera = function() { - return navigator.vendor !== undefined && navigator.vendor.indexOf("Opera") !== -1; - }; - qq.firefox = function() { - return !qq.edge() && !qq.ie11() && navigator.userAgent.indexOf("Mozilla") !== -1 && navigator.vendor !== undefined && navigator.vendor === ""; - }; - qq.windows = function() { - return navigator.platform === "Win32"; - }; - qq.android = function() { - return navigator.userAgent.toLowerCase().indexOf("android") !== -1; - }; - qq.androidStock = function() { - return qq.android() && navigator.userAgent.toLowerCase().indexOf("chrome") < 0; - }; - qq.ios6 = function() { - return qq.ios() && navigator.userAgent.indexOf(" OS 6_") !== -1; - }; - qq.ios7 = function() { - return qq.ios() && navigator.userAgent.indexOf(" OS 7_") !== -1; - }; - qq.ios8 = function() { - return qq.ios() && navigator.userAgent.indexOf(" OS 8_") !== -1; - }; - qq.ios800 = function() { - return qq.ios() && navigator.userAgent.indexOf(" OS 8_0 ") !== -1; - }; - qq.ios = function() { - return navigator.userAgent.indexOf("iPad") !== -1 || navigator.userAgent.indexOf("iPod") !== -1 || navigator.userAgent.indexOf("iPhone") !== -1; - }; - qq.iosChrome = function() { - return qq.ios() && navigator.userAgent.indexOf("CriOS") !== -1; - }; - qq.iosSafari = function() { - return qq.ios() && !qq.iosChrome() && navigator.userAgent.indexOf("Safari") !== -1; - }; - qq.iosSafariWebView = function() { - return qq.ios() && !qq.iosChrome() && !qq.iosSafari(); - }; - qq.preventDefault = function(e) { - if (e.preventDefault) { - e.preventDefault(); - } else { - e.returnValue = false; - } - }; - qq.toElement = function() { - var div = document.createElement("div"); - return function(html) { - div.innerHTML = html; - var element = div.firstChild; - div.removeChild(element); - return element; - }; - }(); - qq.each = function(iterableItem, callback) { - var keyOrIndex, retVal; - if (iterableItem) { - if (window.Storage && iterableItem.constructor === window.Storage) { - for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) { - retVal = callback(iterableItem.key(keyOrIndex), iterableItem.getItem(iterableItem.key(keyOrIndex))); - if (retVal === false) { - break; - } - } - } else if (qq.isArray(iterableItem) || qq.isItemList(iterableItem) || qq.isNodeList(iterableItem)) { - for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) { - retVal = callback(keyOrIndex, iterableItem[keyOrIndex]); - if (retVal === false) { - break; - } - } - } else if (qq.isString(iterableItem)) { - for (keyOrIndex = 0; keyOrIndex < iterableItem.length; keyOrIndex++) { - retVal = callback(keyOrIndex, iterableItem.charAt(keyOrIndex)); - if (retVal === false) { - break; - } - } - } else { - for (keyOrIndex in iterableItem) { - if (Object.prototype.hasOwnProperty.call(iterableItem, keyOrIndex)) { - retVal = callback(keyOrIndex, iterableItem[keyOrIndex]); - if (retVal === false) { - break; - } - } - } - } - } - }; - qq.bind = function(oldFunc, context) { - if (qq.isFunction(oldFunc)) { - var args = Array.prototype.slice.call(arguments, 2); - return function() { - var newArgs = qq.extend([], args); - if (arguments.length) { - newArgs = newArgs.concat(Array.prototype.slice.call(arguments)); - } - return oldFunc.apply(context, newArgs); - }; - } - throw new Error("first parameter must be a function!"); - }; - qq.obj2url = function(obj, temp, prefixDone) { - var uristrings = [], prefix = "&", add = function(nextObj, i) { - var nextTemp = temp ? /\[\]$/.test(temp) ? temp : temp + "[" + i + "]" : i; - if (nextTemp !== "undefined" && i !== "undefined") { - uristrings.push(typeof nextObj === "object" ? qq.obj2url(nextObj, nextTemp, true) : Object.prototype.toString.call(nextObj) === "[object Function]" ? encodeURIComponent(nextTemp) + "=" + encodeURIComponent(nextObj()) : encodeURIComponent(nextTemp) + "=" + encodeURIComponent(nextObj)); - } - }; - if (!prefixDone && temp) { - prefix = /\?/.test(temp) ? /\?$/.test(temp) ? "" : "&" : "?"; - uristrings.push(temp); - uristrings.push(qq.obj2url(obj)); - } else if (Object.prototype.toString.call(obj) === "[object Array]" && typeof obj !== "undefined") { - qq.each(obj, function(idx, val) { - add(val, idx); - }); - } else if (typeof obj !== "undefined" && obj !== null && typeof obj === "object") { - qq.each(obj, function(prop, val) { - add(val, prop); - }); - } else { - uristrings.push(encodeURIComponent(temp) + "=" + encodeURIComponent(obj)); - } - if (temp) { - return uristrings.join(prefix); - } else { - return uristrings.join(prefix).replace(/^&/, "").replace(/%20/g, "+"); - } - }; - qq.obj2FormData = function(obj, formData, arrayKeyName) { - if (!formData) { - formData = new FormData(); - } - qq.each(obj, function(key, val) { - key = arrayKeyName ? arrayKeyName + "[" + key + "]" : key; - if (qq.isObject(val)) { - qq.obj2FormData(val, formData, key); - } else if (qq.isFunction(val)) { - formData.append(key, val()); - } else { - formData.append(key, val); - } - }); - return formData; - }; - qq.obj2Inputs = function(obj, form) { - var input; - if (!form) { - form = document.createElement("form"); - } - qq.obj2FormData(obj, { - append: function(key, val) { - input = document.createElement("input"); - input.setAttribute("name", key); - input.setAttribute("value", val); - form.appendChild(input); - } - }); - return form; - }; - qq.parseJson = function(json) { - if (window.JSON && qq.isFunction(JSON.parse)) { - return JSON.parse(json); - } else { - return eval("(" + json + ")"); - } - }; - qq.getExtension = function(filename) { - var extIdx = filename.lastIndexOf(".") + 1; - if (extIdx > 0) { - return filename.substr(extIdx, filename.length - extIdx); - } - }; - qq.getFilename = function(blobOrFileInput) { - if (qq.isInput(blobOrFileInput)) { - return blobOrFileInput.value.replace(/.*(\/|\\)/, ""); - } else if (qq.isFile(blobOrFileInput)) { - if (blobOrFileInput.fileName !== null && blobOrFileInput.fileName !== undefined) { - return blobOrFileInput.fileName; - } - } - return blobOrFileInput.name; - }; - qq.DisposeSupport = function() { - var disposers = []; - return { - dispose: function() { - var disposer; - do { - disposer = disposers.shift(); - if (disposer) { - disposer(); - } - } while (disposer); - }, - attach: function() { - var args = arguments; - this.addDisposer(qq(args[0]).attach.apply(this, Array.prototype.slice.call(arguments, 1))); - }, - addDisposer: function(disposeFunction) { - disposers.push(disposeFunction); - } - }; - }; - })(); - (function() { - "use strict"; - if (typeof define === "function" && define.amd) { - define(function() { - return qq; - }); - } else if (typeof module !== "undefined" && module.exports) { - module.exports = qq; - } else { - global.qq = qq; - } - })(); - (function() { - "use strict"; - qq.Error = function(message) { - this.message = "[Fine Uploader " + qq.version + "] " + message; - }; - qq.Error.prototype = new Error(); - })(); - qq.version = "5.15.5"; - qq.supportedFeatures = function() { - "use strict"; - var supportsUploading, supportsUploadingBlobs, supportsFileDrop, supportsAjaxFileUploading, supportsFolderDrop, supportsChunking, supportsResume, supportsUploadViaPaste, supportsUploadCors, supportsDeleteFileXdr, supportsDeleteFileCorsXhr, supportsDeleteFileCors, supportsFolderSelection, supportsImagePreviews, supportsUploadProgress; - function testSupportsFileInputElement() { - var supported = true, tempInput; - try { - tempInput = document.createElement("input"); - tempInput.type = "file"; - qq(tempInput).hide(); - if (tempInput.disabled) { - supported = false; - } - } catch (ex) { - supported = false; - } - return supported; - } - function isChrome21OrHigher() { - return (qq.chrome() || qq.opera()) && navigator.userAgent.match(/Chrome\/[2][1-9]|Chrome\/[3-9][0-9]/) !== undefined; - } - function isChrome14OrHigher() { - return (qq.chrome() || qq.opera()) && navigator.userAgent.match(/Chrome\/[1][4-9]|Chrome\/[2-9][0-9]/) !== undefined; - } - function isCrossOriginXhrSupported() { - if (window.XMLHttpRequest) { - var xhr = qq.createXhrInstance(); - return xhr.withCredentials !== undefined; - } - return false; - } - function isXdrSupported() { - return window.XDomainRequest !== undefined; - } - function isCrossOriginAjaxSupported() { - if (isCrossOriginXhrSupported()) { - return true; - } - return isXdrSupported(); - } - function isFolderSelectionSupported() { - return document.createElement("input").webkitdirectory !== undefined; - } - function isLocalStorageSupported() { - try { - return !!window.localStorage && qq.isFunction(window.localStorage.setItem); - } catch (error) { - return false; - } - } - function isDragAndDropSupported() { - var span = document.createElement("span"); - return ("draggable" in span || "ondragstart" in span && "ondrop" in span) && !qq.android() && !qq.ios(); - } - supportsUploading = testSupportsFileInputElement(); - supportsAjaxFileUploading = supportsUploading && qq.isXhrUploadSupported(); - supportsUploadingBlobs = supportsAjaxFileUploading && !qq.androidStock(); - supportsFileDrop = supportsAjaxFileUploading && isDragAndDropSupported(); - supportsFolderDrop = supportsFileDrop && isChrome21OrHigher(); - supportsChunking = supportsAjaxFileUploading && qq.isFileChunkingSupported(); - supportsResume = supportsAjaxFileUploading && supportsChunking && isLocalStorageSupported(); - supportsUploadViaPaste = supportsAjaxFileUploading && isChrome14OrHigher(); - supportsUploadCors = supportsUploading && (window.postMessage !== undefined || supportsAjaxFileUploading); - supportsDeleteFileCorsXhr = isCrossOriginXhrSupported(); - supportsDeleteFileXdr = isXdrSupported(); - supportsDeleteFileCors = isCrossOriginAjaxSupported(); - supportsFolderSelection = isFolderSelectionSupported(); - supportsImagePreviews = supportsAjaxFileUploading && window.FileReader !== undefined; - supportsUploadProgress = function() { - if (supportsAjaxFileUploading) { - return !qq.androidStock() && !qq.iosChrome(); - } - return false; - }(); - return { - ajaxUploading: supportsAjaxFileUploading, - blobUploading: supportsUploadingBlobs, - canDetermineSize: supportsAjaxFileUploading, - chunking: supportsChunking, - deleteFileCors: supportsDeleteFileCors, - deleteFileCorsXdr: supportsDeleteFileXdr, - deleteFileCorsXhr: supportsDeleteFileCorsXhr, - dialogElement: !!window.HTMLDialogElement, - fileDrop: supportsFileDrop, - folderDrop: supportsFolderDrop, - folderSelection: supportsFolderSelection, - imagePreviews: supportsImagePreviews, - imageValidation: supportsImagePreviews, - itemSizeValidation: supportsAjaxFileUploading, - pause: supportsChunking, - progressBar: supportsUploadProgress, - resume: supportsResume, - scaling: supportsImagePreviews && supportsUploadingBlobs, - tiffPreviews: qq.safari(), - unlimitedScaledImageSize: !qq.ios(), - uploading: supportsUploading, - uploadCors: supportsUploadCors, - uploadCustomHeaders: supportsAjaxFileUploading, - uploadNonMultipart: supportsAjaxFileUploading, - uploadViaPaste: supportsUploadViaPaste - }; - }(); - qq.isGenericPromise = function(maybePromise) { - "use strict"; - return !!(maybePromise && maybePromise.then && qq.isFunction(maybePromise.then)); - }; - qq.Promise = function() { - "use strict"; - var successArgs, failureArgs, successCallbacks = [], failureCallbacks = [], doneCallbacks = [], state = 0; - qq.extend(this, { - then: function(onSuccess, onFailure) { - if (state === 0) { - if (onSuccess) { - successCallbacks.push(onSuccess); - } - if (onFailure) { - failureCallbacks.push(onFailure); - } - } else if (state === -1) { - onFailure && onFailure.apply(null, failureArgs); - } else if (onSuccess) { - onSuccess.apply(null, successArgs); - } - return this; - }, - done: function(callback) { - if (state === 0) { - doneCallbacks.push(callback); - } else { - callback.apply(null, failureArgs === undefined ? successArgs : failureArgs); - } - return this; - }, - success: function() { - state = 1; - successArgs = arguments; - if (successCallbacks.length) { - qq.each(successCallbacks, function(idx, callback) { - callback.apply(null, successArgs); - }); - } - if (doneCallbacks.length) { - qq.each(doneCallbacks, function(idx, callback) { - callback.apply(null, successArgs); - }); - } - return this; - }, - failure: function() { - state = -1; - failureArgs = arguments; - if (failureCallbacks.length) { - qq.each(failureCallbacks, function(idx, callback) { - callback.apply(null, failureArgs); - }); - } - if (doneCallbacks.length) { - qq.each(doneCallbacks, function(idx, callback) { - callback.apply(null, failureArgs); - }); - } - return this; - } - }); - }; - qq.BlobProxy = function(referenceBlob, onCreate) { - "use strict"; - qq.extend(this, { - referenceBlob: referenceBlob, - create: function() { - return onCreate(referenceBlob); - } - }); - }; - qq.UploadButton = function(o) { - "use strict"; - var self = this, disposeSupport = new qq.DisposeSupport(), options = { - acceptFiles: null, - element: null, - focusClass: "qq-upload-button-focus", - folders: false, - hoverClass: "qq-upload-button-hover", - ios8BrowserCrashWorkaround: false, - multiple: false, - name: "qqfile", - onChange: function(input) {}, - title: null - }, input, buttonId; - qq.extend(options, o); - buttonId = qq.getUniqueId(); - function createInput() { - var input = document.createElement("input"); - input.setAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME, buttonId); - input.setAttribute("title", options.title); - self.setMultiple(options.multiple, input); - if (options.folders && qq.supportedFeatures.folderSelection) { - input.setAttribute("webkitdirectory", ""); - } - if (options.acceptFiles) { - input.setAttribute("accept", options.acceptFiles); - } - input.setAttribute("type", "file"); - input.setAttribute("name", options.name); - qq(input).css({ - position: "absolute", - right: 0, - top: 0, - fontFamily: "Arial", - fontSize: qq.ie() && !qq.ie8() ? "3500px" : "118px", - margin: 0, - padding: 0, - cursor: "pointer", - opacity: 0 - }); - !qq.ie7() && qq(input).css({ - height: "100%" - }); - options.element.appendChild(input); - disposeSupport.attach(input, "change", function() { - options.onChange(input); - }); - disposeSupport.attach(input, "mouseover", function() { - qq(options.element).addClass(options.hoverClass); - }); - disposeSupport.attach(input, "mouseout", function() { - qq(options.element).removeClass(options.hoverClass); - }); - disposeSupport.attach(input, "focus", function() { - qq(options.element).addClass(options.focusClass); - }); - disposeSupport.attach(input, "blur", function() { - qq(options.element).removeClass(options.focusClass); - }); - return input; - } - qq(options.element).css({ - position: "relative", - overflow: "hidden", - direction: "ltr" - }); - qq.extend(this, { - getInput: function() { - return input; - }, - getButtonId: function() { - return buttonId; - }, - setMultiple: function(isMultiple, optInput) { - var input = optInput || this.getInput(); - if (options.ios8BrowserCrashWorkaround && qq.ios8() && (qq.iosChrome() || qq.iosSafariWebView())) { - input.setAttribute("multiple", ""); - } else { - if (isMultiple) { - input.setAttribute("multiple", ""); - } else { - input.removeAttribute("multiple"); - } - } - }, - setAcceptFiles: function(acceptFiles) { - if (acceptFiles !== options.acceptFiles) { - input.setAttribute("accept", acceptFiles); - } - }, - reset: function() { - if (input.parentNode) { - qq(input).remove(); - } - qq(options.element).removeClass(options.focusClass); - input = null; - input = createInput(); - } - }); - input = createInput(); - }; - qq.UploadButton.BUTTON_ID_ATTR_NAME = "qq-button-id"; - qq.UploadData = function(uploaderProxy) { - "use strict"; - var data = [], byUuid = {}, byStatus = {}, byProxyGroupId = {}, byBatchId = {}; - function getDataByIds(idOrIds) { - if (qq.isArray(idOrIds)) { - var entries = []; - qq.each(idOrIds, function(idx, id) { - entries.push(data[id]); - }); - return entries; - } - return data[idOrIds]; - } - function getDataByUuids(uuids) { - if (qq.isArray(uuids)) { - var entries = []; - qq.each(uuids, function(idx, uuid) { - entries.push(data[byUuid[uuid]]); - }); - return entries; - } - return data[byUuid[uuids]]; - } - function getDataByStatus(status) { - var statusResults = [], statuses = [].concat(status); - qq.each(statuses, function(index, statusEnum) { - var statusResultIndexes = byStatus[statusEnum]; - if (statusResultIndexes !== undefined) { - qq.each(statusResultIndexes, function(i, dataIndex) { - statusResults.push(data[dataIndex]); - }); - } - }); - return statusResults; - } - qq.extend(this, { - addFile: function(spec) { - var status = spec.status || qq.status.SUBMITTING, id = data.push({ - name: spec.name, - originalName: spec.name, - uuid: spec.uuid, - size: spec.size == null ? -1 : spec.size, - status: status - }) - 1; - if (spec.batchId) { - data[id].batchId = spec.batchId; - if (byBatchId[spec.batchId] === undefined) { - byBatchId[spec.batchId] = []; - } - byBatchId[spec.batchId].push(id); - } - if (spec.proxyGroupId) { - data[id].proxyGroupId = spec.proxyGroupId; - if (byProxyGroupId[spec.proxyGroupId] === undefined) { - byProxyGroupId[spec.proxyGroupId] = []; - } - byProxyGroupId[spec.proxyGroupId].push(id); - } - data[id].id = id; - byUuid[spec.uuid] = id; - if (byStatus[status] === undefined) { - byStatus[status] = []; - } - byStatus[status].push(id); - spec.onBeforeStatusChange && spec.onBeforeStatusChange(id); - uploaderProxy.onStatusChange(id, null, status); - return id; - }, - retrieve: function(optionalFilter) { - if (qq.isObject(optionalFilter) && data.length) { - if (optionalFilter.id !== undefined) { - return getDataByIds(optionalFilter.id); - } else if (optionalFilter.uuid !== undefined) { - return getDataByUuids(optionalFilter.uuid); - } else if (optionalFilter.status) { - return getDataByStatus(optionalFilter.status); - } - } else { - return qq.extend([], data, true); - } - }, - reset: function() { - data = []; - byUuid = {}; - byStatus = {}; - byBatchId = {}; - }, - setStatus: function(id, newStatus) { - var oldStatus = data[id].status, byStatusOldStatusIndex = qq.indexOf(byStatus[oldStatus], id); - byStatus[oldStatus].splice(byStatusOldStatusIndex, 1); - data[id].status = newStatus; - if (byStatus[newStatus] === undefined) { - byStatus[newStatus] = []; - } - byStatus[newStatus].push(id); - uploaderProxy.onStatusChange(id, oldStatus, newStatus); - }, - uuidChanged: function(id, newUuid) { - var oldUuid = data[id].uuid; - data[id].uuid = newUuid; - byUuid[newUuid] = id; - delete byUuid[oldUuid]; - }, - updateName: function(id, newName) { - data[id].name = newName; - }, - updateSize: function(id, newSize) { - data[id].size = newSize; - }, - setParentId: function(targetId, parentId) { - data[targetId].parentId = parentId; - }, - getIdsInProxyGroup: function(id) { - var proxyGroupId = data[id].proxyGroupId; - if (proxyGroupId) { - return byProxyGroupId[proxyGroupId]; - } - return []; - }, - getIdsInBatch: function(id) { - var batchId = data[id].batchId; - return byBatchId[batchId]; - } - }); - }; - qq.status = { - SUBMITTING: "submitting", - SUBMITTED: "submitted", - REJECTED: "rejected", - QUEUED: "queued", - CANCELED: "canceled", - PAUSED: "paused", - UPLOADING: "uploading", - UPLOAD_RETRYING: "retrying upload", - UPLOAD_SUCCESSFUL: "upload successful", - UPLOAD_FAILED: "upload failed", - DELETE_FAILED: "delete failed", - DELETING: "deleting", - DELETED: "deleted" - }; - (function() { - "use strict"; - qq.basePublicApi = { - addBlobs: function(blobDataOrArray, params, endpoint) { - this.addFiles(blobDataOrArray, params, endpoint); - }, - addInitialFiles: function(cannedFileList) { - var self = this; - qq.each(cannedFileList, function(index, cannedFile) { - self._addCannedFile(cannedFile); - }); - }, - addFiles: function(data, params, endpoint) { - this._maybeHandleIos8SafariWorkaround(); - var batchId = this._storedIds.length === 0 ? qq.getUniqueId() : this._currentBatchId, processBlob = qq.bind(function(blob) { - this._handleNewFile({ - blob: blob, - name: this._options.blobs.defaultName - }, batchId, verifiedFiles); - }, this), processBlobData = qq.bind(function(blobData) { - this._handleNewFile(blobData, batchId, verifiedFiles); - }, this), processCanvas = qq.bind(function(canvas) { - var blob = qq.canvasToBlob(canvas); - this._handleNewFile({ - blob: blob, - name: this._options.blobs.defaultName + ".png" - }, batchId, verifiedFiles); - }, this), processCanvasData = qq.bind(function(canvasData) { - var normalizedQuality = canvasData.quality && canvasData.quality / 100, blob = qq.canvasToBlob(canvasData.canvas, canvasData.type, normalizedQuality); - this._handleNewFile({ - blob: blob, - name: canvasData.name - }, batchId, verifiedFiles); - }, this), processFileOrInput = qq.bind(function(fileOrInput) { - if (qq.isInput(fileOrInput) && qq.supportedFeatures.ajaxUploading) { - var files = Array.prototype.slice.call(fileOrInput.files), self = this; - qq.each(files, function(idx, file) { - self._handleNewFile(file, batchId, verifiedFiles); - }); - } else { - this._handleNewFile(fileOrInput, batchId, verifiedFiles); - } - }, this), normalizeData = function() { - if (qq.isFileList(data)) { - data = Array.prototype.slice.call(data); - } - data = [].concat(data); - }, self = this, verifiedFiles = []; - this._currentBatchId = batchId; - if (data) { - normalizeData(); - qq.each(data, function(idx, fileContainer) { - if (qq.isFileOrInput(fileContainer)) { - processFileOrInput(fileContainer); - } else if (qq.isBlob(fileContainer)) { - processBlob(fileContainer); - } else if (qq.isObject(fileContainer)) { - if (fileContainer.blob && fileContainer.name) { - processBlobData(fileContainer); - } else if (fileContainer.canvas && fileContainer.name) { - processCanvasData(fileContainer); - } - } else if (fileContainer.tagName && fileContainer.tagName.toLowerCase() === "canvas") { - processCanvas(fileContainer); - } else { - self.log(fileContainer + " is not a valid file container! Ignoring!", "warn"); - } - }); - this.log("Received " + verifiedFiles.length + " files."); - this._prepareItemsForUpload(verifiedFiles, params, endpoint); - } - }, - cancel: function(id) { - this._handler.cancel(id); - }, - cancelAll: function() { - var storedIdsCopy = [], self = this; - qq.extend(storedIdsCopy, this._storedIds); - qq.each(storedIdsCopy, function(idx, storedFileId) { - self.cancel(storedFileId); - }); - this._handler.cancelAll(); - }, - clearStoredFiles: function() { - this._storedIds = []; - }, - continueUpload: function(id) { - var uploadData = this._uploadData.retrieve({ - id: id - }); - if (!qq.supportedFeatures.pause || !this._options.chunking.enabled) { - return false; - } - if (uploadData.status === qq.status.PAUSED) { - this.log(qq.format("Paused file ID {} ({}) will be continued. Not paused.", id, this.getName(id))); - this._uploadFile(id); - return true; - } else { - this.log(qq.format("Ignoring continue for file ID {} ({}). Not paused.", id, this.getName(id)), "error"); - } - return false; - }, - deleteFile: function(id) { - return this._onSubmitDelete(id); - }, - doesExist: function(fileOrBlobId) { - return this._handler.isValid(fileOrBlobId); - }, - drawThumbnail: function(fileId, imgOrCanvas, maxSize, fromServer, customResizeFunction) { - var promiseToReturn = new qq.Promise(), fileOrUrl, options; - if (this._imageGenerator) { - fileOrUrl = this._thumbnailUrls[fileId]; - options = { - customResizeFunction: customResizeFunction, - maxSize: maxSize > 0 ? maxSize : null, - scale: maxSize > 0 - }; - if (!fromServer && qq.supportedFeatures.imagePreviews) { - fileOrUrl = this.getFile(fileId); - } - if (fileOrUrl == null) { - promiseToReturn.failure({ - container: imgOrCanvas, - error: "File or URL not found." - }); - } else { - this._imageGenerator.generate(fileOrUrl, imgOrCanvas, options).then(function success(modifiedContainer) { - promiseToReturn.success(modifiedContainer); - }, function failure(container, reason) { - promiseToReturn.failure({ - container: container, - error: reason || "Problem generating thumbnail" - }); - }); - } - } else { - promiseToReturn.failure({ - container: imgOrCanvas, - error: "Missing image generator module" - }); - } - return promiseToReturn; - }, - getButton: function(fileId) { - return this._getButton(this._buttonIdsForFileIds[fileId]); - }, - getEndpoint: function(fileId) { - return this._endpointStore.get(fileId); - }, - getFile: function(fileOrBlobId) { - return this._handler.getFile(fileOrBlobId) || null; - }, - getInProgress: function() { - return this._uploadData.retrieve({ - status: [ qq.status.UPLOADING, qq.status.UPLOAD_RETRYING, qq.status.QUEUED ] - }).length; - }, - getName: function(id) { - return this._uploadData.retrieve({ - id: id - }).name; - }, - getParentId: function(id) { - var uploadDataEntry = this.getUploads({ - id: id - }), parentId = null; - if (uploadDataEntry) { - if (uploadDataEntry.parentId !== undefined) { - parentId = uploadDataEntry.parentId; - } - } - return parentId; - }, - getResumableFilesData: function() { - return this._handler.getResumableFilesData(); - }, - getSize: function(id) { - return this._uploadData.retrieve({ - id: id - }).size; - }, - getNetUploads: function() { - return this._netUploaded; - }, - getRemainingAllowedItems: function() { - var allowedItems = this._currentItemLimit; - if (allowedItems > 0) { - return allowedItems - this._netUploadedOrQueued; - } - return null; - }, - getUploads: function(optionalFilter) { - return this._uploadData.retrieve(optionalFilter); - }, - getUuid: function(id) { - return this._uploadData.retrieve({ - id: id - }).uuid; - }, - log: function(str, level) { - if (this._options.debug && (!level || level === "info")) { - qq.log("[Fine Uploader " + qq.version + "] " + str); - } else if (level && level !== "info") { - qq.log("[Fine Uploader " + qq.version + "] " + str, level); - } - }, - pauseUpload: function(id) { - var uploadData = this._uploadData.retrieve({ - id: id - }); - if (!qq.supportedFeatures.pause || !this._options.chunking.enabled) { - return false; - } - if (qq.indexOf([ qq.status.UPLOADING, qq.status.UPLOAD_RETRYING ], uploadData.status) >= 0) { - if (this._handler.pause(id)) { - this._uploadData.setStatus(id, qq.status.PAUSED); - return true; - } else { - this.log(qq.format("Unable to pause file ID {} ({}).", id, this.getName(id)), "error"); - } - } else { - this.log(qq.format("Ignoring pause for file ID {} ({}). Not in progress.", id, this.getName(id)), "error"); - } - return false; - }, - removeFileRef: function(id) { - this._handler.expunge(id); - }, - reset: function() { - this.log("Resetting uploader..."); - this._handler.reset(); - this._storedIds = []; - this._autoRetries = []; - this._retryTimeouts = []; - this._preventRetries = []; - this._thumbnailUrls = []; - qq.each(this._buttons, function(idx, button) { - button.reset(); - }); - this._paramsStore.reset(); - this._endpointStore.reset(); - this._netUploadedOrQueued = 0; - this._netUploaded = 0; - this._uploadData.reset(); - this._buttonIdsForFileIds = []; - this._pasteHandler && this._pasteHandler.reset(); - this._options.session.refreshOnReset && this._refreshSessionData(); - this._succeededSinceLastAllComplete = []; - this._failedSinceLastAllComplete = []; - this._totalProgress && this._totalProgress.reset(); - }, - retry: function(id) { - return this._manualRetry(id); - }, - scaleImage: function(id, specs) { - var self = this; - return qq.Scaler.prototype.scaleImage(id, specs, { - log: qq.bind(self.log, self), - getFile: qq.bind(self.getFile, self), - uploadData: self._uploadData - }); - }, - setCustomHeaders: function(headers, id) { - this._customHeadersStore.set(headers, id); - }, - setDeleteFileCustomHeaders: function(headers, id) { - this._deleteFileCustomHeadersStore.set(headers, id); - }, - setDeleteFileEndpoint: function(endpoint, id) { - this._deleteFileEndpointStore.set(endpoint, id); - }, - setDeleteFileParams: function(params, id) { - this._deleteFileParamsStore.set(params, id); - }, - setEndpoint: function(endpoint, id) { - this._endpointStore.set(endpoint, id); - }, - setForm: function(elementOrId) { - this._updateFormSupportAndParams(elementOrId); - }, - setItemLimit: function(newItemLimit) { - this._currentItemLimit = newItemLimit; - }, - setName: function(id, newName) { - this._uploadData.updateName(id, newName); - }, - setParams: function(params, id) { - this._paramsStore.set(params, id); - }, - setUuid: function(id, newUuid) { - return this._uploadData.uuidChanged(id, newUuid); - }, - setStatus: function(id, newStatus) { - var fileRecord = this.getUploads({ - id: id - }); - if (!fileRecord) { - throw new qq.Error(id + " is not a valid file ID."); - } - switch (newStatus) { - case qq.status.DELETED: - this._onDeleteComplete(id, null, false); - break; - - case qq.status.DELETE_FAILED: - this._onDeleteComplete(id, null, true); - break; - - default: - var errorMessage = "Method setStatus called on '" + name + "' not implemented yet for " + newStatus; - this.log(errorMessage); - throw new qq.Error(errorMessage); - } - }, - uploadStoredFiles: function() { - if (this._storedIds.length === 0) { - this._itemError("noFilesError"); - } else { - this._uploadStoredFiles(); - } - } - }; - qq.basePrivateApi = { - _addCannedFile: function(sessionData) { - var self = this; - return this._uploadData.addFile({ - uuid: sessionData.uuid, - name: sessionData.name, - size: sessionData.size, - status: qq.status.UPLOAD_SUCCESSFUL, - onBeforeStatusChange: function(id) { - sessionData.deleteFileEndpoint && self.setDeleteFileEndpoint(sessionData.deleteFileEndpoint, id); - sessionData.deleteFileParams && self.setDeleteFileParams(sessionData.deleteFileParams, id); - if (sessionData.thumbnailUrl) { - self._thumbnailUrls[id] = sessionData.thumbnailUrl; - } - self._netUploaded++; - self._netUploadedOrQueued++; - } - }); - }, - _annotateWithButtonId: function(file, associatedInput) { - if (qq.isFile(file)) { - file.qqButtonId = this._getButtonId(associatedInput); - } - }, - _batchError: function(message) { - this._options.callbacks.onError(null, null, message, undefined); - }, - _createDeleteHandler: function() { - var self = this; - return new qq.DeleteFileAjaxRequester({ - method: this._options.deleteFile.method.toUpperCase(), - maxConnections: this._options.maxConnections, - uuidParamName: this._options.request.uuidName, - customHeaders: this._deleteFileCustomHeadersStore, - paramsStore: this._deleteFileParamsStore, - endpointStore: this._deleteFileEndpointStore, - cors: this._options.cors, - log: qq.bind(self.log, self), - onDelete: function(id) { - self._onDelete(id); - self._options.callbacks.onDelete(id); - }, - onDeleteComplete: function(id, xhrOrXdr, isError) { - self._onDeleteComplete(id, xhrOrXdr, isError); - self._options.callbacks.onDeleteComplete(id, xhrOrXdr, isError); - } - }); - }, - _createPasteHandler: function() { - var self = this; - return new qq.PasteSupport({ - targetElement: this._options.paste.targetElement, - callbacks: { - log: qq.bind(self.log, self), - pasteReceived: function(blob) { - self._handleCheckedCallback({ - name: "onPasteReceived", - callback: qq.bind(self._options.callbacks.onPasteReceived, self, blob), - onSuccess: qq.bind(self._handlePasteSuccess, self, blob), - identifier: "pasted image" - }); - } - } - }); - }, - _createStore: function(initialValue, _readOnlyValues_) { - var store = {}, catchall = initialValue, perIdReadOnlyValues = {}, readOnlyValues = _readOnlyValues_, copy = function(orig) { - if (qq.isObject(orig)) { - return qq.extend({}, orig); - } - return orig; - }, getReadOnlyValues = function() { - if (qq.isFunction(readOnlyValues)) { - return readOnlyValues(); - } - return readOnlyValues; - }, includeReadOnlyValues = function(id, existing) { - if (readOnlyValues && qq.isObject(existing)) { - qq.extend(existing, getReadOnlyValues()); - } - if (perIdReadOnlyValues[id]) { - qq.extend(existing, perIdReadOnlyValues[id]); - } - }; - return { - set: function(val, id) { - if (id == null) { - store = {}; - catchall = copy(val); - } else { - store[id] = copy(val); - } - }, - get: function(id) { - var values; - if (id != null && store[id]) { - values = store[id]; - } else { - values = copy(catchall); - } - includeReadOnlyValues(id, values); - return copy(values); - }, - addReadOnly: function(id, values) { - if (qq.isObject(store)) { - if (id === null) { - if (qq.isFunction(values)) { - readOnlyValues = values; - } else { - readOnlyValues = readOnlyValues || {}; - qq.extend(readOnlyValues, values); - } - } else { - perIdReadOnlyValues[id] = perIdReadOnlyValues[id] || {}; - qq.extend(perIdReadOnlyValues[id], values); - } - } - }, - remove: function(fileId) { - return delete store[fileId]; - }, - reset: function() { - store = {}; - perIdReadOnlyValues = {}; - catchall = initialValue; - } - }; - }, - _createUploadDataTracker: function() { - var self = this; - return new qq.UploadData({ - getName: function(id) { - return self.getName(id); - }, - getUuid: function(id) { - return self.getUuid(id); - }, - getSize: function(id) { - return self.getSize(id); - }, - onStatusChange: function(id, oldStatus, newStatus) { - self._onUploadStatusChange(id, oldStatus, newStatus); - self._options.callbacks.onStatusChange(id, oldStatus, newStatus); - self._maybeAllComplete(id, newStatus); - if (self._totalProgress) { - setTimeout(function() { - self._totalProgress.onStatusChange(id, oldStatus, newStatus); - }, 0); - } - } - }); - }, - _createUploadButton: function(spec) { - var self = this, acceptFiles = spec.accept || this._options.validation.acceptFiles, allowedExtensions = spec.allowedExtensions || this._options.validation.allowedExtensions, button; - function allowMultiple() { - if (qq.supportedFeatures.ajaxUploading) { - if (self._options.workarounds.iosEmptyVideos && qq.ios() && !qq.ios6() && self._isAllowedExtension(allowedExtensions, ".mov")) { - return false; - } - if (spec.multiple === undefined) { - return self._options.multiple; - } - return spec.multiple; - } - return false; - } - button = new qq.UploadButton({ - acceptFiles: acceptFiles, - element: spec.element, - focusClass: this._options.classes.buttonFocus, - folders: spec.folders, - hoverClass: this._options.classes.buttonHover, - ios8BrowserCrashWorkaround: this._options.workarounds.ios8BrowserCrash, - multiple: allowMultiple(), - name: this._options.request.inputName, - onChange: function(input) { - self._onInputChange(input); - }, - title: spec.title == null ? this._options.text.fileInputTitle : spec.title - }); - this._disposeSupport.addDisposer(function() { - button.dispose(); - }); - self._buttons.push(button); - return button; - }, - _createUploadHandler: function(additionalOptions, namespace) { - var self = this, lastOnProgress = {}, options = { - debug: this._options.debug, - maxConnections: this._options.maxConnections, - cors: this._options.cors, - paramsStore: this._paramsStore, - endpointStore: this._endpointStore, - chunking: this._options.chunking, - resume: this._options.resume, - blobs: this._options.blobs, - log: qq.bind(self.log, self), - preventRetryParam: this._options.retry.preventRetryResponseProperty, - onProgress: function(id, name, loaded, total) { - if (loaded < 0 || total < 0) { - return; - } - if (lastOnProgress[id]) { - if (lastOnProgress[id].loaded !== loaded || lastOnProgress[id].total !== total) { - self._onProgress(id, name, loaded, total); - self._options.callbacks.onProgress(id, name, loaded, total); - } - } else { - self._onProgress(id, name, loaded, total); - self._options.callbacks.onProgress(id, name, loaded, total); - } - lastOnProgress[id] = { - loaded: loaded, - total: total - }; - }, - onComplete: function(id, name, result, xhr) { - delete lastOnProgress[id]; - var status = self.getUploads({ - id: id - }).status, retVal; - if (status === qq.status.UPLOAD_SUCCESSFUL || status === qq.status.UPLOAD_FAILED) { - return; - } - retVal = self._onComplete(id, name, result, xhr); - if (retVal instanceof qq.Promise) { - retVal.done(function() { - self._options.callbacks.onComplete(id, name, result, xhr); - }); - } else { - self._options.callbacks.onComplete(id, name, result, xhr); - } - }, - onCancel: function(id, name, cancelFinalizationEffort) { - var promise = new qq.Promise(); - self._handleCheckedCallback({ - name: "onCancel", - callback: qq.bind(self._options.callbacks.onCancel, self, id, name), - onFailure: promise.failure, - onSuccess: function() { - cancelFinalizationEffort.then(function() { - self._onCancel(id, name); - }); - promise.success(); - }, - identifier: id - }); - return promise; - }, - onUploadPrep: qq.bind(this._onUploadPrep, this), - onUpload: function(id, name) { - self._onUpload(id, name); - self._options.callbacks.onUpload(id, name); - }, - onUploadChunk: function(id, name, chunkData) { - self._onUploadChunk(id, chunkData); - self._options.callbacks.onUploadChunk(id, name, chunkData); - }, - onUploadChunkSuccess: function(id, chunkData, result, xhr) { - self._options.callbacks.onUploadChunkSuccess.apply(self, arguments); - }, - onResume: function(id, name, chunkData) { - return self._options.callbacks.onResume(id, name, chunkData); - }, - onAutoRetry: function(id, name, responseJSON, xhr) { - return self._onAutoRetry.apply(self, arguments); - }, - onUuidChanged: function(id, newUuid) { - self.log("Server requested UUID change from '" + self.getUuid(id) + "' to '" + newUuid + "'"); - self.setUuid(id, newUuid); - }, - getName: qq.bind(self.getName, self), - getUuid: qq.bind(self.getUuid, self), - getSize: qq.bind(self.getSize, self), - setSize: qq.bind(self._setSize, self), - getDataByUuid: function(uuid) { - return self.getUploads({ - uuid: uuid - }); - }, - isQueued: function(id) { - var status = self.getUploads({ - id: id - }).status; - return status === qq.status.QUEUED || status === qq.status.SUBMITTED || status === qq.status.UPLOAD_RETRYING || status === qq.status.PAUSED; - }, - getIdsInProxyGroup: self._uploadData.getIdsInProxyGroup, - getIdsInBatch: self._uploadData.getIdsInBatch - }; - qq.each(this._options.request, function(prop, val) { - options[prop] = val; - }); - options.customHeaders = this._customHeadersStore; - if (additionalOptions) { - qq.each(additionalOptions, function(key, val) { - options[key] = val; - }); - } - return new qq.UploadHandlerController(options, namespace); - }, - _fileOrBlobRejected: function(id) { - this._netUploadedOrQueued--; - this._uploadData.setStatus(id, qq.status.REJECTED); - }, - _formatSize: function(bytes) { - if (bytes === 0) { - return bytes + this._options.text.sizeSymbols[0]; - } - var i = -1; - do { - bytes = bytes / 1e3; - i++; - } while (bytes > 999); - return Math.max(bytes, .1).toFixed(1) + this._options.text.sizeSymbols[i]; - }, - _generateExtraButtonSpecs: function() { - var self = this; - this._extraButtonSpecs = {}; - qq.each(this._options.extraButtons, function(idx, extraButtonOptionEntry) { - var multiple = extraButtonOptionEntry.multiple, validation = qq.extend({}, self._options.validation, true), extraButtonSpec = qq.extend({}, extraButtonOptionEntry); - if (multiple === undefined) { - multiple = self._options.multiple; - } - if (extraButtonSpec.validation) { - qq.extend(validation, extraButtonOptionEntry.validation, true); - } - qq.extend(extraButtonSpec, { - multiple: multiple, - validation: validation - }, true); - self._initExtraButton(extraButtonSpec); - }); - }, - _getButton: function(buttonId) { - var extraButtonsSpec = this._extraButtonSpecs[buttonId]; - if (extraButtonsSpec) { - return extraButtonsSpec.element; - } else if (buttonId === this._defaultButtonId) { - return this._options.button; - } - }, - _getButtonId: function(buttonOrFileInputOrFile) { - var inputs, fileInput, fileBlobOrInput = buttonOrFileInputOrFile; - if (fileBlobOrInput instanceof qq.BlobProxy) { - fileBlobOrInput = fileBlobOrInput.referenceBlob; - } - if (fileBlobOrInput && !qq.isBlob(fileBlobOrInput)) { - if (qq.isFile(fileBlobOrInput)) { - return fileBlobOrInput.qqButtonId; - } else if (fileBlobOrInput.tagName.toLowerCase() === "input" && fileBlobOrInput.type.toLowerCase() === "file") { - return fileBlobOrInput.getAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME); - } - inputs = fileBlobOrInput.getElementsByTagName("input"); - qq.each(inputs, function(idx, input) { - if (input.getAttribute("type") === "file") { - fileInput = input; - return false; - } - }); - if (fileInput) { - return fileInput.getAttribute(qq.UploadButton.BUTTON_ID_ATTR_NAME); - } - } - }, - _getNotFinished: function() { - return this._uploadData.retrieve({ - status: [ qq.status.UPLOADING, qq.status.UPLOAD_RETRYING, qq.status.QUEUED, qq.status.SUBMITTING, qq.status.SUBMITTED, qq.status.PAUSED ] - }).length; - }, - _getValidationBase: function(buttonId) { - var extraButtonSpec = this._extraButtonSpecs[buttonId]; - return extraButtonSpec ? extraButtonSpec.validation : this._options.validation; - }, - _getValidationDescriptor: function(fileWrapper) { - if (fileWrapper.file instanceof qq.BlobProxy) { - return { - name: qq.getFilename(fileWrapper.file.referenceBlob), - size: fileWrapper.file.referenceBlob.size - }; - } - return { - name: this.getUploads({ - id: fileWrapper.id - }).name, - size: this.getUploads({ - id: fileWrapper.id - }).size - }; - }, - _getValidationDescriptors: function(fileWrappers) { - var self = this, fileDescriptors = []; - qq.each(fileWrappers, function(idx, fileWrapper) { - fileDescriptors.push(self._getValidationDescriptor(fileWrapper)); - }); - return fileDescriptors; - }, - _handleCameraAccess: function() { - if (this._options.camera.ios && qq.ios()) { - var acceptIosCamera = "image/*;capture=camera", button = this._options.camera.button, buttonId = button ? this._getButtonId(button) : this._defaultButtonId, optionRoot = this._options; - if (buttonId && buttonId !== this._defaultButtonId) { - optionRoot = this._extraButtonSpecs[buttonId]; - } - optionRoot.multiple = false; - if (optionRoot.validation.acceptFiles === null) { - optionRoot.validation.acceptFiles = acceptIosCamera; - } else { - optionRoot.validation.acceptFiles += "," + acceptIosCamera; - } - qq.each(this._buttons, function(idx, button) { - if (button.getButtonId() === buttonId) { - button.setMultiple(optionRoot.multiple); - button.setAcceptFiles(optionRoot.acceptFiles); - return false; - } - }); - } - }, - _handleCheckedCallback: function(details) { - var self = this, callbackRetVal = details.callback(); - if (qq.isGenericPromise(callbackRetVal)) { - this.log(details.name + " - waiting for " + details.name + " promise to be fulfilled for " + details.identifier); - return callbackRetVal.then(function(successParam) { - self.log(details.name + " promise success for " + details.identifier); - details.onSuccess(successParam); - }, function() { - if (details.onFailure) { - self.log(details.name + " promise failure for " + details.identifier); - details.onFailure(); - } else { - self.log(details.name + " promise failure for " + details.identifier); - } - }); - } - if (callbackRetVal !== false) { - details.onSuccess(callbackRetVal); - } else { - if (details.onFailure) { - this.log(details.name + " - return value was 'false' for " + details.identifier + ". Invoking failure callback."); - details.onFailure(); - } else { - this.log(details.name + " - return value was 'false' for " + details.identifier + ". Will not proceed."); - } - } - return callbackRetVal; - }, - _handleNewFile: function(file, batchId, newFileWrapperList) { - var self = this, uuid = qq.getUniqueId(), size = -1, name = qq.getFilename(file), actualFile = file.blob || file, handler = this._customNewFileHandler ? this._customNewFileHandler : qq.bind(self._handleNewFileGeneric, self); - if (!qq.isInput(actualFile) && actualFile.size >= 0) { - size = actualFile.size; - } - handler(actualFile, name, uuid, size, newFileWrapperList, batchId, this._options.request.uuidName, { - uploadData: self._uploadData, - paramsStore: self._paramsStore, - addFileToHandler: function(id, file) { - self._handler.add(id, file); - self._netUploadedOrQueued++; - self._trackButton(id); - } - }); - }, - _handleNewFileGeneric: function(file, name, uuid, size, fileList, batchId) { - var id = this._uploadData.addFile({ - uuid: uuid, - name: name, - size: size, - batchId: batchId - }); - this._handler.add(id, file); - this._trackButton(id); - this._netUploadedOrQueued++; - fileList.push({ - id: id, - file: file - }); - }, - _handlePasteSuccess: function(blob, extSuppliedName) { - var extension = blob.type.split("/")[1], name = extSuppliedName; - if (name == null) { - name = this._options.paste.defaultName; - } - name += "." + extension; - this.addFiles({ - name: name, - blob: blob - }); - }, - _handleDeleteSuccess: function(id) { - if (this.getUploads({ - id: id - }).status !== qq.status.DELETED) { - var name = this.getName(id); - this._netUploadedOrQueued--; - this._netUploaded--; - this._handler.expunge(id); - this._uploadData.setStatus(id, qq.status.DELETED); - this.log("Delete request for '" + name + "' has succeeded."); - } - }, - _handleDeleteFailed: function(id, xhrOrXdr) { - var name = this.getName(id); - this._uploadData.setStatus(id, qq.status.DELETE_FAILED); - this.log("Delete request for '" + name + "' has failed.", "error"); - if (!xhrOrXdr || xhrOrXdr.withCredentials === undefined) { - this._options.callbacks.onError(id, name, "Delete request failed", xhrOrXdr); - } else { - this._options.callbacks.onError(id, name, "Delete request failed with response code " + xhrOrXdr.status, xhrOrXdr); - } - }, - _initExtraButton: function(spec) { - var button = this._createUploadButton({ - accept: spec.validation.acceptFiles, - allowedExtensions: spec.validation.allowedExtensions, - element: spec.element, - folders: spec.folders, - multiple: spec.multiple, - title: spec.fileInputTitle - }); - this._extraButtonSpecs[button.getButtonId()] = spec; - }, - _initFormSupportAndParams: function() { - this._formSupport = qq.FormSupport && new qq.FormSupport(this._options.form, qq.bind(this.uploadStoredFiles, this), qq.bind(this.log, this)); - if (this._formSupport && this._formSupport.attachedToForm) { - this._paramsStore = this._createStore(this._options.request.params, this._formSupport.getFormInputsAsObject); - this._options.autoUpload = this._formSupport.newAutoUpload; - if (this._formSupport.newEndpoint) { - this._options.request.endpoint = this._formSupport.newEndpoint; - } - } else { - this._paramsStore = this._createStore(this._options.request.params); - } - }, - _isDeletePossible: function() { - if (!qq.DeleteFileAjaxRequester || !this._options.deleteFile.enabled) { - return false; - } - if (this._options.cors.expected) { - if (qq.supportedFeatures.deleteFileCorsXhr) { - return true; - } - if (qq.supportedFeatures.deleteFileCorsXdr && this._options.cors.allowXdr) { - return true; - } - return false; - } - return true; - }, - _isAllowedExtension: function(allowed, fileName) { - var valid = false; - if (!allowed.length) { - return true; - } - qq.each(allowed, function(idx, allowedExt) { - if (qq.isString(allowedExt)) { - var extRegex = new RegExp("\\." + allowedExt + "$", "i"); - if (fileName.match(extRegex) != null) { - valid = true; - return false; - } - } - }); - return valid; - }, - _itemError: function(code, maybeNameOrNames, item) { - var message = this._options.messages[code], allowedExtensions = [], names = [].concat(maybeNameOrNames), name = names[0], buttonId = this._getButtonId(item), validationBase = this._getValidationBase(buttonId), extensionsForMessage, placeholderMatch; - function r(name, replacement) { - message = message.replace(name, replacement); - } - qq.each(validationBase.allowedExtensions, function(idx, allowedExtension) { - if (qq.isString(allowedExtension)) { - allowedExtensions.push(allowedExtension); - } - }); - extensionsForMessage = allowedExtensions.join(", ").toLowerCase(); - r("{file}", this._options.formatFileName(name)); - r("{extensions}", extensionsForMessage); - r("{sizeLimit}", this._formatSize(validationBase.sizeLimit)); - r("{minSizeLimit}", this._formatSize(validationBase.minSizeLimit)); - placeholderMatch = message.match(/(\{\w+\})/g); - if (placeholderMatch !== null) { - qq.each(placeholderMatch, function(idx, placeholder) { - r(placeholder, names[idx]); - }); - } - this._options.callbacks.onError(null, name, message, undefined); - return message; - }, - _manualRetry: function(id, callback) { - if (this._onBeforeManualRetry(id)) { - this._netUploadedOrQueued++; - this._uploadData.setStatus(id, qq.status.UPLOAD_RETRYING); - if (callback) { - callback(id); - } else { - this._handler.retry(id); - } - return true; - } - }, - _maybeAllComplete: function(id, status) { - var self = this, notFinished = this._getNotFinished(); - if (status === qq.status.UPLOAD_SUCCESSFUL) { - this._succeededSinceLastAllComplete.push(id); - } else if (status === qq.status.UPLOAD_FAILED) { - this._failedSinceLastAllComplete.push(id); - } - if (notFinished === 0 && (this._succeededSinceLastAllComplete.length || this._failedSinceLastAllComplete.length)) { - setTimeout(function() { - self._onAllComplete(self._succeededSinceLastAllComplete, self._failedSinceLastAllComplete); - }, 0); - } - }, - _maybeHandleIos8SafariWorkaround: function() { - var self = this; - if (this._options.workarounds.ios8SafariUploads && qq.ios800() && qq.iosSafari()) { - setTimeout(function() { - window.alert(self._options.messages.unsupportedBrowserIos8Safari); - }, 0); - throw new qq.Error(this._options.messages.unsupportedBrowserIos8Safari); - } - }, - _maybeParseAndSendUploadError: function(id, name, response, xhr) { - if (!response.success) { - if (xhr && xhr.status !== 200 && !response.error) { - this._options.callbacks.onError(id, name, "XHR returned response code " + xhr.status, xhr); - } else { - var errorReason = response.error ? response.error : this._options.text.defaultResponseError; - this._options.callbacks.onError(id, name, errorReason, xhr); - } - } - }, - _maybeProcessNextItemAfterOnValidateCallback: function(validItem, items, index, params, endpoint) { - var self = this; - if (items.length > index) { - if (validItem || !this._options.validation.stopOnFirstInvalidFile) { - setTimeout(function() { - var validationDescriptor = self._getValidationDescriptor(items[index]), buttonId = self._getButtonId(items[index].file), button = self._getButton(buttonId); - self._handleCheckedCallback({ - name: "onValidate", - callback: qq.bind(self._options.callbacks.onValidate, self, validationDescriptor, button), - onSuccess: qq.bind(self._onValidateCallbackSuccess, self, items, index, params, endpoint), - onFailure: qq.bind(self._onValidateCallbackFailure, self, items, index, params, endpoint), - identifier: "Item '" + validationDescriptor.name + "', size: " + validationDescriptor.size - }); - }, 0); - } else if (!validItem) { - for (;index < items.length; index++) { - self._fileOrBlobRejected(items[index].id); - } - } - } - }, - _onAllComplete: function(successful, failed) { - this._totalProgress && this._totalProgress.onAllComplete(successful, failed, this._preventRetries); - this._options.callbacks.onAllComplete(qq.extend([], successful), qq.extend([], failed)); - this._succeededSinceLastAllComplete = []; - this._failedSinceLastAllComplete = []; - }, - _onAutoRetry: function(id, name, responseJSON, xhr, callback) { - var self = this; - self._preventRetries[id] = responseJSON[self._options.retry.preventRetryResponseProperty]; - if (self._shouldAutoRetry(id, name, responseJSON)) { - var retryWaitPeriod = self._options.retry.autoAttemptDelay * 1e3; - self._maybeParseAndSendUploadError.apply(self, arguments); - self._options.callbacks.onAutoRetry(id, name, self._autoRetries[id]); - self._onBeforeAutoRetry(id, name); - self._uploadData.setStatus(id, qq.status.UPLOAD_RETRYING); - self._retryTimeouts[id] = setTimeout(function() { - self.log("Starting retry for " + name + "..."); - if (callback) { - callback(id); - } else { - self._handler.retry(id); - } - }, retryWaitPeriod); - return true; - } - }, - _onBeforeAutoRetry: function(id, name) { - this.log("Waiting " + this._options.retry.autoAttemptDelay + " seconds before retrying " + name + "..."); - }, - _onBeforeManualRetry: function(id) { - var itemLimit = this._currentItemLimit, fileName; - if (this._preventRetries[id]) { - this.log("Retries are forbidden for id " + id, "warn"); - return false; - } else if (this._handler.isValid(id)) { - fileName = this.getName(id); - if (this._options.callbacks.onManualRetry(id, fileName) === false) { - return false; - } - if (itemLimit > 0 && this._netUploadedOrQueued + 1 > itemLimit) { - this._itemError("retryFailTooManyItems"); - return false; - } - this.log("Retrying upload for '" + fileName + "' (id: " + id + ")..."); - return true; - } else { - this.log("'" + id + "' is not a valid file ID", "error"); - return false; - } - }, - _onCancel: function(id, name) { - this._netUploadedOrQueued--; - clearTimeout(this._retryTimeouts[id]); - var storedItemIndex = qq.indexOf(this._storedIds, id); - if (!this._options.autoUpload && storedItemIndex >= 0) { - this._storedIds.splice(storedItemIndex, 1); - } - this._uploadData.setStatus(id, qq.status.CANCELED); - }, - _onComplete: function(id, name, result, xhr) { - if (!result.success) { - this._netUploadedOrQueued--; - this._uploadData.setStatus(id, qq.status.UPLOAD_FAILED); - if (result[this._options.retry.preventRetryResponseProperty] === true) { - this._preventRetries[id] = true; - } - } else { - if (result.thumbnailUrl) { - this._thumbnailUrls[id] = result.thumbnailUrl; - } - this._netUploaded++; - this._uploadData.setStatus(id, qq.status.UPLOAD_SUCCESSFUL); - } - this._maybeParseAndSendUploadError(id, name, result, xhr); - return result.success ? true : false; - }, - _onDelete: function(id) { - this._uploadData.setStatus(id, qq.status.DELETING); - }, - _onDeleteComplete: function(id, xhrOrXdr, isError) { - var name = this.getName(id); - if (isError) { - this._handleDeleteFailed(id, xhrOrXdr); - } else { - this._handleDeleteSuccess(id); - } - }, - _onInputChange: function(input) { - var fileIndex; - if (qq.supportedFeatures.ajaxUploading) { - for (fileIndex = 0; fileIndex < input.files.length; fileIndex++) { - this._annotateWithButtonId(input.files[fileIndex], input); - } - this.addFiles(input.files); - } else if (input.value.length > 0) { - this.addFiles(input); - } - qq.each(this._buttons, function(idx, button) { - button.reset(); - }); - }, - _onProgress: function(id, name, loaded, total) { - this._totalProgress && this._totalProgress.onIndividualProgress(id, loaded, total); - }, - _onSubmit: function(id, name) {}, - _onSubmitCallbackSuccess: function(id, name) { - this._onSubmit.apply(this, arguments); - this._uploadData.setStatus(id, qq.status.SUBMITTED); - this._onSubmitted.apply(this, arguments); - if (this._options.autoUpload) { - this._options.callbacks.onSubmitted.apply(this, arguments); - this._uploadFile(id); - } else { - this._storeForLater(id); - this._options.callbacks.onSubmitted.apply(this, arguments); - } - }, - _onSubmitDelete: function(id, onSuccessCallback, additionalMandatedParams) { - var uuid = this.getUuid(id), adjustedOnSuccessCallback; - if (onSuccessCallback) { - adjustedOnSuccessCallback = qq.bind(onSuccessCallback, this, id, uuid, additionalMandatedParams); - } - if (this._isDeletePossible()) { - this._handleCheckedCallback({ - name: "onSubmitDelete", - callback: qq.bind(this._options.callbacks.onSubmitDelete, this, id), - onSuccess: adjustedOnSuccessCallback || qq.bind(this._deleteHandler.sendDelete, this, id, uuid, additionalMandatedParams), - identifier: id - }); - return true; - } else { - this.log("Delete request ignored for ID " + id + ", delete feature is disabled or request not possible " + "due to CORS on a user agent that does not support pre-flighting.", "warn"); - return false; - } - }, - _onSubmitted: function(id) {}, - _onTotalProgress: function(loaded, total) { - this._options.callbacks.onTotalProgress(loaded, total); - }, - _onUploadPrep: function(id) {}, - _onUpload: function(id, name) { - this._uploadData.setStatus(id, qq.status.UPLOADING); - }, - _onUploadChunk: function(id, chunkData) {}, - _onUploadStatusChange: function(id, oldStatus, newStatus) { - if (newStatus === qq.status.PAUSED) { - clearTimeout(this._retryTimeouts[id]); - } - }, - _onValidateBatchCallbackFailure: function(fileWrappers) { - var self = this; - qq.each(fileWrappers, function(idx, fileWrapper) { - self._fileOrBlobRejected(fileWrapper.id); - }); - }, - _onValidateBatchCallbackSuccess: function(validationDescriptors, items, params, endpoint, button) { - var errorMessage, itemLimit = this._currentItemLimit, proposedNetFilesUploadedOrQueued = this._netUploadedOrQueued; - if (itemLimit === 0 || proposedNetFilesUploadedOrQueued <= itemLimit) { - if (items.length > 0) { - this._handleCheckedCallback({ - name: "onValidate", - callback: qq.bind(this._options.callbacks.onValidate, this, validationDescriptors[0], button), - onSuccess: qq.bind(this._onValidateCallbackSuccess, this, items, 0, params, endpoint), - onFailure: qq.bind(this._onValidateCallbackFailure, this, items, 0, params, endpoint), - identifier: "Item '" + items[0].file.name + "', size: " + items[0].file.size - }); - } else { - this._itemError("noFilesError"); - } - } else { - this._onValidateBatchCallbackFailure(items); - errorMessage = this._options.messages.tooManyItemsError.replace(/\{netItems\}/g, proposedNetFilesUploadedOrQueued).replace(/\{itemLimit\}/g, itemLimit); - this._batchError(errorMessage); - } - }, - _onValidateCallbackFailure: function(items, index, params, endpoint) { - var nextIndex = index + 1; - this._fileOrBlobRejected(items[index].id, items[index].file.name); - this._maybeProcessNextItemAfterOnValidateCallback(false, items, nextIndex, params, endpoint); - }, - _onValidateCallbackSuccess: function(items, index, params, endpoint) { - var self = this, nextIndex = index + 1, validationDescriptor = this._getValidationDescriptor(items[index]); - this._validateFileOrBlobData(items[index], validationDescriptor).then(function() { - self._upload(items[index].id, params, endpoint); - self._maybeProcessNextItemAfterOnValidateCallback(true, items, nextIndex, params, endpoint); - }, function() { - self._maybeProcessNextItemAfterOnValidateCallback(false, items, nextIndex, params, endpoint); - }); - }, - _prepareItemsForUpload: function(items, params, endpoint) { - if (items.length === 0) { - this._itemError("noFilesError"); - return; - } - var validationDescriptors = this._getValidationDescriptors(items), buttonId = this._getButtonId(items[0].file), button = this._getButton(buttonId); - this._handleCheckedCallback({ - name: "onValidateBatch", - callback: qq.bind(this._options.callbacks.onValidateBatch, this, validationDescriptors, button), - onSuccess: qq.bind(this._onValidateBatchCallbackSuccess, this, validationDescriptors, items, params, endpoint, button), - onFailure: qq.bind(this._onValidateBatchCallbackFailure, this, items), - identifier: "batch validation" - }); - }, - _preventLeaveInProgress: function() { - var self = this; - this._disposeSupport.attach(window, "beforeunload", function(e) { - if (self.getInProgress()) { - e = e || window.event; - e.returnValue = self._options.messages.onLeave; - return self._options.messages.onLeave; - } - }); - }, - _refreshSessionData: function() { - var self = this, options = this._options.session; - if (qq.Session && this._options.session.endpoint != null) { - if (!this._session) { - qq.extend(options, { - cors: this._options.cors - }); - options.log = qq.bind(this.log, this); - options.addFileRecord = qq.bind(this._addCannedFile, this); - this._session = new qq.Session(options); - } - setTimeout(function() { - self._session.refresh().then(function(response, xhrOrXdr) { - self._sessionRequestComplete(); - self._options.callbacks.onSessionRequestComplete(response, true, xhrOrXdr); - }, function(response, xhrOrXdr) { - self._options.callbacks.onSessionRequestComplete(response, false, xhrOrXdr); - }); - }, 0); - } - }, - _sessionRequestComplete: function() {}, - _setSize: function(id, newSize) { - this._uploadData.updateSize(id, newSize); - this._totalProgress && this._totalProgress.onNewSize(id); - }, - _shouldAutoRetry: function(id, name, responseJSON) { - var uploadData = this._uploadData.retrieve({ - id: id - }); - if (!this._preventRetries[id] && this._options.retry.enableAuto && uploadData.status !== qq.status.PAUSED) { - if (this._autoRetries[id] === undefined) { - this._autoRetries[id] = 0; - } - if (this._autoRetries[id] < this._options.retry.maxAutoAttempts) { - this._autoRetries[id] += 1; - return true; - } - } - return false; - }, - _storeForLater: function(id) { - this._storedIds.push(id); - }, - _trackButton: function(id) { - var buttonId; - if (qq.supportedFeatures.ajaxUploading) { - buttonId = this._handler.getFile(id).qqButtonId; - } else { - buttonId = this._getButtonId(this._handler.getInput(id)); - } - if (buttonId) { - this._buttonIdsForFileIds[id] = buttonId; - } - }, - _updateFormSupportAndParams: function(formElementOrId) { - this._options.form.element = formElementOrId; - this._formSupport = qq.FormSupport && new qq.FormSupport(this._options.form, qq.bind(this.uploadStoredFiles, this), qq.bind(this.log, this)); - if (this._formSupport && this._formSupport.attachedToForm) { - this._paramsStore.addReadOnly(null, this._formSupport.getFormInputsAsObject); - this._options.autoUpload = this._formSupport.newAutoUpload; - if (this._formSupport.newEndpoint) { - this.setEndpoint(this._formSupport.newEndpoint); - } - } - }, - _upload: function(id, params, endpoint) { - var name = this.getName(id); - if (params) { - this.setParams(params, id); - } - if (endpoint) { - this.setEndpoint(endpoint, id); - } - this._handleCheckedCallback({ - name: "onSubmit", - callback: qq.bind(this._options.callbacks.onSubmit, this, id, name), - onSuccess: qq.bind(this._onSubmitCallbackSuccess, this, id, name), - onFailure: qq.bind(this._fileOrBlobRejected, this, id, name), - identifier: id - }); - }, - _uploadFile: function(id) { - if (!this._handler.upload(id)) { - this._uploadData.setStatus(id, qq.status.QUEUED); - } - }, - _uploadStoredFiles: function() { - var idToUpload, stillSubmitting, self = this; - while (this._storedIds.length) { - idToUpload = this._storedIds.shift(); - this._uploadFile(idToUpload); - } - stillSubmitting = this.getUploads({ - status: qq.status.SUBMITTING - }).length; - if (stillSubmitting) { - qq.log("Still waiting for " + stillSubmitting + " files to clear submit queue. Will re-parse stored IDs array shortly."); - setTimeout(function() { - self._uploadStoredFiles(); - }, 1e3); - } - }, - _validateFileOrBlobData: function(fileWrapper, validationDescriptor) { - var self = this, file = function() { - if (fileWrapper.file instanceof qq.BlobProxy) { - return fileWrapper.file.referenceBlob; - } - return fileWrapper.file; - }(), name = validationDescriptor.name, size = validationDescriptor.size, buttonId = this._getButtonId(fileWrapper.file), validationBase = this._getValidationBase(buttonId), validityChecker = new qq.Promise(); - validityChecker.then(function() {}, function() { - self._fileOrBlobRejected(fileWrapper.id, name); - }); - if (qq.isFileOrInput(file) && !this._isAllowedExtension(validationBase.allowedExtensions, name)) { - this._itemError("typeError", name, file); - return validityChecker.failure(); - } - if (!this._options.validation.allowEmpty && size === 0) { - this._itemError("emptyError", name, file); - return validityChecker.failure(); - } - if (size > 0 && validationBase.sizeLimit && size > validationBase.sizeLimit) { - this._itemError("sizeError", name, file); - return validityChecker.failure(); - } - if (size > 0 && size < validationBase.minSizeLimit) { - this._itemError("minSizeError", name, file); - return validityChecker.failure(); - } - if (qq.ImageValidation && qq.supportedFeatures.imagePreviews && qq.isFile(file)) { - new qq.ImageValidation(file, qq.bind(self.log, self)).validate(validationBase.image).then(validityChecker.success, function(errorCode) { - self._itemError(errorCode + "ImageError", name, file); - validityChecker.failure(); - }); - } else { - validityChecker.success(); - } - return validityChecker; - }, - _wrapCallbacks: function() { - var self, safeCallback, prop; - self = this; - safeCallback = function(name, callback, args) { - var errorMsg; - try { - return callback.apply(self, args); - } catch (exception) { - errorMsg = exception.message || exception.toString(); - self.log("Caught exception in '" + name + "' callback - " + errorMsg, "error"); - } - }; - for (prop in this._options.callbacks) { - (function() { - var callbackName, callbackFunc; - callbackName = prop; - callbackFunc = self._options.callbacks[callbackName]; - self._options.callbacks[callbackName] = function() { - return safeCallback(callbackName, callbackFunc, arguments); - }; - })(); - } - } - }; - })(); - (function() { - "use strict"; - qq.FineUploaderBasic = function(o) { - var self = this; - this._options = { - debug: false, - button: null, - multiple: true, - maxConnections: 3, - disableCancelForFormUploads: false, - autoUpload: true, - request: { - customHeaders: {}, - endpoint: "/server/upload", - filenameParam: "qqfilename", - forceMultipart: true, - inputName: "qqfile", - method: "POST", - params: {}, - paramsInBody: true, - totalFileSizeName: "qqtotalfilesize", - uuidName: "qquuid" - }, - validation: { - allowedExtensions: [], - sizeLimit: 0, - minSizeLimit: 0, - itemLimit: 0, - stopOnFirstInvalidFile: true, - acceptFiles: null, - image: { - maxHeight: 0, - maxWidth: 0, - minHeight: 0, - minWidth: 0 - }, - allowEmpty: false - }, - callbacks: { - onSubmit: function(id, name) {}, - onSubmitted: function(id, name) {}, - onComplete: function(id, name, responseJSON, maybeXhr) {}, - onAllComplete: function(successful, failed) {}, - onCancel: function(id, name) {}, - onUpload: function(id, name) {}, - onUploadChunk: function(id, name, chunkData) {}, - onUploadChunkSuccess: function(id, chunkData, responseJSON, xhr) {}, - onResume: function(id, fileName, chunkData) {}, - onProgress: function(id, name, loaded, total) {}, - onTotalProgress: function(loaded, total) {}, - onError: function(id, name, reason, maybeXhrOrXdr) {}, - onAutoRetry: function(id, name, attemptNumber) {}, - onManualRetry: function(id, name) {}, - onValidateBatch: function(fileOrBlobData) {}, - onValidate: function(fileOrBlobData) {}, - onSubmitDelete: function(id) {}, - onDelete: function(id) {}, - onDeleteComplete: function(id, xhrOrXdr, isError) {}, - onPasteReceived: function(blob) {}, - onStatusChange: function(id, oldStatus, newStatus) {}, - onSessionRequestComplete: function(response, success, xhrOrXdr) {} - }, - messages: { - typeError: "{file} has an invalid extension. Valid extension(s): {extensions}.", - sizeError: "{file} is too large, maximum file size is {sizeLimit}.", - minSizeError: "{file} is too small, minimum file size is {minSizeLimit}.", - emptyError: "{file} is empty, please select files again without it.", - noFilesError: "No files to upload.", - tooManyItemsError: "Too many items ({netItems}) would be uploaded. Item limit is {itemLimit}.", - maxHeightImageError: "Image is too tall.", - maxWidthImageError: "Image is too wide.", - minHeightImageError: "Image is not tall enough.", - minWidthImageError: "Image is not wide enough.", - retryFailTooManyItems: "Retry failed - you have reached your file limit.", - onLeave: "The files are being uploaded, if you leave now the upload will be canceled.", - unsupportedBrowserIos8Safari: "Unrecoverable error - this browser does not permit file uploading of any kind due to serious bugs in iOS8 Safari. Please use iOS8 Chrome until Apple fixes these issues." - }, - retry: { - enableAuto: false, - maxAutoAttempts: 3, - autoAttemptDelay: 5, - preventRetryResponseProperty: "preventRetry" - }, - classes: { - buttonHover: "qq-upload-button-hover", - buttonFocus: "qq-upload-button-focus" - }, - chunking: { - enabled: false, - concurrent: { - enabled: false - }, - mandatory: false, - paramNames: { - partIndex: "qqpartindex", - partByteOffset: "qqpartbyteoffset", - chunkSize: "qqchunksize", - totalFileSize: "qqtotalfilesize", - totalParts: "qqtotalparts" - }, - partSize: 2e6, - success: { - endpoint: null - } - }, - resume: { - enabled: false, - recordsExpireIn: 7, - paramNames: { - resuming: "qqresume" - } - }, - formatFileName: function(fileOrBlobName) { - return fileOrBlobName; - }, - text: { - defaultResponseError: "Upload failure reason unknown", - fileInputTitle: "file input", - sizeSymbols: [ "kB", "MB", "GB", "TB", "PB", "EB" ] - }, - deleteFile: { - enabled: false, - method: "DELETE", - endpoint: "/server/upload", - customHeaders: {}, - params: {} - }, - cors: { - expected: false, - sendCredentials: false, - allowXdr: false - }, - blobs: { - defaultName: "misc_data" - }, - paste: { - targetElement: null, - defaultName: "pasted_image" - }, - camera: { - ios: false, - button: null - }, - extraButtons: [], - session: { - endpoint: null, - params: {}, - customHeaders: {}, - refreshOnReset: true - }, - form: { - element: "qq-form", - autoUpload: false, - interceptSubmit: true - }, - scaling: { - customResizer: null, - sendOriginal: true, - orient: true, - defaultType: null, - defaultQuality: 80, - failureText: "Failed to scale", - includeExif: false, - sizes: [] - }, - workarounds: { - iosEmptyVideos: true, - ios8SafariUploads: true, - ios8BrowserCrash: false - } - }; - qq.extend(this._options, o, true); - this._buttons = []; - this._extraButtonSpecs = {}; - this._buttonIdsForFileIds = []; - this._wrapCallbacks(); - this._disposeSupport = new qq.DisposeSupport(); - this._storedIds = []; - this._autoRetries = []; - this._retryTimeouts = []; - this._preventRetries = []; - this._thumbnailUrls = []; - this._netUploadedOrQueued = 0; - this._netUploaded = 0; - this._uploadData = this._createUploadDataTracker(); - this._initFormSupportAndParams(); - this._customHeadersStore = this._createStore(this._options.request.customHeaders); - this._deleteFileCustomHeadersStore = this._createStore(this._options.deleteFile.customHeaders); - this._deleteFileParamsStore = this._createStore(this._options.deleteFile.params); - this._endpointStore = this._createStore(this._options.request.endpoint); - this._deleteFileEndpointStore = this._createStore(this._options.deleteFile.endpoint); - this._handler = this._createUploadHandler(); - this._deleteHandler = qq.DeleteFileAjaxRequester && this._createDeleteHandler(); - if (this._options.button) { - this._defaultButtonId = this._createUploadButton({ - element: this._options.button, - title: this._options.text.fileInputTitle - }).getButtonId(); - } - this._generateExtraButtonSpecs(); - this._handleCameraAccess(); - if (this._options.paste.targetElement) { - if (qq.PasteSupport) { - this._pasteHandler = this._createPasteHandler(); - } else { - this.log("Paste support module not found", "error"); - } - } - this._preventLeaveInProgress(); - this._imageGenerator = qq.ImageGenerator && new qq.ImageGenerator(qq.bind(this.log, this)); - this._refreshSessionData(); - this._succeededSinceLastAllComplete = []; - this._failedSinceLastAllComplete = []; - this._scaler = qq.Scaler && new qq.Scaler(this._options.scaling, qq.bind(this.log, this)) || {}; - if (this._scaler.enabled) { - this._customNewFileHandler = qq.bind(this._scaler.handleNewFile, this._scaler); - } - if (qq.TotalProgress && qq.supportedFeatures.progressBar) { - this._totalProgress = new qq.TotalProgress(qq.bind(this._onTotalProgress, this), function(id) { - var entry = self._uploadData.retrieve({ - id: id - }); - return entry && entry.size || 0; - }); - } - this._currentItemLimit = this._options.validation.itemLimit; - }; - qq.FineUploaderBasic.prototype = qq.basePublicApi; - qq.extend(qq.FineUploaderBasic.prototype, qq.basePrivateApi); - })(); - qq.AjaxRequester = function(o) { - "use strict"; - var log, shouldParamsBeInQueryString, queue = [], requestData = {}, options = { - acceptHeader: null, - validMethods: [ "PATCH", "POST", "PUT" ], - method: "POST", - contentType: "application/x-www-form-urlencoded", - maxConnections: 3, - customHeaders: {}, - endpointStore: {}, - paramsStore: {}, - mandatedParams: {}, - allowXRequestedWithAndCacheControl: true, - successfulResponseCodes: { - DELETE: [ 200, 202, 204 ], - PATCH: [ 200, 201, 202, 203, 204 ], - POST: [ 200, 201, 202, 203, 204 ], - PUT: [ 200, 201, 202, 203, 204 ], - GET: [ 200 ] - }, - cors: { - expected: false, - sendCredentials: false - }, - log: function(str, level) {}, - onSend: function(id) {}, - onComplete: function(id, xhrOrXdr, isError) {}, - onProgress: null - }; - qq.extend(options, o); - log = options.log; - if (qq.indexOf(options.validMethods, options.method) < 0) { - throw new Error("'" + options.method + "' is not a supported method for this type of request!"); - } - function isSimpleMethod() { - return qq.indexOf([ "GET", "POST", "HEAD" ], options.method) >= 0; - } - function containsNonSimpleHeaders(headers) { - var containsNonSimple = false; - qq.each(containsNonSimple, function(idx, header) { - if (qq.indexOf([ "Accept", "Accept-Language", "Content-Language", "Content-Type" ], header) < 0) { - containsNonSimple = true; - return false; - } - }); - return containsNonSimple; - } - function isXdr(xhr) { - return options.cors.expected && xhr.withCredentials === undefined; - } - function getCorsAjaxTransport() { - var xhrOrXdr; - if (window.XMLHttpRequest || window.ActiveXObject) { - xhrOrXdr = qq.createXhrInstance(); - if (xhrOrXdr.withCredentials === undefined) { - xhrOrXdr = new XDomainRequest(); - xhrOrXdr.onload = function() {}; - xhrOrXdr.onerror = function() {}; - xhrOrXdr.ontimeout = function() {}; - xhrOrXdr.onprogress = function() {}; - } - } - return xhrOrXdr; - } - function getXhrOrXdr(id, suppliedXhr) { - var xhrOrXdr = requestData[id].xhr; - if (!xhrOrXdr) { - if (suppliedXhr) { - xhrOrXdr = suppliedXhr; - } else { - if (options.cors.expected) { - xhrOrXdr = getCorsAjaxTransport(); - } else { - xhrOrXdr = qq.createXhrInstance(); - } - } - requestData[id].xhr = xhrOrXdr; - } - return xhrOrXdr; - } - function dequeue(id) { - var i = qq.indexOf(queue, id), max = options.maxConnections, nextId; - delete requestData[id]; - queue.splice(i, 1); - if (queue.length >= max && i < max) { - nextId = queue[max - 1]; - sendRequest(nextId); - } - } - function onComplete(id, xdrError) { - var xhr = getXhrOrXdr(id), method = options.method, isError = xdrError === true; - dequeue(id); - if (isError) { - log(method + " request for " + id + " has failed", "error"); - } else if (!isXdr(xhr) && !isResponseSuccessful(xhr.status)) { - isError = true; - log(method + " request for " + id + " has failed - response code " + xhr.status, "error"); - } - options.onComplete(id, xhr, isError); - } - function getParams(id) { - var onDemandParams = requestData[id].additionalParams, mandatedParams = options.mandatedParams, params; - if (options.paramsStore.get) { - params = options.paramsStore.get(id); - } - if (onDemandParams) { - qq.each(onDemandParams, function(name, val) { - params = params || {}; - params[name] = val; - }); - } - if (mandatedParams) { - qq.each(mandatedParams, function(name, val) { - params = params || {}; - params[name] = val; - }); - } - return params; - } - function sendRequest(id, optXhr) { - var xhr = getXhrOrXdr(id, optXhr), method = options.method, params = getParams(id), payload = requestData[id].payload, url; - options.onSend(id); - url = createUrl(id, params, requestData[id].additionalQueryParams); - if (isXdr(xhr)) { - xhr.onload = getXdrLoadHandler(id); - xhr.onerror = getXdrErrorHandler(id); - } else { - xhr.onreadystatechange = getXhrReadyStateChangeHandler(id); - } - registerForUploadProgress(id); - xhr.open(method, url, true); - if (options.cors.expected && options.cors.sendCredentials && !isXdr(xhr)) { - xhr.withCredentials = true; - } - setHeaders(id); - log("Sending " + method + " request for " + id); - if (payload) { - xhr.send(payload); - } else if (shouldParamsBeInQueryString || !params) { - xhr.send(); - } else if (params && options.contentType && options.contentType.toLowerCase().indexOf("application/x-www-form-urlencoded") >= 0) { - xhr.send(qq.obj2url(params, "")); - } else if (params && options.contentType && options.contentType.toLowerCase().indexOf("application/json") >= 0) { - xhr.send(JSON.stringify(params)); - } else { - xhr.send(params); - } - return xhr; - } - function createUrl(id, params, additionalQueryParams) { - var endpoint = options.endpointStore.get(id), addToPath = requestData[id].addToPath; - if (addToPath != undefined) { - endpoint += "/" + addToPath; - } - if (shouldParamsBeInQueryString && params) { - endpoint = qq.obj2url(params, endpoint); - } - if (additionalQueryParams) { - endpoint = qq.obj2url(additionalQueryParams, endpoint); - } - return endpoint; - } - function getXhrReadyStateChangeHandler(id) { - return function() { - if (getXhrOrXdr(id).readyState === 4) { - onComplete(id); - } - }; - } - function registerForUploadProgress(id) { - var onProgress = options.onProgress; - if (onProgress) { - getXhrOrXdr(id).upload.onprogress = function(e) { - if (e.lengthComputable) { - onProgress(id, e.loaded, e.total); - } - }; - } - } - function getXdrLoadHandler(id) { - return function() { - onComplete(id); - }; - } - function getXdrErrorHandler(id) { - return function() { - onComplete(id, true); - }; - } - function setHeaders(id) { - var xhr = getXhrOrXdr(id), customHeaders = options.customHeaders, onDemandHeaders = requestData[id].additionalHeaders || {}, method = options.method, allHeaders = {}; - if (!isXdr(xhr)) { - options.acceptHeader && xhr.setRequestHeader("Accept", options.acceptHeader); - if (options.allowXRequestedWithAndCacheControl) { - if (!options.cors.expected || (!isSimpleMethod() || containsNonSimpleHeaders(customHeaders))) { - xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); - xhr.setRequestHeader("Cache-Control", "no-cache"); - } - } - if (options.contentType && (method === "POST" || method === "PUT")) { - xhr.setRequestHeader("Content-Type", options.contentType); - } - qq.extend(allHeaders, qq.isFunction(customHeaders) ? customHeaders(id) : customHeaders); - qq.extend(allHeaders, onDemandHeaders); - qq.each(allHeaders, function(name, val) { - xhr.setRequestHeader(name, val); - }); - } - } - function isResponseSuccessful(responseCode) { - return qq.indexOf(options.successfulResponseCodes[options.method], responseCode) >= 0; - } - function prepareToSend(id, optXhr, addToPath, additionalParams, additionalQueryParams, additionalHeaders, payload) { - requestData[id] = { - addToPath: addToPath, - additionalParams: additionalParams, - additionalQueryParams: additionalQueryParams, - additionalHeaders: additionalHeaders, - payload: payload - }; - var len = queue.push(id); - if (len <= options.maxConnections) { - return sendRequest(id, optXhr); - } - } - shouldParamsBeInQueryString = options.method === "GET" || options.method === "DELETE"; - qq.extend(this, { - initTransport: function(id) { - var path, params, headers, payload, cacheBuster, additionalQueryParams; - return { - withPath: function(appendToPath) { - path = appendToPath; - return this; - }, - withParams: function(additionalParams) { - params = additionalParams; - return this; - }, - withQueryParams: function(_additionalQueryParams_) { - additionalQueryParams = _additionalQueryParams_; - return this; - }, - withHeaders: function(additionalHeaders) { - headers = additionalHeaders; - return this; - }, - withPayload: function(thePayload) { - payload = thePayload; - return this; - }, - withCacheBuster: function() { - cacheBuster = true; - return this; - }, - send: function(optXhr) { - if (cacheBuster && qq.indexOf([ "GET", "DELETE" ], options.method) >= 0) { - params.qqtimestamp = new Date().getTime(); - } - return prepareToSend(id, optXhr, path, params, additionalQueryParams, headers, payload); - } - }; - }, - canceled: function(id) { - dequeue(id); - } - }); - }; - qq.UploadHandler = function(spec) { - "use strict"; - var proxy = spec.proxy, fileState = {}, onCancel = proxy.onCancel, getName = proxy.getName; - qq.extend(this, { - add: function(id, fileItem) { - fileState[id] = fileItem; - fileState[id].temp = {}; - }, - cancel: function(id) { - var self = this, cancelFinalizationEffort = new qq.Promise(), onCancelRetVal = onCancel(id, getName(id), cancelFinalizationEffort); - onCancelRetVal.then(function() { - if (self.isValid(id)) { - fileState[id].canceled = true; - self.expunge(id); - } - cancelFinalizationEffort.success(); - }); - }, - expunge: function(id) { - delete fileState[id]; - }, - getThirdPartyFileId: function(id) { - return fileState[id].key; - }, - isValid: function(id) { - return fileState[id] !== undefined; - }, - reset: function() { - fileState = {}; - }, - _getFileState: function(id) { - return fileState[id]; - }, - _setThirdPartyFileId: function(id, thirdPartyFileId) { - fileState[id].key = thirdPartyFileId; - }, - _wasCanceled: function(id) { - return !!fileState[id].canceled; - } - }); - }; - qq.UploadHandlerController = function(o, namespace) { - "use strict"; - var controller = this, chunkingPossible = false, concurrentChunkingPossible = false, chunking, preventRetryResponse, log, handler, options = { - paramsStore: {}, - maxConnections: 3, - chunking: { - enabled: false, - multiple: { - enabled: false - } - }, - log: function(str, level) {}, - onProgress: function(id, fileName, loaded, total) {}, - onComplete: function(id, fileName, response, xhr) {}, - onCancel: function(id, fileName) {}, - onUploadPrep: function(id) {}, - onUpload: function(id, fileName) {}, - onUploadChunk: function(id, fileName, chunkData) {}, - onUploadChunkSuccess: function(id, chunkData, response, xhr) {}, - onAutoRetry: function(id, fileName, response, xhr) {}, - onResume: function(id, fileName, chunkData) {}, - onUuidChanged: function(id, newUuid) {}, - getName: function(id) {}, - setSize: function(id, newSize) {}, - isQueued: function(id) {}, - getIdsInProxyGroup: function(id) {}, - getIdsInBatch: function(id) {} - }, chunked = { - done: function(id, chunkIdx, response, xhr) { - var chunkData = handler._getChunkData(id, chunkIdx); - handler._getFileState(id).attemptingResume = false; - delete handler._getFileState(id).temp.chunkProgress[chunkIdx]; - handler._getFileState(id).loaded += chunkData.size; - options.onUploadChunkSuccess(id, handler._getChunkDataForCallback(chunkData), response, xhr); - }, - finalize: function(id) { - var size = options.getSize(id), name = options.getName(id); - log("All chunks have been uploaded for " + id + " - finalizing...."); - handler.finalizeChunks(id).then(function(response, xhr) { - log("Finalize successful for " + id); - var normaizedResponse = upload.normalizeResponse(response, true); - options.onProgress(id, name, size, size); - handler._maybeDeletePersistedChunkData(id); - upload.cleanup(id, normaizedResponse, xhr); - }, function(response, xhr) { - var normaizedResponse = upload.normalizeResponse(response, false); - log("Problem finalizing chunks for file ID " + id + " - " + normaizedResponse.error, "error"); - if (normaizedResponse.reset) { - chunked.reset(id); - } - if (!options.onAutoRetry(id, name, normaizedResponse, xhr)) { - upload.cleanup(id, normaizedResponse, xhr); - } - }); - }, - handleFailure: function(chunkIdx, id, response, xhr) { - var name = options.getName(id); - log("Chunked upload request failed for " + id + ", chunk " + chunkIdx); - handler.clearCachedChunk(id, chunkIdx); - var responseToReport = upload.normalizeResponse(response, false), inProgressIdx; - if (responseToReport.reset) { - chunked.reset(id); - } else { - inProgressIdx = qq.indexOf(handler._getFileState(id).chunking.inProgress, chunkIdx); - if (inProgressIdx >= 0) { - handler._getFileState(id).chunking.inProgress.splice(inProgressIdx, 1); - handler._getFileState(id).chunking.remaining.unshift(chunkIdx); - } - } - if (!handler._getFileState(id).temp.ignoreFailure) { - if (concurrentChunkingPossible) { - handler._getFileState(id).temp.ignoreFailure = true; - log(qq.format("Going to attempt to abort these chunks: {}. These are currently in-progress: {}.", JSON.stringify(Object.keys(handler._getXhrs(id))), JSON.stringify(handler._getFileState(id).chunking.inProgress))); - qq.each(handler._getXhrs(id), function(ckid, ckXhr) { - log(qq.format("Attempting to abort file {}.{}. XHR readyState {}. ", id, ckid, ckXhr.readyState)); - ckXhr.abort(); - ckXhr._cancelled = true; - }); - handler.moveInProgressToRemaining(id); - connectionManager.free(id, true); - } - if (!options.onAutoRetry(id, name, responseToReport, xhr)) { - upload.cleanup(id, responseToReport, xhr); - } - } - }, - hasMoreParts: function(id) { - return !!handler._getFileState(id).chunking.remaining.length; - }, - nextPart: function(id) { - var nextIdx = handler._getFileState(id).chunking.remaining.shift(); - if (nextIdx >= handler._getTotalChunks(id)) { - nextIdx = null; - } - return nextIdx; - }, - reset: function(id) { - log("Server or callback has ordered chunking effort to be restarted on next attempt for item ID " + id, "error"); - handler._maybeDeletePersistedChunkData(id); - handler.reevaluateChunking(id); - handler._getFileState(id).loaded = 0; - }, - sendNext: function(id) { - var size = options.getSize(id), name = options.getName(id), chunkIdx = chunked.nextPart(id), chunkData = handler._getChunkData(id, chunkIdx), resuming = handler._getFileState(id).attemptingResume, inProgressChunks = handler._getFileState(id).chunking.inProgress || []; - if (handler._getFileState(id).loaded == null) { - handler._getFileState(id).loaded = 0; - } - if (resuming && options.onResume(id, name, chunkData) === false) { - chunked.reset(id); - chunkIdx = chunked.nextPart(id); - chunkData = handler._getChunkData(id, chunkIdx); - resuming = false; - } - if (chunkIdx == null && inProgressChunks.length === 0) { - chunked.finalize(id); - } else { - log(qq.format("Sending chunked upload request for item {}.{}, bytes {}-{} of {}.", id, chunkIdx, chunkData.start + 1, chunkData.end, size)); - options.onUploadChunk(id, name, handler._getChunkDataForCallback(chunkData)); - inProgressChunks.push(chunkIdx); - handler._getFileState(id).chunking.inProgress = inProgressChunks; - if (concurrentChunkingPossible) { - connectionManager.open(id, chunkIdx); - } - if (concurrentChunkingPossible && connectionManager.available() && handler._getFileState(id).chunking.remaining.length) { - chunked.sendNext(id); - } - if (chunkData.blob.size === 0) { - log(qq.format("Chunk {} for file {} will not be uploaded, zero sized chunk.", chunkIdx, id), "error"); - chunked.handleFailure(chunkIdx, id, "File is no longer available", null); - } else { - handler.uploadChunk(id, chunkIdx, resuming).then(function success(response, xhr) { - log("Chunked upload request succeeded for " + id + ", chunk " + chunkIdx); - handler.clearCachedChunk(id, chunkIdx); - var inProgressChunks = handler._getFileState(id).chunking.inProgress || [], responseToReport = upload.normalizeResponse(response, true), inProgressChunkIdx = qq.indexOf(inProgressChunks, chunkIdx); - log(qq.format("Chunk {} for file {} uploaded successfully.", chunkIdx, id)); - chunked.done(id, chunkIdx, responseToReport, xhr); - if (inProgressChunkIdx >= 0) { - inProgressChunks.splice(inProgressChunkIdx, 1); - } - handler._maybePersistChunkedState(id); - if (!chunked.hasMoreParts(id) && inProgressChunks.length === 0) { - chunked.finalize(id); - } else if (chunked.hasMoreParts(id)) { - chunked.sendNext(id); - } else { - log(qq.format("File ID {} has no more chunks to send and these chunk indexes are still marked as in-progress: {}", id, JSON.stringify(inProgressChunks))); - } - }, function failure(response, xhr) { - chunked.handleFailure(chunkIdx, id, response, xhr); - }).done(function() { - handler.clearXhr(id, chunkIdx); - }); - } - } - } - }, connectionManager = { - _open: [], - _openChunks: {}, - _waiting: [], - available: function() { - var max = options.maxConnections, openChunkEntriesCount = 0, openChunksCount = 0; - qq.each(connectionManager._openChunks, function(fileId, openChunkIndexes) { - openChunkEntriesCount++; - openChunksCount += openChunkIndexes.length; - }); - return max - (connectionManager._open.length - openChunkEntriesCount + openChunksCount); - }, - free: function(id, dontAllowNext) { - var allowNext = !dontAllowNext, waitingIndex = qq.indexOf(connectionManager._waiting, id), connectionsIndex = qq.indexOf(connectionManager._open, id), nextId; - delete connectionManager._openChunks[id]; - if (upload.getProxyOrBlob(id) instanceof qq.BlobProxy) { - log("Generated blob upload has ended for " + id + ", disposing generated blob."); - delete handler._getFileState(id).file; - } - if (waitingIndex >= 0) { - connectionManager._waiting.splice(waitingIndex, 1); - } else if (allowNext && connectionsIndex >= 0) { - connectionManager._open.splice(connectionsIndex, 1); - nextId = connectionManager._waiting.shift(); - if (nextId >= 0) { - connectionManager._open.push(nextId); - upload.start(nextId); - } - } - }, - getWaitingOrConnected: function() { - var waitingOrConnected = []; - qq.each(connectionManager._openChunks, function(fileId, chunks) { - if (chunks && chunks.length) { - waitingOrConnected.push(parseInt(fileId)); - } - }); - qq.each(connectionManager._open, function(idx, fileId) { - if (!connectionManager._openChunks[fileId]) { - waitingOrConnected.push(parseInt(fileId)); - } - }); - waitingOrConnected = waitingOrConnected.concat(connectionManager._waiting); - return waitingOrConnected; - }, - isUsingConnection: function(id) { - return qq.indexOf(connectionManager._open, id) >= 0; - }, - open: function(id, chunkIdx) { - if (chunkIdx == null) { - connectionManager._waiting.push(id); - } - if (connectionManager.available()) { - if (chunkIdx == null) { - connectionManager._waiting.pop(); - connectionManager._open.push(id); - } else { - (function() { - var openChunksEntry = connectionManager._openChunks[id] || []; - openChunksEntry.push(chunkIdx); - connectionManager._openChunks[id] = openChunksEntry; - })(); - } - return true; - } - return false; - }, - reset: function() { - connectionManager._waiting = []; - connectionManager._open = []; - } - }, simple = { - send: function(id, name) { - handler._getFileState(id).loaded = 0; - log("Sending simple upload request for " + id); - handler.uploadFile(id).then(function(response, optXhr) { - log("Simple upload request succeeded for " + id); - var responseToReport = upload.normalizeResponse(response, true), size = options.getSize(id); - options.onProgress(id, name, size, size); - upload.maybeNewUuid(id, responseToReport); - upload.cleanup(id, responseToReport, optXhr); - }, function(response, optXhr) { - log("Simple upload request failed for " + id); - var responseToReport = upload.normalizeResponse(response, false); - if (!options.onAutoRetry(id, name, responseToReport, optXhr)) { - upload.cleanup(id, responseToReport, optXhr); - } - }); - } - }, upload = { - cancel: function(id) { - log("Cancelling " + id); - options.paramsStore.remove(id); - connectionManager.free(id); - }, - cleanup: function(id, response, optXhr) { - var name = options.getName(id); - options.onComplete(id, name, response, optXhr); - if (handler._getFileState(id)) { - handler._clearXhrs && handler._clearXhrs(id); - } - connectionManager.free(id); - }, - getProxyOrBlob: function(id) { - return handler.getProxy && handler.getProxy(id) || handler.getFile && handler.getFile(id); - }, - initHandler: function() { - var handlerType = namespace ? qq[namespace] : qq.traditional, handlerModuleSubtype = qq.supportedFeatures.ajaxUploading ? "Xhr" : "Form"; - handler = new handlerType[handlerModuleSubtype + "UploadHandler"](options, { - getDataByUuid: options.getDataByUuid, - getName: options.getName, - getSize: options.getSize, - getUuid: options.getUuid, - log: log, - onCancel: options.onCancel, - onProgress: options.onProgress, - onUuidChanged: options.onUuidChanged - }); - if (handler._removeExpiredChunkingRecords) { - handler._removeExpiredChunkingRecords(); - } - }, - isDeferredEligibleForUpload: function(id) { - return options.isQueued(id); - }, - maybeDefer: function(id, blob) { - if (blob && !handler.getFile(id) && blob instanceof qq.BlobProxy) { - options.onUploadPrep(id); - log("Attempting to generate a blob on-demand for " + id); - blob.create().then(function(generatedBlob) { - log("Generated an on-demand blob for " + id); - handler.updateBlob(id, generatedBlob); - options.setSize(id, generatedBlob.size); - handler.reevaluateChunking(id); - upload.maybeSendDeferredFiles(id); - }, function(errorMessage) { - var errorResponse = {}; - if (errorMessage) { - errorResponse.error = errorMessage; - } - log(qq.format("Failed to generate blob for ID {}. Error message: {}.", id, errorMessage), "error"); - options.onComplete(id, options.getName(id), qq.extend(errorResponse, preventRetryResponse), null); - upload.maybeSendDeferredFiles(id); - connectionManager.free(id); - }); - } else { - return upload.maybeSendDeferredFiles(id); - } - return false; - }, - maybeSendDeferredFiles: function(id) { - var idsInGroup = options.getIdsInProxyGroup(id), uploadedThisId = false; - if (idsInGroup && idsInGroup.length) { - log("Maybe ready to upload proxy group file " + id); - qq.each(idsInGroup, function(idx, idInGroup) { - if (upload.isDeferredEligibleForUpload(idInGroup) && !!handler.getFile(idInGroup)) { - uploadedThisId = idInGroup === id; - upload.now(idInGroup); - } else if (upload.isDeferredEligibleForUpload(idInGroup)) { - return false; - } - }); - } else { - uploadedThisId = true; - upload.now(id); - } - return uploadedThisId; - }, - maybeNewUuid: function(id, response) { - if (response.newUuid !== undefined) { - options.onUuidChanged(id, response.newUuid); - } - }, - normalizeResponse: function(originalResponse, successful) { - var response = originalResponse; - if (!qq.isObject(originalResponse)) { - response = {}; - if (qq.isString(originalResponse) && !successful) { - response.error = originalResponse; - } - } - response.success = successful; - return response; - }, - now: function(id) { - var name = options.getName(id); - if (!controller.isValid(id)) { - throw new qq.Error(id + " is not a valid file ID to upload!"); - } - options.onUpload(id, name); - if (chunkingPossible && handler._shouldChunkThisFile(id)) { - chunked.sendNext(id); - } else { - simple.send(id, name); - } - }, - start: function(id) { - var blobToUpload = upload.getProxyOrBlob(id); - if (blobToUpload) { - return upload.maybeDefer(id, blobToUpload); - } else { - upload.now(id); - return true; - } - } - }; - qq.extend(this, { - add: function(id, file) { - handler.add.apply(this, arguments); - }, - upload: function(id) { - if (connectionManager.open(id)) { - return upload.start(id); - } - return false; - }, - retry: function(id) { - if (concurrentChunkingPossible) { - handler._getFileState(id).temp.ignoreFailure = false; - } - if (connectionManager.isUsingConnection(id)) { - return upload.start(id); - } else { - return controller.upload(id); - } - }, - cancel: function(id) { - var cancelRetVal = handler.cancel(id); - if (qq.isGenericPromise(cancelRetVal)) { - cancelRetVal.then(function() { - upload.cancel(id); - }); - } else if (cancelRetVal !== false) { - upload.cancel(id); - } - }, - cancelAll: function() { - var waitingOrConnected = connectionManager.getWaitingOrConnected(), i; - if (waitingOrConnected.length) { - for (i = waitingOrConnected.length - 1; i >= 0; i--) { - controller.cancel(waitingOrConnected[i]); - } - } - connectionManager.reset(); - }, - getFile: function(id) { - if (handler.getProxy && handler.getProxy(id)) { - return handler.getProxy(id).referenceBlob; - } - return handler.getFile && handler.getFile(id); - }, - isProxied: function(id) { - return !!(handler.getProxy && handler.getProxy(id)); - }, - getInput: function(id) { - if (handler.getInput) { - return handler.getInput(id); - } - }, - reset: function() { - log("Resetting upload handler"); - controller.cancelAll(); - connectionManager.reset(); - handler.reset(); - }, - expunge: function(id) { - if (controller.isValid(id)) { - return handler.expunge(id); - } - }, - isValid: function(id) { - return handler.isValid(id); - }, - getResumableFilesData: function() { - if (handler.getResumableFilesData) { - return handler.getResumableFilesData(); - } - return []; - }, - getThirdPartyFileId: function(id) { - if (controller.isValid(id)) { - return handler.getThirdPartyFileId(id); - } - }, - pause: function(id) { - if (controller.isResumable(id) && handler.pause && controller.isValid(id) && handler.pause(id)) { - connectionManager.free(id); - handler.moveInProgressToRemaining(id); - return true; - } - return false; - }, - isResumable: function(id) { - return !!handler.isResumable && handler.isResumable(id); - } - }); - qq.extend(options, o); - log = options.log; - chunkingPossible = options.chunking.enabled && qq.supportedFeatures.chunking; - concurrentChunkingPossible = chunkingPossible && options.chunking.concurrent.enabled; - preventRetryResponse = function() { - var response = {}; - response[options.preventRetryParam] = true; - return response; - }(); - upload.initHandler(); - }; - qq.WindowReceiveMessage = function(o) { - "use strict"; - var options = { - log: function(message, level) {} - }, callbackWrapperDetachers = {}; - qq.extend(options, o); - qq.extend(this, { - receiveMessage: function(id, callback) { - var onMessageCallbackWrapper = function(event) { - callback(event.data); - }; - if (window.postMessage) { - callbackWrapperDetachers[id] = qq(window).attach("message", onMessageCallbackWrapper); - } else { - log("iframe message passing not supported in this browser!", "error"); - } - }, - stopReceivingMessages: function(id) { - if (window.postMessage) { - var detacher = callbackWrapperDetachers[id]; - if (detacher) { - detacher(); - } - } - } - }); - }; - qq.FormUploadHandler = function(spec) { - "use strict"; - var options = spec.options, handler = this, proxy = spec.proxy, formHandlerInstanceId = qq.getUniqueId(), onloadCallbacks = {}, detachLoadEvents = {}, postMessageCallbackTimers = {}, isCors = options.isCors, inputName = options.inputName, getUuid = proxy.getUuid, log = proxy.log, corsMessageReceiver = new qq.WindowReceiveMessage({ - log: log - }); - function expungeFile(id) { - delete detachLoadEvents[id]; - if (isCors) { - clearTimeout(postMessageCallbackTimers[id]); - delete postMessageCallbackTimers[id]; - corsMessageReceiver.stopReceivingMessages(id); - } - var iframe = document.getElementById(handler._getIframeName(id)); - if (iframe) { - iframe.setAttribute("src", "javascript:false;"); - qq(iframe).remove(); - } - } - function getFileIdForIframeName(iframeName) { - return iframeName.split("_")[0]; - } - function initIframeForUpload(name) { - var iframe = qq.toElement("